【更新あり】PC-9801のプログラム(ソースコード無し)をリバースエンジニアリングしてくれ!→変態技術の塊なことが判明しました

あの(一見)ネタ(と思ってしまうぐらいヤバい)依頼が無事解決したとのことで。解析された方のツイートのみのまとめです。 (たぶん追記される予定です)
376
まとめ 発注額の桁が違う?PC-9801用アプリケーションの解析業務が話題に 20年以上前の見積もりシステム(?)の解析と仕様を起こすお仕事です。 どうも単純に逆アセンブルしただけでは全体は見えてこなさそうな雰囲気です。 発注側は何とか「単純」な仕事にしたいようですが、個人的にはこういった仕事にありがちな、蓋を開けてみると全く簡単じゃなかった案件じゃないかとみております。 23204 pv 66 4 users 156
roentgen/技術書典3 か-46 @roentgen

クラウドワークスで大人気だった PC98 の古い業務プログラム解析案件、回りまわって請けたので年が変わる前に顛末を書いておく crowdworks.jp/public/jobs/15…

2017-12-31 21:08:51
roentgen/技術書典3 か-46 @roentgen

このプログラムの正体は、 BASIC で書いたものを BASIC コンパイラで実行形式に変換したものだった。「BASIC コンパイラ……実在していたのか……」って気持ちになりましたよね。いや、噂には聞いていたんだけど、使い物にならんと聞いてました。高校生か中学生だったしその時は検証してない

2017-12-31 21:08:51
roentgen/技術書典3 か-46 @roentgen

実際、大したことないプログラムだったんだけど 283KB もあったので、当時言われていた「使い物にならない」はある程度正しかった

2017-12-31 21:08:51
roentgen/技術書典3 か-46 @roentgen

このコンパイラがどこのベンダの何て言う製品だったのかはまったく分からないけど、 undocumented な ROM BASIC のファンクションコールを呼んでいることからも NEC か、その BIOS のベンダのどちらかの手によるものかなという程度

2017-12-31 21:08:52
roentgen/技術書典3 か-46 @roentgen

1. この BASIC コンパイラ生成の実行形式は結構特徴があって、それが解析を妨げる大きな要因だった。 EXE はリロケーションエントリを一切持たず、 DOS でなく自分でリロケーションを行っていた。これがまず一点。

2017-12-31 21:08:52
roentgen/技術書典3 か-46 @roentgen

2. リロケーションの対象は DS, ES, そして CS の一部。 libc に相当するような共通ライブラリがオーバーレイで実行時ロードされていた。オーバーレイ/リロケーション周りが二点目。

2017-12-31 21:08:52
roentgen/技術書典3 か-46 @roentgen

3. BSS, rodata に相当する部分も、自分でロードしてセグメントを設定していた。しかもこれは、実行形式に埋め込まれたモジュール(.bas) ごとに散らばっていて、簡単な圧縮が施されていた。オーバーレイとリロケーション、そしてデータセクションの圧縮を解くのに片手間で一週間程度かかった

2017-12-31 21:08:52
roentgen/技術書典3 か-46 @roentgen

4. 四点目は本当に簡単。 BASIC コンパイラは、一応ネイティブコードを吐くけども、実際は VM のオペコードに近いものだった。各オペコードが一つのルーチン call に対応していた

2017-12-31 21:08:53
roentgen/技術書典3 か-46 @roentgen

これの解析は、マシン語をちゃんと読んでもいいけど、一つ読めば仮想マシンスタックアドレスが分かるから、デバッガでそこの動きを調べてもいい。 しかもこれは、色々と興味深いことがわかった。

2017-12-31 21:08:53
roentgen/技術書典3 か-46 @roentgen

以上がキモであり、このプログラムが何年も解析されなかった原因のすべてだった。早い話が、98DOS/real mode の知識に加えて動的ライブラリのローダの知識と仮想マシンの知識がないと解析できない。こんなのお小遣い程度の金額でやる人間、地球上にいないですよという普通のオチでした

2017-12-31 21:08:53
roentgen/技術書典3 か-46 @roentgen

もちろん、理論上は知識なんかなくても砂漠にサイロを作るような気持ちで一年くらい取り組めば可能ではあるけどね?

2017-12-31 21:10:49
roentgen/技術書典3 か-46 @roentgen

