首页
社区
课程
招聘
[原创]分析一个一般般骚的病毒
发表于: 2020-11-13 10:52 7287

[原创]分析一个一般般骚的病毒

2020-11-13 10:52
7287

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


无壳


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



查看PE头信息

这里只导入了一个库KERNEL32.dll
查看导入函数

很明显用到了进程注入,因为这里看到了VirtualAlloc和WriteProcessMemory,GetModuleHandle,GetProcAddress
CreateFileA,WriteFile表明创建了一个文件,根据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执行恶意程序

将提取出的可执行文件命名为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下的隐身技术就很叼,别具一格,很有创意,艺术啊.


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 8
支持
分享
最新回复 (8)
雪    币: 968
活跃值: (6818)
能力值: (RANK:462 )
在线值:
发帖
回帖
粉丝
2
感谢分享! 如果条件允许,希望可以把样本压缩上传到论坛,供更多坛友学习交流
2020-11-13 11:07
0
雪    币: 164
活跃值: (1823)
能力值: ( LV11,RANK:185 )
在线值:
发帖
回帖
粉丝
3
learn
2020-11-13 11:08
0
雪    币: 3307
活跃值: (3524)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
4
坐等样本,分析一波
2020-11-13 15:55
0
雪    币: 210
活跃值: (651)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
5
感觉这个技术在 恶意样本分析中有提到,就是svchost.exe 不会独立出来运行,独立运行的可能是伪装的一个进程,感谢分享
2020-11-13 17:10
0
雪    币: 9217
活跃值: (1886)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
2020-11-13 19:12
0
雪    币: 12364
活跃值: (5889)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
这个exe的内存加载流程怎么这么简单,难道入口点才修复导入表?而且还需要在编译选项里关闭重定位、apiset、sxs、seh等。
2020-11-14 14:46
0
雪    币: 26205
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
8
感谢分享!
2020-11-16 17:27
0
雪    币: 183
活跃值: (6634)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
9
顾何 感谢分享! 如果条件允许,希望可以把样本压缩上传到论坛,供更多坛友学习交流[em_41]
感谢
2020-11-17 17:53
0
游客
登录 | 注册 方可回帖
返回
//