最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

C++程序反編譯筆記(18) 拆分函數(shù)

2023-01-09 21:08 作者:GC_CH  | 我要投稿

????如果無法找到突破口, 那么就從界面入手.

????程序總是要輸入和輸出的, 這里說的界面是指顯示輸出的界面, 可以是控制臺(tái), 窗口, 文本文件等.

????一般程序總是調(diào)用系統(tǒng)API來制作界面的,?操作系統(tǒng)屏蔽掉了顯卡顯示器等的操作接口.

????而操作系統(tǒng)的API的參數(shù)和返回值都是可以查到的, 這就有利于反編譯時(shí)分析代碼, 從已知的推斷未知的.

消息處理

????Windows操作系統(tǒng)的界面是基于消息處理的, 因此, 要了解操作界面后會(huì)調(diào)用什么代碼, 就需要分析窗口的消息處理函數(shù).

????

????從上圖中的 lpfnWndProc?字段可以知道掃雷主窗口的消息處理函數(shù).

拆分函數(shù)

????為什么要拆分函數(shù)? 因?yàn)楹艽蟮暮瘮?shù)看起來十分頭疼, 我認(rèn)為一個(gè)漂亮的函數(shù)應(yīng)該在50行左右.

????MainWndProc_1001BC9 就是一個(gè)比較大的函數(shù), 我們需要把它按照不同的消息來拆分. 比較好的做法是將它改成一個(gè)僅有一個(gè)switch語句的函數(shù), 而且每個(gè)case分支只是簡單的調(diào)用具體的消息函數(shù), 這樣我們看起來就一目了然了.

????本來它是這樣的

????????里面有很多if, switch 和 goto, 看起來還行, 不是特別亂. 拆分后是這樣的

????一般是On + 消息名來給某個(gè)消息命名處理函數(shù), 這樣找起來比較方便.

????可以使用 TortoiseGit 將我上傳到gitee的項(xiàng)目切換到 21 這個(gè)版本來對比拆分前后的區(qū)別.

菜單資源

????我并沒有從鼠標(biāo)消息入手, 而是從菜單消息入手. 原因是直接看鼠標(biāo)消息的處理代碼, 肯定會(huì)遇到很多不知道具體含義的變量, 從菜單入手有一個(gè)好處就是菜單項(xiàng)是有文本的, 我們可以根據(jù)文本直接對應(yīng)的處理代碼做了什么.

????菜單也是一種資源, 我們可以從Visual Studio的資源視圖看到菜單的消息.

????比如, 點(diǎn)擊"開局"菜單, 那么對應(yīng)的代碼肯定是游戲開始要做的事了. 而初級(jí), 中級(jí), 高級(jí), 自定義這四個(gè)菜單就更好理解了, 設(shè)置游戲級(jí)別(難度), 那么我們就可以知道表示游戲級(jí)別的變量是哪個(gè)了.

????菜單點(diǎn)擊對應(yīng)的消息是WM_COMMAND, 這里我用OnCommand函數(shù)來處理該消息.

????再資源視圖選中某個(gè)菜單項(xiàng), 在屬性窗口就可以看到它的ID了, 我們需要根據(jù)ID來找到它的處理代碼.

????

? ? WM_COMMAND消息處理中的WPARAM參數(shù)的低2個(gè)字節(jié)就是菜單項(xiàng)ID. 具體的處理代碼就下篇再說了.


C++程序反編譯筆記(18) 拆分函數(shù)的評論 (共 條)

分享到微博請遵守國家法律
磴口县| 全州县| 霍邱县| 凌海市| 织金县| 安福县| 昭平县| 道孚县| 合川市| 昌宁县| 阿拉尔市| 内丘县| 育儿| 吴堡县| 秦安县| 宽城| 克东县| 金华市| 连江县| 蓬溪县| 图们市| 乌拉特前旗| 上高县| 宁波市| 抚松县| 富裕县| 郴州市| 茶陵县| 嵊州市| 忻城县| 万安县| 宜君县| 诸城市| 涪陵区| 布尔津县| 秦皇岛市| 博爱县| 克什克腾旗| 蒙阴县| 监利县| 阿拉善右旗|