分析样本来源
链接:https://www.malware-traffic-analysis.net/2022/04/20/index.html
样本表现
Emotet,最初是作为银行木马病毒开发的计算机恶意软件程序。其目的是访问外部设备,监控敏感的私人数据。Emotet 欺骗基本的病毒预防程序并保持隐藏。恶意软件一旦被感染,就会像计算机蠕虫病毒一样传播,并试图渗透到网络中的其他计算机中。 其中,样本不能在虚拟环境中直接运行。由于反向工程、反调试和反虚拟机技术的种类繁多,我们利用强大的第三方网站帮助我们分析样本,以验证样本的行为特征。
分析环境
虚拟机VMware,虚拟机环境是Windows 7 64位,物理机Win 10 Pro。
分析工具
- IDA Pro 7.5
- Procmon.exe
- LordPE.exe
- Resource Hacker
- 火绒剑
分析过程
VirusTotal分析
放到VirusTotal在线分析结果可以看到。 在分析报告中,可以看到很多引擎说是病毒,很多引擎都知道。 还是有很多红色的。我们点击DETAILS更多的分析报告可以在里面看到。 从这个表格信息中,我们可以看到这是一个编译时间为2022年4月19日的64位程序。然后代码段和数据段是正常的,但有一点值得注意.rsrc样本会释放的文件可能存在于资源段。
LorePE.exe和Resource Hacker分析
首先我们用LordPE检查程序的程序, 看到里面的程序入口点是0x470c0,镜像大小为0x一般来说,1万,还是比较大的,毕竟是64个程序。 我们再点击PE Editor当中的Sections。 查看里面的段表,看看有什么不同。根据前面的内容VirusTotal内部性能,我们仔细看这个表,一般来说,这个表结构的大小是正常的,代码段,只读数据段,可变数据段是正常的,值得我们关注,或.rsrc在所有段表结构中,资源段的大小仅次于代码段。最后一个重定位代表段.reloc,根据经验,我们可以知道它可能会被调用GetProcAddress该函数延迟绑定重定段中的数据。在后面的分析中,我们可以看到这一段中有哪些函数值得我们关注。 接着我们放到Resource Hacker其中分析。 我们可以把它放进去resource hacker进行分析,然后依次点击左侧菜单栏中的这些项目。这是我们发现的exe文件的资源段富含光标资源、位图资源和一些窗口图形界面设计的预设配置。我们可以从图以知道。他的感染效果可能是影响受害者主机的光标和某些操作系统的图标,并在某些地方更换窗口。 根据在线提示,我们猜测这些光标资源和窗口预制设置会影响用户主机office文件。这里我们先留个坑,后面填。
行为特征分析
在前面,我们主要从静态分析的角度,从文件结构和特殊段表的角度,分析文件是否包含一些可疑的关注信息。我们在前面的分析知道这个样本的魔数,也就是magic number是MZ。对应的是exe文件或者dll文件。然后我们试着先把样本改成exe然后通过文件Process Monitor这个程序监控他在注册表、网络行为、文件行为等方面会做什么。以下是我们的操作截图。 不幸的是,当我们看到这一点时,我们无法运行,所以我们试图改变它dll操作文件。然后尝试操作。rundll32 emotet.dll,然后分析火绒剑。 运行火绒剑。 但无论是虚拟机还是物理机,这个程序都不能运行,也没有确切的结果供我们参考。 在这个时候,我们没有任何想法继续下去。因为这个程序不能再运行了,我们只能尝试使用第三方平台来分析这个文件。我们发现的网站是JOE Sandbox Cloud,这是国外著名的在线分析平台。他可以帮助我们分析他的虚拟环境。这个样本给出了详细的分析报告,帮助我们分析和学习。
我们在JOE SandBox Cloud在这个雷达图中,我们可以看到隐藏者Evader被标记为恶意。那图中一表示这个样本有可能会Bypass操作系统的安全保护,如关闭一些安全选项,然后使用一些反向工程技能。例如,反调试这些技他们的行为。例如,可以使用一些异常工具和数据。同时,网站还对恶意行为进行了分析。
从图中可以看出,该样本中存在恶意分析软件的规避和反调试行为。当我们在虚拟机中运行样本时,一些硬件信息可能会被样本检测到,导致样本判断环境异常,然后导致自动退出。 在恶意分析系统避免的行为中,网站给出了帮助我们分析样本的特征。首先,样本可以使用睡眠模式来避免动态检测;第二,样本将在睡眠时停止执行;第三,使用系统或本地时间来决定是否执行,即样本将在特定时间执行,作为恶意样本的重要依据;第四,通常用于检测虚拟机环境;第五,样品中也发现了很多未执行的样品API。以上五种行为可以认为样本是反虚拟机和反动态分析的反向工程技术。而上述的五个行为可以认为样本在一定程度上是反虚拟机的、反动态分析的反逆向工程的技术存在。其余的还有枚举正在运行的进程、检查硬盘的剩余空间这些一些并不是特别敏感的操作,但这些行为同样可以收集部分信息来判断是否是虚拟机环境。 在对抗调试中,样本包含一些函数来检查调试器是否正在运行,例如IsDebuggerPresent这个函数;第二点是样本中包含一些动态绑定的函数API调用;第三点,样本包括一些函数,将用于检测是否有调试器,例如GetProcessHeap这个函数;第四点,样本将检查当前过程是否处于调试状态;第五点也是可疑的,即样本包含一些函数来注册自己的异常处理结构。 在这个样本分析网站上。除了恶意分析系统的回避和反调试外,他还进行了其他恶意行为分析,但我们最重要的分析是分析其反向工程、反虚拟机和反向调整技术。因此,我们的其他分析工作将是简短的,大部分,主要是在分析网站提供的方向的帮助下,然后进行验证操作。
IDA 7.5 分析
根据恶意样本分析,老师在课堂上告诉我们的IDA在其中,我们可以首先分析输入表中包含的函数,以及一些敏感的函数API它可以帮助我们快速分析帮助我们快速分析。 为了快速判断样本介绍了什么?Dll我们先用010文件 editor借助这个二进制编辑工具exe可执行文件的分析脚本去解析样本引用了哪些dll文件。除了常规,从图中我们可以看到。kernel32.dll、user32.dll,还有一些不常见的dll文件。 其中GDI32.dll是windows应用拓展下图用户界面;comdlg32.dll是Windows例如,打开文件对话框;WINSPOOL.DRV是系统打印管理库所需的文件,如果没有这个文件,系统就不能正常打印,有关联文件Winspool.drv和winspool.exe;ADVAPI32.DLL是一个高级API应用程序接口服务库的一部分包括与对象安全、登记表控制和事件日志相关的函数;SHELL32.DLL用于打开网页和文件,微软视窗外壳需要生效的命令代码集合,设置默认文件名等大量功能;SHLWAPI.DLL注册键值和颜色设置;ole32.dll在应用程序中嵌入链接和对象的过程文件。它用于编写和整合来自不同应用程序的数据Windows操作系统骨干部分;OLEAUT32.dll是对象链接和嵌入OLE相关文件。 这些文件可以很容易地帮助我们分析样本的功能集合,所以我们把它们放在那里ida经过分析,发现主函数有很多行,其中包含了大量的变量。从图中可以看出,单个主函数DllMain入口有近2000行伪代码。 在主函数的前面,有一个不可思议的代码。也就是说,他首先会malloc申请大小为size堆块,然后在堆块中按顺序赋值。赋值后,它将释放堆块。如果最终赋值的次数是这样的i,不等于这个Size大小,然后退出程序。 我们可以在程序中看到0x5F5E100字节,也就是1亿字节。在这里,我们猜他申请了这么多字节堆,然后试图依次赋值,可能是为了检查宿主机是否有可用的内存使用。我们可以通过向下分析来看到它。检查可用内存后,将赋值六个全局变量和site赋值全局变量低16位。 然后我们可以在主函数中找到一个连续的char数组,如图所示。在图中,我们可以看到他被标记为v9,v10以及最后到v25都是char类型。其实我们可以认为他是一个很大的数组,只是负值有些不同。然后我们计算一下,v9~v共2904字节,即0xB58。我们从main从函数中第一个被赋值的代码行数开始,从那一行到最后一个被赋值的数组元素,共有2805行。检查后发现v25未被赋值。 在上文含有VirtualAlloc在这个代码的截图中,我们可以看到,VirtualAllo的功能是在调用进程的虚地址空间,预定或者提交一部分页。我们继续深入sub_10002518去看,更多是一种数据的重新计算初始化。 前面我们尝试说运行这个文件,然后分析他的行为,其实对于d11文件来说是不成立的。我们在前面的分析报告当中提及了一个点,就是这个样本当中有大量的函数没有被使用。这说明了一点,就是他是被作为一个动态扩展库被装载的。如果说要让里面的函数运行起来,肯定是要有一个主要的控制流程序来对它里面的程序函数进行调用,而对于它自身而言是没有什么办法去让自己执行起来。 所以接下来的分析,我们主要通过对特定的API函数进行静态分析。
反调试分析
我们分析这个文件头,然后看到他的程序入口地址是DllEntryPoint。我们按照这个地点进行一步一步的分析,然后根据前面的提示看到有很多反虚拟机行为的系列函数存在,我们推断在dll文件刚运行开始,它会检查环境是否是虚拟机环境,因此我们结合IDA这个程序进行调试分析。 首先,我们先用IDA查看DllEntryPoint看看代码,里面有一个_security_init_cookie()函数,双击进去我们看到里面是会检查系统里面的具体环境。
在检查这个security cookie这个函数里面,他首先会判断一个全局变量是否等于一个十分大的值,然后进入不同的看你条件,如果他等于这个值的话,全局变量本身等于这个值的话,它就会获取Windows高精度时间戳,然后还有或许主窗口句柄获取现成ID,从操作系统其中到现在所经历的毫秒数以及最后返回高精度性能计数器的一个值,他们把这些值进行异或xor等操作,然后将其跟一个值进行比较,如果还等于这个值的话,那么他们将在两个全局变量上,进行重新复制。我们在效果上看,也就是说第一个这个7c零的全局变量他将会递增加一然后7c8他将会是这个7c0全局变量的取反。 因此,根据上文分析,我们将7c0命名为cookie_1,将7c8命名为cookie_not_1。根据网上资料可以知道,这其实是在程序运行当中保证堆栈完整性的一个初始化操作,因为cookie的作用是在对每一个程序调用完之后,检查自己的堆栈cookie是否被改写,如果被改写了,说明可能存在栈溢出,将会触发异常保护机制。那么我们对这个函数按一下x来查看它的交叉引用发现在众多函数当中都被引用说明这个函数是贯彻始终的。 紧接着,我们尝试分析_DllMainCRTStartup函数,这个函数不论_security_init_cookie是否执行,其都会执行。
根据Win64平台的传参规则:使用寄存器传参递前四个参数,分别使用RCX、RDX、R8与R9传递,其他多余的参数使用堆栈传递,我们可以大体分析一下: 这个函数它首先会判断是启用了,Security的Cookie的初始化,如果他没有启用初始化,而且一个全局变量是等于零的话,那么他将会直接返回退出,因此我们判断这个曲全局变量应该是Ct是否被调用的一个值,因为我们双击进来的时候,发现他只在这个行当中被调用。因此我们可以继续往下分析。如果是正常运行的话,fdwReason和这个全局变量必定有一个是非零的,如果都不正常,说明系统可能的工作流程被篡改。正常情况下,在第九行的前两个判断条件是零,然后在crt这个函数当中我们双击进来看。他首先会检查第二个参数,那根据上下文我们可以知道,这个a2它就是fdwReason,然后a1是一个提示的dll名称。然后这第三个是一个fpvReserve,根据名称判断可能是处于调试环境下吧。正常情况下这里并没有写,刚进到crt这个函数当中,它会检查fdwReason的值,如果等于二的话。 以上就是初始化的主要分析工作。 我们根据具体函数IsDebuggerPresent来跟踪,看看在哪些地方会被跟踪,我们按下X按键来尝试跟踪。 我们看到有三个函数调用了这个IsDebuggerPresent这个函数。我们依次点进去看,发现他是贯通在非常多的函数里面。因此我们可以判断它是一个通用型的安全机制。也就是说他的反调是是在很多情况下都会触发,在我们发现除了第二个unknown_libname_147这个函数用不了不是在部分函数的退出前运行之外,__report_gsfailure所属的父函数_security_init_cookie和_invalid_parameter基本上都是在函数ret运行前运行的,说白了就是每次函数退出的时候都会检查是否处于被调试状态。 我们自己分析,函数发现,基本上的反调试在__report_gsfailure和_invalid_parameter之中的函数调用都是RtlCaptureContext、IsDebuggerPresent、SetUnhandledExceptionFilter、UnhandledExceptionFilter、GetCurrentProcess、TerminateProcess的流程。 这个函数它会调用RtlCaptureContext函数,获取当前进程的上下文,然后返回上下文记录给这个指针。这个指针它可以包含一些寄存器等上下文信息。接着把这个目前的一些异常返还给这个结构体然后进程会调用IsDebuggerPresent函数,检查进程是否处于被调试的状态。调试的话那就会返回1,没有调试的话就返回0。然后进程会通过SetUnhandledExceptionFilter函数注册一个空异常处理结构,然后调用UnhandledExceptionFilter函数来尝试解决这个异常,如果有这个异常的话,有调试器的话,这把异常交给调试器来进行处理。如没有调试器的话,那么将会跳过这个异常处理。然后将会调用GetCurrentProcess函数获取当前进程的ID,返回一个句柄。然后最后调用TerminateProcess函数将这个进程进行终止。 因此可见,进程中确实到处存在反调试的检查工作。
这一部分是关于从堆结构的flags上去判断是否处于被调试的状态。根据网友的分享,如下图所示。 我们知道可能在在获取堆结构之后,PEB.ProcessHeap+0xC的Flags和偏移0x10的ForceFlags上在调试的时候会被改变,因此,在反反调试上,只需要将其改成HEAP.Flags=0x2,HEAP.ForceFlags=0即可。 我们跟踪GetProcessHeap这个函数的交叉引用,我们可以判断这个样本当中是否有反调试的存在。 图中我们看到了全部都是在_CRT_INIT这个函数当中,我们综合分析了一下,然后结合下图来分析可以知道这个样本其实是一个初始化系统信息的,是检查系统版本的。 图示的两个HeapFree,都表明了最后堆块是会被释放的,且检查完结构后,并没有所谓的flags,更多的它是一个名为OSVERSIONINFOEX的结构体。与前面分析的不一样,所以在这里我们分析并没有反调试存在。 关于这条信息,因为我们没办法动态执行查找到相关的信息,只能借助在线平台来进行分析,因此这条我们无从考证。
分析结果
样本的自我保护:存在一些高危敏感行为,有反虚拟机行为、反检测技术和反逆向工程的技术在样本里面体现比如在动态调试的过程中,我们在缓冲区中发现了一个PE文件,在系统环境探测当中,它会检查注册表中的CPU名称以及检查硬盘相关的信息,通过检查常见的固件信息、查询系统硬盘大小、检查适配器地址等收集操作系统硬件相关的指纹信息来尝试判定样本是否处于虚拟环境中,而这种多方检查的手段让样本处于相对独立的运行环境,是反虚拟机行为、反检测技术和反逆向工程的技术体现。同时,二进制文件当中也存在被加密和压缩的数据,这是应对静态分析的反逆向工程技术的体现。自身也会检查系统的时间,而这个操作常常用于躲避恶意软件分析系统。 网络相关:样本当中存在可疑的HTTP流量,而这种可以流量在Emotet家族中具有可识别的特点。Emotet通常通过恶意垃圾邮件(malspam)电子邮件进行分发。 系统相关:轮询操作系统敏感路径下的文件,枚举进程模块,在枚举过程中,如果发现了特定的进程或者线程,将会对其进行相关检查、注入操作。样本会搜索并加载模块资源,枚举文件和目录,在临时目录中创建文件。Emotet感染链中的关键步骤是Microsoft Word文档,其中包含旨在感染易受攻击的Windows主机的宏。 总的来说,这个样本技术复杂度比较高的,威胁性高。特别是样本当中存储了一般虚拟环境的指纹信息,然后通过广泛收集各种操作系统的硬件信息来不断比较来判定样本是否处在虚拟环境中、调试环境中等。 在反调试、反虚拟机这一块,其编程手段值得我们学习。
学习网址
- https://www.kaspersky.com.cn/resource-center/threats/emotet
- https://www.malwarebytes.com/emotet
- https://www.xctf.org.cn/library/details/85162f1d6357c787b3cecc13302219e152f28904/
- https://analyze.intezer.com/files/978f702136527b15555bf7ebe208c464117219acaae692380ede3f96cafbdff4/sub/1de9d7d8-2de1-43ea-bf3d-bfb51fd4819e/genetic-summary
- https://www.joesandbox.com/analysis/612929/0/html#deviceScreen