2009-12-09 66 views
5

我編寫(和銷售)的軟件在分發之前被壓縮和加密。每次我發佈一個新版本時,我都會保存所有的.map文件和生成的二進制文件(包括exe文件),然後對其進行壓縮和加密。如何在小型轉儲中更改模塊的校驗和?

當它在客戶機上崩潰時,我得到一個小型轉儲。我在Visual Studio中打開這些小型轉儲並在那裏探索它們。

我通過在.map文件中搜索地址,很好地使用了這些小型轉儲。這通常會讓我處於正確的代碼區域,我通常可以推斷爲什麼發生崩潰並修復它,但這非常耗時。

如果我可以使用我在調試minidump時從原始版本中保存的符號,這將會很有幫助。

我的問題是,我收到有關無法找到正確符號的警告。我的研究使我相信這是因爲客戶端機器上exe的校驗和與Visual Studio構建的exe的校驗和不匹配。我明白爲什麼它被壓縮和加密。校驗和當然不匹配。

我想我可以手動編輯minidump或更改保存的二進制文件的校驗和以匹配可分發的校驗和。我寧願操縱存儲的副本,所以我不必修改每個轉儲進來,但我會與任何轉載。

所以,我的問題是:我如何找到這些校驗和並找出我應該替換它們?作爲一個輔助問題:有沒有更好的方法?

回答

5

不知道你是如何正確地壓縮和加密你的二進制文件,對我來說很難具體。

John Robbins的blog post指出可執行映像通過嵌入可執行文件的PE頭中的GUID與其PDB關聯。您應該能夠通過在可執行文件上運行DUMPBIN/HEADERS並查找Debug目錄的輸出來查看它。如果你的壓縮和加密已經修改了PE頭文件使得這些信息不可用(或正確),那麼它就可以解釋爲什麼你的調試器找不到任何東西。

我認爲您可以採取幾種方法來解決此問題。要想真正實現這一點,您可能需要考慮使用WinDbg代替Visual Studio調試器。你會明白我爲什麼在一會兒推薦這個...

WinDbg提供了一些選項,允許輕鬆加載符號文件。使用此選項的想法是,如果源代碼沒有更改,但二進制文件與PDB不同,則可以放棄GUID檢查,並可以加載不匹配的符號文件。我不知道這將如何與您的壓縮和加密,所以YMMV。

WinDbg及其附帶工具可用於從可執行文件和PDB轉儲GUID,但現在我忽略了這一點,因爲我希望這些步驟不是必需的。

你已經在WinDbg中打開你的轉儲後,您將需要輸入幾個命令,進入命令行來得到這一切的工作:

.symopt +0x40 
!sym noisy 
ld <exe name> 

第一個命令啓用SYMOPT_LOAD_ANYTHING選項跳過GUID檢查。!sym命令爲符號加載啓用詳細輸出,以便您可以看到更詳細的錯誤消息。 ld命令指示WinDbg嘗試加載可執行文件名稱的符號,您將鍵入代替<exe name>。如果您重複ld命令,WinDbg會指示它是否第一次成功加載符號。

希望這有助於 - 再次,我不知道這將如何與您的壓縮和加密工作,但它是值得一試。

+0

我覺得第一個命令應該是.symopt + 0x40(你忘了最初的點)。 – Patrick 2010-03-08 10:35:15

0

這種壓縮/加密類似UPX嗎?如果二進制文件的實際可執行文件內容發生了變化(就像UPX這樣的工具一樣),那麼你就會走運了(除非你喜歡用匯編語言來調試複雜的應用程序)。您的軟件真的非常重要/特殊,它的二進制文件在交付之前需要進行加密?根據我的經驗,調試崩潰轉儲的能力遠比阻止人們對代碼進行反向工程更爲重要。

+0

我不會說我的軟件是特殊/重要的。這是一種商業消費品,所以逆向工程不是問題。破解和keygens是。 – 2009-12-10 14:37:25

+1

無論你做什麼,人們都會想出辦法破解你的應用程序,至少如果它很受歡迎或有用。根據我的經驗,加強應用程序以抵禦這種事情的努力只是不值得花費它需要的時間和金錢,特別是如果它導致合法用戶的調試頭痛。 – Luke 2009-12-10 16:19:37

+2

這與鎖定你的車和拿鑰匙是一樣的。它並不能阻止堅定的盜賊,但它也不是無用的。 – 2009-12-10 16:39:25