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

C++程序反编译笔记(12) 读取位置 0x00000001 时发生访问冲突

2022-12-04 23:09 作者:GC_CH  | 我要投稿

    接下来遇到了这样的错误:

    这样的错误一般都是非法访问内存造成的, 比如数组越界, 访问野指针等.

数组越界

    具体出错误位置如下:

    点击"中断"按钮, 可以看到是调用 RegQueryValueEx时的第2个参数v7的值为0x00000001. 而RegQueryValueEx的第二个参数是注册表子项字符串.

    根据1477行的v7赋值语句, 查看 lpKeyName 的定义,

    1477行的赋值是将字符串数组索引为 Data 的字符串赋值给v7, lpKeyName是该数组的第一个元素; 但是下方的 lpKeyName 的定义指示, lpKeyName仅是一个字符串指针, 这是矛盾的, 这就是问题所在.

解决方法

    通常情况下, IDA Pro反编译出来的的伪代码是没错的, 而变量的识别是很容易出错的. 这里就是这样的情况. 解决方法是 将lpKeyName开始的一系列变量合并为一个字符串数组. 

    在IDA Pro中查看lpKeyName.

原因是IDA Pro识别错了, 此处lpKeyName确实应该是一个长度18的字符串数组. 选中这18个字符串, 右键选择"Array", 点确定, 最后点击lpKeyName, 按Y键修改它的类型为LPCWSTR lpKeyName[]; 再按Shift + E, 打开导出数据窗口, 复制Preview下方的定义到Visual Studio里面替换掉原来的定义:

修正引用代码

    修改了lpKeyName的类型, 还需要修改引用到它的代码, 反编译就是这么麻烦. 不过好在IDA Pro会根据变量类型自动修正代码, 只需要按F5刷新一下.

    对每个需要修正的代码, 到IDA Pro中复制修正的代码到Visual Studio中, 就解决了这个问题.

C++程序反编译笔记(12) 读取位置 0x00000001 时发生访问冲突的评论 (共 条)

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