1.样本运行概图
恶意样本将"白加黑"免杀代码打包为iso镜像文件,镜像挂载后只显示一个快捷方式,快捷方式图标为WORD文档图标,快捷方式运行后会启动白文件OneDriveUpdate.exe,由于做了dll劫持,所以会加载运行恶意dll–version.dll,在恶意dll中解密OneDriveUpdate.update生成shellcode,后将解密shellcode做远线程注入到RuntimeBroker.exe进程,shellcode代码中释放自身硬编码的PE文件(dll)到内存,随后动态获取该dll的导出函数并运行,导出函数中做dll反射注入,将自身dll文件加载运行,解密得到C2地址,与控制端进行通信,开展恶意行为。
2.样本信息
2.1 样本指纹信息
名称: a7df3462a6dce565064cfe408557c4df
大小: 4839424 字节 (4726 KiB)
MD5: a7df3462a6dce565064cfe408557c4df
SHA1: 6b91bfc761fe958c8ac04dd403db284ccc3a530e
SHA256: 1fc7b0e1054d54ce8f1de0cc95976081c7a85c7926c03172a3ddaa672690042c
2.2 样本结构略图
3.恶意代码分析
此样本的分析为上下篇完成,此为上篇文章,主要记录恶意样本载体,下篇记录恶意样本的功能性代码分析。
3.1.快捷方式启动运行
此恶意样本所采用免杀技术为“白加黑+dll劫持”,OneDriveUpdater.exe就是带签名白文件,vresion.dll文件属于原始dll文件(等待被OneDriveUpdater.exe加载),version.dll文件为恶意dll。
1.白加黑免杀:白指出现在杀软的白名单中文件,黑是指恶意代码,利用杀软白名单特性,将黑白文件打包到一起进行投放,在一定程度上绕过杀软的查杀。
2.dll劫持:程序运行时在指定位置加载自身运行所需dll文件,那么使用恶意dll文件替换原始dll,原始程序运行就会加载恶意dll,同时为了保证程序正常运行,恶意dll需要实现或者做函数转发,让载体程序能正常访问到原始dll文件的函数,避免执行异常引起怀疑。
3.2 内存解密得到shellcode
在version.dll被加载到OneDriveUpdate.exe进程后,会执行插入的劫持部分代码,主要就是将OneDriveUpdate.Update文件读取到内存,通过于自身硬编码抑或得到解密数据,该数据为一段shellcode。
1.CreateFile->ReadFile 函数组合将文件读取到内存
2.内存解密OneDriveUpdater.exe文件
3.3 注入shellcode到RunTimeBroker.exe进程
使用底层函数调用实现远线程代码注入,将解密出来的shellcode注入到进程RunTimeBroker.exe中运行。与常规远程代码注入不同的是,此恶意代码实现的注入没有调用上层API函数实现,而是借助底层函数,一定程度上绕过杀软的主动防御。
1.获取注入的目标进程,通过函数WTSEnumerateProcessesA获取到所有进程列表,遍历进程列表通过名称找到目标进程RuntimeBroker.exe,获取到进程信息。
2.通过映射内存方式将解密的shellcode映射到目标进程的内存中,再创建远程线程执行shellcode。
查看RuntimeBroker.exe进程,存在映射内存,属性为可读可执行,存储的数据正是解密的shellcode
3.4 shellcode执行,加载PE文件到内存,执行导出函数
shellcode中会一次一次的将硬编码的dll文件push到内存,随后获取导出函数的运行地址,创建新线程运行该导出函数
1.push大量数据到栈空间,该数据为 文件大小+去头DLL文件
2.解析内存中dll文件,获取导出函数的AddressOfFunctions以及FIRSTSECTION地址。
3.通过公式获取到导出函数在文件中的函数地址FOA
4.计算得出导出函数在当前内存中的地址
5.在函数地址获取之前,获取到ntdll的模块基址
6.基于ntdll基址进行导出函数表遍历,进行传入hash的对比,匹配到即找到目标地址,找到目标地址后,会进行函数安全性检测,也是在函数层面进行杀软的对抗。
7.函数安全性检测主要进行软件断点|HOOK与否|CRC三个维度的检测。每个后续执行的函数都要确保杀软没有进行监控。
8.根据PE文件的SizeOfImage申请对应大小的空间,将PE文件写入到申请的空间,再将PE头信息去除,防止杀软的内存扫描,最后调用函数 NtCreateThreadEx 创建新线程,新线程的回调函数就是dll文件的导出函数
3.5 反射加载dll文件
在dll文件的导出函数中,会模拟PE加载流程,将内存中的文件模式PE加载成为执行模式,也就是dll反射加载技术。
1.定位PE头,获取当前代码位置,回退0x3BF大小内寻找0x4550,也就是定位PE头
2.获取后续使用的函数,并且检测这些函数是否被杀软监控
3.调用函数ZwAllocVirtualMemory根据SizeOfImage申请对应大小的空间,之后先将PE文件头部拷贝到申请的内存中。
4.将区段从文件读取到内存中
5.导入表载入和修复
6.重定位表修复
7.初始化栈帧,调用OEP,开始运行恶意dll文件。
4. 小结
文章上篇记录恶意代码的载体行为,主要涉及文件运行流程和运行过程中如何防止杀软查杀,此相当于一个载体,将真正的恶意代码运载到目标机器,并确保恶意代码运行达到预期效果。