2013-04-27 58 views
4

我試圖用反編譯器「破解」我自己的應用程序。 我可以清楚地看到函數名稱和許多參數名稱。C++ VS2010將我的代碼編譯成幾乎可讀的代碼

因此,我認爲我以某種方式編譯調試信息與我的代碼,雖然它設置爲發佈。

此外,該編譯器告訴我之類的東西

MYLIB.LIB(vq.obj):警告LNK4099:PDB 「vc100.pdb」 不與發現 「MYLIB.LIB(vq.obj)」 或者「 M:\ MYAPP \發佈\ vc100.pdb「;對象將被鏈接,就好像調試信息不​​可用一樣。

這是暗示VC試圖包含一些調試信息?

此外,我的解決方案由3個項目導致編譯形式的3個DLL。

當我「破解」3個dll中的一個時,我可以看到其他2個dll的函數名稱。 我不知道爲什麼。

有人可以告訴我如何讓dll少調試,以及如何「使用」DLL中的dll函數而不是1 dll中的所有函數。我希望我能解釋得很好。

回答

5

這是暗示VC試圖包含一些調試信息?

是的,它意味着你正在鏈接你的DLL與調試信息。你可以通過設置鏈接器 - >調試 - >生成調試信息來禁用它。不過,請注意,這個選項不會(近似)影響你的dll文件,但它會切換生成pdb文件。

有兩種類型的實體,它的名字將被明確地存儲在DLL文件:

  • 接口功能
  • 態類名

你無法擺脫第一。任何使用dll的人都必須知道,接口函數是如何命名的。

但是,您可以禁用第二個。只有啓用RTTI時,多態類名稱纔是必需的。這就是你如何做dynamic_casttypeid。如果您不需要這些功能,可以通過轉到C/C++ - >語言 - >啓用運行時類型信息來禁用RTTI並將其設置爲否。請參閱Remove C++ class names from binary dll file

所有其他實體的名字將被編譯器剝離。

+0

通過「接口函數」,我假設你的意思是導出函數。你*可以*給他們真正的短名稱,或者在.DEF文件的EXPORTS部分重新命名它們,並且可以選擇通過序號導入它們。 – 2013-04-27 07:35:39

+0

「按順序導入它們」?我不知道這個功能。你能否回答一下細節? – Mikhail 2013-04-27 07:38:46

+2

例如,請參閱http://blogs.msdn.com/b/peterrosser/archive/2006/02/22/exporteddllfunctions.aspx – 2013-04-27 07:40:08