C++程序反编译笔记(13) 资源丢失
之前用简单的方法解决了字符串资源丢失的问题.
可执行文件中还有很多其他的资源, 比如位图, 音频, 对话框等.
字符串资源十分简单, 可以在代码中直接用字符串常量代替原来的LoadString函数调用. 其他资源就不好办了, 因为其他资源的数据结构比较复杂, 不清楚内部数据结构的话, 资源就相当于一个很长的字节数组.
当然也可以用字节数组常量来替换原来的资源, 但是最方便的办法还是 : 从可执行文件中导出资源, 然后添加到项目中.

使用Resource Hacker导出资源

使用Resource Hacker打开"扫雷.exe" 可以看到, 里面有很多资源. 点击菜单"Action" -> "Save ALL Resources to an RC file ...", 然后选择保存位置, Resource Hacker将导出所有资源并生成一个 xxx.rc 文件.

导出的资源文件如下, 主要是 "扫雷.rc" :


导入资源到项目中
rc文件就是Visual Studio项目资源描述文件, 可以直接把它添加到项目中(只需要添加rc文件就可以了, 其他资源文件被包含在了rc文件中).
但是Resource Hacker导出的rc文件有点问题, Visual Studio会报错. 因此, 我们创建一个新的rc文件, 然后把导出的rc文件的代码复制过来. 出现问题的原因应该是rc文件版本不同, 代码格式做了一些修改.

接下来把导出的资源文件复制到 Resource.rc 文件同级文件夹下, 并将 "扫雷.rc" 除第一行外的内容全部复制, 粘贴到 Resource.rc 中的如下位置:


修复rc文件错误
选中Resource.rc文件, 右键 -> 编译, 发现还会报错 "FW_NORMAL" 及 "FALSE" 未定义, 把所有FW_NORMAL替换为400, FALSE 替换为0 就行了.
这是在定义字体, 数值是多少不太重要, 具有可以参考RC文件的格式.

运行程序
启动项目, 可以看到如下界面:

已经有扫雷的轮廓了, 但是有点乱码的感觉, 还需要继续修复.