无论如何,这里有一个示例可以更好地理解我的问题。
假设我有3个IDA为我命名的功能:
sub_00543210
sub_00543211
sub_00543212
稍后在分析过程中,我找出了两个功能的名称。
foo_bar1
sub_00543211
foo_bar3
至此,我要说的是,第二个函数的名称与找到的函数名称包围着,肯定与“ foo”有关,因此我将其命名为“ foo_bar2 ”。 (后来证明是真的。)
这是一个有效的假设,还是这是一个特殊的场合?
#1 楼
通常,您会在二进制文件中看到类似的模式。当然,不能以任何方式保证它,但是您通常会看到类似的函数彼此靠近放置。那是什么意思?好好考虑一下如何布置典型的C程序:
foo.c
static foo_1()
static foo_2()
use_foo()
bar.c
static bar_1()
static bar_2()
use_bar()
main.c
usage()
process_args()
main()
人们通常通常将每个C文件本身(编译成.o)编译,然后将这些目标文件链接起来一起形成最终的二进制文件。大多数情况下,链接器不会重新排列功能。因此,这就是为什么您可以期望彼此看到相似或相关的功能的原因。
此外,这对于二进制文件静态链接的库也是如此。如果IDA FLIRT签名匹配,则经常会看到这些标准库函数彼此相邻。
当您找到标准压缩/加密/ xml /任何函数时,这一事实确实有帮助,因为在大多数情况下,您可以提取源代码并快速开始识别其余的库调用(或至少知道可以忽略哪些函数)。
#2 楼
通常,链接器将按原始顺序保留功能。但是,工作集调整(另请参见配置文件优化)之类的技术可以对程序进行配置文件,以查看最常调用哪些部分,然后将其重新链接到该信息。这会将最常用的代码聚在一起(不仅对函数进行重新排序,而且还可能将它们分成单独的块)以进行内存分页,并且当然会将原始函数扔出窗口。
评论
谢谢你的回答。我的第二个问题与您的答案有某种关系:)
–多米尼克·安塔尔(Dominik Antal)
2013年12月12日下午6:15