病毒常用的技俩之一就是创建一个傀儡进程,借助傀儡进程,执行自己的恶意代码。
其实现方法:
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文件是否已经在内存中展开了,如果展开过了,我们需要做一些修复才能使用
1) 方法一, 检查PE扩展头中SizeOfImage
字段,内存镜像大小,如果该字段和你dump的文件大小一致说明是映射过的PE文件,需要修复。
2)方法二,检查区段内存偏移地址,如果一个PE在内存中展开后,该区段的内存偏移地址处应该有代码才对。
因为本文中使用的dump PE文件是一个加过UPX壳的,所以我们检查第二个区段的偏移地址6000
,通常情况检查第一个区段的内存偏移地址就行了。
使用16进制编辑器打开dump文件,跳转到第二个区段内存偏移6000
看看是否是一个区段的开头
3)第三种方法,检查导入表是否正确,可以看到导入表基本全部是无效的
现在可以确定了这个dump下来的PE在内存展开过,要让它正常运行,需要修复一下!~
这里我们使用一种快速修复的方法,修复区段Raw地址和大小,修改成在内存展开后的地址和大小就行了,不影响运行。
现在再看导入表也恢复正常了
接下来就是UPX脱壳了~
把刚才修复好的PE拖进x32dbg,运行到EP,然后经典的UPX脱壳步骤
你可以使用ESP定律,不过今天介绍另一种UPX快速脱壳的方法,如果你知道UPX壳的原理,你可以直接跳转到流程图界面,在最后一个jmp 下断,一般这个跳转是去OEP的。
断下后,单步一下,就来到了OEP
Scylla搞起~
首先dump下来脱壳的PE,按下图中的提示文字操作
然后修复导入表
脱壳成功!现在可以使用IDA来分析这个木马咯