远程木马创建傀儡进程分析
一、实验目的
该样本具有一定的免杀性,分析该样本都用了什么技术,能达到免杀效果,所以本次实验目的如下:
(1)分析该样本运行流程
(2)提取该样本的关键技术,研究免杀原理。
二、实验描述
分析样本,MD5是997CF4517EE348EA771FD05F489C07FE,分析该样本的运行流程,我们需要调试傀儡进程,修复dump出来的傀儡进程,手工脱UPX壳,修复导入表。
三、实验目标
- 先将样本放到火绒剑里运行一下,了解样本A大概执行流程
- dump出的傀儡进程为B程序,修复后的傀儡进程为C程序
- 傀儡进程带有UPX壳,手工脱UPX壳,并修复导入表为D程序
- 分析修复后的傀儡有个加载资源的操作,该部分数据是PE格式,dump出来另存为E程序,发现是.net带有混淆的代码,需要反混淆操作
- 调试反混淆后的程序,分析发现其为远控木马,下载相应服务器端,研究该木马的功能。
四、实验环境
主机终端:win7 32位
资源:
Visual Studio 2013
010editor.exe
火绒剑.exe
OllyDbg.exe
样本
dnSpy.exe
de4dot.exe
pchunter.exe
NanoCore RAT Cracked.zip
五、实验原理
1、本样本逃过层层安全产品最终能落地到客户终端,由于其具有一定的免杀性,研究后发现关键技术是通过创建傀儡进程的形式实现启动恶意代码,也就是说恶意代码部分蜷缩在原程序中,通过创建傀儡进程的形式将恶意代码加载到内存中并运行。我们看下创建傀儡进程的方法:
(1) 通过CreateProcess以CREATE_SUSPENDED方式创建一个进程。
(2) GetThreadContext获取挂起进程CONTEXT。
(3) ZwUnmapViewOfSection卸载挂起进程内存空间数据;
(4) VirtualAlloc分配内存空间;
(5) WriteProcessMemory将恶意代码写入分配的内存;
(6) SetThreadContext设置挂起进程状态;
(7) ResumeThread唤醒进程运行
2、傀儡进程dump出来后需要进行修复,我们dump出来是程序拉伸后的状态,需要把文件偏移改为内存偏移
3、本程序涉及到UPX脱壳,手工脱壳后需要修改导入表,因为导入表在壳子里,我们把壳子脱掉了,导表表就没有了,需要将壳子程序的导入表赋值到脱壳后的程序中。
六、实验步骤
1. 火绒剑里运行一下,了解样本行为,发现该样本创建傀儡进程B
将样本托拽到火绒剑运行,排除掉一些不关心的动作,比如打开注册表,获取键值等操作。
发现两个问题,原程序创建了傀儡进程B,傀儡进程B将自己复制了一份命名为tcpmgr.exe并通过修改注册表启动项实现持久化。
2. Dump出傀儡进程B
关闭火绒剑,打开pchunter,点击“进程”,将所有grp-ps.exe进程停掉
用OD打开程序,Ctrl+G 输入ResumeThread,双击该API函数,F2下断,运行程序在唤醒进程前将程序断下来
在样本运行的时候会多次被断下,但只有一次断下来的情况是我们需要的。我们打开火绒剑,清空所有项,在OD中点击红色右箭头让程序运行起来。火绒剑和OD同时调试,找到ResumeThread唤醒傀儡进程的那次操作。
对照看火绒剑的日志,发现第六次断下就可以用pchunter工具dump傀儡进程了
打开Pchunter工具,dump出傀儡进程,如果pchunter工具没有目标进程,可以进行刷新
找到傀儡进程
点击傀儡进程,右键,依次选择“查看-查看进程内存”
选择具有可读可写可执行的模块,点击Dump,将傀儡进程B存放于桌面