IDA Pro:“创建函数”的副作用或缺点

逆向工程 艾达 拆卸 蟒蛇 静态分析
2021-06-20 06:47:28

二进制文件中的某些指令不属于函数,或者,IDA 无法恢复。例如,请参见下面屏幕截图中的红色地址。

然而,您可以右键单击此类“无功能”地址并Create function从菜单中选择(请参见下面的屏幕截图)。

从“无功能”指令创建功能是否有任何副作用?例如,它是否更改指令、符号、变量等?它是否会更改 IDA 生成的外部参照,从而对静态控制流分析产生影响?

我问是因为我必须使用一种只能处理属于函数的指令的算法。我的想法是遍历二进制文件并继续创建函数,直到所有“无函数”指令都属于一个函数。

您是否看到这种方法的任何可能的缺点?

在此处输入图片说明

2个回答

取决于你所说的劣势。这种代码残留通常是由源代码中存在但从未被调用过的函数引起的,因此 IDA 没有为其分配名称。如果是这种情况,您:

  • 通常不想在您的分析中包含该函数,因为该程序从不使用它
  • 可以搜索更长的未使用函数序列**,这可能会识别意外链接但未在程序中使用的整个源文件
  • 可以将这些函数的空间用于“增强”程序功能的代码洞;例如,我有时将它们用于记录一些中间值的一系列打开/写入/关闭调用。

您通过使未使用的函数成为真正的函数来破坏这一点,这对您的用例可能重要也可能不重要。

(*) 但是,该函数可能是类方法,从vtable中引用,但从未直接调用,误导IDA

(**) 如果您有两个函数aand b,这两个函数都不会从外部a调用b但是调用,IDA 仍然会给出b一个sub_名称,这会干扰识别未使用的函数

还有一点可能有问题。有时在某些平台上,IDA 无法正确识别代码区域,将数据定义为复杂函数中的代码或根本不复杂的代码。将此代码定义为函数可能会将其插入自动分析队列,并且来自此错误识别代码的所有错误定义的引用可能会破坏另一个函数。使用混淆代码时也会出现此问题。

不幸的是,正如@Guntram Blohm 所说,间接调用的函数可能不被识别,因此仍然需要解决此问题。我建议使用更好的算法来创建此类函数:不要将每个指令转换为自动函数。改为查找所有函数序言(例如,在图片上的函数中进行 2 次推送),并尝试创建一个只能识别此序言的函数。

它可以通过使用idc.MakeFunction(prologue_address)没有第二个参数的函数来使用 IDAPython 来完成在这种情况下,IDA 将尝试自动定义函数边界。