恶意代码分析实战笔记--更新中

恶意代码分析实战笔记–更新中

所有分析文件下载:https://github.com/mikesiko/PracticalMalwareAnalysis-Labs

0x1 恶意代码类型

后门,僵尸网络,下载器,间谍软件,启动器,内核套件,勒索软件,发送垃圾邮件,蠕虫或病毒

0x2 分析方法

0x21 静态分析
反病毒引擎扫描:

virustotal:http://www.virustotal.com

哈希:

恶意代码的指纹,常用md5算法和sha1,可以通过搜索哈希值去看是否已经被识别分析过

可以用md5deep来生成一个程序的哈希值/或者winmd5

Strings:

可以用strings来简单查看程序中含有的字符串,但是并非完全可靠,主要是要从错误信息中获取有效信息,如错误信息中提示了说缺少邮件类型的dll,我们就可以猜测到这个程序可能是利用了邮件系统

混淆与加壳

加壳是混淆的一种

image-20201123095412066

可以用peid之类的工具来检测和脱壳

pe文件头:

pe文件头里的信息

image-20201123101809636

image-20201123101503221

resourcehacker可以查看资源节(.rsrc)

链接库和函数:

ida中可以看到导入表

dependence walker工具可以列出程序的动态链接函数

常见dll:

image-20201123095848393

导入函数可以去微软官方文档查

第一章实践:【】内为官方答案补充
0x211:

将文件上传到网站后,发现已经有很多引擎匹配到了,在details里可以看到详细情况

可以看到编译时间是2010-12-19【可以看一下exe和dll文件的日期,相差在一分钟之内】

image-20201123103846810

用exeinfo看这两个文件,都没有加壳

可以用detectiteasy查看1.exe的输入表,看到创建文件和复制文件(createfilea/copyfilea)以及搜索一个目录下的所有函数(findnextfila/findfirstfile)的导入函数,我们可以猜测这个程序可能会创建一个文件然后复制到某个文件夹下。1.dll的输入表里可以看到创建进程和睡眠的导入函数【ws2_32.dll是提供了联网服务】

image-20201123112803267

image-20201123113248321

运行程序后程序闪退,开启wireshark抓包没有抓到,所以并没有通过网络,同文件夹下并无明显文件变化【.dll文件中隐藏了一个ip地址】

打开ida分析,应该是用lab01这个dll替换了kernel32.dll【应该可以在文件夹下看到kerne132.dll,但是有系统限制(win10没有】

image-20201123114322202

image-20201123155740170

【可以猜测.dll是后门文件,.exe是用来安装和运行.dll文件的】

0x212:

将文件上传到网站后,有很多引擎匹配到

可以看到有加了upx的壳

image-20201123145915934

找了upx脱壳软件,重新看原文件就没有壳了

image-20201123150625482

image-20201123150719541

接下来看看导入函数,kernel32中有可以猜测使用CreateWaitableTimer函数创建可等待的计时器对象,然后使用SetWaitableTimer函数设置计时器以及WaitForSingleObject函数来确定何时向计时器发出信号。

image-20201123151014222

【winner中有可以猜测是打开网站的internetopenurl函数】

image-20201123160439581

【advapi32中有可以猜测是创建服务的createservicea函数】

image-20201123160530351

【使用strings可以猜测是创建了一个叫malservice的服务,会访问malwareanalysibook这个网站】

image-20201123161324560

0x213:

将文件上传到网站后,有很多引擎匹配到

看看有没有加壳,通过scan/t按钮可以看到是fsg1.0壳,工具比较少,应该要手动脱壳

image-20201123151306021

0x214:

将文件上传到网站后,有很多引擎匹配到

没有加壳,可以看到有movefile,findresourcea等函数,还有writefile和createfilea,猜测是写文件和复制资源

image-20201123152755628

【advapi32.dll可以猜测程序会做一些和权限相关的工作,从字符串可以猜测从这个网站下载恶意程序,位置就是在system32下】

image-20201123161610357

image-20201123161758555

用resourcehacker看看资源,不是很理解【这是另一个pe可执行文件,可以保存下来然后再次分析这个文件(可以将可执行文件保存为资源)】

image-20201123153940389

【将它save as bin文件,然后再放到die里打开,可以看到urldownloadtofile,可以猜测这是一个下载器】

image-20201123162708369

0x22 动态分析
沙箱:

在安全的环境中运行不可信任的机制,沙箱包含一个虚拟环境,通过某种方法模拟网络服务

恶意代码分析的沙箱:Norman和gfi

dll运行:

恶意的dll文件通常在dllmain执行代码,无论dll什么时候被加载,dllmain函数总会被执行。

cmd:rundll32.exe dllname,export arguments

export值必须是一个dll文件导出函数表中的函数名或者序号(前面加‘#’)

例如:runnel32.exe test.dll, install

也可以通过修改PE头部,并改变扩展名

修改PE头部,从IMAGE_FILE_HEADER的特征域里擦除IMAGE_FILE_DLL(0x2000)标记。这样不会执行任何输入函数,但是会调用dllmain方法,也可能造成恶意代码崩溃或终止

安装成服务

例如:cmd>rundll32 ipr32x.dll,installservice servicename

然后用net start命令就可以执行

进程监视:

process monitor/process explorer:监控注册表、文件系统、网络、进程和线程行为

regshot:比较前后两次注册表快照

模拟网络:

ApateDns:查看恶意代码是否会发出dns请求,修改dns配置

netcat:监听

Inetsim:linux下模拟常见网络服务,记录所有的连入请求和链接

数据包监听:

Wireshark

动态整体流程:

运行进程监视器和进程浏览器->regshot注册表快照->inetsim+apatedns设置虚拟网络->wireshark看抓包

image-20201126162144572

0x23 静态分析进阶

计算机:硬件->微指令->机器码->低级语言(汇编)->高级语言->解释型语言

冯诺伊曼体系:cpu(寄存器,控制单元,算数逻辑单元(ALU)),内存,输入输出

内存:

包含堆(动态内存),栈,代码,数据

寄存器:

image-20201201163409806

用AH之类的可以取EAX中的值

image-20201201163513378

乘法和除法只能用EAX和EDX

标志寄存器:

ZF:运算结果等于0,ZF被置位

CF:运算结果相对于目标操作数太大或太小

SF:运算结果为负或者算术运算结果最高位值为1

TF:用于调试

lea和mov:

lea是获取地址的值,mov是获取存在该地址的数据的值

栈:

存储函数的内存、局部变量、流控制结构等,短期存储,主要用途是管理函数调用之间的数据交换,后入先出

ESP是栈指针,相关指令:push, pop,call,leave,enter,ret

EBP是栈基址寄存器,程序的定位器,在一个函数中会保持不变,用来确定局部变量和参数的位置

image-20201201174659216

函数调用约定:

决定函数调用发生的方式,包含参数被放在栈上或寄存器中的次序,以及是由调用者还是被调函数负责在函数执行完成时清理栈

cdecl:参数从右到左压入栈,函数完成时由调用者清理栈,返回值保存在EAX

stdcall:同上,被调函数清理栈

fastcall:前一些参数(典型是前两个)会被传到寄存器中,备用寄存器是EDX和ECX