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]
、1 つの命令を含むへの呼び出しに従います。
jmp far 0x33:0x74BE271E
しかし、この命令をステップ実行すると、Ollyは呼び出しntdll.ZwCreateUserProcess
のadd esp, 4
直後に戻ってきます (これは at ではありません0x74BE271E
)。にブレークポイントを設定するretn 0x2C
と、 の実行中に何らかの形で新しいプロセスが作成されたことがわかりましたadd esp, 4
。
だから、遠距離ジャンプには何らかの魔法がかかっていると思います。実際にファー ジャンプを実行する代わりに、CS レジスタを に変更し0x33
、EIP をに変更しようとしましたが、いくつかの命令の後でアクセス違反が発生しました。0x74BE271E
何が起きてる?ZwCreateUserProcess
Windows がプロセスを正確に作成する方法を理解するには、この抽象化を超えてさらに深く掘り下げることができる必要があります。