日本語版
最新ニュース
科学&テクノロジー

ROM の幽霊 – NYC レジスター

Apple Mac SE ROM イメージから生成されたダンプを詳しく調べているうちに、大量の非コード、非オーディオ データがあることに気付きました。Adam Mayer はさまざまなストライド幅をテストし、67 バイト (横 536 ピクセル) のところに、明らかに人物の写真である何らかの画像データがあることを発見しました。画像の残りの部分は歪んでおり、非圧縮ビットマップとして保存されていないことがわかりました。 調査の結果、上記の混乱した画像を解読し、「1986 年 11 月 20 日木曜日「: この写真と ROM に保存されていた他の 3 枚の写真をどのように復元したかについてのリバース エンジニアリングの詳細と、Motorola 68000 時代の Macintosh に関する情報については、以下をお読みください。 私たちはブルックリンの道端でこの Macintosh SE を見つけ、NYC Resistor に持ち込みました。起動はしますが、メディアがないため、さらにデジタル考古学的な調査を行うことにしました。 2つのROMチップ(ボードの中央、統合WozマシンであるVLSI ASICの上にあるもの)を取り外し、 プロムデート…

ROM の幽霊 – NYC レジスター

1719409302
2024-06-26 12:15:46

Apple Mac SE ROM イメージから生成されたダンプを詳しく調べているうちに、大量の非コード、非オーディオ データがあることに気付きました。Adam Mayer はさまざまなストライド幅をテストし、67 バイト (横 536 ピクセル) のところに、明らかに人物の写真である何らかの画像データがあることを発見しました。画像の残りの部分は歪んでおり、非圧縮ビットマップとして保存されていないことがわかりました。

調査の結果、上記の混乱した画像を解読し、「1986 年 11 月 20 日木曜日「:

Mac SE エンジニア (0x1D93C)

この写真と ROM に保存されていた他の 3 枚の写真をどのように復元したかについてのリバース エンジニアリングの詳細と、Motorola 68000 時代の Macintosh に関する情報については、以下をお読みください。

ゴミ箱の中の宝物

私たちはブルックリンの道端でこの Macintosh SE を見つけ、NYC Resistor に持ち込みました。起動はしますが、メディアがないため、さらにデジタル考古学的な調査を行うことにしました。

マックSE

2つのROMチップ(ボードの中央、統合WozマシンであるVLSI ASICの上にあるもの)を取り外し、 プロムデート デバイス。チップのピン配置はM27C512 PROMと同じですが、 ヴップ ピンは A17 に再利用されます。再プログラムできないマスク ROM なので、プログラミング ピンは必要ありません (Nick さん、ありがとうございます)。これにより、M27C512 プログラマブル ROM の 64 KB と比較して、アドレス空間が 128 KB (1024 キロビット) に拡張されます。

PROMdate: AVRサポートを追加

m68kは16ビット幅のバスを持っているので、128KBの8ビットROMはそれぞれ半ワードで、それを256KBのバイナリファイルにマージする必要があります。 文字列 ファイルには「シカゴ「、」パック” そして “CDEF(バイト順序が間違っている場合は「APKC」など)。

イースターエッグの報告 アドレスにジャンプすることで見つけることができると述べた 0x41D89AROMを起動することができました ミニ vMac そして、これらがすでに発見されていた秘密の画像であることを確認しました。これで終わりでもよかったのですが、それらがどのように保存され、表示されているのかを知りたかったし、ROM に保存されている他の驚きのものを探すことができたので、さらに調査が必要でした。

ROMを逆アセンブルするには、生のバイナリダンプをELFファイルに変換するのが最も簡単だとわかりました。 オブジェクトダンプ 処理します。履歴から、ROMがアドレスにマッピングされていることがわかります。 0x0040_0000 (24 MB) がメモリ内にあるため、ELF ファイルの開始アドレスをそこに設定しました。IDA Pro は、まさにこの種のリバース エンジニアリングを実行するための優れたツールですが、この分析には無料のソフトウェアを使用しています。

