是否可以根据函数在二进制文件中的位置对它们进行分组?我是否可以假设每个其他对象旁边的功能属于同一逻辑组,或者至少它们具有相似的功能?我怀疑函数的顺序/布局是在编译时决定的,但是我仍然不知道到底该控制什么。

无论如何,这里有一个示例可以更好地理解我的问题。
假设我有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 /任何函数时,这一事实确实有帮助,因为在大多数情况下,您可以提取源代码并快速开始识别其余的库调用(或至少知道可以忽略哪些函数)。

评论


谢谢你的回答。我的第二个问题与您的答案有某种关系:)

–多米尼克·安塔尔(Dominik Antal)
2013年12月12日下午6:15

#2 楼

通常,链接器将按原始顺序保留功能。

但是,工作集调整(另请参见配置文件优化)之类的技术可以对程序进行配置文件,以查看最常调用哪些部分,然后将其重新链接到该信息。这会将最常用的代码聚在一起(不仅对函数进行重新排序,而且还可能将它们分成单独的块)以进行内存分页,并且当然会将原始函数扔出窗口。