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。因此,第三行中加载的地址不正确。我已经仔细检查了输入文件是否相同,并且我知道IDA是正确的文件,因为此特定游戏的游戏代码会修改该地址。
我什至在十六进制编辑器中确认该字节应为0x76,但在Ghidra自己的十六进制输出中,该字节显示为0xEC。因此,在输入期间,由于某种原因,它会将其加倍。
那么Ghidra这么做的原因是什么?我尝试重新加载文件并作为通用MIPS进行分析(认为这是我使用的PS2 ELF加载器),并且执行了相同的操作。
所以我做了一些测试,当我剥离ELF时标头并将文件作为原始二进制文件加载,然后Ghidra正确加载。所以我想知道ELF标头中的什么会导致Ghidra修改该字节?
#1 楼
这与Ghidra处理重定位的方式有关。在禁用以下处理器选项和重定位的情况下加载SLUS_204.99
二进制文件。Processor: MIPS
Variant: 64-32addr
Size: 32
Endian: little
Compiler: default
反汇编与IDA相同。
使用
readelf
表示在该地址存在R_MIPS_26
类型的重定位。 />因此,在处理R_MIPS_26
类型的重定位的代码中可能会出现错误。
评论
我对mips格式并不完全熟悉,但是您检查过堆栈大小吗?还可以期待吗?可以共享文件吗?
由于它已受版权保护,所以我认为我不能上传它。但这是PS2的《火龙之息呼吸区》的主要可执行文件。游戏光盘根目录上的文件名为SLUS_204.99。 PS2游戏是光盘上的标准ELF,但我之所以特别使用它,是因为它们出于某种原因将调试符号保留在可执行文件中。