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