【更新あり】PC-9801のプログラム(ソースコード無し)をリバースエンジニアリングしてくれ!→変態技術の塊なことが判明しました
クラウドワークスで大人気だった PC98 の古い業務プログラム解析案件、回りまわって請けたので年が変わる前に顛末を書いておく crowdworks.jp/public/jobs/15…
2017-12-31 21:08:51このプログラムの正体は、 BASIC で書いたものを BASIC コンパイラで実行形式に変換したものだった。「BASIC コンパイラ……実在していたのか……」って気持ちになりましたよね。いや、噂には聞いていたんだけど、使い物にならんと聞いてました。高校生か中学生だったしその時は検証してない
2017-12-31 21:08:51実際、大したことないプログラムだったんだけど 283KB もあったので、当時言われていた「使い物にならない」はある程度正しかった
2017-12-31 21:08:51このコンパイラがどこのベンダの何て言う製品だったのかはまったく分からないけど、 undocumented な ROM BASIC のファンクションコールを呼んでいることからも NEC か、その BIOS のベンダのどちらかの手によるものかなという程度
2017-12-31 21:08:521. この BASIC コンパイラ生成の実行形式は結構特徴があって、それが解析を妨げる大きな要因だった。 EXE はリロケーションエントリを一切持たず、 DOS でなく自分でリロケーションを行っていた。これがまず一点。
2017-12-31 21:08:522. リロケーションの対象は DS, ES, そして CS の一部。 libc に相当するような共通ライブラリがオーバーレイで実行時ロードされていた。オーバーレイ/リロケーション周りが二点目。
2017-12-31 21:08:523. BSS, rodata に相当する部分も、自分でロードしてセグメントを設定していた。しかもこれは、実行形式に埋め込まれたモジュール(.bas) ごとに散らばっていて、簡単な圧縮が施されていた。オーバーレイとリロケーション、そしてデータセクションの圧縮を解くのに片手間で一週間程度かかった
2017-12-31 21:08:524. 四点目は本当に簡単。 BASIC コンパイラは、一応ネイティブコードを吐くけども、実際は VM のオペコードに近いものだった。各オペコードが一つのルーチン call に対応していた
2017-12-31 21:08:53これの解析は、マシン語をちゃんと読んでもいいけど、一つ読めば仮想マシンスタックアドレスが分かるから、デバッガでそこの動きを調べてもいい。 しかもこれは、色々と興味深いことがわかった。
2017-12-31 21:08:53以上がキモであり、このプログラムが何年も解析されなかった原因のすべてだった。早い話が、98DOS/real mode の知識に加えて動的ライブラリのローダの知識と仮想マシンの知識がないと解析できない。こんなのお小遣い程度の金額でやる人間、地球上にいないですよという普通のオチでした
2017-12-31 21:08:53もちろん、理論上は知識なんかなくても砂漠にサイロを作るような気持ちで一年くらい取り組めば可能ではあるけどね?
2017-12-31 21:10:49解析するプログラムのロジック自体は、ロジックもコードも退屈極まりないものだった。特にコードは、条件分岐ばかり(しかも間違っている)で失笑しながら解析した。発注者は CUI と称していたけど、より正確には TUI, メニューを表示するウィザード形式のものだった。
2017-12-31 21:24:06このため、利用するライブラリ関数はかなりの数に上った。ロジックの解析にはほとんど不要なんだけども、暇潰し代わりに解析していた。まぁ、テキスト VRAM とテキスト GDC の知識があれば難しくはない程度のものだった。むしろ面白いのは BASIC 由来のファイル IO 関数のほうか。
2017-12-31 21:24:06ゲームや組み込みプログラムからこの世界に入った人間は、学校、会社に入ってからも昔の偉大な業務プログラムやプログラマと比べられることがあって辟易してたわけだけど、その昔の業務プログラムを眺めることがこの仕事を請けた理由の一つ
2017-12-31 21:24:07あえて解析されにくくしているものではなくて、これは単純に「メモリがない」に尽きるように読めたかなぁ。(コードがでかくて)メモリに乗りきらないから、データセクションを圧縮し、圧縮したぶん詰めたらコードのアドレスが変わるので実行時にパッチを当てる必要が生じたと twitter.com/sera___/status…
2017-12-31 23:03:10あえてそういう複雑なバイナリを出力するコンパイラにしていたんだとしたらすごいなぁ。(解析されにくくすることでアプリの開発会社を守りたいというような意思を感じてしまいます。) twitter.com/roentgen/statu…
2017-12-31 22:23:33ついでにいうと、このオレオレ reloc tbl というかパッチを当てる命令のリストは、データセクションの展開時に破壊されてしまう領域にロードされるため、いったん別の領域にバックアップするという力業がとられていて涙ぐましかった
2017-12-31 23:03:10あと地味に FDD 一枚にのりきらないというのはきつい。 exe だけで 300KB もあったら FD 1/4 使ってしまう。
2017-12-31 23:07:03今更だけどさっき教えてもらったこれをポチッた amazon.co.jp/dp/481630732X (どんなオプションがあるか気になってきた)
2017-12-31 23:10:37前職を離れて以来、合法のリバースエンジニアリングに飢えていた(たまに必要があっても一瞬で終わるやつばかり)のも理由のうちだけど、まぁ安いので非公開で出し直してもらいました(請けると金額がバレるっぽかったので) twitter.com/dmikurube/stat…
2018-01-01 00:16:24これは…単に興味深いが、たしかにあの値段でやる解析でもないな… twitter.com/roentgen/statu…
2018-01-01 00:10:57さて BASIC の話。今回請けるにあたってちょっと書いてみたら意外と覚えていた。でも「ああ、こういうクソ言語だった」ってことも思い出した。
2018-01-01 01:13:32元提督、花海咲季P。 水晶雫アイコン。 カメラ、ギャルゲー、遊戯王が趣味。 推しブランドはAUGUST、Lose、ゆずソフト。 推しテーマはヴァルモニカ、斬機、クシャトリラ。 次は『ノラと皇女と野良猫ハート2』をプレイ予定。 ブログやマシュマロや批評空間などへのリンク:lit.link/ysrken