让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

admin 2023年10月23日13:32:38评论110 views字数 1757阅读5分51秒阅读模式


我们在进入IDA反编译的函数后经常会看到如下情况,IDA确定传入了一个类对象地址,但是却没有解析该类对象。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

我们需要点击this指针变量,右键Reset pointer type,重新定义指针类型。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

重新定义后IDA会根据复制类型重置偏移。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

再次右键点击create new struct type,该功能会根据当前函数的赋值去重构对象指针。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)



查看IDA重构后的结构体指针类型。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

点击OK后发现对象被重新定义


让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

C++恶意样本实战修改类对象

样本hashmd5,48FF98ED6AE74DA9C1FEF59B40699BAEsha1,14DD1C186613CD96A4C04007775B12726E7C0686sha256,4537FAB9DE768A668AB4E72AE2CCE3169B7AF2DD36A1723DDAB09C04D31D61A5

我们拿一个C++样本举列子进入样本可以看到如下内容

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

因为IDA是懒惰性反编译,不会在一开始就反编译所有函数所以我们需要利用导出C文件的功能,让IDA遍历每个函数对所有函数进行反编译。而不需要一个个点进去进行解析。(Ctrl+F5快捷键)

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

导出C文件后可以看到IDA重新反编译了所有函数。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

再次按下F5快捷键,可以看到IDA重新生成了C伪代码函数及其参数类型。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

找到IDA解析为C++的函数位置。函数主功能地址在sub_413435里,点击第一函数 sub_405BF1,查看内容。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

可以看到病毒正在初始化一个类,我们使用文章开头的技巧对该类进行结构体重构。根据初始化可以判断该类中成员至少有20个。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

重构类对象。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

再次切回结构体指针位置,右键创建新的结构体类型。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

IDA会快速只能识别结构体,并且将不确定的结构体全部以gap开头的字段表示。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)


我们需要调整该结构体,把所有gap开头的都换成DWORD,这样做的好处便于后续逆向分析判断真正的类型。目前看有19个DWORD


让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

点击原始类型,按y修改类型。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

修改后我们观察出现了以下异常状况,这证明IDA只能反编译发现该结构体不止19个,需要再增加结构体个数到20。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)


将个数修改为20个后如下

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)


再改下结构体名字便于后续逆向区分

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

回到上层函数F5刷新伪代码,可以看到IDA帮我们重新定义了临时变量

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

进入下一个病毒定义函数,发现该函数调用了我们之前定义的struct_this_20的初始化函数。可能意味着该函数继承了之前的struct_this_20。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

继续按照上面的步骤调整该对象的结构体。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

调成dword后发现出现异常,我们必须保证mw_init_struct_20()函数传入的是对应结构体指针。我们需要继续在结构体前补充dowrd直到满足条件。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

双击dowrd5查看在结构体的偏移,方便我们计算还需要在struct_20前补充多少dword。偏移为0x14。则需要补充5个DWORD变量。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

补充后结构体如下

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

F5刷新结果如下

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)


接下来回到上层函数调整所有使用到这些结构体的函数参数类型。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

调整后如下。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

父层函数参数结构体调整完成后,继续进入病毒定义的函数查看内容。发现将对象指针给了一个v31的指针,这破坏了我们修改结构体指针的目的。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

我们需要使用=键,将v31直接映射成arg_struct_this_20。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

重新映射的代码不在存在偏移

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

进入函数sub_41044F继续调整对象结构体,IDA帮我们识别该类对象至少有16个成员。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

先暂时添加结构体成员16个DWORD

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

继续观察调整同级函数中,使用到该类对象的函数参数类型。在进入函数sub_410346时发现结构异常。还要继续增加DWORD字段









让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

增加后

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

继续向后观察函数,最终来到了一个PE解析的位置sub_410346。可以看到明显的PE解析行为。可以推测出a2就是一个IMAGE_DOS_HEADER指针

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

我们定义该类成员为IMAGE_DOS_HEADER指针类型,可以看到代码变得更加容易阅读。

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

继续按照这个方法调整,代码就会变得更加清晰简洁

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)




其它课程

windows网络安全一防火墙


让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

windows文件过滤(更新完成)

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

USB过滤(更新完成)

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

游戏安全(更新中)

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

二进制漏洞(更新中)

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

ios逆向

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

还有很多免费教程(限学员)

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)


让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

 

 

让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)


















原文始发于微信公众号(安全狗的自我修养):让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年10月23日13:32:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   让逆向更接近源码——IDA重定义C++类对象技巧(逆向实战3)https://cn-sec.com/archives/2137303.html

发表评论

匿名网友 填写信息