我对逆向工程二进制文件还比较陌生,在使用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;
}
是通过以下反汇编创建的:具有“ unaff_”前缀的未定义类型,该类型已分配给相等数量的带有“ in_”前缀的变量。它们通常也出现在调用程序功能的开头。我的直觉是,它与类结构有关(我不确定原始二进制文件是C还是C ++),但是鉴于我的搜索没有运气,我想在这里问。 br />会产生这种反编译代码的通用代码模式是什么(如果有的话)?
#1 楼
这是符合PPC EABI的编译器使用的辅助功能,用于减小代码大小。来自ctrsavres.asm
:/* Routines for saving integer registers, called by the compiler. */
/* Called with r11 pointing to the stack header word of the caller of the */
/* function, just beyond the end of the integer save area. */
由于它是由编译器调用的,因此它的行为与正常函数不同,可以直接访问
r11
,而无需先对其进行设置(由调用者进行设置)。 br />评论
有趣。是否有任何设置可以更优雅地显示此内容?看到它似乎有点怪异,但这也许只是意料之中的。
–那家伙
7月7日,1:12
#2 楼
关于unaff_和in_前缀(源):in或unaff:这通常表示在写入寄存器之前已对其进行读取
(并且该寄存器不包含参数因此,如果在反编译器中遇到它们,则意味着它们的值在函数中初始化之前就已使用(它们包含先前分配的值,在先前的函数之一中) 。要解决此问题,您可以将这些寄存器添加为该函数的参数(右键单击->
edit function signature
)。您可以在此处和此处看到更多详细信息。对于所需的模式,ARM中的
r11
寄存器(我想这是二进制的体系结构)用于访问放置在堆栈上的局部函数变量。因此,似乎您的函数(可能是6-参数构造函数)初始化了某个类(具有6个成员),该类是原始代码中某些局部变量的类型(在调用者函数中声明)。评论
很好啊。听起来很正确。我相信此二进制文件的体系结构是PowerPC。不知道它有什么相似/不同之处。
–那家伙
6月24日下午1:55
我懂了。因此,至少我答案的第一部分是有效的。拆卸应加以澄清。
–bart1e
6月24日下午6:15
编辑以显示反汇编
–那家伙
6月24日23:41
评论
请分享创建此反编译代码的反汇编@macro_controller这样做的最佳方法是什么?编辑我的问题或使用外部站点(例如pastebin)?
编辑您的问题
您是否可以添加更多的拆卸线(直到返回指示)?如果可能,请使用文本(代码块)代替图片。您可以删除外部参照注释,它们在这里不重要,仅占用空间。
@IgorSkochinsky已更新为使用文本(而不是图片),并且现在包含更多行。