二进制中的某些指令不属于某个功能,或者IDA无法恢复一个功能。例如,请参见下面的屏幕快照中的红色地址。

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

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

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

您看到此方法的任何可能的缺点吗?



#1 楼

取决于您所谓的劣势。这种代码残留通常是源代码中提供的一个函数导致的,但是从来没有被调用*,因此IDA并未为其分配名称。在这种情况下,您:


通常不希望在分析中包含该函数,因为程序从不使用它
可以搜索更长的序列哪些未使用的功能**,它们可能会识别意外链接的整个源文件,但未在程序中使用
可以将这些功能的空间用于“增强”程序功能的代码陷阱例如,有时我会将它们用于记录一些中间值的一系列open / write / close调用。

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

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

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

评论


好点子。您的回答证实了我的假设,即“创建函数”纯粹是IDA内部的事情。我的意思是,它不更改任何指令,符号,变量等。它也不应该更改任何外部参照,因此也不应对静态控制流分析产生任何影响,对吗?还是我错过了什么?

– gogo_gorilla
15年5月28日在7:23



#2 楼

还有一点可能是有问题的。
在某些平台上,IDA有时无法正确识别代码区域,并且将数据定义为复杂功能或完全复杂的代码。将此代码定义为函数可能会将其插入自动分析队列,并且该错误识别的代码中所有错误定义的引用都可能破坏其他功能。使用混淆代码时,也会发生此问题。不幸的是,正如@Guntram Blohm所说的那样,间接调用的函数可能无法这样识别,因此仍然需要解决此问题的方法。我建议使用更好的算法来创建此类函数:
不要将每条指令都自动转换为函数。
相反,请查找所有函数序言(例如,在图片中插入2个类似的函数) ,并尝试创建一个只能识别此序言的函数。

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

评论


IIRC插件IDAScope在这方面做得很好

–卡洛斯·加西亚(Carlos Garcia)
15年5月28日在17:20

@w s:可以肯定的是,创建函数不会更改指令,符号,变量等,对吗?它会更改IDA生成的外部参照吗?

– gogo_gorilla
15年5月29日在18:57

@stackoverflowwww它可能会更改指令和外部参照。使用混淆代码时,这尤其成问题。

– w s
2015年5月31日下午5:26

@ws您能给我一个指向何时,为什么以及可能添加哪些外部参照的更多信息的链接吗?也许甚至是一个例子?还是我应该打开一个新问题?

– gogo_gorilla
15年5月31日在6:45