对于C++编写的程序,在分析时常常会不小心走入框架代码。因此学习如何识别C++框架代码是十分必要的。否则会花费大量精力在框架代码上。
this指针在汇编代码中常以ECX
进行存储。
如图中的方法重载,仅通过函数参数个数进行区分。
C++使用名字修饰技术来区分重载的N个函数。名字修饰的大致格式如下:
函数名@类名@@参数1@参数2....
IDA中已经为我们标识出了一些库函数的名字修饰:
IDA还可以返修饰成我们能读懂的格式:
继承可以帮助正向开发者高效率开发,减少代码复用。其在汇编中无法体现。
一个类的虚函数表指针存在于其实例化对象的首地址处。
IDA已经为我们识别出了这是两张虚函数表,它们包含相同的虚函数4010E0
,且4020DC处的函数数量明显多于4020F0。
根据继承特点,我们可以说:4020DC所属类是4020F0所属类的子类。 其继承了4010E0方法。
在堆中创建对象(new)时,IDA大部分时候可以为我们识别出operator new操作。
①②两处是对虚函数表的赋值。但①处的代码貌似是无意义的。
我们知道子类对象初始化时会先初始化父类属性。因此①处的代码是将父类的虚函数表赋给子类对象。其后再将子类的虚函数表赋给子类对象。
所以造成了①处代码无用的效果。
在0x401040处的函数采用了什么参数?
哪个URL被用来调用URLDownloadToFile
这个程序做了什么事情?
在这个程序中,你可以从有趣的字符串中了解到什么?
导入函数表告诉你关于这个程序的什么信息?
在0x4011D9处创建对象的目的是什么?它有什么虚函数吗?
哪个函数可能被在0x401349处的call [edx]指令调用?
如何简易地搭建这个恶意代码所预料的服务器,不用连接到互联网,就能完整地分析这个恶意代码呢?
这个程序的目的是什么?
在这个程序中实现虚函数调用的目的是什么?
你可以在这个程序中得到什么有意思的字符串?
导入函数表告诉你关于这个程序的什么信息?
在Ox4025C8处的switch表中的6个项都做了什么?
内核驱动。
驱动的位数要求与系统一致,当一个病毒在内核层进行执行,那么大部分都是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寻址
调用约定与函数传参
X64的传参变成了前四个参数从左到右依次通过RCX RDX R8 R9传参,其余参数通过push
异常处理
X64中结构化异常处理不再在函数头部修改fs:[0]。而是在PE静态文件中存储在一张异常信息表中。
.pdata节中的_IMAGE_RUNTIME_FUNCTION_ENTRY结构保存了每一个函数的开始地址和末尾地址。以及那个函数的异常处理函数指针。
当你不带任何参数运行程序时会发生什么?
根据你使用的IDA Pro 的版本,main函数可能没有被自动识别,你如何识别对main函数的调用?
从0x0000000140001150地址到0x0000000140001161地址的指令在栈上存储了什么?
在不改变二进制程序文件名的前提下,如何才能让这个程序运行它的真正负载?
Ox0000000140001205位置的strncmp 函数调用比较了哪两个字符串?
0x00000001400013C8位置的函数接收哪些参数?
有多少个参数被传递给在Ox0000000140001093位置对CreateProcess函数的调用?你是如何知道的?
恶意代码的资源节有什么有趣的东西?
这个恶意代码是为x64编译的,还是为x86编译的?
恶意代码是如何确定出它正在运行的环境类型的?
与在x86环境中相比,恶意代码在x64环境中会做哪些不同的事情?
恶意代码在x86环境中运行时会释放出哪些文件?你可以在哪里找到这些文件?
当运行在x64机器上时,恶意代码丢弃了哪些文件?你在哪里能找到这个或这些文件?
当运行在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文件
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)