前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个病毒样本分析的全过程

一个病毒样本分析的全过程

作者头像
信安之路
发布2018-08-08 17:17:02
3.1K1
发布2018-08-08 17:17:02
举报
文章被收录于专栏:信安之路信安之路

本文作者:x-encounter(来自信安之路作者团队)

0x01 样本概述

样本名称: 7.exe

MD5: 4865fa85d9ee28bfab97d073a3dde8a3

SHA1: 3f738735bb0c5c95792c21d618eca8c0d5624717

分析环境及工具: winxp sp3IDAOD火绒剑

0x02 相关文件

7.exe: 样本主体

dump.exe: 样本主体经过部分解密后的病毒文件

shellcode.txt: 主体经过解密后的 shellcode,病毒的主要行为都在 shellcode 中

回调函数.txt: shellcode 会创建两个线程,该回调函数是第二个线程的回调函数(第一个线程的回调函数比较简单就没有 dump 下来)

ptf6.tmp:主线程创建的临时文件,用于 telnet 功能的实现

sfc.dll: 在第一个线程中被调用,用于禁用文件保护功能

网盘下载:

https://pan.baidu.com/s/1EsisuCsbO8lEiFLd3reB2Q (有相关 idb 文件)

0x03 行为预览

该病毒为感染型病毒,边运行边解密,有一定的混淆和反调试技术,会将自身注入到每个正在运行的进程中实现感染和传播,同时该病毒还伪装成正常的 telnet 终端,使用者会误认为这是正常的 telnet 工具从而放松警惕

7.exe (样本主体行为):

1、解密自身和 shellcode

2、创建窗口,初始化 telnet 终端,在窗口的回调函数中调用 shellcode

shellcode.txt( shellcode 行为):

1、动态获取所需要的 API 函数地址

2、操作注册表想要常驻内存(通过屏保程序)

3、提权、创建安全描述符和互斥量

4、创建线程

(1)第一次创建线程的行为:

a、调用sfc.dll中的导出函数禁用系统的文件保护功能

b、消息死循环

(2)第二次创建线程的行为:

a、检查是否被调试,遍历所有运行的进程

b、遍历进程中的所有线程

c、通过远程线程将自身注入到所有进程中

5、主线程进行复杂的 PE 操作创建 ptf6.tmp,并对这个临时文件创建一个挂起的进程用于实现 telnet 功能的伪装

0x04 详细分析

7.exe (病毒主体行为分析)

使用 PEid 查壳

无壳,接下来通过火绒剑动态监视进程,结果如下

发现有远程注入的行为,初步判断为感染型病毒,将病毒主体载入 IDA 和 OD 进行分析

快速定位主函数,来到 0100C9EB call InitApplication 函数,用于初始化 telnet 相关功能,在 OD 中 F7 步入

首先载入 telnetcr.dll,判断操作系统的语言,之后载入资源

在函数最后调用 RegisterClassWCreateWindowExW 创建窗口,这里我们应该注意这个窗口的回调函数

在 OD 中下断点,断到该窗口回调函数中,单步到 0100B9FC call sub_1038F75 时,如果直接步过,程序会直接跑飞并重新断在了窗口回调函数的起始位置

我们只能步入该函数,之后我们会出现上述同样的问题,步过某个函数程序会跑飞,我们记录这些函数并进入该函数重复上述操作,最终找到了核心代码(该过程需要极大的耐心),断点函数如下

最终找到了 01035D6C 处的 call eax,步入该函数,会出现一个 loop 循环,该循环用于动态解密 loop 下面的指令,解密前后的对比图如下

解密前

下条件断点解密后的指令

解密后的数据中又发现了 loop 指令,同上下条件断点解密 shellcode,我们可以 dump 当前的内存保存为 dump.exe

使用 IDA 载入。

之后会在 0103370Bcall eax 调用 virtualAlloc 为 shellcode 分配堆空间,接着在 01033775call ebx 进入堆空间执行 shellcode

在内存中 dump 该 shellcode 保存为 shellcode.txt,IDA 载入,继续分析

shellcode.txt(shellcode 行为分析)

首先会分四次动态获取所需的 API 函数

获取的过程比较有趣,该病毒作者自己实现了一个 hash 算法,用于对相应的 DLL 进行 PE 操作后获取的 API 函数名称进行加密再与已经写好的 hash 进行比较,从而找到需要的 API 函数地址

之后调用 GlobalMemoryStatus 函数获取内存信息,接着调用 cpuid 指令获取 cpu 信息

接着打开注册表 HKEY_CURRENT_USER\Control Panel\Desktop 查询有没有 SCRNSAVE.exe (屏保程序),如果有进行替换,作为自启动的一种方式

然后进行提权,调用提权函数

有趣的是提权之后会跳到一个高址,执行 InitializeSecurityDescriptorSetSecurityDescriptorDacl 这两个函数,创建一个安全描述符,并且分配给该安全描述符一个空的 DACL,查了一下 MSDN,空的 DACL 表示系统允许对该对象的所有访问

