Zbot老木马换新装:轻松绕过邮箱安全安检

最近我们的工程师收到这样一封邮件,发件人显示为“Microsoft outlook”,附件貌似是个音频文件。但是把附件下载到本地一看,却是一个Zbot木马。

Zbot其实是一个很古老的木马了,它会将恶意代码注入到除CSRSS.EXE以外的所有进程。这些恶意代码会挂钩许多与网络操作相关的函数来监控网络数据,以达到盗取用户银行卡信息、电子邮箱密码等个人信息的目的。盗取到的信息会先存储在本地,随后发送到配置文件里所指定的地址。但这个变种还有些新意,用了一些伪装手段绕过了QQ邮箱的安全检测。下面是详细分析:

木马加载过程

第一层免杀:程序会先拷贝一段数组到内存中去作为shellcode来执行。

将这段内存数据扒出来,用IDA查看。

可见这段代码是被混淆过的,这些做法都是为了躲过杀软的特征查杀。

第二层免杀:接着段代码分配了一段内存将宿主程序拷贝进去,然后从文件的末尾往前搜索以B4E32392开头的数据并进行解密。

然后,shellcode调用VirtualAlloc重新分配一段空间(准备填充解压后的数据),再调用RtlDecompressBuffer将这段被解密的数据再解压到重新分配的空间中,这段解密后的数据就是zbot木马的文件数据。

以这样的方式得到木马文件就避免了释放文件的操作,躲避了杀软对木马文件的扫描。

第三层免杀:之后程序以挂起的方式创建新的进程(傀儡进程),并调用释放傀儡进程的内存映射,这样是为后边修改线程上下文做准备。

重新分配空间并设置属性为可执行,用来存放母体文件的内存映射。

分别写入文件头和各个区段。

再调用GetThreadContext获得线程上下文,修改傀儡进程的Eip,把Eip指向程序的入口,这是程序就跑到zbot木马的入口点。

最后调用SetThreadContext并恢复线程,木马程序开始跑起来。

木马就是通过这种方式,避免了直接加载母体进程,从而逃避了部分杀软的检测。

总结

主文件使用.NET编写的,作者通过在.NET程序里分配一段可执行内存空间,并拷贝一段被混淆的代码到此空间,然后加载;接着混淆代码又在文件中搜索被压缩过的一段数据进行解压得到母体文件;最后通过挂起新进程,修改线程上下文的方式触发母体文件。

简单来说,木马需要经过以下几部分才会运行:宿主文件à混淆代码à压缩数据à母体文件à挂起线程修改eipà触发木马。

这个变种用了三层的保护技术,增加了杀毒软件检测的难度,好在360的QVM对这类样本有着比较全面的收集和训练,能够检出最新出现的变种。