Winapi ntdll.dll中的跳远';s内部ZwCreateUserProcess

Winapi ntdll.dll中的跳远';s内部ZwCreateUserProcess,winapi,assembly,process,Winapi,Assembly,Process,我试图理解Windows API是如何创建进程的,这样我就可以创建一个程序来确定无效EXE失败的地方。我有一个调用kernel32.CreateProcessA的程序。接下来在OllyDbg中调用kernel32.CreateProcessInternalA,它调用kernel32.CreateProcessInternalW,它调用ntdll.ZwCreateUserProcess。此功能用于: mov eax, 0xAA xor ecx, ecx lea edx, dword ptr [es

我试图理解Windows API是如何创建进程的,这样我就可以创建一个程序来确定无效EXE失败的地方。我有一个调用
kernel32.CreateProcessA
的程序。接下来在OllyDbg中调用
kernel32.CreateProcessInternalA
,它调用
kernel32.CreateProcessInternalW
,它调用
ntdll.ZwCreateUserProcess
。此功能用于:

mov eax, 0xAA
xor ecx, ecx
lea edx, dword ptr [esp+4]
call dword ptr fs:[0xC0]
add esp, 4
retn 0x2C
因此,我跟随对
fs:[0xC0]
的调用,它包含一条指令:

jmp far 0x33:0x74BE271E
但当我执行此指令时,Olly只会在调用后的
add esp,4
处返回到
ntdll.ZwCreateUserProcess
(而不是
0x74BE271E
)。我在
retn0x2c
处放置了一个断点,我发现新进程是在执行
addesp,4
的过程中创建的


所以我假设跳远有一些魔力。我试图将CS寄存器更改为
0x33
,将EIP更改为
0x74BE271E
,而不是实际执行远跳转,但这只是在几条指令后给了我一个访问冲突。这是怎么回事?我需要能够深入研究这个
ZwCreateUserProcess
的抽象之外的内容,以了解Windows是如何创建进程的。

您缺少的部分是内核部分。您将需要附加一个内核模式调试器,并进入ZwCreateUserProcess的内核端代码,以查看该进程是如何创建的。您还应该看看第5版或第6版Windows内部构件的第5章“进程、线程和作业”。该章详细介绍了流程创建

jmp far 0x33:0x74BE271E` 

跳转正在进入内核
0x33
是一个特殊的段选择器,指向某种x86门;这会触发到内核的上下文切换。

实际上,该跳转不会进入内核,而是切换到WoW64的x64用户模式子系统(Win32 on Win64)

选择器33h是一种特殊选择器,覆盖4GB内存空间,但设置为x64模式。跳转到wow64cpu.dll的64位(但仍然是用户模式)部分,该部分将32位API参数转换为64位参数,并在64位ntdll.dll中调用API(是的,在WoW64进程中有两个参数)。该ntdll依次调用真正的系统调用,该系统调用进入内核

这里有几个链接更详细地描述了该机制。你也可以通过搜索“天堂之门”来找到更多信息