在分析常规且格式良好的二进制文件时,通常可以依赖IDA的自动分析来正确创建函数并检测其边界。然而,有时IDA的猜测可能需要调整。
不返回的调用
一个例子是调用不返回的函数。假设IDA误将一个函数检测为不返回:
但经过进一步分析,你意识到它实际上是返回的,并移除了不返回标志。然而,IDA已经在调用后截断了函数,现在你需要扩展它以包含调用后的代码。该怎么做呢?
重新创建函数
这可能是简单情况下最快的方法:
-
转到函数的起始位置(例如,通过双击函数列表中的函数),或通过按键序列 Ctrl
–P
,Enter
。 -
删除函数(从函数列表中),或 Ctrl
–P
,Del
。如果你在图形视图中,IDA将切换到文本视图。 -
再次创建它(从上下文菜单中选择创建函数…),或按 P
。
如果更改足以解决原始问题,这种方法效果很好。在逐个修复问题时,可能需要重复几次。请注意,删除函数可能会破坏附加在其上的一些信息(例如函数注释),因此这并不总是最佳选择。
编辑函数边界
编辑函数对话框有用于函数起始和结束地址的字段:
它们可以被编辑以扩展或缩小函数,但有一些限制:
-
新的函数边界不能与另一个函数或函数块相交。它们也不能跨越段边界。 -
函数起始必须是一个有效的指令。
请记住,结束地址是排他的,即它是函数最后一条指令之后的地址。
更改函数结束
要仅移动当前或前一个函数的结束,可以使用快捷键E
(设置函数结束)。如果当前地址有一个函数或块,它会被截断到刚好在当前指令之后。如果当前地址不属于一个函数,则最近的前一个函数或块会被扩展。如果扩展导致函数块紧邻在一起,它们会被合并。
例如,考虑这种情况:
红色矩形中的指令应该是函数的一部分,但它们目前是“独立的”(这也可以通过地址前缀的颜色看出,它是棕色而不是函数内指令的黑色)。为了使它们成为函数的一部分,我们可以将其结束移动到最后一个指令(0027FD6A
)。将光标放在那里并调用编辑 > 函数 > 设置函数结束(快捷键E
)将函数结束从0027FD44
移动到0027FD6A
。因为这使函数与其自身的块相邻,IDA将块与函数合并,函数扩展以覆盖所有新可达的指令。
原文始发于微信公众号(二进制磨剑):IDA 技巧(127)函数
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论