首页
论坛
课程
招聘
[原创]分析实战读书笔记1_初级静态分析
2020-12-4 16:23 4510

[原创]分析实战读书笔记1_初级静态分析

2020-12-4 16:23
4510

[原创]分析实战读书笔记1_初级静态分析
[原创]分析实战读书笔记2_初级动态分析
[原创]分析实战读书笔记3_IDA小知识
[原创]分析实战读书笔记4_汇编中C代码结构
[原创]分析实战读书笔记5_实战分析恶意样本
[原创]分析实战读书笔记6_样本实战之初探树形逻辑

 

从事安全行业有3个月了,进步还是比较快的,但是慢慢发现自己对于病毒分析这块还是有些力不从心.所以决定工作之余读读这本<恶意代码分析实战>,学习下病毒分析领域中常见的分析手法、上手思路、一些常见突破点之类的.

 

感觉还是整理成笔记比较好,这样自己以后翻找起来也方便一些.
PDF+随书文件天翼云:
https://cloud.189.cn/t/jIV3iy7fEbee (访问码:k3dw)

1_基础静态分析知识点总结

对于一个样本而言,分析师们不可能直接拖进ida拖进od就开始分析. 简单且快速的初步静态分析会让分析师对样本的行为、类型有个大致的了解, 方便进行后续的样本详细分析及样本溯源.

 

恶意代码分析实战一书中开篇就为我们讲解了一些常见的基础静态分析技术,我将其进行简单整理, 在以后的分析中会大有用处.

 

基础的样本分析包括了:查壳,查PE信息,查导入导出表,查资源表等

1.1_查壳

一个程序之所以要加壳,就是为了给逆向分析者们带来障碍. 而对于恶意样本,加壳可以增大分析师们对样本代码、静态字符串、文件特征值等数据的分析难度,从而保证恶意样本的第一步存活.

 

所以通过查壳可以进行初步的判断,若是有壳,则可能为恶意程序,不过随着硬件技术的发展,机器的计算能力越来越强,非常多的正常程序也开始进行加壳保护,而在N年前,加壳会对程序的运行速度有很大的影响,正规的开发者为了保证用户体验一般不会加壳,所以目前来看,这个判断依据已经几乎不成立了.

 

查壳的方法多种多样,最简单快速的则是用类似PEID 、ExeInfo等强大的查壳工具进行快速的壳子鉴定,部分壳子还可以通过插件直接脱掉,可以说是非常方便了.

 

即使不使用工具,我们也可以通过一些细节来判断程序是否加壳了

  • 很多壳子会在节表处留下很明显的字符串来宣传自身, 如:mapo upx vmp等,因此当出现这些区段时,此程序则可能被加壳(也可能是脱壳后)

  • 没见过的节名,随机化的节名 大部分编译器在没有人工干预的情况下,节表可以说就那么几种,其中包含的常见区段如下图:

    image-20201202161439793

    如果在节表中看到很少见的节名称或类似gfdjdfmn明显随机化的名称时,则极有可能文件被加壳

  • 节VirtualSize远大于RawSize 当一个节的VSize远大于RSize时, 说明其在运行时留出了很大一块内存用于存放某些数据, 这点很有可能是外壳程序解密后存放原代码的区域,如下图:

    image-20201202161858435

    但是需要注意的是, 对于windows程序来讲, .data节的VSize大于RSize是很正常的.

  • 导入表很少 对于一个正常程序来讲, 即使是简单的Hello World ,也会有大量的导出函数,当一个程序的导出函数很少时,则明显被加壳.如下图:

    image-20201202162247571

  • 字符串很少或不认识 如果在用提串工具无法获取到可识别的单词,句子等,那么基本可以判定为加了壳子.

1.2_查PE信息

PE信息包含了整个可执行文件的各种属性, 观察PE结构可以帮助我们快速了解样本的类型, 样本的关键信息等

 

如当子系统(Subsystem)为GUI时, 说明这是一个窗口程序, 当你执行时却未见窗口, 那么就需要考虑下是什么原因导致窗口未显示, 又或者程序本就不存在窗口而是偷偷运行?

 

