21/11/14 07:57:39.40 4LzObxJP.net
香港版のEXEFSが抽出出できるという話は置いといて
その中のmainファイル(NSO形式)をnx2elf.exeなどを使ってmain.elf(ELF形式)に変換する
main.elfをバイナリエディタなどで覗きヘッダーを読み取ってプログラムコード(.text)の開始アドレスを調べる
よくわかんなかったらメガテン5なら多分アドレス0x48にLEで開始アドレス(日本版v1.0.0なら0x888)が入っている
バイナリエディタで上で調べたアドレス+コードのアドレス付近のバイナリ値をメモる
同様に抽出変換した移植先(日本版v1.0.1?)のmain.elfをバイナリエディタで開きメモッた値で検索する
検索でヒットしたアドレス - 移植先のプログラムコード(.text)の開始アドレスの値でコードのアドレスを書換える
注意点
メモった値に分岐命令などアドレスを含む命令が入っていると検索してもヒットしないことがある
→コード付近の相対アドレスが解れば良いので他の付近のバイナリ値をメモる
コード命令自体の箇所に修正が入った(レアケース)
→逆アセして対応する
コード命令がワークコードへ分岐する命令を含んでいる
→まず移植先の分岐命令のアドレスを上記方法で求めて書換える
値も新たなワークコードアドレス(.rodata開始アドレスの前の空きが手っ取り早い)への分岐命令に書換える
ARM64のアセンブラコード⇔16進数コード値はWEBで変換かけてくれるところとかもある
移植前のワークコードのアドレスを新たなワークコードアドレスへ書換える
その他にも上記方法では無理なケースが色々考えられる