但是,您可以右键单击这样的“无功能”地址,然后从菜单中选择
Create function
(请参见下面的屏幕截图)。从“无功能”指令创建功能是否有副作用?例如,它会更改指令,符号,变量等吗?它问是否会更改IDA生成的外部参照,从而对静态控制流分析产生影响?
我问是因为我必须使用只能处理属于某个功能的指令的算法来工作。我的想法是遍历二进制文件并继续创建函数,直到所有“无函数”指令都属于一个函数为止。
您看到此方法的任何可能的缺点吗?
#1 楼
取决于您所谓的劣势。这种代码残留通常是源代码中提供的一个函数导致的,但是从来没有被调用*,因此IDA并未为其分配名称。在这种情况下,您:通常不希望在分析中包含该函数,因为程序从不使用它
可以搜索更长的序列哪些未使用的功能**,它们可能会识别意外链接的整个源文件,但未在程序中使用
可以将这些功能的空间用于“增强”程序功能的代码陷阱例如,有时我会将它们用于记录一些中间值的一系列open / write / close调用。
您可以通过使未使用的函数成为实函数来破坏这一点,这对您可能或不重要用例。
(*)但是,该函数可能是类方法,该类方法是从vtable引用的,但从未直接调用,这会误导IDA
(** )如果您有两个函数
a
和b
,它们从不从外部调用,但是a
调用b
,IDA仍会给b
一个sub_
名称,这会干扰识别未使用的函数#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
评论
好点子。您的回答证实了我的假设,即“创建函数”纯粹是IDA内部的事情。我的意思是,它不更改任何指令,符号,变量等。它也不应该更改任何外部参照,因此也不应对静态控制流分析产生任何影响,对吗?还是我错过了什么?
– gogo_gorilla
15年5月28日在7:23