m68k-elf-objcopy 
  --change-addresses=0x400000 
  --redefine-sym _binary_mac_se_bin_start=rom 
  --strip-symbol _binary_mac_se_bin_size 
  --strip-symbol _binary_mac_se_bin_end 
  -I binary 
  -O elf32-m68k 
  -B m68k 
  roms/mac-se.bin 
  roms/mac-se.elf 

イースターエッグ関数のアドレスを見ると m68k-elf-objdump -D roms/mac-se.elf、 私たちは見る:

  41d89a:       4eba 0018       jsr %pc@(41d8b4 )
  41d89e:       5847            addqw #4,%d7
  41d8a0:       0287 0000 000c  andil #12,%d7
  41d8a6:       6100 002e       bsrw 41d8d6 
  41d8aa:       307c 00b5       moveaw #181,%a0
  41d8ae:       a03b            0120073
  41d8b0:       4efa ffec       jmp %pc@(41d89e )

0xa03b 命令が奇数です — モトローラは、で始まるすべての命令を予約しました 0xAなので、これは正当なm68k命令ではありません。代わりに、不正命令トラップがトリガーされ、トラップハンドラは次のワードを見て適切なハンドラにベクトルします。このAラインまたはAトラップは、 Macintosh ツールボックス 通常のシステム コール メソッドに比べて、コード スペースを大幅に節約できます。 このコードリスト それは _遅れ そして、 %a0 遅延時間を指定する引数として使用されます。アセンブリ コードで何が起こっているかを理解するために、このリストを再度参照します。
これに基づいて、この関数を「C」のようなものに翻訳できます。

void easter_egg(void)
{
    func_41d8b4();
    while (1)
    {
        d7 = (d7 + 4) & 0xC;
        func_0x41d8d6();
        _Delay(181);
    }
}

これが呼び出す最初の関数は 0x41d8b4:

  41d8b4:       31fc ffff 0b9e  movew #-1,b9e
  41d8ba:       594f            subqw #4,%sp
  41d8bc:       2f3c 6262 6d63  movel #1650617699,%sp@-
  41d8c2:       4267            clrw %sp@-
  41d8c4:       a9a0            0124640
  41d8c6:       201f            movel %sp@+,%d0
  41d8c8:       6700 0050       beqw 41d91a 
  41d8cc:       2040            moveal %d0,%a0
  41d8ce:       21d0 0a78       movel %a0@,a78
  41d8d2:       7e00            moveq #0,%d7
  41d8d4:       4e75            rts
...
  41d91a:       a9ff            0124777

これにより、Aラインコールが行われます 0xA9A0、 または _GetResource(0x62626d63) そしてセット 0xb9e部屋の挿入フラグ 検索関数にROMテーブルを検索するように指示します。リソースの取得に失敗した場合は、デバッガートラップにジャンプします(0xA9FF)、マシンを停止します。それ以外の場合はゼロになります %d7 そして、返されたアドレスからリソースのアドレスを読み取ります。 _リソースを取得 その値をグローバルメモリの場所に書き込みます 0xa78アップルスクラッチ)。

ASCIIを話す人にとっては、この定数は興味深いものになるかもしれません。これはマルチバイト文字です。bbmc‘、あなたはおそらく 文字列 オフセットでの出力 0x1af4e、ある種の構造のように見えます:

001af3e: 5041 434b 0002 006a 7463 736c 0000 008e  PACK...jtcsl....
001af4e: 6262 6d63 0000 009a 5345 5244 0000 00a6  bbmc....SERD....
001af5e: 4452 5652 0004 00b2 4344 4546 0001 00ee  DRVR....CDEF....
001af6e: 4b43 4852 0000 0106 4b4d 4150 0000 0112  KCHR....KMAP....
001af7e: 4d42 4446 0000 011e 4d44 4546 0000 012a  MBDF....MDEF...*
001af8e: 5744 4546 0001 0136 4355 5253 0003 014e  WDEF...6CURS...N
001af9e: 464f 4e54 0004 017e 0005 ffff 5801 b122  FONT...~....X.."
001afae: 0000 0000 0004 ffff 5801 c188 0000 0000  ........X.......
001afbe: 0007 ffff 5801 d348 0000 0000 0000 ffff  ....X..H........
001afce: 5801 d896 0000 0000 0000 ffff 5801 d924  X...........X..$

