在编译代码中,有时会发现一些指令并不直接代表程序员编写的代码,而是由编译器为了自身目的或程序执行环境的要求而添加的。
可跳过指令的种类
编译函数通常在开始时有序言指令,用于执行各种记录操作,例如:
-
保存函数体中使用的易失性寄存器; -
为当前函数设置新的栈帧; -
为局部栈变量分配栈空间; -
初始化栈饼干以检测缓冲区溢出; -
为当前函数设置异常处理程序。
类似地,函数的尾声在返回给调用者之前执行相反的操作。
在切换模式中,也可能有一些指令仅用于执行额外的操作以确定间接跳转的目标,并不代表代码的实际逻辑。
为了不浪费时间分析这些样板或不感兴趣的代码,并仅显示函数的“真实”主体,反编译器依赖于处理器模块来标记这些指令。
显示可跳过的指令
默认情况下,跳过的指令在视觉上没有任何区别。要启用它们的可视化效果,可以创建一个名为idauser.cfg
的文本文件,内容如下:
#ifdef __GUI__
PROLOG_COLOR = 0xE0E0E0 // 灰色
EPILOG_COLOR = 0xE0FFE0 // 浅绿色
SWITCH_COLOR = 0xE0E0FF // 粉色
#endif
将文件放在用户目录中(Windows上为%appdata%Hex-RaysIDA Pro
,Unix上为$HOME/.idapro
),然后重启IDA或重新加载数据库以在反汇编列表中观察效果。
原始反汇编:
创建配置文件后:
如你所见,前面三条和最后两条指令以指定的颜色高亮显示。这些指令将在反编译过程中被跳过。
修改可跳过的指令
有时你可能需要调整IDA对跳过指令的判断。例如,IDA可能未能将某些寄存器保存标记为序言的一部分(这可能表现为伪代码中对未初始化变量的访问)。在这种情况下,你可以手动修复:
-
在反汇编视图中,选择应标记的指令; -
调用编辑 > 其他 > 切换可跳过指令…; -
选择类别(序言/尾声/切换)并点击确定。
如果出现相反的问题(IDA错误地标记了一些必要的指令),执行相同的操作,除了在步骤3中不会有对话框——指令将直接被取消标记。
更多文章
立即关注【二进制磨剑】公众号
原文始发于微信公众号(二进制磨剑):IDA 技巧(68) 可跳过指令
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论