分析一个一般般骚的病毒
2020-12-19 18:58:00 Author: mp.weixin.qq.com(查看原文) 阅读量:83 收藏

本文为看雪论优秀文章

看雪论坛作者ID:SpyGOD

前言

无任何可见迹象,推测是一个Rootkit。

无壳

基础静态分析

输出的字符串很怪,很明显被加密了。



查看PE头信息
这里只导入了一个库KERNEL32.dll。
查看导入函数:
很明显用到了进程注入,因为这里看到了VirtualAllocWriteProcessMemory,GetModuleHandle,GetProcAddress CreateFileAWriteFile表明创建了一个文件,根据ResumeThread和SetThreadContext还有GetThreadContext猜测用到了代码注入。
这里对资源节进行了操作。

资源节隐藏可执行文件

FreeResource,SizeOfResource,LockResource,LoadResource,FindResourceA,这里用LockResource这个函数有点奇怪,该函数返回内存中资源基址的指针,查看资源节。
这里我们看到资源节的类型是UNICODE名字是LOCALIZATION下面是一段像被加密了的字符。
向下拉,我们看到了在strings下看到的内容:
这里是被加密过的。

识别加密算法

用ResourceHacker打开并提取出来。

这里用KANAL识别加密算法。
这里推测有可能是作者自己写的一个加密算法,如果是作者自己写的一个加密算法则一定会有解密例程,后面会用IDA识别解密例程。

基础动态分析


这里发生了一个奇怪的现象,我们在Process Explorer下看到了money.exe进程停留了大概一秒接着就消失不见了,回想我们在看导入的API的时候并未发现内核相关的API,这里用的应该是R3下的进程隐藏技术我们在API中并未发现ZwQuerySystemInformation,这里用的也不是HOOK该函数,这里就有一个问题,该病毒是如何在R3下实现进程隐藏的,我们用功能更强大的procmon来观察。
这里,Process Monitor证实了我的好眼力,真的是一秒(哈哈哈哈哈哈),最左侧的Time栏,第一个是14:37:35,最后一个是14:37:36,真的是一秒,回忆之前在PEView下看到了sleep函数,该病毒启动了另外两个进程,一个是C:\WINDOWS\system32\conime.exe,另一个是C:\WINDOWS\system32\svchost.exe,conime.exe是输入法相关的程序svchost.exe是从DLL启动的服务的通用主机进程,病毒经常感染该进程。
查看进程树
该病毒产生的svchost.exe的PID为1560,父进程的PID为1384。

高级动静态分析


载入IDA,Shift+F12查看string。
这个看到了一个很有意思的字符串。
NtUnmapViewOfSection函数用来解除内存映射。

main函数直接调用了五个函数,其中两个是API:
sub_40149d的作用很简单,就是拼接可执行文件的路径。

sub_40132c的作用显而易见,计算资源所需内存的大小然后在svchost.exe的进程空间中分配内存然后将资源节的内容拷贝到分配的内存中,然后获取首地址。


解密例程

401425处调用了sub_401000,该函数有三个参数,其中有一个是41h,这和我们用ResourceHacker看到的41是一致的,同时也是字母A 的阿斯克码,这就解释了为什么我们在strings下看到那么多AAAAAAAAAAAAAAAAAAA,enter跟进。
这里是一个XOR例程
打开FlexHEX
如图,解密出的文件如下:


这是一个可执行文件。 下面看sub_4010ea:
最后一个函数,CreateProcessA,我们找到了创建svchost.exe进程的代码,如图:
这里,IDA将CreateProcessA的参数标记了出来,参数dwCreationFlags的值为4,查看MSDN:
点击Process Creation Flags:
MSDN 给出的解释是:
dwCreationFlags为4的时候表示新进程的主线程创建之后处于挂起状态,调用ResumeThread函数才能运行。
接着,401195处调用了GetThreadContext函数,该函数的hThread参数于401139处的CreateprocessA的参数位置相同表明访问的的挂起进程的上下文,即svchost.exe得上下文。
在4011c3位置按T,这里通过CONTEXT结构来引进svchost.exe的进程空间的寄存器,CONTEXT结构就是一系列寄存器的集合。
新创建就被挂起的进程的EBX寄存器指向PEB结构,EAX指向EIP,这里将PEB的指针给了ecx,然后add ecx,8然后压栈作为ReadProcessMemory的参数LpBaseAddress,这个参数指的是读取的起始地址,我们看看PEB结构。
PEB偏移8字节处是一个指向ImageBaseAddress的指针,ImageBaseAddress是被加载可执行文件的起始部分,将这个作为基址然后读取了4个字节到lpbuffer中。
然后调用GetProcAddress手动加载了UnMapViewOfSection函数,接着将UnMapViewOfSection的地址给了var_64,在4011fe处,ImageBaseAddress作为UnMapViewOfSection的参数传入,接着在401206处调用了UnMapViewOfSection
UnMapViewOfSection将这个被挂起的进程从内存中移除。
接着调用了VirtualAllocEx函数,flProtect为40表示是以PAGE_EXECUTE_READWRITE权限分配的。
接着用到了var_8,我们看下var_8是什么:
4010fe处将lpbuffer处的偏移为4的值与5A4D比较,检查是否是'MZ',同样,401119处检查是否是'PE',所以var_8指向加载到内存的PE头,401216处指定分配内存的大小,40121d处要求内存被分配在ImageBase处。