現時点では、構造を解読する方法も、 %a0 グローバルに参照解除されるときを指す 0xa78これについては後でまた触れますが、明らかにそれは 0x009A そして赤い部分は 0x1AFDA

次に 関数0x41d8d6()擬似コードが散りばめられています:

  41d8d6:       moveal a78,%a0
  41d8da:       addaw %d7,%a0
  41d8dc:       movel %a0@,%d3     d3 = _a78[d7];
  41d8de:       movel a78,a7c
  41d8e4:       addl %d3,a7c       _a7c = _a78 + d3;
  41d8e8:       movel 824,a80      _a80 = _824 // ScrnBase
  41d8ee:       movel #340,%d3     d3 = 340;
                                   do {
  41d8f4:       pea a7c
  41d8f8:       pea a80
  41d8fc:       movew #72,%sp@-        // 72 * 8 == 576 bits
  41d900:       a8d0                   _UnpackBits(&_a7c, &_a80, 72)
  41d902:       subql #8,a80           _a80 -= 8;
  41d906:       dbf %d3,41d8f4     } while (d3--)
  41d90a:       pea a7c
  41d90e:       pea a80
  41d912:       movew #64,%sp@-
  41d916:       a8d0                _Unpackbits(&_a7c, &_a80, 64);
  41d918:       rts                 return;

これら 3 つの関数のコード全体を C に似た形式で書き直します。

void draw_bitmap(const uint8_t * packed)
{
	uint8_t * fb = _ScrnBase;

	for (int y = 0 ; y 

Adam found the format expected by _UnpackBits defined in PackBits on wikipedia, and wrote a python unpackbits.py that can be given the offsets of the images in the ROM. So the last piece of the puzzle was to figure out where they are located.

And this is where I cheated… Based on a binary search of the image space using unpackbits.py, I found that the first one started at 0x1d93c. Looking slightly earlier in the ROM dump, I saw:

001d920: 0000 0064 0000 0018 0000 5618 0000 a71c  ...d......V.....
001d930: 0000 f700 0001 4281 0000 0000 30aa 552a  ......B.....0.U*
001d940: 52a5 294a 5294 a529 4a52 2449 1224 44a9  R.)JR..)JR$I.$D.

それ 0x0000_0018 正しいようです。 0x1D924 + 0x18 = 0x1D93Cそしてそのすぐ後には、他のビットマップの適切な間隔のように見える追加のオフセットがあります。これにより、他のビットマップは次のようになります。 0x22F3C0x280400x2D024 そして未使用のもの 0x31BA5ROMダンプのリソース定義領域を振り返ってみると、 0x5801D924(冒頭の 0x58 (Mac SE には 24 ビットのアドレスしかなかったので、CPU によって無視されます)。

アダムのツールと私のツールを組み合わせて実行する 16進数2png 地域では4つの画像が成功しました!

for offset in 1D93C 22F3C 28040 2D024; do
  off_decimal=`echo 16i $offset p | dc`
  ../unpackbits.py $off_decimal 5000 

So here is the team that twenty five years ago found space in the ROM to include their own images as an easter egg. Can anyone identify them? Where are they now? Are they “JCSLWRLBBMABOEMTDAHJTCFJLMBKCRCLAKEHBRDCDAFSHFT“? If you do know who they are, please send them our thanks for a fun puzzle!

Mac SE エンジニア (0x22F3C)

Mac SE エンジニア (0x28040)

Mac SE エンジニア (0x2D024)

5 番目の領域には何があるのでしょうか? 注目すべき画像データはないようですが、ROM 内の文字列に基づくオーディオである可能性があります。これは後で取り組むプロジェクトになるかもしれません...

0031ba0: 00b9 00b9 0000 c000 08fc 0000 0068 600a .............h`.  0031bb0: 0000 5345 5244 0000 0003 487a 0074 487a ..SERD....Hz.tHz 0031bc0: 0058 487a 003c 487a 0020 76fa 3003 a53d .XHz.

もちろん、これらの画像の著作権は Apple Computer が所有しています。つまり、次のようになります。

Mac SE ROMイメージ

#ROM #の幽霊 #NYC #レジスター

執筆者について: nipponese

Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。