首页
社区
课程
招聘
[原创]分析实战读书笔记15_完结:C++与X64
发表于: 2021-3-30 11:12 8828

[原创]分析实战读书笔记15_完结:C++与X64

2021-3-30 11:12
8828

对于C++编写的程序,在分析时常常会不小心走入框架代码。因此学习如何识别C++框架代码是十分必要的。否则会花费大量精力在框架代码上。

this指针在汇编代码中常以ECX进行存储。

image-20210329152541447

如图中的方法重载,仅通过函数参数个数进行区分。

image-20210329153321077

C++使用名字修饰技术来区分重载的N个函数。名字修饰的大致格式如下:

函数名@类名@@参数1@参数2....

IDA中已经为我们标识出了一些库函数的名字修饰:

image-20210329154701591

IDA还可以返修饰成我们能读懂的格式:

image-20210329154831442

继承可以帮助正向开发者高效率开发,减少代码复用。其在汇编中无法体现。

一个类的虚函数表指针存在于其实例化对象的首地址处。

image-20210329155235394

image-20210329155338295

IDA已经为我们识别出了这是两张虚函数表,它们包含相同的虚函数4010E0,且4020DC处的函数数量明显多于4020F0。

根据继承特点,我们可以说:4020DC所属类是4020F0所属类的子类。 其继承了4010E0方法。

在堆中创建对象(new)时,IDA大部分时候可以为我们识别出operator new操作。

image-20210329155725186

①②两处是对虚函数表的赋值。但①处的代码貌似是无意义的。

我们知道子类对象初始化时会先初始化父类属性。因此①处的代码是将父类的虚函数表赋给子类对象。其后再将子类的虚函数表赋给子类对象。

所以造成了①处代码无用的效果。

在0x401040处的函数采用了什么参数?

image-20210329160652620

哪个URL被用来调用URLDownloadToFile

image-20210329160936241

这个程序做了什么事情?

在这个程序中,你可以从有趣的字符串中了解到什么?

image-20210329162054031

导入函数表告诉你关于这个程序的什么信息?

在0x4011D9处创建对象的目的是什么?它有什么虚函数吗?

image-20210329162300197

哪个函数可能被在0x401349处的call [edx]指令调用?

image-20210329162729388

如何简易地搭建这个恶意代码所预料的服务器,不用连接到互联网,就能完整地分析这个恶意代码呢?

这个程序的目的是什么?

在这个程序中实现虚函数调用的目的是什么?

你可以在这个程序中得到什么有意思的字符串?

image-20210330094526876

导入函数表告诉你关于这个程序的什么信息?

在Ox4025C8处的switch表中的6个项都做了什么?

image-20210330095307224

内核驱动。

驱动的位数要求与系统一致,当一个病毒在内核层进行执行,那么大部分都是X64驱动。因此需要懂得64位程序的分析。

插件和注入代码

插件和注入代码必须与目标进程位数相同,以便正确运行。当目标为64位进程时,代码也会是64位的。

shellcode

对利用目标是64位的来说,shellcode也会是64位的。

提高门槛

为了提高分析门槛,恶意代码编写者会使用X64编译器。

寻址方式变成了64位寻址

通用寄存器变成了64位寄存器,如RAX RCX,低32位仍可访问。

通用寄存器通过添加L后缀来访问8位版本,如BPL,DIL,SIL

EIP变成了64位RIP

通用寄存器数量翻倍,新寄存器从R8~R15,它们的32位版本为R8D,R9D, 16位版本为R8W R9W

8位版本为 R8L R9L

RIP寻址

image-20210330100343900

调用约定与函数传参

X64的传参变成了前四个参数从左到右依次通过RCX RDX R8 R9传参,其余参数通过push

异常处理

X64中结构化异常处理不再在函数头部修改fs:[0]。而是在PE静态文件中存储在一张异常信息表中。

.pdata节中的_IMAGE_RUNTIME_FUNCTION_ENTRY结构保存了每一个函数的开始地址和末尾地址。以及那个函数的异常处理函数指针。

当你不带任何参数运行程序时会发生什么?

image-20210330101624133

根据你使用的IDA Pro 的版本,main函数可能没有被自动识别,你如何识别对main函数的调用?

从0x0000000140001150地址到0x0000000140001161地址的指令在栈上存储了什么?

image-20210330101839512

在不改变二进制程序文件名的前提下,如何才能让这个程序运行它的真正负载?

image-20210330102241868

