Osegi
ソフトウェア·2 分で読めます

Borland C++ 2.0のソースをBCC.EXEから復元、バイト単位で一致

Borlandが公開しなかったBorland C++ 2.0のソースを、1991年のバイナリから復元。元のツールで再ビルドするとBCC.EXEが完全一致するという。

A vintage DOS screen showing a Borland C++ 2.0 command-line compiler prompt next to lines of recovered C source code.
画像: Хабр

Borland C++ 2.0のソースコードは、Borlandから公開されたことがありません。そのソースを、1991年のコンパイラ自身のバイナリから復元したプロジェクトが「borland-reborn」です。Borland純正のツールチェーンでビルドすると、BCC.EXEは元のファイルとバイト単位で一致し、SHA-256も同じになります。

リポジトリには15のサブシステムに分かれた298個のソースファイルがあります。内訳はCが265ファイル(Borland C++ 2.0とTurbo C 2.01)、手書きのTASMモジュールが33です。元のCとアセンブラの区分はそのまま保たれています。アセンブラを無理にCへ書き直すことも、コンパイル済みのCをアセンブラのまま残すこともしていません。単体のプリプロセッサCPP.EXEも同様に一致します。

どうやってバイナリからソースを戻したのか

まずコンパイラとそのオプションを突き止めました。BCC.EXEはBorland C++ 2.0本体と、手書き部分用のTASM 2.51、オーバーレイ管理VROOMM付きのTLINK 4.0で作られています。関数が一致するのは、コンパイラ、バージョン、全オプション(-mm -G -O -Z -p、オーバーレイ部分は-Y)が正しいときだけです。この過程で、ライブラリの29モジュールはTurbo C 2.01で作られていたことも分かりました。

次に関数を1つずつ調整し、全バイトが合うまで繰り返しました。人が読める形にしたのはその後です。約3100個の名前と、約1万行のコメントを付けています。変更はすべて同じバイト一致の検査を通します。

Borland C++自体のバグも見つかった

作業中に、元のコンパイラの不具合も出てきました。strrchrは空文字列の直前の1バイトを読みます。プリコンパイル済みヘッダファイルで解放した領域は再利用されません。パーサーはyaccを使わず、再帰下降と演算子優先順位の式パーサーで手書きされています。

Borlandの元プログラムはリポジトリに含まれず、再ビルドには配布版を自分で入手する必要があります。プロジェクト独自のスクリプトはMITライセンスで、復元ソースは著作権のあるBorlandのプログラム由来のため、研究と保存の目的で公開されています。

注目のアプリ

SUMO:数字パズル

正しいマスを選んで足し算、目標の数に。覚えるのは簡単、極めるのは難しい。無料、全年齢向け。

Dialo:話して学ぶ語学アプリ

AIの会話パートナーと話すだけ。一文ごとに添削され、あなたの言語で解説が返ってきます。9言語、A1からC2まで。

タグ:borland c++borland-rebornreverse engineeringdecompilationretrocomputingexhume

同じ日のニュース

すべて見る →

関連カテゴリ: ソフトウェア

すべて見る →