当你在反编译器中处理伪代码时,可能会注意到变量声明和提示中有一些内容略显神秘的注释。那么它们是什么意思呢?
虽然有些注释的含义显而易见,但有些则不那么明显,还有一些仅在罕见情况下出现。
变量位置
注释的第一部分是变量的位置。对于栈变量,这包括其相对于栈和帧指针的位置。对于寄存器变量,则是用于存储其值的寄存器。
在某些情况下,你可能还会看到分散的参数位置语法。例如:
struct12 v78; // 0:r2.8,8:^0.4
这表示一个12字节的结构体部分存储在寄存器中(前8个字节,从r2
开始),部分存储在栈中(后4个字节,从栈偏移8开始)。
变量属性
在位置之后,可能会有额外的属性以大写关键字形式打印。以下是最常见的可能性:
-
按引用传递
:该变量的地址在当前函数中被获取(例如用于传递给函数调用); -
重叠
:当反编译器未能将所有变量分开时显示,因此其中一些变量最终存储在交叉位置。通常具有此类变量的函数也会标记有注释:// 局部变量分配失败,输出可能错误!
-
映射目标
:另一个变量已被映射到此变量; -
强制
:这是一个明确强制的变量。 -
是参数
:用于函数参数(在鼠标提示弹出窗口中显示);
用户定义的注释
局部变量也可能有额外的用户定义的注释,可以使用/
快捷键或上下文菜单添加:
如果存在,它将在变量注释的末尾打印,位于注释之后。
类型注释
除了局部变量,反编译器还可以在提示中显示以下内容的注释:
-
结构体和联合体字段。显示偏移量和类型。 -
全局变量。仅显示类型。 -
函数和函数调用。打印参数列表及其位置:
更多文章
立即关注【二进制磨剑】公众号
原文始发于微信公众号(二进制磨剑):IDA 技巧(66) 反编译器注释
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论