时间戳也是个很有用的信息, 虽然在PE结构中时间戳可以被随意更改, 但部分情况下时间戳可以帮助我们进行样本溯源

  • 当时间戳过旧时,可能说明此样本为旧样本 , 因此可以想办法提取一些这个样本的以往案例, 看下是否已经有某个组织机构出过此类样本的报告.
  • Delphi的程序比较特殊, 经Delphi编译器正常编译的程序, 时间戳是固定的, 因此对于Delphi程序不适用时间戳进行判断

1.3_查导入导出表

导入导出表是一个PE文件的核心, 这两部分清晰的展示了一个程序 我要做什么/我能提供什么,因此绝大部分恶意程序会想尽办法隐藏导入导出表来躲避分析师的分析. 熟悉导入导出表的常见函数, 可以为我们的分析提供强力的帮助.

 

既然要通过导入导出表进行初步鉴定, 那么我们就必须对常见的动态链接库和函数有一个深刻的印象,了解其作用

 

image-20201202172058743

 

上图例举出了常见的dll, 当一个程序的导入表包含这些dll时, 我们就可以大致猜测出整个程序具备什么功能.

 

附录A中例举了一些常见的winApi函数作用 以及恶意程序是如何使用这些函数的,这里就不贴了

 

对于导出表而言, 导出函数名可以确定一个文件的真实格式, 例如main可能为exe程序, DllEntryPoint则可能为动态链接库, DriverEntry则说明这可能是一个驱动文件, 知道了文件的格式我们就可以对不同格式的文件采取不同的分析手法.

 

导出表中还可能包含一种情况, 那就是dll劫持技术, 恶意样本常使用dll劫持来达到我们俗称的白加黑效果, 而这种劫持最明显的特点就是会破坏原导出函数的内容, 当我们在看到一个文件的导出函数, 大量导出函数的内容相同或都为空, 则可以确定此dll劫持了原dll.

1.4_查资源表

之所以将资源表单独拿出来说一下, 是因为大量的恶意样本选择将恶意代码隐藏到资源数据段中, 这种技术在.NET恶意程序中尤为多见. 但并不说明资源表含有代码数据必然为恶意程序,很多正规程序也喜欢在资源段中保存一些数据一共随时使用.

 

想要提取资源数据段中的内容可以使用诸如ResourceHacker ResEdit ResScope等资源信息查看/提取工具

2_章节实验练习

这本书有很多章节练习, 相比于其他书籍尽可能简单的练习而言, 分析实战中的练习为了让读者加深印象, 站在了病毒开发者的角度, 尽可能地将练习伪造成正常程序并抹除/隐藏关键信息, 用心去完成章节实验会加深对分析思路的理解与记忆.

Lab 1 - 1

这个练习包含exe与dll两部分,使用上文的思路我们试着总结一下样本信息

  • Lab01-01.exe

    • 通过查壳工具可以确认此程序未加壳.

      image-20201202174726910

    • 观察PE信息,可以发现样本为控制台程序, 对于控制台程序, 很多控制台程序会一闪而过, 为了清晰观察样本行为, 后门的分析中可以在命令控制行内运行样本

      image-20201202174943706

    • 程序无导出表,通过观察导入表可以猜测出程序具有遍历文件 创建文件 拷贝文件的功能,

      image-20201202175555897

    • 查看字符串 , 发现可疑字符串 C:\windows\system32\kerne132.dll 这里的l写成了1

      image-20201203144052434

    • 程序无资源段

  • Lab01-01.dll

    • 查壳无壳

      image-20201203134317325

    • 查PE信息与exe编译时间接近,应该是搭配使用

      image-20201203134448639

    • 查询导入表包含延迟、创建进程、创建互斥体功能, 应该有防止多开, 导入了ws2_32应该包含联网功能

      无导出表数据,但是存在导出表RVA

      image-20201203135357031

    • 查字符串 发现一个IP 还有sleep与exec sleep可能用于延迟程序运行来躲避沙箱或虚拟机检测,这些后面再说

      image-20201203144209788

