如果这是重复的,请道歉。不知道要搜索什么词,因为这就是问题所在。
我对逆向工程二进制文件比较陌生,在使用 Ghidra 时,我注意到它经常反编译二进制文件以生成以下功能:
void FUN_803adb50(void)
{
int in_r11;
undefined4 unaff_r26;
undefined4 unaff_r27;
undefined4 unaff_r28;
undefined4 unaff_r29;
undefined4 unaff_r30;
undefined4 unaff_r31;
*(undefined4 *)(in_r11 + -0x18) = unaff_r26;
*(undefined4 *)(in_r11 + -0x14) = unaff_r27;
*(undefined4 *)(in_r11 + -0x10) = unaff_r28;
*(undefined4 *)(in_r11 + -0xc) = unaff_r29;
*(undefined4 *)(in_r11 + -8) = unaff_r30;
*(undefined4 *)(in_r11 + -4) = unaff_r31;
return;
}
这是从以下反汇编创建的:
* FUNCTION *
**************************************************************
void __stdcall FUN_803adb50(void)
assume GQR0 = 0x0
assume GQR1 = 0x0
assume GQR2 = 0x40004
assume GQR3 = 0x50005
assume GQR4 = 0x60006
assume GQR5 = 0x70007
assume GQR6 = 0x0
assume GQR7 = 0x0
assume r13 = 0x805dd0e0
assume r2 = 0x805e6700
void <VOID> <RETURN>
FUN_803adb50
803adb50 93 4b ff e8 stw r26,-0x18(r11)
**************************************************************
* FUNCTION *
**************************************************************
undefined GetVCTypeSomething()
assume GQR0 = 0x0
assume GQR1 = 0x0
assume GQR2 = 0x40004
assume GQR3 = 0x50005
assume GQR4 = 0x60006
assume GQR5 = 0x70007
assume GQR6 = 0x0
assume GQR7 = 0x0
assume r13 = 0x805dd0e0
assume r2 = 0x805e6700
undefined r3:1 <RETURN>
GetVCTypeSomething
803adb54 93 6b ff ec stw r27,-0x14(r11)
803adb58 93 8b ff f0 stw r28,-0x10(r11)
803adb5c 93 ab ff f4 stw r29,-0xc(r11)
803adb60 93 cb ff f8 stw r30,-0x8(r11)
803adb64 93 eb ff fc stw r31,-0x4(r11)
803adb68 4e 80 00 20 blr
它经常发生,它必须是某种常见的模式,总是带有许多带有“unaff_”前缀的未定义类型的变量,这些变量被分配给具有“in_”前缀的相同数量的变量。它们也通常出现在调用函数的开头。我的直觉是它与类结构有关(我不确定原始二进制文件是 C 还是 C++),但鉴于我的搜索没有运气,我想我会在这里问。
什么(如果有的话)会产生这种反编译代码的通用代码模式是什么?
如果有一种方法可以编辑函数定义以生成更清晰的内容,则可以加分。