C++程序反编译笔记(10) 字符串资源丢失
经过前面的努力, 已经可以弹出一个消息框了:

目前的情况是: (1) 根据前文所述的反编译步骤, 现在需要解决逻辑错误, 这是最麻烦的一步, 但也是反编译的最后一步了. (2) 要解决的第一个逻辑错误是这个消息框的问题.
根据经验 : (1) 消息框肯定是要提示我们什么的. (2) 根据消息框上的图标, 要提示的信息肯定是发生了某个错误.

定位消息框代码位置
要定位消息框代码的位置很简单.
在Visual Studio中, 调试状态下, 点击暂停按钮就可以将代码暂停在正在执行的语句上. 而消息框代码会阻塞当前代码的执行, 正好给了我们知道具体代码位置的机会.

如图是定位出来的代码位置:

该函数中都是调用Windows API, 还是比较容易懂的. 查文档可以知道, 是从资源中加载字符串. 于是, 这个函数的作用就明白了, 从资源加载字符串然后用消息框显示出来.

解决消息框错误
我们需要做的是修正消息框的文本, 根据提示文本才知道程序哪里出了问题(不知道也有其他办法, 但是比较麻烦).
使用断点功能可以知道, 执行的是 if语句体. LoadString函数的第2个参数是资源中的字符串ID, 因此内容的ID是6, 标题的ID是3.
使用ResHack可以查看"扫雷.exe"中的字符串资源:

由于exe中的字符串资源是静态的, 不会改变, 所以可以直接用字符串替换代码中的字符缓冲区.
修正后的代码如下:


修正结果

这个结果似乎没什么用!