なぜ編集する必要があるのか
HSP3の実行ファイルのデコンパイルは簡単で、公開されているデコンパイラ
https://github.com/YSRKEN/HSP-Decompiler
に実行ファイルを投げるだけで完了します。
ですが、場合によってはデコンパイルに失敗したり、内容が難読化されていて部分的な処理に手を加えるだけなのにそれが出来ない、という事態に陥ります。
(/*09 20 004E*/
とかになる場合はhttps://github.com/onitama/OpenHSP/blob/master/src/hspcmp/hspcmd.cpp を参考にしながらDictionary.csvを編集するだけで動きますが)
それなら必要な部分だけ編集しよう、ということです。
また、axファイルを編集することでデコンパイルの対策にもなります。
axファイルの構造
編集する
if文の条件式を変える
こんなプログラムを用意します
#module
#defcfunc check int p1, int p2
return p1 - p2
#global
if check(30, 29) == 1{
mes "Oops!"
}else{
mes "flag{cool}"
}
これからaxファイルを生成すると
こんな感じになります。
このままだとOops!が表示されてしまうので条件式を変えます。
=の命令コードは08なのでこれを!である09に変更します。
場所は0xB8ですね。
axファイルを編集したらレガシーツールからPACKFILEを編集してstart.axファイルを入れます。
そしてレガシーツールから実行ファイルを生成すると
無事にflagが入手できました。
(axファイルが編集できる時点で中の文字列が全部見えるけど)
関数名を変更する(主にデコンパイル対策)
つぎにaxファイルを編集してデコンパイラを使った場合に出力される関数名を変更してみます。
上と同じプログラムを利用します。
元のaxファイルはこんな感じです。
この"check"という文字列を同じ長さの"color"に変更して、実行ファイルを生成してみます。
このファイルを実行すると
結果は変わりませんが
goto *label_1
#defcfunc color int prm_0, int prm_1
return prm_0 - prm_1
*label_1
if ( color(30, 29) == 1 ) {
mes "Oops!"
}
else {
mes "flag{cool}"
}
デコンパイルすると関数名がcolorになっていることが分かります。
勿論、"color"という名前の色を指定する命令が既にあるので、コンパイルしようとしてもエラーが発生します。