网络安全DRIDEX木马巧用VEH混淆API调用流程
Posted IT老涵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络安全DRIDEX木马巧用VEH混淆API调用流程相关的知识,希望对你有一定的参考价值。
情报背景
DRIDEX是自2014年起活动至今的著名恶意银行木马家族,通常以OFFICE文档的方式进行文档钓鱼攻击。0xCERT的研究人员将其描述为精于防御规避的信息与凭据窃取恶意软件,利用众多C&C服务器令针对其的网络·封锁无能为力。DRIDEX在其历史行动中曾多次运用高级防御规避技术隐匿其恶意行为,其v4版本是第一个使用AtomBombing进程注入技术的恶意软件。
【学习资料】
而本文中将对其近期样本中利用向量化异常处理(VEH)机制混淆其API函数调用的手法进行分析研判,该手法对于动态静态分析均有较好的对抗效果。
攻击技术分析
亮点:利用VEH进行API调用混淆
关于向量化异常处理(VEH)
向量化异常处理(VEH)是结构化异常处理(SEH)的扩展,VEH的优先级先于SEH,且不依赖栈结构,而是以双链表的形式保存在堆中。应用程序可通过AddVectoredContinueHandler函数注册异常处理函数来监视和处理程序所有的异常。当程序执行过程中发生异常,该异常处理函数将被首先调用以处理异常。
PVOID AddVectoredContinueHandler(
ULONG First,
PVECTORED_EXCEPTION_HANDLER Handler
);
当异常处理函数捕获到异常时,将会拿到类型为EXCEPTION_POINTERS的参数。其中的ContextRecord成员保存了触发异常时的寄存器上下文,并在异常处理完成后恢复,通过修改EIP/ESP等寄存器便可劫持程序执行流程。
typedef struct _EXCEPTION_POINTERS {
PEXCEPTION_RECORD ExceptionRecord;
PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
插入代码破坏动静态分析
开始的流程比较中规中矩,利用哈希匹配动态解析API地址放入寄存器之后,将函数参数依次推入栈中,之后调用函数。
而DRIDEX独居匠心之处则是未使用call指令直接调用函数,而是使用“int3+retn”的组合完成函数调用。这是一种一箭双雕的反分析手段:通过插入int3断点实现反调试、利用retn指令破坏程序静态函数分析。
正常执行流程下int3指令会触发异常,进入到VEH处理函数中完成最终的跳转。而当程序被动态调试分析时,int3断点异常会被调试器捕获并中断,给程序分析带来阻碍。分析者必须理解DRIDEX的反调试意图,对插入的指令进行恰当的处理,增加了动态分析的成本。
而插入的retn指令则会使ida等反编译工具将retn地址视为函数的结尾,忽略剩余的函数执行流程(如下图,对返回值的检查及后续跳转被反编译器忽略了)。
精巧设计的VEH跳转流程
DRIDEX通过动态解析获取AddVectoredContinueHandler的地址之后,将sub_687D40注册新的VEH异常处理函数。这意味着代码段中被插入的int3指令被执行时,异常将被捕获并交由该函数处理。
该异常处理函数会通过传入的ExceptionRecord的传入参数获取异常类型,若是断点导致的异常则将异常交由下一个异常处理函数。在接下来的异常处理过程中,DRIDEX读取存储于ContextRecord中的eax寄存器值(保存之前被解析的API地址),将其置于栈顶,并将EIP指向int3之后的retn指令。
当寄存器的篡改操作完成后,函数返回EXCEPTION_CONTINUE_EXCUTION,使得程序以被修改的上下文继续执行。当retn执行被执行时,被解析的API函数地址从栈顶弹出并跳转,完成一次隐蔽的API调用过程。
总结
DRIDEX在本次活动中利用向量化异常处理(VEH)对其调用API的行为进行了隐藏,在对抗动静态分析方面起到了较好的效果。但其异常触发与异常处理函数中的流程还较为简单,导致研究者可通过编写patch脚本等方式对函数调用流程进行修改,复原其原始逻辑。
向量化异常处理的利用潜力远不只如此,更加灵活地对其进行利用,可以在不修改程序代码段的前提下对整个程序的执行流程进行篡改,实现更加复杂的反调试反分析技巧。
以上是关于网络安全DRIDEX木马巧用VEH混淆API调用流程的主要内容,如果未能解决你的问题,请参考以下文章
5月头号恶意软件:Dridex 跌出榜单,Trickbot 跃升至榜首
对银行木马DanaBot的Javascript Downloader分析