解析するプログラムのロジック自体は、ロジックもコードも退屈極まりないものだった。特にコードは、条件分岐ばかり(しかも間違っている)で失笑しながら解析した。発注者は CUI と称していたけど、より正確には TUI, メニューを表示するウィザード形式のものだった。

2017-12-31 21:24:06
roentgen/技術書典3 か-46 @roentgen

このため、利用するライブラリ関数はかなりの数に上った。ロジックの解析にはほとんど不要なんだけども、暇潰し代わりに解析していた。まぁ、テキスト VRAM とテキスト GDC の知識があれば難しくはない程度のものだった。むしろ面白いのは BASIC 由来のファイル IO 関数のほうか。

2017-12-31 21:24:06
roentgen/技術書典3 か-46 @roentgen

ゲームや組み込みプログラムからこの世界に入った人間は、学校、会社に入ってからも昔の偉大な業務プログラムやプログラマと比べられることがあって辟易してたわけだけど、その昔の業務プログラムを眺めることがこの仕事を請けた理由の一つ

2017-12-31 21:24:07
roentgen/技術書典3 か-46 @roentgen

BASIC コンパイラと内部設計の方は結構面白かったので用事済んだら書くわ

2017-12-31 21:29:10

roentgen/技術書典3 か-46 @roentgen

あえて解析されにくくしているものではなくて、これは単純に「メモリがない」に尽きるように読めたかなぁ。(コードがでかくて)メモリに乗りきらないから、データセクションを圧縮し、圧縮したぶん詰めたらコードのアドレスが変わるので実行時にパッチを当てる必要が生じたと twitter.com/sera___/status…

2017-12-31 23:03:10
sera💙💛 @sera___

あえてそういう複雑なバイナリを出力するコンパイラにしていたんだとしたらすごいなぁ。(解析されにくくすることでアプリの開発会社を守りたいというような意思を感じてしまいます。) twitter.com/roentgen/statu…

2017-12-31 22:23:33
roentgen/技術書典3 か-46 @roentgen

ついでにいうと、このオレオレ reloc tbl というかパッチを当てる命令のリストは、データセクションの展開時に破壊されてしまう領域にロードされるため、いったん別の領域にバックアップするという力業がとられていて涙ぐましかった

2017-12-31 23:03:10
roentgen/技術書典3 か-46 @roentgen

あと地味に FDD 一枚にのりきらないというのはきつい。 exe だけで 300KB もあったら FD 1/4 使ってしまう。

2017-12-31 23:07:03
roentgen/技術書典3 か-46 @roentgen

今更だけどさっき教えてもらったこれをポチッた amazon.co.jp/dp/481630732X (どんなオプションがあるか気になってきた)

2017-12-31 23:10:37
リンク www.amazon.co.jp Ver.4 MS‐DOS版N88‐日本語BASICコンパイラハンドブック (ナツメ・ハンディ・リファレンス) | 戸内 順一 |本 | 通販 | Amazon Amazonで戸内 順一のVer.4 MS‐DOS版N88‐日本語BASICコンパイラハンドブック (ナツメ・ハンディ・リファレンス)。アマゾンならポイント還元本が多数。戸内 順一作品ほか、お急ぎ便対象商品は当日お届けも可能。またVer.4 MS‐DOS版N88‐日本語BASICコンパイラハンドブック (ナツメ・ハンディ・リファレンス)もアマゾン配送商品なら通常配送無料。
roentgen/技術書典3 か-46 @roentgen

前職を離れて以来、合法のリバースエンジニアリングに飢えていた(たまに必要があっても一瞬で終わるやつばかり)のも理由のうちだけど、まぁ安いので非公開で出し直してもらいました(請けると金額がバレるっぽかったので) twitter.com/dmikurube/stat…

2018-01-01 00:16:24
Dai MIKURUBE @dmikurube

これは…単に興味深いが、たしかにあの値段でやる解析でもないな… twitter.com/roentgen/statu…

2018-01-01 00:10:57

roentgen/技術書典3 か-46 @roentgen

さて BASIC の話。今回請けるにあたってちょっと書いてみたら意外と覚えていた。でも「ああ、こういうクソ言語だった」ってことも思い出した。

2018-01-01 01:13:32