病毒常用的技俩之一就是创建一个傀儡进程,借助傀儡进程,执行自己的恶意代码。
其实现方法:
1.以挂起方式创建一个进程
2.写入一个PE文件到这个挂起的进程的内存,可能会使用API WriteProcessMemory或MapViewOfSection那一套API来完成这个操作
3.调用ResumeThread恢复进程执行
对付这种我们可以在它写入数据到目标进程时下断点,例如WriteProcessMemory
WriteProcessMemory函数原型:
BOOL WINAPI WriteProcessMemory(
_In_ HANDLE hProcess,
_In_ LPVOID lpBaseAddress,
_In_ LPCVOID lpBuffer,
_In_ SIZE_T nSize,
_Out_ SIZE_T *lpNumberOfBytesWritten
);
可以看到第三个参数1170000
内存地址处就是要写入的内容,大小是20000,一个PE文件
如果是遇到解密自身硬编码的PE文件,动态在自身内存中展开那种,类似壳的,我们可以直接在VirtualAlloc下断点,发现有申请内存后写入了MZ头,转到内存布局,在该内存块下一次性执行断点,等断下来,就可以直接转到内存布局去保存文件了。
如果断不下来,或者比如OD调试器不支持内存块下执行断点,那就下内存块访一次性问断点,第一次断下后,直接转到OEP,下INT3断点,F9跑到OEP,然后到内存布局保存内存块,再修复PE~
怎么知道OEP是哪里? 可以先把第一次写入的残缺的PE文件,导入PE工具查看,扩展头里面有个入口点偏移。
OEP下断的地方,就是申请的地址+扩展头中的入口偏移
到内存布局页面找到相应的内存段,转存到文件
下一步就是要检查这个PE文件是否已经在内存中展开了,如果展开过了,我们需要做一些修复才能使用
1) 方法一, 检查PE扩展头中SizeOfImage
字段,内存镜像大小,如果该字段和你dump的文件大小一致说明是映射过的PE文件,需要修复。
2)方法二,检查区段内存偏移地址,如果一个PE在内存中展开后,该区段的内存偏移地址处应该有代码才对。
因为本文中使用的dump PE文件是一个加过UPX壳的,所以我们检查第二个区段的偏移地址6000
,通常情况检查第一个区段的内存偏移地址就行了。
使用16进制编辑器打开dump文件,跳转到第二个区段内存偏移6000
看看是否是一个区段的开头
3)第三种方法,检查导入表是否正确,可以看到导入表基本全部是无效的
现在可以确定了这个dump下来的PE在内存展开过,要让它正常运行,需要修复一下!~
这里我们使用一种快速修复的方法:
1. 修复区段Raw地址和大小,修改成在内存展开后的地址和大小
2. 然后修复exe加载基地址和dump的内存地址一样就行了,不影响运行。
现在再看导入表也恢复正常了
接下来就是UPX脱壳了~
把刚才修复好的PE拖进x32dbg,运行到EP,然后经典的UPX脱壳步骤
你可以使用ESP定律,不过今天介绍另一种UPX快速脱壳的方法,如果你知道UPX壳的原理,你可以直接跳转到流程图界面,在最后一个jmp 下断,一般这个跳转是去OEP的。
断下后,单步一下,就来到了OEP
Scylla搞起~
首先dump下来脱壳的PE,按下图中的提示文字操作
然后修复导入表
脱壳成功!现在可以使用IDA来分析这个木马咯