我不确定这是否可行,但是给定了一个可执行文件(foo.exe),其中有许多已静态链接的库。
是否有任何软件从此文件中提取可执行文件中的.lib(或.a)?
感谢。
答案 0 :(得分:15)
由于通常不会将库的全部内容注入到您的可执行文件中,所以非常不可能。
您只能满足所有未定义的符号。这实际上可能只是图书馆的一小部分。库通常由一组目标文件组成,只有那些目标文件才链接到您的可执行文件中。
例如,如果您在C运行时库中调用的唯一内容是exit()
,那么您的可执行文件中不太可能有printf()
个函数系列。
如果你直接链接到目标文件,你可能有机会,因为无论是否使用它们都会被包括在内(除非你的链接器很聪明)。
但即使这样也是一项艰巨的任务,因为可执行文件中可能没有关于哪些代码段来自特定目标文件的信息。这可能是可行的,但是,如果有另一种方式,我会首先看一下。
让我澄清一下典型的过程:
a.o
,b.o
,c.o
和d.o
包含a()
,b()
,c()
函数和d()
分别。它们所有已添加到abcd.a
存档。b()
调用c()
之外,它们都是独立的(没有依赖关系)。a()
和b()
的主程序,然后编译它,然后将其与abcd.a
库链接。a.o
和b.o
拖出库并进入您的可执行文件,满足a()
和b()
的需求,但需要c()
},因为b()
需要它。c.o
拖出库并进入您的可执行文件,满足c()
的需要。现在所有未定义的符号都已满足,可执行文件已完成并且已粉碎,您可以在准备就绪时运行它。在该过程的任何阶段都d.o
被拖入您的可执行文件中,因此您没有希望将其删除。
更新:重新“如果有另一种方式,我会看到我上面提到的第一个”评论,你刚才在评论中说过一个你有其他答案的答案,你有源代码,使你想要提取的库。我需要问一下:为什么你不能用这个源重建库?在我看来,这比尝试从可执行代码的混乱中重新创建库更容易。
答案 1 :(得分:1)
想象一下,你有10本书不懂,没有封面,标题页,页码和章节。有些书可能不完整。所有页面都被混合在一起,因此无法找出每本书的开头和结尾。(每个页面都是一个函数调用)现在尝试查找第5册的第123页(比如上面提到的函数Exit() )。
嗯,这是可能的......
答案 2 :(得分:-1)
好像你要求反编译器。这些工具很难使用(对于稍微复杂的C ++来说可能是不可能的),如果有任何其他方法可以解决您的问题,包括花几个月时间重写库,我建议采取行动。
就像pax指出的那样,即使您使用了反编译器,您也只能获得可执行文件所调用的库函数。