:解析/解析への道

Last-modified: 2022-08-24 (水) 13:43:49

警告:以下の文章はスポイラー、いわゆるネタバレです。
プレイの楽しみを損なう可能性があるので、一通りプレイしてからの閲覧を推奨します。
尚、ここで得た情報等をこの手の情報を扱っている場所以外で公言するのはマナーとしてお控え下さい。











ここの記載はHSPによるプログラミングやバイナリファイルの解析についての基本的な知識があることを前提としています。
書いてあることが分からない、書いてある通りにやった(つもり)のにうまくいかないなどの場合、あなたの知識が不足しているものと思われます。

用意しておくもの

(セーブデータを解析する場合)バイナリエディタ(Stirlingがお勧め)
(あったほうがいいもの)Elonaの変数について纏められたファイルAxfc UpLoader

exeの分解

elona.exeからstart.axを抽出する。

gochaさんのgithubアカウント[https://github.com/gocha/spihsp]で公開されているツール(spihsp)を使う。
start.axが取り出せたら成功。
後述の方法で楽に出来る。

逆コンパイル

start.axをstart.hspに逆コンパイルする。

きつつきさんの逆コンパイラが公開されている。ここではそれを使うことを前提とする。
上記のコンパイラを元に改良した、HSPdecoがある。これはexeの分解も簡単に行えるため、こちらを推奨する。
また、それをさらに改良したHSPdecomが[http://stpr18.blogspot.jp/2015/10/hspdecohspelona.html]で公開されている。こちらは変数名の復元も行える。

再コンパイル

start.hspをコンパイルする。

start.hspをelona.exeがあったフォルダにおき、HSP3でコンパイルする。
しかし、そのままではエラーが出て再コンパイルできない。

第一に、10万行目あたりで"if命令以外で{~}が使われています"というエラーがでてコンパイルが止まる。
エラーが出た場所を数十行さかのぼると

	else {
	}

という部分があるのでこれを消す。
(本来はelseを消せばいいというものではないようだが、正しい状態が何なのかがわからないのでとりあえず動けばよしとする。)
詳細はよくわからないが、HSPは

if(a){
	if (b) {
		x = 0
	}
	else{
		x = 1
	}
	else{
		y = 1
	}
else{
	y = 0
}

のようにifとelseの対応が怪しくてもコンパイルしてしまうらしく、そのようなstart.axを逆コンパイルすると再コンパイルできないソースになってしまうようだ。

余計なelseを消すとコンパイルは通るようになる。が、起動直後に固まってしまう。
これはdirinfo(1)が返すフォルダがelonaのフォルダではなくHSPのフォルダになっているからである。
ファイル中のdirinfo(1)をdirinfo(0)に置換する(計2か所)。

また、一部の動作がおかしい。
HSPのバージョンの違い(?)のせいでHMMBITCHECKの戻り値の符号がおかしい(?)らしい。
#defcfunc cbit と ibit, cdbitのHMMBITCHECK直後の return stat を return abs(stat) に書き換える(計三か所)。

以上でおそらく正常に動作する。

解析

がんばれ。