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

反编译记事本(3) 解决编译错误

2023-02-06 21:19 作者:GC_CH  | 我要投稿

    上一篇文章漏掉了一步, 那就是去除@<寄存器名>的操作. IDA Pro导出的代码中, 如果一个函数不是常规的参数传递方式, 而是使用了特定的寄存器来传递参数的话, 这个函数会被声明为__usercall, 而且函数名或参数后面会加上一个@<寄存器名>的符号.

    比如这个函数, 函数名后的@<eax>表示返回值放在EAX寄存器, a1后的@<eax>表示a1这个参数放在EAX寄存器中.

    记事本项目的编译错误很多, 接下来分类列举解决办法.

类型未定义

    (1) 对于类型, 肯定是用来声明变量的. 如果一个类型没有定义, 那么看使用这个类型的地方, 如果这个类型的变量没有使用到(全局搜索), 那么可以注释掉(或者删掉)用这个类型声明变量的语句.

    比如, 上一篇文章删掉了 start 函数, 那么只在start函数中使用到变量也是可以删掉的.

    (2) 其次, 类型未定义, 很可能是没有包含对应的头文件, 网上搜索后, 包含对应的头文件. 比如 _snwprintf_s 需要包含 wchar.h 才能使用.

类型对不上

    声明了某种类型的一个变量, 但是使用其他类型的值来给这个变量赋值. 这种情况直接强制类型转换一般就能解决问题. C语言中大多数类型都是可以强制类型转换的, 完全可以把一个结构体变量当作整型数组来使用. 

强制转为int *

    

未初始化错误

    这种错误百分百是IDA Pro识别错误, 属于逻辑错误, 现在不处理, 全部初始化为0就好.

    这里一看就是数组大小没有识别对, 但是现在先不管.

复杂错误

    有些编译错误很麻烦, 比如直接访问寄存器的函数. 对于这种错误, 先把它放一边, 以后再处理, 先让项目可以跑起来才是硬道理. 做法是将整个函数内的语句全部注释起来, 然后再加上一个throw 语句, 以便跑起来后运行到这里时, 提醒我们该解决这个问题了.

    

成果

    记事本项目就这么多编译错误了, 好了, 现在可以运行项目看看效果了.

    欲知后事如何, 且听下回分解.

反编译记事本(3) 解决编译错误的评论 (共 条)

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