Ox0000000140001205位置的strncmp 函数调用比较了哪两个字符串?

0x00000001400013C8位置的函数接收哪些参数?

image-20210330102356726

有多少个参数被传递给在Ox0000000140001093位置对CreateProcess函数的调用?你是如何知道的?

恶意代码的资源节有什么有趣的东西?

image-20210330105451514

这个恶意代码是为x64编译的,还是为x86编译的?

image-20210330105556511

恶意代码是如何确定出它正在运行的环境类型的?

image-20210330105701417

与在x86环境中相比,恶意代码在x64环境中会做哪些不同的事情?

image-20210330110101433

image-20210330110110081

恶意代码在x86环境中运行时会释放出哪些文件?你可以在哪里找到这些文件?

image-20210330110159331

当运行在x64机器上时,恶意代码丢弃了哪些文件?你在哪里能找到这个或这些文件?

image-20210330110553448

当运行在x64系统上时,恶意代码启动什么类型的进程?

这个恶意代码的目的是什么?

经过了3个多月的学习,终于是在闲暇时间将这本《恶意代码分析实战》读完了,通过整理笔记的方式加深章节知识点的印象。

同时这本书中的内容都是满满的干货,几乎没有什么理论性的东西,对实际分析有很大的帮助。

3个月前我还是个IDA都不会用的萌新,现在至少可以上手分析了,感谢本书对我提供了这么大的帮助!

 
 
 
 
 
 
 
 
 
 
 
 
 
函数内部出现凭空出现ecx,观察上层代码,发现是this指针传参。
函数内部出现凭空出现ecx,观察上层代码,发现是this指针传参。
通过对this指针的赋值回溯可以知道是 http://www.practicalmalwareanalysis.com/cpp.html
通过对this指针的赋值回溯可以知道是 http://www.practicalmalwareanalysis.com/cpp.html
下载远程数据至本地
下载远程数据至本地
和pdf doc相关  还有一个url  可能是上传或是下载
和pdf doc相关  还有一个url  可能是上传或是下载
这个程序具备网络功能和遍历文件的功能,其中FtpPutFile为上传文件的API。
这个程序具备网络功能和遍历文件的功能,其中FtpPutFile为上传文件的API。
存储当前遍历的文件名。   有虚函数 为 sub_401440
存储当前遍历的文件名。   有虚函数 为 sub_401440
程序根据文件类型创建不同的三个对象
doc文件为doc子对象,调用sub_401440虚函数
pdf文件为pdf子对象,调用sub_401380虚函数
其他文件为父对象,调用unknown_libname_1(00401370)虚函数
程序根据文件类型创建不同的三个对象
doc文件为doc子对象,调用sub_401440虚函数
pdf文件为pdf子对象,调用sub_401380虚函数
其他文件为父对象,调用unknown_libname_1(00401370)虚函数
无需搭建就可以分析。
无需搭建就可以分析。
上传C盘目录下所有的pdf文件和doc文件
上传C盘目录下所有的pdf文件和doc文件

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 4
支持
分享
最新回复 (7)
雪    币: 2063
活跃值: (1752)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
图片都挂掉了
2021-3-30 12:04
0
雪    币: 1475
活跃值: (14652)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
3
davidangle 图片都挂掉了
没挂掉啊,用的图床,可能加载的比较慢
2021-3-30 13:05
0
雪    币: 15
活跃值: (3546)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
实际分析中函数都是通过动态方式获取的函数地址,不运行不知道程序调用了什么函数,程序干的事情不会像示例程序那样一眼就能看出来.
2021-3-31 19:38
1
雪    币: 1475
活跃值: (14652)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
5
麻木的时间 实际分析中函数都是通过动态方式获取的函数地址,不运行不知道程序调用了什么函数,程序干的事情不会像示例程序那样一眼就能看出来.
是的呢,不过IDA命名一下就和正常程序一样了
2021-4-1 17:10
0
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
小白请教一下,c代码编译后的obj文件还可以反编译吗
2021-4-29 14:00
0
雪    币: 1475
活跃值: (14652)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
7
Way_1023 小白请教一下,c代码编译后的obj文件还可以反编译吗
没试过,不过obj里面都是汇编代码,ida应该能识别吧,你可以试试
2021-4-29 16:59
0
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
SSH山水画 没试过,不过obj里面都是汇编代码,ida应该能识别吧,你可以试试
我是想加密obj文件,请问您知道相关加密信息吗
2021-4-30 20:05
0
游客
登录 | 注册 方可回帖
返回
//