本文介绍恶意代码常规分析流程。(待更)
菜鸟一枚,可能写的不好或存在错误,欢迎指正。
首先,恶意代码的生命周期分为三个——植入前、植入中、植入后
攻击途径
攻击途径有很多,大致有:
1.网页漏洞方式——0day
2.邮件方式——附件、社工钓鱼等
3.聊天工具
4.U盘交叉使用等等
形式
常见为exe、dll
分析
前:
1.建立虚拟环境(安全)
2.静态分析
- 指通过反病毒引擎扫描识别已知的恶意代码家族和变种名
- 逆向分析恶意代码模块构成,内部数据结构,关键控制流程等,理解恶意代码的机理,并提取特征码用于检测。
- 常用工具包括PEview、PEID 、IDA(加壳的能脱壳就脱,利用工具能得到结论的是没加壳的恶意代码)
中:
3.脱不了就动态分析
- 指通过在受控环境中执行目标代码,以获取目标代码的行为及运行结果。
目标:
- 为网络入侵事件的响应提供所需信息
- 确定到底发生了什么
- 确保定位出所有受感染的主机和文件
- 确定恶意代码可以做什么
- 分析出主机特征和网络特征,以便检测
例如:动态分析a.exe。
假如释放新的c.dll或c.exe,再对释放的代码进行静态动态分析(目标恶意代码是下载器之类的)
恶意代码是否自启动——资源配置(文件释放,修改注册表、注册服务等等)——网络行为(连接web服务器下载东西等等)
把a.exe运行起来,要针对a.exe中PID 2503(注入到explorer.exe中)的进程行为进行分析监控,对进程行为分析processmonitor(进程行为、注册表、文件、API调用(IAP hook)、端口(专门列举端口的应用程序)等等)
针对c.exe——如果注册成服务,以内核态运行——到内核层用hook(API调用)
后:
持久控制(可靠控制)、隐蔽控制
完成
(1)自启动:修改注册表、注册服务——sys(内核中做hook)
(2)资源配置:文件释放
(3)网络行为:连接web服务器,下载
实例
本次分析的为样本下载链接:
一、首先建立安全的虚拟环境,这里使用win10虚拟机进行样本分析。
二、1.拿到样本首先进行静态分析,用PEid分析样本,观察其是否为加壳的恶意代码。如下图:
观察到其并没有加壳,病毒本身是利用C#进行编写。入口点为0003008E。
2.接下来我们进一步查看扩展信息,如下图:
可见其的确是未经过加壳的病毒。
三、然后我们利用PEview查看这个PE文件头信息以及各分节信息,如下图:
1.先解释一下各部分的信息:
- DOS_HEADER:DOS头
- MS-DOS Stub Program:DOS环境下执行的指令,输出该程序不能再dos下运行的提示。
- NT_HEADERS:PE文件头,其包含了标准与扩展PE头
- NT_HEADERS下属的4个表(.text等):各节(section)的摘要信息,又称节表。
- SECTION .text:存储程序中的代码节
- SECTION .rdata:存储程序中引用的所有外部符号的数据节,该节包含导入的DLL名称表,其中的函数相对虚拟地址表,如果是DLL,则还有导出表
- SECTION .data:存储程序中用到的所有全局变量,符号常量,字符串等数据的节,这些数据通常是由程序员自定义的,并且没有引用外部文件的内容。
- SECTION .rsrc:存储程序中用到的所有资源,例如图标,窗口菜单,按钮等的节,该节通常只存在于图形界面的程序中。
- SECTION .reloc:就是重定位区段,可执行文件的基址重定位。
2.首先分析IMAGE_FILE_HEADER字段,如下图:
可以看出该字段的值为014C(对应符号常量为IMAGE_FILE_MACHINE_I386) ,
所有编译为可以在Intel 80386以及后续兼容处理器平台上运行的PE文件,应该都具有相同的值。
- IMAGE_FILE_EXECUTABLE_IMAGE表示这是一个可执行文件
- IMAGE_FILE_32BIT_MACHINE表示这是一个在32位机器上运行的程序
3.然后是IMAGE_OPTIONAL_HEADER字段,如下图:
由Subsystem可以看出这是一个具有windows图形化界面的恶意代码
IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE可知允许在载入的时候进行重定位
IMAGE_DLLCHARACTERISTICS_NX_COMPAT,表示程序采用了/NXCOMPAT编译
IMAGE_DLLCHARACTERISTICS_NO_SEH表示不使用结构化异常处理
IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE表示支持终端服务器
4..text代码段分析,如下图:
- Size of Raw Data指向的是代码起始处
- IMAGE_SCN_MEM_EXECUTE表示该节加载到内存后的所有页面可执行
- IMAGE_SCN_MEM_READ表示该节加载到内存后的所有页面可读
5.接下来是.data字节,存储程序中用到的所有全局变量,符号常量,如下图
6.在SECTION .sdata字段中我们看到value中有Auto clicker typer的字样,推测这是一个自动点击记录器。如下图
四、使用Dependency Walker扫描32位或64位Windows模块(exe,dll,ocx,sys等),如下图:
1.首先可以看到该程序调用MSCOREE.DLL,mscoree.dll是.NET Framework相关组件。在KERNEL32.DLL中我们可以看到导出函数中有如RegDeleteKey字样的函数,说明该可执行文件会删除注册表键和注册表键值,如下图:
2.在NTDLL.DLL中还发现了RtlIpv4AddressToString字眼的函数,很可能和网络服务有关,如下图:
3.同时,看到了UnmapViewOfFile函数,该函数可以对修改后的文件保存,如下图:
五、接下来用IDA进行反编译,但却出现如下图界面:
发现IDA无法反编译用C#编写的.NET程序,因此这里尝试使用其他工具,上网搜索后,决定使用dotPeek
1.利用dotPeek进行反编译后,结果如下图:
need-to-insert-img
2.我们可以看到这个恶意代码调用了哪些库,如下图:
need-to-insert-img
3.可以看到在这个恶意代码中有4个Form,应该对应4个界面,如下图:
need-to-insert-img
4.在Form1中往下看,可以看到许多引人注目的API,如下图:
need-to-insert-img
need-to-insert-img
这些函数的功能再明显不过了,如KeyPress()应该是键盘记录的作用,MouseDown()应该是记录鼠标点击的动作,MouseWheel()应该是记录鼠标滚轮的操作等等。
5.然后我们来看看Button1,如下图:
need-to-insert-img
可见点击button1后,应该是让其他按钮无效DisableAll(),如下图。然后安装钩子InstallHooks()
need-to-insert-img
在进入InstallHooks()这个函数后,可以看到其实现了对用户鼠标行为的监控,比如获取鼠标button的flag,如下图:
need-to-insert-img
获取用户点击鼠标的次数,如下图:
need-to-insert-img
创建鼠标事件,如下图:
need-to-insert-img
其中的X、Y用来记录鼠标的位置,通过POINTAPI来实现,如下图:
need-to-insert-img
接下来就是很明显的键盘记录行为,通过GetKeyboardState()函数来获取键盘状态,然后转换成ASCII码。如下图:
need-to-insert-img
6.Button2的按钮的功能应该是和Button1的功能相呼应,重新激活各个按钮,移除钩子,如下图:
need-to-insert-img
7.注意到Button5有保存文件,且有写文件的功能。先是通过ShowDialog()显示目录,然后写文件。因此可能这个按钮会触发释放文件。如下图:
need-to-insert-img
8.Button7、Button9等应该就是触发其他Form的功能。如下图:
need-to-insert-img
9.我们来到Form2看一下几个button的功能,绝大部分是与Form1相关,例如打开目录等等,如下图:
need-to-insert-img
10.再来看看Form3,Form3中有许多ComboBox,也有包括创建注册表键(名为AutoClickerTyper),如下图:
need-to-insert-img
11.Form4中看到设置了注册表项中的开机自启项,因此推测可以有开机自启的功能,如下图:
need-to-insert-img
12.在Keyboard中,我们可以看到列举了Keys的各个枚举值常量,如下图:
need-to-insert-img
13.在Win32中我们同样可以看到刚刚的关键性函数GetKeyboardState(),如下图:
need-to-insert-img
动态分析
- 准备好软件工具包和恶意代码样本,放到Windows10虚拟机
need-to-insert-img
- 对改虚拟机拍摄快照,建立安全的运行环境,以便虚拟机出现问题时快速恢复。
need-to-insert-img
- 运行process monitor,界面如图,可以对Windows下的高级监视工具,提供监控注册表、文件系统、网络、线程、进程和线程行为。
· 结合了文件监视器FileMon和注册表监视器RegMon的功能。
· 监控所有能捕获的系统调用-> 容易耗尽内存
· 通常不用于记录网络行为
need-to-insert-img
- 可以只针对恶意代码或特定的系统调用设置过滤。如图我们指定对测试的恶意代码进行测试。
need-to-insert-img
- 运行该恶意代码,因为是.exe文件,直接双击运行即可。界面如下:
need-to-insert-img
点击record,发现我的键盘输入以及鼠标的点击都被显示出来,键盘是以ASCII码形式记录,鼠标点击的方式等都被记录。
need-to-insert-img
点击stop停止运行
need-to-insert-img
点击option有开机自启动等选项
need-to-insert-img
点击play可以对整个被记录的过程进行复现。
点击clear清除现有记录。
need-to-insert-img
save list 可以将现有的键盘记录存储在电脑上,如图:
need-to-insert-img
open list 可以打开现有的键盘记录,如图:
need-to-insert-img
点击auto list 可以打开如下界面进行诚挚keys
need-to-insert-img
hot key 用于设置快捷键,如图:
need-to-insert-img
change delay 可以设置延迟时间,如下图:
need-to-insert-img
- 过滤之后可以看到该恶意代码的进程行为。
need-to-insert-img
- 首先查看注册表。通过检查注册表变化,发现恶意程序对注册表的操作。
need-to-insert-img
need-to-insert-img
后来查资料发现.pf文件是预读文件,可以加快程序的加载速度。
need-to-insert-img
发现很多修改注册表的行为
新建删选条件如下:
need-to-insert-img
need-to-insert-img
wininet.dll是Windows应用程序网络相关模块,与网络的连接有关。
WSOCK32.dll和WS2_32.dll,是用来创建套接字的dll库,显然,如果这个程序所介绍的功能中不应该有网络连接部分,那么在其动态链接库中还存在这2个库就显得尤为可疑了
msvcrt.dll是提供C语言运行库执行文件,提供了printf,malloc,strcpy等C语言库函数的具体运行实现,并且为使用C/C++(Vc)编译的程序提供了初始化(如获取命令行参数)以及退出等功能。
need-to-insert-img
上图为writefile函数的情况
通过这些函数我们可以猜测恶意代码进行了修改注册表、修改内存信息、建立网络连接等行为。
need-to-insert-img
进程浏览器(****Process Explore****)
主要功能
· 列出所有活跃的进程、被进程载入的DLL、各种进程属性和整体系统信息。
· 杀死一个进程、退出用户登录、启动或激活进程。
need-to-insert-img
尝试查看我们的恶意代码,如下图
need-to-insert-img
发现他的详细信息被隐藏了
Regshot
运行恶意代码前 打开Regshot进行1st shot并保存其快照
如图所示:
need-to-insert-img
另存为:
need-to-insert-img
need-to-insert-img
接下来运行恶意代码,运行一段时间后进行第二个拍照,对比两次注册表信息的变化情况。如下图:
need-to-insert-img
比较前后注册表的不同,对比结果用记事本打开
need-to-insert-img
对比结果如下:
need-to-insert-img
结论:
Auto Clicker Typer的主要功能为击键记录和鼠标操作记录,同时包含有复现记录下的操作,保存记录文件等功能。