2015-12-24 31 views
0

我有應用程序(可執行文件),但我沒有該應用程序的源代碼。我可以啓動這個應用程序。 我需要知道的是它的發佈或調試版本。確定是否使用或不使用_DEBUG宏編譯的應用程序

是否有任何方式在Windows中以編程方式確定應用程序編譯與_DEBUG宏?

P.S. CheckRemoteDebuggerPresent可以檢查連接的調試器進程的存在。這不是我需要的。

+3

除非您有可用的調試信息,可以告訴您在構建時定義了哪些宏,那麼沒有辦法。 –

+1

我發現了幾篇文章「如何調試版本構建」,並附帶說明如何做到這一點。我發現,對於某些應用程序列表,加載的DLL與發佈/調試版本非常不同。因此我假設調試器可以區分發布/調試版本。 –

+3

您可以檢查它是否與標準C庫DLL的調試版本或發行版本鏈接(如果它沒有靜態鏈接)。確切的DLL名稱取決於Visual Studio版本。 – interjay

回答

1

我會先用一些最基本的數據嗅探它, 兩個這樣的例子是bin字符串和應用程序頭文件;

  • 在某些情況下,字符串可能會保留例如蛛絲馬跡與和編譯相同的可執行如下:

沒有 <assemblyIdentity type="win32" name="Microsoft.VC90.CRT

隨着<assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT"

(可能也編譯器?)

You ca n,其中任何下列選項中提取的字符串:打開exe文件在VS,並期待在RCDATA,在十六進制編輯器打開EXE,GUI工具,如BinText,字符串實用MinGW binutils (windows)和更多的選擇

  • 展望通過PE頭(例如使用VS dumpbin.exe)。我過去注意到的一個暗示是,OPTIONAL HEADER VALUES中的校驗和字段僅在發佈版本中設置。如果你正在試圖爲磁盤上的文件這麼做,那麼PE格式有很好的文檔記錄,你應該能夠「反彙編」它來獲取字段。這也應該是可能加載到內存中運行的進程,一旦你找到加載到內存中圖像的基址的可執行文件(例如,通過使用該tool help snapshot API

正如我說的這些可能白送回答,或者如果不希望給一些導致與。

相關問題