6

我试图了解 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

ntdll.ZwCreateUserProcess但是当我执行这条指令时,Olly 只是在通话后回到add esp, 4右边(不是 at 0x74BE271E)。我在 处设置了一个断点retn 0x2C,我发现新进程是在add esp, 4.

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

4

3 回答 3

7
jmp far 0x33:0x74BE271E` 

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

于 2012-12-02T20:17:22.603 回答
5

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

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

这里有一些链接更详细地描述了该机制。您还可以通过搜索“天堂之门”一词找到更多信息。

http://rce.co/knockin-on-heavens-gate-dynamic-processor-mode-switching/

http://wasntnate.com/2012/04/heavens-gate-64-bit-code-in-32-bit-file/

于 2012-12-03T17:01:49.647 回答
4

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

于 2012-12-02T18:50:46.867 回答