簡體   English   中英

我可以從調試二進制文件重構C ++源代碼嗎?

[英]Can I reconstruct C++ source code from debug binaries?

我有一個在調試中編譯的C ++應用程序(使用MinGW和Qt),但是我失去了一些重大更改,因為我的團隊中有人忘記在源代碼管理器中提交他的更改並用其他更改覆蓋源代碼。

當我在debug中運行程序時(在Qt Creator中)我可以在main中設置一個斷點然后查看源代碼。

有沒有辦法只使用調試二進制文件重建丟失的所有源文件? 手動或自動。

謝謝!

當我在debug中運行程序時(在Qt Creator中)我可以在main中設置一個斷點然后查看源代碼。

真? 找出調試器從哪里獲取源代碼,然后從那里復制它。

您的調試器更有可能只是使用與原始文件名相同的名稱/路徑來獲取系統上的文件(可能是更新的版本,或者是舊版本等),而事情就恰好排成一行。

您不能真正從已編譯的二進制文件中重新生成原始源,因為從C ++源到已編譯的二進制文件的轉換不是1對1的關系。 有許多(無限......)不同的源文件將編譯為相同的二進制文件。 通過查看二進制文件原始源的樣子,無法知道。

有些工具可以生成類似於C ++源文件的東西,但很可能它看起來不像你的原始資源。

我認為實際上可以恢復源的可能性很小,但不是來自二進制本身:如果你真的非常絕望,你可以使用搜索應用程序(例如Agent Ransack)並在整個驅動器中搜索你知道的字符串模式存在於源代碼中。 特別是,如果你有一個頁面文件(pagefile.sys),你可能會搜索它 - 有可能它被埋在某處。

我曾經嘗試過這種方法,當時我非常絕望,但我的情況則有點不同,更有利於“搜索和恢復”,因為當IDE崩潰並且整個源文件丟失時我丟失了它(!!! !令人討厭的驚喜!!!)

我最近不得不通過將其反編譯為匯編程序來重建MSVC編譯程序 - 沒有調試信息,源甚至沒有進行版本控制。 只有從頭開始保存我的東西才是之前的開發人員使用API​​的示例應用程序作為這個新應用程序的基礎。

如果您有調試符號,您至少可以獲得方法名稱。

我發現rec22(recstudio.exe)是我反編譯的最佳選擇(作為免費下載)idaPro和hexrays似乎可能更好(但買不起)

如果通過“當我在調試中運行程序時(在Qt Creator中),我可以在main中設置一個斷點,然后查看源代碼。” 你實際上意味着在調試器中你可以看到代碼的舊版本,然后這意味着仍然有一個源的副本位於調試器能夠接收到的某個地方。 你應該能夠(最壞的情況)桁架調試器找出文件的位置。

如果這不是你的意思,我所知道的最好的是嘗試使用調試器進行某種反匯編。 根據更改的復雜程度,可以從程序集中推斷源代碼。

通常,即使調試二進制文件也不能設計為能夠重新創建原始源:這就是源的用途。 它們確實有符號表和指令 - >行號映射,可以提供幫助。

使用strings程序提取所有ASCII字節,然后置換它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM