C++程序反編譯筆記(10) 字符串資源丟失
????經(jīng)過前面的努力, 已經(jīng)可以彈出一個消息框了:

????目前的情況是: (1) 根據(jù)前文所述的反編譯步驟, 現(xiàn)在需要解決邏輯錯誤, 這是最麻煩的一步, 但也是反編譯的最后一步了. (2) 要解決的第一個邏輯錯誤是這個消息框的問題.
????根據(jù)經(jīng)驗 : (1) 消息框肯定是要提示我們什么的. (2) 根據(jù)消息框上的圖標, 要提示的信息肯定是發(fā)生了某個錯誤.

定位消息框代碼位置
????要定位消息框代碼的位置很簡單.
????在Visual Studio中, 調(diào)試狀態(tài)下, 點擊暫停按鈕就可以將代碼暫停在正在執(zhí)行的語句上. 而消息框代碼會阻塞當前代碼的執(zhí)行, 正好給了我們知道具體代碼位置的機會.
????

????如圖是定位出來的代碼位置:

????該函數(shù)中都是調(diào)用Windows API, 還是比較容易懂的. 查文檔可以知道, 是從資源中加載字符串. 于是, 這個函數(shù)的作用就明白了, 從資源加載字符串然后用消息框顯示出來.

解決消息框錯誤
? ?我們需要做的是修正消息框的文本, 根據(jù)提示文本才知道程序哪里出了問題(不知道也有其他辦法, 但是比較麻煩).?
????使用斷點功能可以知道, 執(zhí)行的是 if語句體. LoadString函數(shù)的第2個參數(shù)是資源中的字符串ID, 因此內(nèi)容的ID是6, 標題的ID是3.?
????使用ResHack可以查看"掃雷.exe"中的字符串資源:

? ? 由于exe中的字符串資源是靜態(tài)的, 不會改變, 所以可以直接用字符串替換代碼中的字符緩沖區(qū).
????修正后的代碼如下:


修正結果
????

????????這個結果似乎沒什么用!