SSブログ

孤独へ向って突っ走れ (24) [  PC-98x1(補完計画)]

今までかかってゲーム本編にたどり着くどころか、いつになったらたどり着けるかわからない。もしも絵を読み込む部分のコードを探し当てられれば、そこから解析を始めることによってビットマップデータのフォーマット解析に早くたどり着ける。

フロッピーディスク内の拡張子picのファイルがビットマップデータだというのは想像できる。もっとも、ファイル名からはどんな絵か見当がつかない。

試しにどれかひとつを選び、それをディスクから読み込む部分のCALL 6FECを特定できるか試す。b:\tennis\pic4\z08.picを選んだ。

ファイルを読み込むサブルーチン6FECHは、データセグメントの[SI+8]からDOSファイル名を取得する。SIに値を入れるLEAを見つけられるか。文字列b:\tennis\pic4\z08.picが格納されているのはEXEファイル先頭からのオフセットで3C6DH。これはデータセグメント先頭からのオフセットで3C6DH - 0C00H = 306DH。これから8を引くと3065H。

この値65 30(念のために30 65も)をバイナリエディタで検索したが、見つからなかった。世の中そんなに甘くないか。

では仕方がない、CALL 6FECを意味するE8 C3 6Eを検索しよう。おかしい。E8 C3 6EがEXE内にひとつしかない。このサブルーチンは何度もCALLされているのに。

さっきは2回目のCALL 6FECを調べた。試しに最初のCALL 6FECを調べてみると、E8 D5 6Fだった。

これは参った。CALLという命令は飛び先のアドレスを直接指定しないのか。サブルーチンを呼び出すたびにコードが違うらしい。

今の私が功を焦っているのは確かだ。最初に戻ろう。すでに解析済みの部分に出てきたa:\pic\w.gを使って私の計算が正しいかどうか調べた。文字列a:\pic\w.gが格納されているのはEXEファイル先頭からのオフセットで2B72H。これからヘッダのサイズを引くと2B72H - 0C00H = 1F72H。さらに8を引くと1F6AHで、これは逆アセンブル結果で確認したSIの値だ。計算方法は合っている。

a:\pic\w.gの場合はLEAを使ってSIに即値を入れている。LEAを使うと即値はコード内に下位バイト上位バイトの順にそのまま現れる。先ほどEXEファイル内を検索して見つからなかった値は、即値以外の形でSIに入れられているに違いない。

うーん、私には、解析済み部分の先を地道に少しずつ解析してゆく方法しか残されていないのだろうか。




そして一晩が過ぎ、翌日となった。人間誰でも心に恐れているものがあると私は信じる。怒り・憎しみ・恐れ、それらは実は別個のものでなく、相互に関連しあっている。今日は選挙だ。私は恐れと戦いつつ、もうじき選挙に行こうとしながら、これを書いている。

CALL。最初の1バイトはどうやら常にE8だ。次の2バイトは飛び先のアドレスではない。となると現在IPと飛び先との相対的な位置関係かもしれない。試してみよう。

相対的ということは、マイナスもありうるということだ。

CS:0014にあるCALL 6FECは、E8 D5 6F。
CS:0126にあるCALL 6FECは、E8 C3 6E。

0014H + 6FD5H = 6FE9H
0126H + 6EC3H = 6FE9H

惜しいな。CALL命令が実行された後のIPか。3バイトを足すと

6FE9H + 3 = 6FECH

よし、NEAR CALLはわかった。

なにしろ、初めは読み込むファイル名のアドレスからLEA SI,[...]を探し出そうとしていたが、それが無理だったので、そうなるとファイルを読み込むサブルーチンを呼び出すCALL 6FECの場所を突き止めるしかないだろう。そうでなければこれから何か月・何年とかけてコードセグメントを全部解析することになってしまう。

さあ、選挙に行く準備だ。

コメント(0) 

コメント 0

コメントの受付は締め切りました