课后题

  1. 将文件上传至virustotal.com进行分析并查看报告. 文件匹配到了已有的反病毒软件特征吗?

    1
    将样本上传至VT后, 有42家报毒, 这么规模的报毒基本不是误报了.
  2. 这些文件是什么时候编译的?

    1
    根据上面我们对PE的查看, 可以发现两个文件都是2010/12/19-16:16进行编译的
  3. 这两个文件中是否存在迹象说明他们是否被加壳或混淆了?

    1
    未存在加壳或混淆迹象
  4. 是否有导入函数显示了这个恶意代码是做什么的?如果是, 是那些导入函数?

    1
    2
    .exe 包含了遍历文件 拷贝文件的函数
    .dll 包含了创建进程 联网功能的函数
  5. 是否有任何其他文件或基于主机的迹象,让你可以在受感染系统上查找?

    1
    2
    在exe文件中发现了字符串C:\windows\system32\kerne132.dll
    这里使用1代替l来混淆视线, 因此可以在主机上判断这个文件是否存在来判断主机是否被恶意程序攻击
  6. 是否有基于网络的迹象,可以用来发现受感染机器上的这个恶意代码?

    1
    在dll中发现了IP字符串127.26.152.13
  7. 你猜这些文件的目的是什么?

    1
    dll文件可能是后门,用于向IP发送连接请求, exe用于加载dll, 并将文件拷贝至C:\windows\system32\kerne132.dll来隐藏自身

Lab 1 - 2

  • 查壳,清楚的看到是UPX壳, win32控制台程序

    image-20201203151823154

  • 使用官方UPX工具进行脱壳后查看导入表, 无导出函数

    image-20201203152307585

  • 将脱壳后的程序提串

    image-20201203152516754

  • 无资源表

课后题

  1. 将Lab01-02.exe文件上传至http://www.VirusTotal.com/进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?

    1
    55家引擎报毒,毕竟书籍太老了
  2. 是否有这个文件被加壳或混淆的任何迹象?如果是这样,这些迹象是什么?如果该文件被加壳,请进行脱壳,如果可能的话。

    1
    通过PEID可以看到加了UPX壳, 使用UPX官方提供的工具可以进行脱壳
  3. 有没有任何导入函数能够暗示出这个程序的功能?如果是,是哪些导入函数,它们会告诉你什么?

    1
    2
    3
    CreateThread 程序会创建线程
    CreateService 会创建服务
    WININET.dll 导入的两个函数会发起网络请求
  4. 哪些基于主机或基于网络的迹象可以被用来确定被这个恶意代码所感染的机器?

    1
    通过分析字符串可以发现  恶意代码会创建名为 MalService的服务  并会访问www.malwareanalysisbook.com网址, 可以通过寻找服务、监控网络流量来判断主机是否感染

Lab 1 - 3

  • 查壳 ,发现是FSG1.0壳子, 尝试多款脱壳机无果, 并且程序是个控制台程序

    image-20201204134433183

  • 程序导入表只包含两个函数 也是壳子必要的两个函数

    image-20201204135252360

  • 加壳了自然提取不到什么有用的串

    image-20201204135345196

课后题

  1. 将Lab01-03.exe文件上传至 http:/www.VirusTotal.com/进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?

    1
    53家引擎报毒
  2. 是否有这个文件被加壳或混淆的任何迹象?如果是这样,这些迹象是什么﹖如果该文件被加壳,请进行脱壳,如果可能的话。

    1
    通过PEID查到壳子为FSG 1.0  尝试脱壳失败
  3. 有没有任何导入函数能够暗示出这个程序的功能?如果是,是哪些导入函数,它们会告诉你什么?

    1
    脱壳失败,无法判断导入函数
  4. 有哪些基于主机或基于网络的迹象,可以被用来确定被这个恶意代码所感染的机器?

    1
    脱壳失败 无法提取有用信息

Lab 1 - 4

  • 查壳,发现是VC++ 6.0开发的程序, 各区段正常 , 基本确定无壳, 并且是个win32窗口程序

    image-20201204140032651

  • 查看导入表, 程序无导出表

  • 提取字符串(字符串很多,就不截全了) !This program cannot be run in DOS mode.说明了资源中可能包含PE结构数据

    image-20201204140324152

