C++程序反编译笔记(11) 查看调用堆栈
上文中, 反编译 "扫雷.exe" 进展到出现了一个错误1001, 暂时不知道这个1001是什么意思. 只能从调用过程寻找原因.
这也解释了为什么要生成一个可以编译的C++项目. 如果仅从IDA Pro反编译出来的伪代码去了解程序的源代码, 那根本不可能理解清除. 反编译一个程序不止要静态地看伪代码, 还要动态地调试代码, 一步一步解决反编译过程中出现的问题. 就像不可能百分百地写出正确的程序一样, 运行程序然后测试输出, 修改bug也是编程的一部分.

观看调用堆栈
上文已经找出了错误弹窗的代码位置sub_1003950, 现在需要查看调用堆栈以确定出错原因. 首先在 sub_1003950函数 中下一个断点, (单击该函数中的一行, 按F9, 或点击行号左边空列, 出现红点则成功), 代码运行到这里便会停下来.

点击 sub_10039E7, 是这个函数调用了sub_1003950.

左边的箭头指示了调用位置. 这个函数也是调用LoadString加载字符串资源, 将鼠标放到a1上, 可以看到a1此时的值为 1, 也就是要加载ID为1的字符串资源, 但是加载失败了, 和上一篇文章中的错误类型一样. 同样使用ResHack查看ID为1的字符串资源, 并修改这个函数如下:

这里将LoadString改为了用代码赋值. 到此, 不再会弹出"错误1001"的消息框.