来自 DDOS 2022-05-14 06:10 的文章

服务器防御_高防包包_快速接入

服务器防御_高防包包_快速接入

自我调试Sirefef密码分析

最近我写了一篇关于合法网站传播Sirefef恶意软件的博客文章。然后我继续进行更深入的分析,并注意到它使用了一种有趣的密码。

恶意软件作者每天传播许多新的恶意软件变体。乍一看,这些变体通常看起来完全不同。这就是为什么定期更新防病毒软件很重要的原因。然而,当我们深入研究这些天传播的大多数恶意软件时,kanglecc防御策略,我们发现核心功能并没有经常改变。当今恶意软件的大部分可变性是由所谓的"密码器"封装而成的。

在大多数情况下,这些密码器都是相当无聊的软件。它们通常从恶意文件中提取看似随机的数据,以正确的方式重新排列,使这些字节成为可执行代码,然后执行它们。然而,Sirefef恶意软件的作者通常会想出更有趣的加载程序的方法,我们将在这篇博文中介绍他们的方法。

现在,让我们来看看Sirefef。执行后不久,哪个免费高防的cdn好,我们可以看到以下方案。

应用程序试图通过调用IsDebuggerPresent来确定它是否在调试器下运行。如果是,则选择左分支(加载库)。在计算机安全中,"调试器"是用于测试和调试其他程序的计算机程序的名称。我们把调试过的程序称为"目标"程序。它通常是第三方程序,您可以在其中加载任何其他程序并观察其指令流。在此分支中,它从windows/system32目录加载untfs.dll库(LoadLibraryW),然后获取序号为0x2302的函数的地址(通过调用函数LdrGetProcedureAddress)并调用它。

untfs.dll是windows操作系统的合法部分。它的名称来源于"NTFS实用程序库",它包含使用NTFS文件系统的函数。如果我们查看untfs.dll库,我们可以注意到有些函数的序号为0x00到0x96,而没有序号为0x2302的函数。

事实上,当在常规调试器中运行时,LdrGetProcedureAddress会在寄存器EAX错误消息0xC0000138中返回,这是"未找到序号"状态。然后左分支完成,整个应用程序结束。

如果应用程序没有在调试器中运行(这在大多数情况下都是典型的),它将选择右分支(procedure execute_debugger,请参见下图)。在开始时,我们注意到一个DbgUiConnectToDbg调用,随后在过程create_debuggee CreateProcessW中,dwCreationFlags=0x200001,其中0x0000001是DEBUG_进程,0x02000000是create_PRESERVE_CODE_AUTHZ_级别。

根据文档,新创建的子进程将在没有通常应用的进程限制的情况下执行,并且它还将由执行它的父进程进行调试。因此,父进程成为目标进程的调试器。

lpCommandLine和lpApplicationName参数被传递到执行_debugger,cc防御方法,然后创建_debuggee,它们包含到最初执行的文件的路径,因此只要执行sirefefef,它就成为调试器,然后作为调试对象(目标)再次执行。

Sirefefef恶意软件在两个实例中运行:一个作为调试器,一个作为目标应用程序。在上图中,您可以看到Process Explorer在受感染机器上运行的屏幕截图。它显示两个进程,一个进程ID为1548的父进程(调试器)和一个进程ID为2740的子进程(目标进程)。

然后调试器开始循环,等待并处理调试事件。请参见下图中的决策逻辑。

调试器侦听并处理几种类型的事件。首先,在目标进程启动后立即收到CREATE_PROCESS_DEBUG_事件,然后在将每个导入的DLL库加载到目标进程的内存空间后调用LOAD_DLL_DEBUG_事件。当遇到异常、中断或以前设置的断点时,将收到异常调试事件。下图显示了处理LOAD_DLL_DEBUG_事件时运行的代码摘录。

调用函数"process_LOAD_DLL_DEBUG_EVENT"中的ZwQueryInformationFile以获取当前加载到目标进程中的库的名称。请注意,地址0x401723将unicode字符串"untfs.dll"的地址推送到堆栈上,地址0x401734将dll库名称与untfs.dll进行比较。如果相等(如果当前加载的库是untfs.dll),则在0x401769调用目标进程中设置陷阱标志的过程。陷阱标志指示目标进程以单步模式运行,即它只执行一条指令,然后再次中断。加载untfs.dll库后,目标进程只执行另一条指令(因为设置了陷阱标志),然后调试器接收异常调试事件。由于设置了陷阱标志,因此接收到带有异常代码0x80000004的单步异常。DecryptPE和ZwUnmapViewOfSection被调用。

在函数"DecryptPE"中,ddos攻击防御360,注意"AP32"标记,后面是"M8Z8"签名,这是用aPlib压缩库打包的可执行映像的开始。函数"decryptPE"获取以AP32标记开始的内存块,读取以下几个常量(标头大小,…)并将其解压缩。

调用"decryptPE"完成后,ZwUnmapViewOfSection从目标进程地址空间卸载untfs.dll库,随后对ZwMapViewOfSection的调用将我们的解包(由aPlib)代码映射到目标进程的untfs.dll映射到的地址相同。因此,调试器进程等待目标进程加载untfs.dll库,加载时用自己的代码替换。

调试器在完成异常调试事件处理之前,必须将EAX寄存器的值设置为0x40000003,根据文档,微信ddos防御算法,它是STATUS_IMAGE_NOT_AT_BASE.