我正在浏览一些 PS2 ELF,我发现了一个奇怪的问题,其中 Ghidra 似乎出于某种原因将该字节的值加倍。
以下是 Ghidra 展示的内容:
undefined Money_get()
undefined v0_lo:1 <RETURN>
Money_get XREF[1]: Entry Point(*)
001bcb90 ec 00 01 3c lui at,0xec
001bcb94 98 00 03 3c lui v1,0x98
001bcb98 e8 aa 25 8c lw a1,-0x5518(at)=>DAT_00ebaae8
以及 IDA 显示的内容:
main:001BCB90 Money_get: # CODE XREF: plmove_find_02+178↑p
main:001BCB90 # Item_get+70↑p
main:001BCB90 lui $at, 0x76
main:001BCB94 lui $v1, 0x98
main:001BCB98 lw $a1, 0x7657A8
IDA 显示的是正确的反汇编。第一行应该是
lui $at, 0x76
但出于某种原因,Ghidra 已将 0x76 加倍到 0xEC。因此,第 3 行加载的地址不正确。我已经仔细检查过输入文件是否相同,我知道 IDA 是正确的,因为这个特定游戏的 gameshark 代码修改了该地址。
我什至在十六进制编辑器中确认该字节应该是 0x76,但在 Ghidra 自己的十六进制输出中,它显示为 0xEC。因此,在输入期间,出于某种原因,它会加倍。
那么 Ghidra 这样做的原因是什么?我尝试重新加载文件并作为通用 MIPS 进行分析(认为它是我使用的 PS2 ELF 加载器)并且它做了同样的事情。
所以我做了一些更多的测试,当我去除 ELF 标头并将文件作为原始二进制文件加载时,Ghidra 正确加载它。所以我想知道 ELF 标头中的什么会导致 Ghidra 修改该字节?