2015年10月24日土曜日

HSPdecoを利用したHSPプログラム(Elona)の逆コンパイル

Elonaの解析を行うため、HSPdecoを用いて逆コンパイルを行いました。

必要なもの
HSPdeco 1.00 と 最新版のDictionary.csv (10/25更新)
またはHSPdecom 1.00(12/15の追記参照)
HSPdecomの場合は、最新版のDictionary.csvは不要です。

注意
HSPdecoに付属のDictionary.csvは古く、一部の命令を認識できないため、最新のElonaではエラーが出ます。
たとえば、Elona omake overhaul 2015/07/19の場合、start.hsp.logには以下のように出力されます。
000001行:deHSPの出力する#structはHSPの公開されている言語仕様には含まれません
127579行:式:不適切な要素を検出
265648行:式:不適切な要素を検出
270995行:式:不適切な要素を検出
271039行:式:不適切な要素を検出
271106行:式:不適切な要素を検出
272734行:式:不適切な要素を検出
そのため、Dictionary.csvを最新版に差し替えておく必要があります。
最新版へのリンクはすでに上に示しました。

手順
例としてomake_overhaul.exeを逆コンパイルします。

  1. HSPdeco.exeと同じフォルダにあるDictionary.csvを、最新版のDictionary.csvに置き換える
  2. HSPdecoを起動し「ここにドロップしてください」と書かれている部分に「omake_overhaul.exe」をドラッグ&ドロップすると解析が始まる
  3. 解析終了後「omake_overhaul.exe」が置いてあるフォルダに「omake_overhaul」という名前のフォルダが作られていることを確認する
  4. 「omake_overhaul」フォルダ内のstart.axを、再度HSPdecoにドラッグ&ドロップする
  5. 解析終了後、start.axと同じフォルダに逆コンパイルされたソースコードstart.hspができている
雑記
  • 最新版のDictionary.csvを使ってもstart.hsp.logに以下のように出力されるけど気にしないでいいよね…(HSPあんまりわからない)。
000001行:deHSPの出力する#structはHSPの公開されている言語仕様には含まれません
  • 逆コンパイルされたソースコードを、HSPで再々?コンパイルした結果、(少なくとも見かけ上は)動作しました。一部ヴァリアントはこのようにして作っているものと思われます。
  • HSPの過去バージョンは以下のリンクからダウンロード可能です。たとえばoomは3.31b3.5b2で制作されているらしいです(readmeより)。
    http://www.onionsoft.net/hsp/file/

参考
Dictionary.csvは下のサイトのものを利用させて頂きました。
CSSの問題?でページが真っ白になるのでview-sourceから引っ張ってきました。

逆コンパイルの手順は下のサイトを参考にさせて頂きました。
http://elona.wikiwiki.jp/?%3A%B2%F2%C0%CF%2F%B2%F2%C0%CF%A4%D8%A4%CE%C6%BB



10/25追記
Elona omake overhaul modify (oom)は、HSP 3.5b2で制作されているため、ヴァリアントwikiで公開されているDictionary.csvでは古すぎるようです。そのため、私の方で新しい命令を追記したものを、上のリンクで公開しました。

12/15追記
HSPdecom1.00を公開しました。
これは、HSPdeco1.00を改良したもので、変数名の復元を行います。

以下詳細
axファイル内のデバッグ領域には、変数名や行数などのデバッグに必要な情報が記録されています。
この情報は通常、リリース段階で取り除かれるのですが、作者さんが変数名をあえて残してくれることがあるらしいです。

ところが、HSPdecoではデバッグ情報の有無に関わらず、変数名はすべてvar_***の形で逆コンパイルされます。
HSPdecomでは、デバッグ情報から変数名を読み取り、逆コンパイル時に復元するようにしました。

参考
http://jbbs.shitaraba.net/bbs/read.cgi/game/58103/1438401066/950-954
http://www.onionsoft.net/hsp/v33/hspsdk/hsp3code.txt

1 件のコメント:

  1. とてもありがたく使わせてもらっているのですが、oomの逆コンパイルをしようとすると、#func と、それで定義された命令名が出力されないようです。
    対応していただけるとありがたいです。

    返信削除