我试图了解 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 是如何创建进程的。