2009-11-13 60 views
8

我不確定這是否甚至可能,但給出了一個可執行文件(foo.exe),並且有很多靜態鏈接的庫。從可執行文件中提取靜態鏈接的庫

是否有任何軟件從該文件中提取位於可執行文件內的.lib(或.a)?

謝謝。

回答

15

令人難以置信的可能性不大,因爲通常情況下,您不會將注入庫的全部內容注入到可執行文件中。

你只得到足以滿足所有未定義的符號。這實際上可能只是圖書館的一小部分。庫通常由一組目標文件組成,其中只有那些需要的文件被鏈接到可執行文件中。例如,如果您在C運行時庫中調用的唯一東西是exit(),那麼在可執行文件中很可能不會有printf()函數系列。

如果你直接鏈接到目標文件,你可能會有機會,因爲無論是否使用它們(除非你的鏈接器是一個聰明的鏈接器)。

但即便如此,這也將是一項艱鉅的任務,因爲可執行文件中可能沒有關於哪些代碼段來自特定對象文件的信息。這可能是可行的,但如果還有其他方法,我會先看看。

讓我澄清一下典型的過程:

  1. 四個目標文件,a.ob.oc.od.o包含的功能分別a()b()c()d()。他們將全部添加到abcd.a存檔中。
  2. 除了b()調用c()之外,它們都是獨立的(沒有依賴關係)。
  3. 您有一個主程序,它調用a()b(),然後編譯它並將其與abcd.a庫鏈接。
  4. 鏈接器拖動a.ob.o出庫和你的可執行文件,滿足了a()b()的需要,但將需要c(),因爲b()需要它。
  5. 然後,鏈接程序將c.o拖出庫並放入可執行文件中,以滿足對c()的需求。現在,所有未定義的符號都已滿足,可執行文件已完成並已粉碎,您可以在準備就緒時運行它。

在這個過程中沒有任何階段是d.o拖入您的可執行文件,所以你沒有希望得到它。

更新:的Re 「如果有另一種方式,我會看,首先」評論我上面做,你剛纔的評論表示您所擁有的源其他的答案之一代碼,使你想要提取的庫。我需要問:爲什麼你不能用該源重建庫?這似乎比嘗試從可執行代碼的重現中重新創建庫要容易得多。

+0

該方案由上有幾個自定義對象的文件,將其鏈接到一個單獨的定製庫文件,以及庫可執行文件裏面靜態鏈接。 如果所有庫都是自定義庫,那麼它們不是「完全嵌入」到可執行文件中嗎? 其實我不想得到源代碼,我只想得到庫文件。 – HyLian 2009-11-13 12:46:27

+0

如果庫中的每個對象文件都需要滿足所有未定義的符號,那麼是的,它們都會在那裏。但事實並非如此。 – paxdiablo 2009-11-13 12:53:49

+0

讓我們退後一步。爲什麼你沒有.sl/.a文件? – paxdiablo 2009-11-13 12:54:50

-1

這似乎是你要求一個反編譯器。這些工具很難使用(對於溫和複雜的C++來說可能不可能),並且如果有任何其他方式來解決您的問題,包括花幾個月時間來重寫這些庫,我會推薦這種行爲方式。

就像pax指出的那樣,即使你確實使用了反編譯器,你也只能得到可執行文件調用的庫函數。

+0

但我不想完全反編譯可執行文件,我不需要源代碼,我需要的是在該可執行文件中鏈接的庫文件,並將另一個不同的可執行文件與該庫鏈接。 – HyLian 2009-11-13 12:51:18

+0

你有庫的頭文件嗎? – 2009-11-13 13:08:34

+0

是的,實際上我擁有生成這些庫的所有源代碼。 – HyLian 2009-11-13 13:52:04

1

想象一下,有10本書的語言你不明白,沒有封面,標題頁,頁碼和章節。有些書可能不完整。所有的頁面都被混洗在一起,所以不可能找出每本書的開始和結尾在哪裏(每一頁都是一個函數調用)現在試着找到第5冊的第123頁(假設它是上面提到的函數Exit() )。

嗯,這是可能的...

+0

而且您有第5本書的原稿。絕對容易從原稿中重新打印第5本書。 – 2009-11-13 15:26:12

相關問題