9

我不确定这是否可能,但给定一个可执行文件(foo.exe),其中有许多静态链接的库。

是否有任何软件可以从该文件中提取可执行文件中的 .lib(或 .a)?

谢谢。

4

3 回答 3

15

难以置信地不太可能,因为通常情况下,您不会将库的全部内容注入到您的可执行文件中。

您只能满足所有未定义的符号。这实际上可能只是库的一小部分。库通常由一组目标文件组成,其中只有那些需要的文件才链接到您的可执行文件中。

例如,如果您在 C 运行时库中调用的唯一内容是exit(),则您的可执行文件中不太可能包含printf()函数族。

如果您直接链接到目标文件,您可能会有机会,因为无论是否使用它们都会包含在内(除非您的链接器是智能的)。

但即使这样也将是一项艰巨的任务,因为可执行文件中可能没有关于哪些代码段来自特定目标文件的信息。这可能是可行的,但如果有另一种方法,我会先看看。

让我澄清一下典型的过程:

  1. 四个目标文件a.o、和分别包含函数b.o、和。它们都被添加到档案中。c.od.oa()b()c()d()abcd.a
  2. 除了b()调用c().
  3. 您有一个主程序调用a()b()编译它,然后将其与abcd.a库链接。
  4. 链接器拖出库并进入您的可执行文件,满足了对的需求a.o,但引入了对的需求,因为需要它。b.oa()b()c()b()
  5. 然后链接器c.o从库中拖出并进入您的可执行文件,以满足对c(). 现在所有未定义的符号都已满足,可执行文件已完成并除尘,您可以在准备好时运行它。

在该过程的任何阶段都没有被d.o拖到您的可执行文件中,因此您将其取出的希望为零。

更新:关于我在上面所做的“如果有另一种方式,我会先看那个”评论,您刚刚在对其他答案之一的评论中声明您拥有制作您想要提取的库的源代码. 我需要问:为什么你不能用那个源重建库?在我看来,这比尝试从一堆可执行代码中重新创建库要容易得多。

于 2009-11-13T12:37:15.253 回答
1

想象一下,有 10 本您不懂的语言的书,没有封面、标题页、页码和章节。有些书可能不完整。所有页面都混在一起,所以不可能找出每本书的开头和结尾。(每一页都是一个函数调用)现在尝试找到第 5 本书的第 123 页(假设上面提到了函数 Exit() )。

嗯,有可能……

于 2009-11-13T13:09:12.990 回答
-1

看来您要的是反编译器。这样的工具很难使用(对于稍微复杂的 C++ 来说可能是不可能的),如果有任何其他方法可以解决您的问题,包括花几个月的时间重写库,我建议您采取这种做法。

就像 pax 指出的那样,即使您确实使用了反编译器,您也只会获得可执行文件调用的库函数。

于 2009-11-13T12:48:20.517 回答