簡體   English   中英

確定哪個編譯器構建了Win32 PE

[英]Determining Which Compiler Built a Win32 PE

如何確定使用哪個C或C ++編譯器來構建特定的Windows可執行文件或DLL? 一些編譯器在最終的可執行文件中留下了版本字符串,但這在Windows上似乎比在Linux上更少見。

具體來說,我有興趣區分Visual C ++和各種MinGW編譯器(通常很容易從函數簽名),然后在Visual C ++版本之間(6,2002 / 2003,2005,2008;更難做)。 有沒有可以半可靠方式區分的工具?

區分VC版本的提示的一個來源是鏈接的特定C運行時庫。 由於默認情況(至少在現代版本中)鏈接到DLL,這很容易做到。 實用程序Dependency Walker對於驗證您是否知道正在加載的DLL幾乎是必不可少的,它將告訴您正在使用哪個C運行時DLL。 盡管Dependency Walker包含在Microsoft Platform SDK中,但它已經獨立擴展,我鏈接的站點是其當前開發的主頁。

VC6和MinGW默認都鏈接到MSVCRT.DLL,因此不區分它們。 通過一些努力,MinGW也可以鏈接到后來的C運行時版本,因此您需要獨立排除MinGW。

Runtime       VC Version
----------    -------------
MSVCRT.DLL    VC6
MSCVR80.DLL   VC8 (VS 2005)
MSCVR90.DLL   VC9 (VS 2008)

其他運行時DLL也是很好的線索,例如對Delphi運行時的引用可能表明EXE實際上是從Delphi構建的,而不是C工具鏈。

如果尚未從.EXE文件中刪除符號,則可能會找到一些內部符號存在的線索。 例如,對_sjlj_init類的_sjlj_init可能表示在某些時候涉及為setjmp / longjmp異常處理配置的MinGW GCC 3.x.

另一種選擇是使用depends.exe檢查dll鏈接到哪個CRT庫
MinGW和Cygwin有他們自己的dll,很明顯可以識別。
VC6通常使用MSVCRT.dll
任何較新版本的VS的版本都在dll的文件名旁邊:
MSVCR90.dll - VS2008
MSVCR80.dll - VS2005
MSVCR71.dll - VS2003
MSVCR70.dll - VS2002

不要將此列表作為權威指南,因為這些名稱往往有奇怪的變化,特別是在VS2002-2003領域。 還有其他類似MFC和ATL dll的dll具有類似的版本控制方案。

只要PE實際上依賴於CRT並且它沒有靜態地鏈接到它,這將起作用。

我認為Delphi也有一些它鏈接到的DLL,但我不確定它是什么。

IDA-Pro執行的部分分析包含一些編譯器識別。 打開PE進行分析后,查看輸出日志。 它通常埋在那里的某個地方。

暫無
暫無

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

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