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]、1 つの命令を含むへの呼び出しに従います。

jmp far 0x33:0x74BE271E

しかし、この命令をステップ実行すると、Ollyは呼び出しntdll.ZwCreateUserProcessadd esp, 4直後に戻ってきます (これは at ではありません0x74BE271E)。にブレークポイントを設定するretn 0x2Cと、 の実行中に何らかの形で新しいプロセスが作成されたことがわかりましたadd esp, 4

だから、遠距離ジャンプには何らかの魔法がかかっていると思います。実際にファー ジャンプを実行する代わりに、CS レジスタを に変更し0x33、EIP をに変更しようとしましたが、いくつかの命令の後でアクセス違反が発生しました。0x74BE271E何が起きてる?ZwCreateUserProcessWindows がプロセスを正確に作成する方法を理解するには、この抽象化を超えてさらに深く掘り下げることができる必要があります。

4

3 に答える 3

7
jmp far 0x33:0x74BE271E` 

そのジャンプはカーネルに入っています。0x33ある種のx86ゲートを指す特別なセグメントセレクターです。これにより、カーネルへのコンテキストスイッチがトリガーされます。

于 2012-12-02T20:17:22.603 に答える
5

実際には、そのジャンプはカーネルに入りませんが、WoW64 (Win64 上の Win32) の x64 ユーザーモード サブシステムに切り替わります。

セレクター 33h は、4GB のメモリ空間をカバーする特別なセレクターですが、x64 モードに設定されています。ジャンプは wow64cpu.dll の 64 ビット (ただしユーザーモード) 部分に移動し、32 ビット API パラメーターを 64 ビットのものに変換し、64 ビット ntdll.dll で API を呼び出します (はい、それらの 2 つがあります)。 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 5th または 6th edition の第 5 章「プロセス、スレッド、およびジョブ」も参照してください。その章では、プロセスの作成について詳しく説明しています。

于 2012-12-02T18:50:46.867 に答える