之后分配内存空间,创建三个互斥量,互斥量的生成方式也很有意思,首先以 “Global\” 为起始字符串,接下来会进行两次循环,每次循环调用 GetTickCount 获取操作系统启动所经过的毫秒数,对其进行操作然后拼接到 “Global\” 后面,由于有两个循环所以拼接了两次

生成的三个互斥量

00910591 处会创建该病毒的第一个线程,回调函数的地址为 00B93F61,由于该线程比较简单,我就长话短说,该线程会首先调用 CreateMutexA 创建互斥量

然后进入该线程的核心部分,核心功能是关闭系统的文件保护,通过找到 sfc.dll 中编号为 2 的未公开函数,导入符号链接我们可知该函数名称为 SfcTerminateWatcherThread 来关闭文件保护机制,同时还获取了 SfcIsFileProtected 函数用于检测文件是否处于保护状态

之后线程会进入消息死循环……第一个线程分析完毕。

创建完第一个线程之后,单步跟会跳出 shellcode,之后你按 F9 程序会一直断在窗口回调函数处,仿佛一直在处理消息,给人造成一种病毒已经执行完毕的错觉,但是目前分析的结果与火绒剑产生的结果不符(并没有发现任何远程注入的行为),这里我们应该这么想:病毒会不会在窗口回调函数中第二次调用 shellcode 呢?

解决方案:

我们之前已经找到了 01035D6C 处的 call eax 用于解密 shellcode 并执行 shellcode,我们在此下断点,OD 重启病毒程序,按下 F9,断在了第一次调用 shellcode 处,接着再按下 F9,程序并没有跑飞,反而是断了下来,说明病毒确实会第二次调用 shellcode,从结果上来看,虽然这两次会调用同一段 shellcode,但是会执行不同的功能。

这两次调用 shellcode 的不同点发生在创建的线程的回调函数中,首先将线程的回调函数从内存中 dump 出来,保存为 “回调函数.txt”,IDA 载入分析

回调函数.txt(第二次创建线程的回调函数分析

长话短说,经过一系列的操作,会在 009AB766call dword ptr ss:[ebp-0x11],也就是又一次创建了一个线程!!!回调函数地址 009AB3F8

为了后面叙述方便为该线程的回调函数起名为 M,对 M 进行下断,执行到 M 函数内,进行一系列的操作之后,终于到了 M 函数的核心,也是该病毒的核心部分

首先会调用 GetCurrentThread 获取当前线程的一个句柄,调用 SetThreadPriority 调整当前线程优先级

接着会遍历所有进程,调用 IsDebuggerPrsent 函数检测是否被调试,使用 StrongOD 插件轻松绕过(有兴趣的可以查一下 IsDebuggerPrsent 的检测原理,很简单,我就不补充了)

之后会打开对应的进程

然后遍历该进程中所有的线程

对每一个进程调用 CreateRemoteThread 进行远程线程的注入

注入的内容是自身,这里就不做过多的描述了

然而,到这里病毒并没有分析完!!!

剩余主线程功能分析

回到 shellcode 剩下的部分,我们只分析到了 CreateThread 用于创建了一个功能线程,接下来分析后面的操作

首先会调用 GetTempPath 获取临时目录,接着调用 CopyFile 将病毒文件复制到临时目录中,之后对病毒副本进行非常复杂的 PE 操作,创建文件映射,移动节区数据,对该副本进行 PE 魔改,相当于将样本中的恶意代码全部去除掉只剩下 telnet 功能然后将该副本命名为 ptf6.tmp,存放在临时目录中(有兴趣的可以分析一下该病毒是怎么魔改原样本的,这里不做过多叙述,PE 操作可以看我之前分析勒索病毒的文章里面有详细分析)

之后会对该临时文件创建一个挂起的进程

最后调用 ResumeThread 使挂起的进程执行,呈现一个正常的 telnet 工具的界面,之后会等待那两个线程执行完毕,线程执行完毕之后删除文件并退出进程。

当窗口回调函数执行完之后,在病毒主体中,还会有一次注册表的操作

设置注册表 Software\Microsoft\TelnetClient 的键值

分析完毕

0x05 小结

1、该病毒还使用了代码混淆,我没有进行呈现,大家可以自己调试分析

2、感染性病毒切记要一遍下来,如果不小心病毒跑飞了,那就虚拟机回滚重新来,不要接着分析,例如这个病毒的远程线程注入功能只执行一次,执行完之后你重新载入再想分析就已经单步不到了。

3、病毒行为并不复杂,但是比较恶心

4、样本在网盘中供大家下载、学习、分析

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 信安之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 样本概述
  • 0x02 相关文件
  • 0x03 行为预览
  • 0x04 详细分析
  • 0x05 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档