如何理解基于C语言的可自定义PE加载恶意软件Gacrux,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
近期,我对这款名为Gacrux的恶意软件样本进行了分析。考虑到这两个样本文件的来源,我无法直接跟大家共享文件的哈希或直接公开样本文件,不过根据本文所提供的信息,大家可以轻松识别出这款恶意软件。这款恶意软件加载器采用C语言开发,并且使用了Visual Studio 2017进行编译。这款恶意软件从2020年8月开始在某些论坛上出售,似乎受到了Smoke Loader的极大启发。
反分析技术
Gacrux应用了很多反调试和反虚拟机技术。其中,第一种技术涉及到了下列代码跳转,这将导致IDA无法对代码指令进行正确解析。
这里,我们可以直接利用nop操作码来修复这个问题。进行模式扫描并修复问题之后,我们就可以使用IDA来对代码进行反编译了。
第二种技术涉及到伪造的返回值,并破坏IDA的函数分析过程。跟之前的一样,我们同样可以使用nop操作码来解决这种问题。
最后的代码混淆涉及到两个磁盘上的加密函数,解密操作是在调用函数之前完成的,然后在不久之后又会对函数进行重新加密。
解密/加密的工作原理是在函数中找到两个表示加密区域开始和结束的模式,然后用传递给函数的键来对代码进行异或操作。
代码会检查目标磁盘上的可用空间和RAM大小,这也是其反虚拟机检测机制的一部分。在这里,我们可以设置断点来修改返回值,或直接使用nop命令跳过检测。
字符串加密
字符串存储在一个函数中,该函数根据传入的ID对字符串进行解密。
点击【这里】即可获取外部模块的字符串列表。
整体执行流
反调试和反VM技术
这款恶意软件的代码中还添加了一些反调试技术,这些技术嵌入在了很多重要函数中,并且会在检测到调试器或虚拟机的时候来让进程崩溃。第一个技术位于malloc函数中,它会检查PEB中的BeingDebugged成员,如果检测到了相应设置,那么函数将返回请求的缓冲区的大小,而不是分配它。除此之外,它还会检查黑名单上的模块,如果存在,则退出执行。
在第二项技术中,如果目标系统的RAM或磁盘空间不足,则会增加Explorer资源浏览器的进程PID,这通常是虚拟化的表现。此时,代码将会NtOpenProcess崩溃并阻止其进一步运行。
在这里,注入的初始化ShellCode/自定义PE加载器还会检查PEB的BeingDebugged和NtGlobalFlag成员。
Syscall
这款恶意软件的Syscall模块几乎完全是从开源的加密程序中拷贝过来的。
这里的哈希算法被修改为了djb2,而输出会使用一个常量值进行异或计算。
持久化
恶意软件的持久化是通过一个Windows进程实现的,恶意代码会在explorer.exe上下文中不断地调用这个进程,这个进程会检测安装文件,并在启动项菜单中创建.lnk文件。
代码注入
针对代码注入,Gacrux在32位环境中使用NtCreateSection/NtMapViewOfSection作为写原语,在64位环境中使用NtAllocateVirtualMemory/NtWriteVirtualMemory,这两种方法都是通过直接的系统调用完成的。对于执行原语,它利用的是SetPropA,正如Adam在其文章“PROPagate–一种新的代码注入技巧”中所详述的那样。这是从开源实现中复制的,函数指针的设置方式就证明了这一点。
这里的代码注入技术主要用来调用一个小型的自定义PE加载器,请大家继续往下看。
自定义PE加载器和数据格式
这是Gacrux最有意思的功能,注入到Explorer中的代码并非一个普通的PE文件,而是一个带有自定义PE Header和自定义加载器的PE加载器。
加载器首先会进行一些反调试检测:
接下来,它会解析三个API,并使用它们来处理导入的表并修复重定位:
PE加载器使用的是自定义的PE格式,根据Kaitai描述符,我们可以轻松恢复出原始的PE文件:
网络通信
这款恶意软件的网络通信使用的是WinInet,并且在Explorer上下文场景中实现:
正如我们所看到的,Gacrux实际上也没有非常多的特别之处。它借鉴了大量的公共代码,并且在稍加修改之后便投入使用了。最重要的是,Gacrux的漏洞非常多!
关于如何理解基于C语言的可自定义PE加载恶意软件Gacrux问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/tech/safety/227600.html