傀儡进程创建过程:
(1) CreateProcess一个进程,并挂起,即向dwCreationFlags 参数传入CREATE_SUSPENDED;
(2) GetThreadContext获取挂起进程CONTEXT,其中,EAX为进程入口点地址,EBX指向进程PEB;
(3) ZwUnmapViewOfSection卸载挂起进程内存空间数据;
(4) VirtualAlloc分配内存空间;
(5) WriteProcessMemory将恶意代码写入分配的内存;
(6) SetThreadContext设置挂起进程状态;
(6) ResumeThread唤醒进程运行。
傀儡进程是恶意软件隐藏自身代码的常用方式,在调式过程中,若遇到傀儡进程,需要将创建的子进程数据从内存中dump出来,作为PE文件单独调试,dump的时机为ResumeThead调用之前,此时傀儡进程内存数据已经完全写入,进程还未正式开始运行。
若dump后文件无法运行,OD加载失败,则需要做如下修复:
(1) FileAlignment值修改为SectionAlignment值;
(2) 所有section的Raw Address值修改为Virtual Address.
参考:
http://www.programlife.net/puppet-process-memory-dump.html