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

C++程序反编译笔记(16) 修正扫雷窗口位置

2023-01-02 23:51 作者:GC_CH  | 我要投稿

    目前还存在一个比较明明显的问题

    启动项目后, 游戏只会出现在屏幕右上角.

CreateWindow

    一些重命名变量和函数的操作就跳过不说了.

    在网上查了一下, 窗口的位置一般是用CreateWindow, 或MoveWindow来设置的.

    首先看一下WinMain中CreateWindow的调用.

    IDA Pro命名的X 和 Y 那里就是窗口的位置. 那么如何判断是不是这里有问题呢? 很简单, 把这两个参数用常量替换一下然后运行看结果就知道了,  如果运行后, 游戏窗口的位置和自己设置的常量位置一致, 那么就说明这里错了, 否则, 说明创建窗口后有其他地方修改了窗口的位置.

    经过测试, 窗口位置还是在右上角.

MoveWindow

    接下来查看MoveWindow的调用

    只有这两处调用了MoveWindow, 并且这两处都使用了X和Y的值来设置位置(v3由Y赋值). 同样的方法, 这次窗口出现在了设置的位置(300, 100).

修正位置

    其实上有一个很奇怪的地方,  对X和Y的使用都是 *(_DWORD*)&X 或 *(int *)&X这种形式, 这不就是等价于 直接取X和Y的值吗? 难道IDA Pro的bug?

    查看X和Y的定义, 发现X和Y居然是BYTE类型的, BYTE类型只有1个字节, 使用的时候确实用到了4个字节, 明显是越界了.

    将X和Y的类型改为int并修正所有使用到X和Y的地方后. 启动项目, 结果游戏的位置正确了.

    

    

    

C++程序反编译笔记(16) 修正扫雷窗口位置的评论 (共 条)

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