静态库中的函数依赖

逆向工程 二元分析 静态分析 编译器 二进制格式 图书馆
2021-06-12 17:07:52

我在另一个 SO 线程中阅读

对于静态库,复制的单位是库中的目标文件。

换句话说,如果两个程序从某个目标文件调用一个函数,那么两个程序最终都会得到可执行文件中的所有目标文件。

然而,上面的答案是从 2012 年开始的,我想知道更新的链接器是否提出了更智能的解决方案,即只将那些函数复制到实际需要的可执行文件中的解决方案(例如,因为其他函数依赖于它们)。

  • 是否有任何一般原因表明这不是一个好主意或不可能?
  • 有没有办法找出静态库中函数之间的依赖关系?链接器或链接过程是否提供此信息?

术语依赖是指某个库函数总是与另一个函数一起复制到可执行文件中的事实。

我的总体目标如下:

我有一个未知的二进制文件,但我知道它包含来自某个静态库的代码。我不知道图书馆的版本。我也知道这个可执行文件使用了这个静态库中的某个函数。我想知道可执行文件中还有哪些其他功能(无论是否实际使用)。

感谢您提供任何答案、评论或想法。

1个回答

您实际上在这里问了多个不同的问题:

【关于只静态链接库的几个函数】

是否有任何一般原因表明这不是一个好主意或不可能?

好吧,如果它是您的代码并且您知道自己在做什么(基本上是制作一个新库,它是第一个库的子部分),那么它可能是可能的,但除此之外,没有简单的方法来预测您要访问的目标文件的哪些部分在一般情况下使用。

有没有办法找出静态库中函数之间的依赖关系?链接器或链接过程是否提供此信息?

那真的取决于你的图书馆。在某些情况下可能是可能的,但在其他情况下则完全不可能。如果您的库足够简单且足够干净,那么它可能会很容易。

我有一个未知的二进制文件,但我知道它包含来自某个静态库的代码。我也知道这个可执行文件使用了这个静态库中的某个函数。我想知道可执行文件中还有哪些其他功能(无论是否实际使用)。

那是完全不同的问题!我不确定我是否完全理解您的问题,因为如果您知道链接了哪个静态库,您就已经知道整个库都在您的二进制文件中并且基本上可以访问。然后,您可以使用常用工具(FLIRT 签名、Diaphora、Rizzo 等)传播此信息。

如果您知道该库,但不知道确切的版本,则通常必须设计一个启发式方法,以便将二进制文件中的 lib 与该库的多个版本进行比较。(如果您只有源代码,这也可能取决于您对编译参数的猜测)。

如果您对正在使用的库一无所知,我想您只需要盲目猜测或扭转整个事情。