5

次のコマンドを使用して、ntdll.dllが新しいプロセスにマップされたとき、およびntdllのプロセス初期化が実行される前にWinDBGに侵入したいと思います。

sxe ld ntdll.dll; g

ただし、このトリックはまったく機能しません。

ModLoad: 7c900000 7c9b0000   ntdll.dll
eax=010043af ebx=7ffde000 ecx=020f18f5 edx=00000034 esi=00c2f720 edi=00c2f6f2
eip=7c810867 esp=0006fffc ebp=00000720 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000200
7c810867  ??              ???
Processing initial command 'sxe ld ntdll.dll ;g'
0:000> sxe ld ntdll.dll ;g
(ae8.6f4): Break instruction exception - code 80000003 (first chance)
eax=00181eb4 ebx=7ffde000 ecx=00000001 edx=00000002 esi=00181f48 edi=00181eb4
eip=7c901230 esp=0006fb20 ebp=0006fc94 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!DbgBreakPoint:
7c901230 cc              int     3

では、ntdll.dllが新しいプロセスにマップされているときにWinDBGに侵入するにはどうすればよいですか?ありがとう

[アップデート]

jcopenhaが述べた手順を正確に実行しましたが、Notepad.exeが実行されているときにWindbgが奇妙なエラー(メモリアクセスエラー)を表示する理由がわかりません。

手を貸してください!ありがとうございました!

0:000> .restart /f
CommandLine: C:\WINDOWS\NOTEPAD.EXE
Symbol search path is: D:\Symbols\Symbols;SRV*D:\Symbols\MySymbols*http://msdl.microsoft.com/download/symbols
Executable search path is: 
ModLoad: 01000000 01014000   notepad.exe
eax=0100739d ebx=7ffd9000 ecx=020f18f5 edx=0000004e esi=00f7f73a edi=00f7f6f2
eip=7c810867 esp=0007fffc ebp=0000024c iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000200
7c810867 ??              ???
0:000> u 7c810867
7c810867 ??              ???
            ^ Memory access error in 'u 7c810867'

[UPDATE2] 7c810867 に奇妙な命令が表示されているのを見つけましたが、pコマンドは引き続き機能します。

WinDBGのバグですか?

ここに画像の説明を入力してください

4

3 に答える 3

5

[デバッグ] -> [イベント フィルタ] に移動し、[プロセスの作成] を [有効] に変更してアプリケーションを再起動すると、モジュール リストに ntdll.dll が表示される前にアプリケーションが起動します。するとsxe ld ntdll.dll;gで止まりntdll!RtlUserThreadStartます。

0:000> .restart /f
CommandLine: C:\Windows\System32\notepad.exe
Symbol search path is: SRV*d:\symbols*http://msdl.microsoft.com/download/symbols
Executable search path is: 
ModLoad: 00000000`ffe00000 00000000`ffe35000   notepad.exe
00000000`7790c500 4883ec48        sub     rsp,48h
0:000> sxe ld ntdll.dll;g
ModLoad: 00000000`778e0000 00000000`77a89000   ntdll.dll
ntdll!RtlUserThreadStart:
00000000`7790c500 4883ec48        sub     rsp,48h
于 2012-08-27T19:41:02.827 に答える
2

ntdll の読み込みについては、こちらをお読みになることをお勧めます。コードを実行する前に、次の方法でプロセスに割り込むことができます。

windbg -xe cpr notepad

または

windbg -xe ld:ntdll notepad

この時点では、ntdll はまだプロセスにマップされています。これが発生する前に侵入することはできません。

メモリアクセスエラーに関しては、kernel32 はまだプロセスにロードされていません。最初のスレッドは、kernel32!BaseProcessStartThunk で実行するためにキューに入れられますが、kernel32 はまだアドレス空間にロードされていないため、そのアドレスには何も表示されません。

スレッドの開始アドレスがマップされていないメモリで開始できる理由は、スレッドが実行を開始する前に、ユーザー APC が最初のスレッドのコンテキストで実行され、すべてのプロセスの初期化を処理するためです。 kernel32 をロードしています。次のような同様のイベントを設定すると、このイベントが発生することがわかります。

sxe ld kernel32

スタック トレースで内部関数名を取得するには、シンボルを読み込む必要があります。

最初のリンクに加えて、ここでプロセスの初期化について詳しく読むことができます。お役に立てれば。

于 2012-09-11T23:35:12.380 に答える
-1

私が覚えている限り、ntdllはユーザーモードによってマップされていません。ユーザーモードでマップされた場合、ntdllをマップするモジュールは何にマップされますか?ntdllには、syscallがカーネルに入るスタブのセットが含まれています。また、プロセスの初期化の一部であるCOFFローダーなどの他のいくつかのものも含まれています。これはちょっとした魔法のdllであり、再配置することはできないため、すべてのプロセスで常に同じ仮想アドレスにあります。

ntdllがマップされる前に中断したい場合は、カーネルデバッガーを使用する必要があります。

ntdllがマップされる前に壊して何を達成しようとしているのか聞いてもいいですか?

于 2012-09-12T13:03:53.733 に答える