内存分配好之后调用WriteProcessMemory从PE头开始将文件写入分配的内存中。
接下来是一个超大的循环用来将恶意可执行文件写入svchost.exe的进程空间中。
接下来分析一下复制的细节。
var_70是一个循环计数器,在循环开始处将它与PE偏移6处的值比较,百度一下PE偏移6处是什么。
PE头部偏移6处是NumberOfSections,这里应该是为了将PE文件各个节都复制到分配的内存中然后是一个分支语句,左边表示PE文件的各个节未复制完成,右边表示复制完成,先看左边。
上面我们分析过var_4指向内存中的PE文件,这里将DOS头加上0x3c,该位置是e_lfanew,指向PE头。
这样ecx就指向PE头imul edx,28h没看懂,这里卡了好久.lea eax,[ecx+edx+0xf8],ecx指向PE头,我们看下PE头偏移0xf8处是什么,0xf8处是IMAGE_HEADER_SECTION数组的起始位置,该结构体的大小为40字节,换算为十六进制28,所以上面其实是一个计数器。
接下来分析右边:
SetThreadContext设置进程上下文,我们看下MSDN的解释:
4012e7处将eax设置为被加载到进程内存空间的可执行文件的入口点然后调用ResumeThread执行恶意程序。

分析射入到svchost.exe的可执行文件。

静态分析

将提取出的可执行文件命名为zxc.exe:



这里注意几个函数
GetActiveWindow、SetWindowsHookExA、CallNextHookEx、UnhookWindowsHookEx。其中GetActiveWindow获取当前活动窗口,CallNextHookEx将挂钩信息传递到当前挂钩链中的下一个挂钩过程,UnhookWindowsHookEx卸载挂钩。
接下来是一些键,很明显是一个击键记录器:

动态分析

动静态分析

main函数中调用了SetWindowsHookExA函数,idHook参数为0dh查看MSDN对应的是WH_KEYBOARD_LL,挂钩函数为fn:


接着是一个循环和分支,右边是循环结束后:
该循环中调用GetMessageA从消息队列中检索消息。
查看钩子函数:
40108f处104h对应的是WM_SYSKEYDOWN,401098处100h对应的是WM_KEYDOWN。
此处检查按键的类型,然后调用了sub_4010c7函数,该函数接收虚拟按键码。
程序首先创建了一个vlog.log这个日志文件接着调用SetFilePointer,GetForegroundWindow和GetWindowTextA函数获取按键按下时活动的窗口然后获得窗口的标题接着将其写入文件中。

接下来是一个跳转表:

var_C包含接收的虚拟按键码该按键码作为switch表的索引,该表位于off_401441处,见图中光标处,byte_40148d处是一个数组:

401251处我们看到[SHIFT]被写入文件,下面是一系列的按键:

[BACKSPACE],[TAB],[CTRL],下面都是一系列的按键:

这里已确认资源节解密出的可执行文件的功能就是一个键盘记录器,记录到创建的vlog文件中。

总结

这个病毒骚的地方不仅是资源节隐藏加密的可执行文件,这样就导致很难识别,Krypto ANALyzer插件也识别不出加密算法,最后只能在IDA中找解密例程。

最骚的还是R3下隐藏进程的手法,动态分析工具识别不到进程名的PID,只能看到正常运行的进程该病毒利用的是svchost.exe,关键技术是利用的CreateProcessA创建挂起的线程的EBX寄存器指向PEB,EAX指向EIP,因为大部分人知道如果线程没被挂起FS指向TEB然后加上0x30h偏移获取PEB的指针,这里把svchost.exe掏空了,把恶意可执行文件射入正常进程的地址空间,好一个偷梁换柱,借窝生蛋,最牛逼的是用各种工具都很难发现,这个R3下的隐身技术就很叼,别具一格,很有创意,艺术啊!

- End -

看雪ID:SpyGOD

https://bbs.pediy.com/user-home-830337.htm

 *本文由看雪论坛 SpyGOD 原创,转载请注明来自看雪社区。

# 往期推荐

公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]

球分享

球点赞

球在看

点击“阅读原文”,了解更多!


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458378467&idx=1&sn=a3a5404a905bf5f2f5b2bd1df79677bb&chksm=b180d06986f7597f793bd27f459f769d400b5b898e55c86208b9826981ce4144c53347ea56bb#rd
如有侵权请联系:admin#unsafe.sh