导语:Process Doppelgänging是一种模拟进程的技术。近期,勒索软件SynAck把该技术用作恶意用途,但该技术的应用还是很少的。研究任意发现Osiris(Kronos变种)银行木马dropper使用了该技术。
Process Doppelgänging是一种模拟进程的技术。近期,勒索软件SynAck把该技术用作恶意用途,但该技术的应用还是很少的。研究任意发现Osiris(Kronos变种)银行木马dropper使用了该技术。
关于process doppelgänging的其他情况请参考:http://www.4hou.com/system/9183.html
关于Osiris的其他情况请参考:http://www.4hou.com/web/12776.html
Dropper的开发者非常娴熟,使用了很多的技巧,本文分析加载器的实现过程。
分析的样本:
· 5e6764534b3a1e4d3abacc4810b6985d – original sample (stage 1)
· 8d58c731f61afe74e9f450cc1c7987be – stage 2
· e8c39091cce419adee23153f30cefa5a – Osiris core bot
Osiris的加载过分为三步:
概览
Dropper会创建一个新的进程,并注入内容:
当查看注入器的进程空间中加载的模块时,会看到一个NTDLL的多余副本:
这也是恶意软件开发者常用的技术,用来避免应用被监控和隐藏使用的API调用。
在检查从额外的NTDLL处调用了哪些函数时,研究人员发现了一些有趣的东西。它会调用许多与NTFS事务相关的API。因此,很容易猜测使用了Process Doppelgänging技术,因为这种技术非常依赖NTFS。
加载额外的NTDLL
NTDLL是一种特殊的、低级的DLL,是对syscall的封装,不依赖于系统中的其他DLL。
其他的系统DLL,比如Kernel32,非常依赖于NTDLL输出的函数。这就是为什么许多用户监控工具会hook和拦截NTDLL输出的函数:监视调用的函数,检查进程是否有可疑活动。
当然恶意软件开发者也知道这个机制,所以为了欺骗这一机制,恶意软件会从磁盘中加载NTDLL的新的没有钩子的(unhooked)的副本。
下面看一下Osiris dropper的应用方式:
从内存映射中可以看出,与其他DLL相似,NTDLL是以图像的形式加载。但NTDLL不是以典型的LoadLibrary函数加载,也不是以低级版NTDLL——LdrLoadDll加载。作者使用的是下面的函数来加载文件的:
· ntdll.NtCreateFile 打开ntdll.dll文件
· ntdll.NtCreateSection 在文件外创建一个section
· ntdll.ZwMapViewOfSection 映射section与进程地址空间
因为这样DLL看起来就是以典型的方式加载的,如果监控LdrLoadDll也看不出什么异常。
Process Doppelgänging的应用
为了让注入更加隐蔽,恶意软件作者在原来的Process Doppelgänging应用基础上,只用了低级API。恶意软件并没有从Kernel32调用便利的封装,但调用的大多数函数都与NTDLL是等价的。
首先,创建一个新的暂停进程。这也是payload要注入的进程。在特殊情况下,函数是从kernel32.dll中的函数CreateProcessInternal调用的。
然后,Process Doppelgänging会创建一个新的事务,事务会创建新文件。Kernel32中的CreateTransaction和CreateFileTransacted就是这个作用。
首先,调用NTDLL中的ZwCreateTransaction。然后,恶意软件作者会用RtlSetCurrentTransaction和ZwCreateFile打开事务文件。然后,dropper会将新的可执行文件的内容写入文件中,即恶意软件的stage 2。类似的,也会使用ZwWriteFile的RtlSetCurrentTransaction。
可以看到缓存会被写入新的PE文件,即stage 2 payload。对Process Doppelgänging技术,文件只有该事务可见,其他进程不能打开,即反病毒扫描器也无法打开。
事务中的文件创建后,会用于创建特殊格式的缓存,即section。完成这些动作的函数都只能通过低级API ZwCreateSection/NtCreateSection调用。
Section创建完成后,创建的文件就不需要了。事务会回滚(ZwRollbackTransaction),对文件的修改也不会保存到磁盘上。
之后,创建是section会被用于加载PE文件。将payload写入内存、设定必要的补丁后,进程就重新开始了:
Stage 2 loader
下一层(8d58c731f61afe74e9f450cc1c7987be)不是核心部分,但是是loader的第二阶段。加载最终payload的方式更简单,Osiris核心代码一段一段解包,然后与相关依赖一起加载到加载器进程新分配的内存区域中。
自注入(self-injection)后,加载器会跳转到payload的入口点:
应用的入口点与header中保存的入口点不同。如果复制payload并相互依赖的运行,却不能得到系统的执行代码。这是一种误导研究人员的技术。
这是header中设置的入口点地址RVA 0x26840:
调用让应用进入无尽休眠循环的函数:
恶意软件执行的开始点,也就是真实的入口点在0x25386,只有loader知道入口点地址。
对比Kronos loader
原来的Kronos恶意软件(2a550956263a22991c34f076f3160b49)也是用了系统的技术来隐藏入口点。
Kronos的最终payload是注入到svchost中的。其执行会通过对svchost中的入口点打补丁来重定向到内核:
Payload的入口点是RVA 0x13B90,而payload header(d8425578fc2d84513f1f22d3d518e3c3)中保存的入口点地址是0x15002。
真实Kronos入口点代码与Osiris的非常相似,但并不是完全相同的:
结论
Process Dopplegänging在stage 1加载器的应用是非常专业的。恶意软件作者使用相对较新的技术和其他有名的技术融合在一起。代码的准确性与Kronos如出一辙。但还不能确定第一层与core bot的作者是否是同一个人。恶意软件传播者经常使用第三方加密器来对恶意软件打包。Stage 2与payload是紧密结合在一起的,而且这层是core的准备阶段。