课后题

  1. 将Lab01-04.exe文件上传至http://www.VirusTotal.com/进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?

    1
    57家引擎报毒
  2. 是否有这个文件被加壳或混淆的任何迹象?如果是这样,这些迹象是什么﹖如果该文件被加壳,请进行脱壳,如果可能的话。

    1
    没有加壳迹象
  3. 这个文件是什么时候被编译的?

    1
    通过PE工具查看时间戳并进行转换得知,编译时间为 2019/8/30-22:26:59, 结合本书发售时间,这是个虚假的编译时间
  4. 有没有任何导入函数能够暗示出这个程序的功能﹖如果是,是哪些导入函数,它们会告诉你什么?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    通过查看导入表得知:
    GetProcAddress+LoadLibraryA -> 组合实现动态加载
    WinExec -> 实现执行命令
    KERNEL32.dll中与File有关的函数 -> 创建文件+写入文件+移动文件+取文件路径
    FindResourceA+LoadResource+SizeOfResource -> 加载程序中的资源数据
    OpenProcess -> 打开进程
    GetCurrentProcess -> 取当前进程
    GetWindowsDirectory -> 取win系统目录
    CreateRemoteThread -> 创建远程线程,配合动态加载实现远线程注入
    ADVAPI32.dll中的函数 -> 和权限有关
     
    总体推测程序可能将资源数据通过远线程注入到某个进程,同时涉及文件操作
  5. 有哪些基于主机或基于网络的迹象,可以被用来确定被这个恶意代码所感染的机器?

    1
    2
    3
    4
    http://www.practicalmalwareanalysis.com/updater.exe
    \system32\wupdmgrd.exe
    \winup.exe
    可以通过以上文件名进行确认
  6. 这个文件在资源段中包含一个资源。使用Resource Hacker工具来检查资源,然后抽取资源。从资源中你能发现什么吗?

    1
    2
    通过reshack打开样本,发现BIN资源段包含PE结构数据,将其保存后使用PEID查壳,发现是VC++6.0编写的程序
    同样的分析方法可以发现是个下载器程序

3_读后总结

本章带领读者通过简单的静态分析方法去判断样本行为与性质

 

这些简单的静态分析方法包括 :

  1. 判断壳子
  2. 根据导入函数判断可能具备的功能
  3. 根据字符串判断关键信息如网络访问地址、文件释放未知
  4. 通过VT平台进行样本的初步认识,通过多数引擎的报毒名对样本行为有个初步判断

在1-4的分析中还积累了一个小知识:

 

恶意程序常喜欢玩千层饼套路, 将另一个恶意程序数据放置在资源段中


[注意]中秋好礼,诚意满满——你提意见,我送月饼!!

最后于 2021-4-19 09:03 被SSH山水画编辑 ,原因: 补链
收藏
点赞6
打赏
分享
最新回复 (7)
雪    币: 293
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
zhaublitz 活跃值 2020-12-30 17:12
2
0
提串和查看导入导出表,是用的什么软件,怎么设置软件的呢?
雪    币: 8230
活跃值: 活跃值 (7779)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
SSH山水画 活跃值 3 2020-12-30 18:11
3
0
zhaublitz 提串和查看导入导出表,是用的什么软件,怎么设置软件的呢?
用的FAR+工具包, 我找时间写一篇工具贴吧,这玩意设置有点麻烦,你可以百度搜搜FAR,挺好用的工具
雪    币: 413
活跃值: 活跃值 (309)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
N1ptune 活跃值 2021-4-18 12:08
4
0
大佬天翼云的外链挂了,可以再发一下吗
雪    币: 8230
活跃值: 活跃值 (7779)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
SSH山水画 活跃值 3 2021-4-19 09:07
5
0
N1ptune 大佬天翼云的外链挂了,可以再发一下吗
补了
雪    币: 1505
活跃值: 活跃值 (4057)
能力值: ( LV11,RANK:185 )
在线值:
发帖
回帖
粉丝
天象独行 活跃值 2 2021-7-23 07:08
6
0
您好;这个书可以放在百度云盘嘛?
雪    币: 8230
活跃值: 活跃值 (7779)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
SSH山水画 活跃值 3 2021-7-23 09:18
7
0
天象独行 您好;这个书可以放在百度云盘嘛?
我度盘号被封了,只有天翼云了
雪    币: 1505
活跃值: 活跃值 (4057)
能力值: ( LV11,RANK:185 )
在线值:
发帖
回帖
粉丝
天象独行 活跃值 2 2021-7-23 10:09
8
0
SSH山水画 我度盘号被封了,只有天翼云了
嗯,没关系,感谢。
游客
登录 | 注册 方可回帖
返回