C++程序反編譯筆記(11) 查看調(diào)用堆棧
????上文中, 反編譯 "掃雷.exe" 進(jìn)展到出現(xiàn)了一個(gè)錯(cuò)誤1001, 暫時(shí)不知道這個(gè)1001是什么意思. 只能從調(diào)用過程尋找原因.?
????這也解釋了為什么要生成一個(gè)可以編譯的C++項(xiàng)目. 如果僅從IDA Pro反編譯出來的偽代碼去了解程序的源代碼, 那根本不可能理解清除. 反編譯一個(gè)程序不止要靜態(tài)地看偽代碼, 還要?jiǎng)討B(tài)地調(diào)試代碼, 一步一步解決反編譯過程中出現(xiàn)的問題. 就像不可能百分百地寫出正確的程序一樣, 運(yùn)行程序然后測(cè)試輸出, 修改bug也是編程的一部分.

觀看調(diào)用堆棧
????上文已經(jīng)找出了錯(cuò)誤彈窗的代碼位置sub_1003950, 現(xiàn)在需要查看調(diào)用堆棧以確定出錯(cuò)原因. 首先在 sub_1003950函數(shù) 中下一個(gè)斷點(diǎn), (單擊該函數(shù)中的一行, 按F9, 或點(diǎn)擊行號(hào)左邊空列, 出現(xiàn)紅點(diǎn)則成功), 代碼運(yùn)行到這里便會(huì)停下來.

????點(diǎn)擊 sub_10039E7, 是這個(gè)函數(shù)調(diào)用了sub_1003950.

????左邊的箭頭指示了調(diào)用位置. 這個(gè)函數(shù)也是調(diào)用LoadString加載字符串資源, 將鼠標(biāo)放到a1上, 可以看到a1此時(shí)的值為 1, 也就是要加載ID為1的字符串資源, 但是加載失敗了, 和上一篇文章中的錯(cuò)誤類型一樣. 同樣使用ResHack查看ID為1的字符串資源, 并修改這個(gè)函數(shù)如下:

????這里將LoadString改為了用代碼賦值. 到此, 不再會(huì)彈出"錯(cuò)誤1001"的消息框.
????