[原创]分析实战读书笔记1_初级静态分析
[原创]分析实战读书笔记2_初级动态分析
[原创]分析实战读书笔记3_IDA小知识
[原创]分析实战读书笔记4_汇编中C代码结构
[原创]分析实战读书笔记5_实战分析恶意样本
[原创]分析实战读书笔记6_样本实战之初探树形逻辑
从事安全行业有3个月了,进步还是比较快的,但是慢慢发现自己对于病毒分析这块还是有些力不从心.所以决定工作之余读读这本<恶意代码分析实战>
,学习下病毒分析领域中常见的分析手法、上手思路、一些常见突破点之类的.
感觉还是整理成笔记比较好,这样自己以后翻找起来也方便一些.
PDF+随书文件天翼云:
https://cloud.189.cn/t/jIV3iy7fEbee (访问码:k3dw)
对于一个样本而言,分析师们不可能直接拖进ida拖进od就开始分析. 简单且快速的初步静态分析会让分析师对样本的行为、类型有个大致的了解, 方便进行后续的样本详细分析及样本溯源.
恶意代码分析实战
一书中开篇就为我们讲解了一些常见的基础静态分析技术,我将其进行简单整理, 在以后的分析中会大有用处.
基础的样本分析包括了:查壳,查PE信息,查导入导出表,查资源表等
一个程序之所以要加壳,就是为了给逆向分析者们带来障碍. 而对于恶意样本,加壳可以增大分析师们对样本代码、静态字符串、文件特征值
等数据的分析难度,从而保证恶意样本的第一步存活.
所以通过查壳可以进行初步的判断,若是有壳,则可能为恶意程序,不过随着硬件技术的发展,机器的计算能力越来越强,非常多的正常程序也开始进行加壳保护,而在N年前,加壳会对程序的运行速度有很大的影响,正规的开发者为了保证用户体验一般不会加壳
,所以目前来看,这个判断依据已经几乎不成立了.
查壳的方法多种多样,最简单快速的则是用类似PEID 、ExeInfo
等强大的查壳工具进行快速的壳子鉴定,部分壳子还可以通过插件直接脱掉,可以说是非常方便了.
即使不使用工具,我们也可以通过一些细节来判断程序是否加壳了
很多壳子会在节表处留下很明显的字符串来宣传自身, 如:mapo upx vmp
等,因此当出现这些区段时,此程序则可能被加壳(也可能是脱壳后)
没见过的节名,随机化的节名 大部分编译器在没有人工干预的情况下,节表可以说就那么几种,其中包含的常见区段如下图:
如果在节表中看到很少见的节名称或类似gfdjdfmn
明显随机化的名称时,则极有可能文件被加壳
节VirtualSize远大于RawSize 当一个节的VSize远大于RSize时, 说明其在运行时留出了很大一块内存用于存放某些数据, 这点很有可能是外壳程序解密后存放原代码的区域,如下图:
但是需要注意的是, 对于windows程序来讲, .data节的VSize大于RSize是很正常的.
导入表很少 对于一个正常程序来讲, 即使是简单的Hello World ,也会有大量的导出函数,当一个程序的导出函数很少时,则明显被加壳.如下图:
字符串很少或不认识 如果在用提串工具无法获取到可识别的单词,句子等,那么基本可以判定为加了壳子.
PE信息包含了整个可执行文件的各种属性, 观察PE结构可以帮助我们快速了解样本的类型, 样本的关键信息等
如当子系统(Subsystem)为GUI时, 说明这是一个窗口程序, 当你执行时却未见窗口, 那么就需要考虑下是什么原因导致窗口未显示, 又或者程序本就不存在窗口而是偷偷运行?
时间戳也是个很有用的信息, 虽然在PE结构中时间戳可以被随意更改, 但部分情况下时间戳可以帮助我们进行样本溯源
导入导出表是一个PE文件的核心, 这两部分清晰的展示了一个程序 我要做什么/我能提供什么
,因此绝大部分恶意程序会想尽办法隐藏导入导出表来躲避分析师的分析. 熟悉导入导出表的常见函数, 可以为我们的分析提供强力的帮助.
既然要通过导入导出表进行初步鉴定, 那么我们就必须对常见的动态链接库和函数有一个深刻的印象,了解其作用
上图例举出了常见的dll, 当一个程序的导入表包含这些dll时, 我们就可以大致猜测出整个程序具备什么功能.
附录A
中例举了一些常见的winApi函数作用 以及恶意程序是如何使用这些函数的,这里就不贴了
对于导出表而言, 导出函数名可以确定一个文件的真实格式, 例如main可能为exe程序, DllEntryPoint则可能为动态链接库, DriverEntry则说明这可能是一个驱动文件, 知道了文件的格式我们就可以对不同格式的文件采取不同的分析手法.
导出表中还可能包含一种情况, 那就是dll劫持技术, 恶意样本常使用dll劫持来达到我们俗称的白加黑
效果, 而这种劫持最明显的特点就是会破坏原导出函数的内容, 当我们在看到一个文件的导出函数, 大量导出函数的内容相同或都为空, 则可以确定此dll劫持了原dll.
之所以将资源表单独拿出来说一下, 是因为大量的恶意样本选择将恶意代码隐藏到资源数据段中, 这种技术在.NET恶意程序
中尤为多见. 但并不说明资源表含有代码数据必然为恶意程序
,很多正规程序也喜欢在资源段中保存一些数据一共随时使用.
想要提取资源数据段中的内容可以使用诸如ResourceHacker ResEdit ResScope
等资源信息查看/提取工具
这本书有很多章节练习, 相比于其他书籍尽可能简单的练习而言, 分析实战中的练习为了让读者加深印象, 站在了病毒开发者的角度, 尽可能地将练习伪造成正常程序并抹除/隐藏关键信息, 用心去完成章节实验会加深对分析思路的理解与记忆.
这个练习包含exe与dll两部分,使用上文的思路我们试着总结一下样本信息
Lab01-01.exe
通过查壳工具可以确认此程序未加壳.
观察PE信息,可以发现样本为控制台程序, 对于控制台程序, 很多控制台程序会一闪而过, 为了清晰观察样本行为, 后门的分析中可以在命令控制行内运行样本
程序无导出表,通过观察导入表可以猜测出程序具有遍历文件 创建文件 拷贝文件
的功能,
查看字符串 , 发现可疑字符串 C:\windows\system32\kerne132.dll 这里的l写成了1
程序无资源段
Lab01-01.dll
查壳无壳
查PE信息与exe编译时间接近,应该是搭配使用
查询导入表包含延迟、创建进程、创建互斥体功能, 应该有防止多开, 导入了ws2_32应该包含联网功能
无导出表数据,但是存在导出表RVA
查字符串 发现一个IP 还有sleep与exec sleep可能用于延迟程序运行来躲避沙箱或虚拟机检测,这些后面再说
将文件上传至virustotal.com进行分析并查看报告. 文件匹配到了已有的反病毒软件特征吗?
这些文件是什么时候编译的?
这两个文件中是否存在迹象说明他们是否被加壳或混淆了?
是否有导入函数显示了这个恶意代码是做什么的?如果是, 是那些导入函数?
是否有任何其他文件或基于主机的迹象,让你可以在受感染系统上查找?
是否有基于网络的迹象,可以用来发现受感染机器上的这个恶意代码?
你猜这些文件的目的是什么?
查壳,清楚的看到是UPX壳, win32控制台程序
使用官方UPX工具进行脱壳后查看导入表, 无导出函数
将脱壳后的程序提串
无资源表
将Lab01-02.exe文件上传至http://www.VirusTotal.com/进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?
是否有这个文件被加壳或混淆的任何迹象?如果是这样,这些迹象是什么?如果该文件被加壳,请进行脱壳,如果可能的话。
有没有任何导入函数能够暗示出这个程序的功能?如果是,是哪些导入函数,它们会告诉你什么?
哪些基于主机或基于网络的迹象可以被用来确定被这个恶意代码所感染的机器?
查壳 ,发现是FSG1.0壳子, 尝试多款脱壳机无果, 并且程序是个控制台程序
程序导入表只包含两个函数 也是壳子必要的两个函数
加壳了自然提取不到什么有用的串
将Lab01-03.exe文件上传至 http:/www.VirusTotal.com/进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?
是否有这个文件被加壳或混淆的任何迹象?如果是这样,这些迹象是什么﹖如果该文件被加壳,请进行脱壳,如果可能的话。
有没有任何导入函数能够暗示出这个程序的功能?如果是,是哪些导入函数,它们会告诉你什么?
有哪些基于主机或基于网络的迹象,可以被用来确定被这个恶意代码所感染的机器?
查壳,发现是VC++ 6.0开发的程序, 各区段正常 , 基本确定无壳, 并且是个win32窗口程序
查看导入表, 程序无导出表
提取字符串(字符串很多,就不截全了) !This program cannot be run in DOS mode.说明了资源中可能包含PE结构数据
将Lab01-04.exe文件上传至http://www.VirusTotal.com/进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?
是否有这个文件被加壳或混淆的任何迹象?如果是这样,这些迹象是什么﹖如果该文件被加壳,请进行脱壳,如果可能的话。
这个文件是什么时候被编译的?
有没有任何导入函数能够暗示出这个程序的功能﹖如果是,是哪些导入函数,它们会告诉你什么?
有哪些基于主机或基于网络的迹象,可以被用来确定被这个恶意代码所感染的机器?
这个文件在资源段中包含一个资源。使用Resource Hacker工具来检查资源,然后抽取资源。从资源中你能发现什么吗?
本章带领读者通过简单的静态分析方法去判断样本行为与性质
这些简单的静态分析方法包括 :
在1-4的分析中还积累了一个小知识:
恶意程序常喜欢玩千层饼套路, 将另一个恶意程序数据放置在资源段中
将样本上传至VT后, 有
42
家报毒, 这么规模的报毒基本不是误报了.
将样本上传至VT后, 有
42
家报毒, 这么规模的报毒基本不是误报了.
根据上面我们对PE的查看, 可以发现两个文件都是
2010
/
12
/
19
-
16
:
16
进行编译的
根据上面我们对PE的查看, 可以发现两个文件都是
2010
/
12
/
19
-
16
:
16
进行编译的
未存在加壳或混淆迹象
.exe 包含了遍历文件 拷贝文件的函数
.dll 包含了创建进程 联网功能的函数
.exe 包含了遍历文件 拷贝文件的函数
.dll 包含了创建进程 联网功能的函数
在exe文件中发现了字符串C:\windows\system32\kerne132.dll
这里使用
1
代替l来混淆视线, 因此可以在主机上判断这个文件是否存在来判断主机是否被恶意程序攻击
在exe文件中发现了字符串C:\windows\system32\kerne132.dll
这里使用
1
代替l来混淆视线, 因此可以在主机上判断这个文件是否存在来判断主机是否被恶意程序攻击
在dll中发现了IP字符串
127.26
.
152.13
在dll中发现了IP字符串
127.26
.
152.13
dll文件可能是后门,用于向IP发送连接请求, exe用于加载dll, 并将文件拷贝至C:\windows\system32\kerne132.dll来隐藏自身
dll文件可能是后门,用于向IP发送连接请求, exe用于加载dll, 并将文件拷贝至C:\windows\system32\kerne132.dll来隐藏自身
55
家引擎报毒,毕竟书籍太老了
通过PEID可以看到加了UPX壳, 使用UPX官方提供的工具可以进行脱壳
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-4-19 09:03
被SSH山水画编辑
,原因: 补链