欢迎光临散文网 会员登陆 & 注册

C++程序反编译笔记(14) 寻找绘图代码

2022-12-24 11:47 作者:GC_CH  | 我要投稿

    经过前面的代码修复, 扫雷已经能显示出基本的界面了.

    但是有点"乱码"的感觉. 点击中间的"笑脸"或者雷区, 右上角的时间文本是会变化的, 说明游戏可以正常开始. 运行过程中, 基本不会产生错误. 就是点击"×" 关闭游戏时, 报了一个错误

    这个错误指出result没有初始化, 那么将result初始化为 FALSE 就好.

从WinMain开始

    目前不知道为什么会"乱码", 但是知道窗口的绘制是在处理WM_PAINT消息(Windows系统的窗口靠消息机制运行), 因此, 需要找到绘制窗口的地方.

    还是使用前面用过的方法, 暂停程序的运行, 查看代码停在了哪里.

    

    代码停在了 GetMessage函数调用这里, 这里正是wWinMain函数. 往前一点查看代码, 可以发现注册窗口类, 创建窗口, 显示窗口的代码都有. 

    根据注册窗口类时 WNDCLASSW 结构体的lpfnWndProc字段可以知道窗口的消息处理函数是sub_1001BC9.

IDA 识别枚举

    查看消息处理函数, Msg就是消息的值, 但是 if语句和 switch语句中用的都是数字, 这不利于查看是什么消息. 可以在IDA Pro中将它们修正为 WM_ 开头的宏.

    在IDA pro中找到sub_1001BC9的代码, 点击消息的值, 比如0x201, 按M键会将该值标识为枚举. 接着从下拉列表中选择具体的枚举就行了.

    可以看到 0x201 是消息 WM_LBUTTONDOWN. 将修复好的代码复制回 Visual Studio.

    这样就很容易找到需要的消息了.

寻找绘图代码

    找到WM_PAINT 消息对应的代码, 可以知道sub_1002AC3就是总的绘图代码的函数.

    我给这个函数加了一个OnPaint的注释, 当然也可以直接修改函数名.


C++程序反编译笔记(14) 寻找绘图代码的评论 (共 条)

分享到微博请遵守国家法律