我们在进入IDA反编译的函数后经常会看到如下情况,IDA确定传入了一个类对象地址,但是却没有解析该类对象。
我们需要点击this指针变量,右键Reset pointer type,重新定义指针类型。
重新定义后IDA会根据复制类型重置偏移。
再次右键点击create new struct type,该功能会根据当前函数的赋值去重构对象指针。
查看IDA重构后的结构体指针类型。
点击OK后发现对象被重新定义
C++恶意样本实战修改类对象
样本hash:
md5,48FF98ED6AE74DA9C1FEF59B40699BAE
sha1,14DD1C186613CD96A4C04007775B12726E7C0686
sha256,4537FAB9DE768A668AB4E72AE2CCE3169B7AF2DD36A1723DDAB09C04D31D61A5
我们拿一个C++样本举列子进入样本可以看到如下内容
因为IDA是懒惰性反编译,不会在一开始就反编译所有函数所以我们需要利用导出C文件的功能,让IDA遍历每个函数对所有函数进行反编译。而不需要一个个点进去进行解析。(Ctrl+F5快捷键)
导出C文件后可以看到IDA重新反编译了所有函数。
再次按下F5快捷键,可以看到IDA重新生成了C伪代码函数及其参数类型。
找到IDA解析为C++的函数位置。函数主功能地址在sub_413435里,点击第一函数 sub_405BF1,查看内容。
可以看到病毒正在初始化一个类,我们使用文章开头的技巧对该类进行结构体重构。根据初始化可以判断该类中成员至少有20个。
重构类对象。
再次切回结构体指针位置,右键创建新的结构体类型。
IDA会快速只能识别结构体,并且将不确定的结构体全部以gap开头的字段表示。
我们需要调整该结构体,把所有gap开头的都换成DWORD,这样做的好处便于后续逆向分析判断真正的类型。目前看有19个DWORD
点击原始类型,按y修改类型。
修改后我们观察出现了以下异常状况,这证明IDA只能反编译发现该结构体不止19个,需要再增加结构体个数到20。
将个数修改为20个后如下
再改下结构体名字便于后续逆向区分
回到上层函数F5刷新伪代码,可以看到IDA帮我们重新定义了临时变量
进入下一个病毒定义函数,发现该函数调用了我们之前定义的struct_this_20的初始化函数。可能意味着该函数继承了之前的struct_this_20。
继续按照上面的步骤调整该对象的结构体。
调成dword后发现出现异常,我们必须保证mw_init_struct_20()函数传入的是对应结构体指针。我们需要继续在结构体前补充dowrd直到满足条件。
双击dowrd5查看在结构体的偏移,方便我们计算还需要在struct_20前补充多少dword。偏移为0x14。则需要补充5个DWORD变量。
补充后结构体如下
F5刷新结果如下
接下来回到上层函数调整所有使用到这些结构体的函数参数类型。
调整后如下。
父层函数参数结构体调整完成后,继续进入病毒定义的函数查看内容。发现将对象指针给了一个v31的指针,这破坏了我们修改结构体指针的目的。
我们需要使用=键,将v31直接映射成arg_struct_this_20。
重新映射的代码不在存在偏移
进入函数sub_41044F继续调整对象结构体,IDA帮我们识别该类对象至少有16个成员。
先暂时添加结构体成员16个DWORD
继续观察调整同级函数中,使用到该类对象的函数参数类型。在进入函数sub_410346时发现结构异常。还要继续增加DWORD字段
增加后
继续向后观察函数,最终来到了一个PE解析的位置sub_410346。可以看到明显的PE解析行为。可以推测出a2就是一个IMAGE_DOS_HEADER指针
我们定义该类成员为IMAGE_DOS_HEADER指针类型,可以看到代码变得更加容易阅读。
继续按照这个方法调整,代码就会变得更加清晰简洁
其它课程
windows网络安全一防火墙
windows文件过滤(更新完成)
USB过滤(更新完成)
游戏安全(更新中)
二进制漏洞(更新中)
ios逆向
还有很多免费教程(限学员)
更多详细内容添加作者微信
原文始发于微信公众号(安全狗的自我修养):让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论