C++程序反編譯筆記(14) 尋找繪圖代碼

????經(jīng)過前面的代碼修復(fù), 掃雷已經(jīng)能顯示出基本的界面了.

????但是有點(diǎn)"亂碼"的感覺. 點(diǎn)擊中間的"笑臉"或者雷區(qū), 右上角的時(shí)間文本是會(huì)變化的, 說明游戲可以正常開始. 運(yùn)行過程中, 基本不會(huì)產(chǎn)生錯(cuò)誤. 就是點(diǎn)擊"×" 關(guān)閉游戲時(shí), 報(bào)了一個(gè)錯(cuò)誤

????這個(gè)錯(cuò)誤指出result沒有初始化, 那么將result初始化為 FALSE 就好.

從WinMain開始
????目前不知道為什么會(huì)"亂碼", 但是知道窗口的繪制是在處理WM_PAINT消息(Windows系統(tǒng)的窗口靠消息機(jī)制運(yùn)行), 因此, 需要找到繪制窗口的地方.
????還是使用前面用過的方法, 暫停程序的運(yùn)行, 查看代碼停在了哪里.

????

????代碼停在了 GetMessage函數(shù)調(diào)用這里, 這里正是wWinMain函數(shù). 往前一點(diǎn)查看代碼, 可以發(fā)現(xiàn)注冊(cè)窗口類, 創(chuàng)建窗口, 顯示窗口的代碼都有.?

????根據(jù)注冊(cè)窗口類時(shí) WNDCLASSW 結(jié)構(gòu)體的lpfnWndProc字段可以知道窗口的消息處理函數(shù)是sub_1001BC9.

IDA 識(shí)別枚舉
????查看消息處理函數(shù), Msg就是消息的值, 但是 if語句和 switch語句中用的都是數(shù)字, 這不利于查看是什么消息. 可以在IDA Pro中將它們修正為 WM_ 開頭的宏.

????在IDA pro中找到sub_1001BC9的代碼, 點(diǎn)擊消息的值, 比如0x201, 按M鍵會(huì)將該值標(biāo)識(shí)為枚舉. 接著從下拉列表中選擇具體的枚舉就行了.

????可以看到 0x201 是消息 WM_LBUTTONDOWN. 將修復(fù)好的代碼復(fù)制回 Visual Studio.

????這樣就很容易找到需要的消息了.

尋找繪圖代碼
????找到WM_PAINT 消息對(duì)應(yīng)的代碼, 可以知道sub_1002AC3就是總的繪圖代碼的函數(shù).

????我給這個(gè)函數(shù)加了一個(gè)OnPaint的注釋, 當(dāng)然也可以直接修改函數(shù)名.
