2012-03-22 3 views
6

サードパーティのバイナリ(ソースなし)の起動が遅い場合のトラブルシューティングを試みています。これは、64ビットWindows 7上で動作する32ビットアプリケーションです。WOW64でHANDLE作成をトラップする

起動時にCPU使用率が0%になるとデバッガを使用してアプリケーションに侵入しましたが、ReadFileを待っているようです戻る。 ReadFileの最初の引数はハンドル値000000f0です。 windbgのの!handleコマンドは私に語った:

Handle f0 
    Type   File 
    Attributes  0 
    GrantedAccess 0x120189: 
     ReadControl,Synch 
     Read/List,ReadEA,ReadAttr,WriteAttr 
    HandleCount  2 
    PointerCount 4 
    No Object Specific Information available 

私はこれが何に該当するデバイスを知りたいです。しかし、Sysinternals Process Explorerは、このハンドルをプロセスハンドルの一覧に含めません。

windbgを使用してすべての呼び出しをntdll!NtCreateFileにトレースし、パスと返されたハンドルを出力しました。このハンドルはその中にありません。 kernel32!CreateNamedPipeWkernel32!CallNamedPipeW、およびkernel32!WaitNamedPipeWのブレークポイントは決して起動されません(プロセスエクスプローラがパス\Device\NamedPipe\を持つ別のハンドルを表示したために奇妙です)。

bp ntdll!NtCreateFile "!ustr poi(@r8+10) ; r $t0 = @rcx ; gu ; dd @$t0 L1 ; gc" 

Thanks to Skywing for pointing me in the right direction on that

は参考のため、ここではWindowsのx64でNtCreateFileをトレースするためのコマンド(akak ZwCreateFile)です。

Fileのハンドルは他にどこから来ますか?他のHANDLE作成関数は実際のシステムコールのためにNtCreateFileに委譲していませんか?

+1

スタートアップを監視するプロセスモニターとも考えましたか? 2つ目のオプションは、windbgからのカーネルの側面を調べるためにlivekdされます。 – deemok

+0

@deemok:はい、私が知る限り、procmonはタイムアウトした 'ReadFile'呼び出しを見ていません。私はカーネルデバッガを走らせることができたと思いますが、VMはそれほど悪くないでしょうが、私はそれを避けようとしています。すべての必要な情報は、ユーザーモードで利用可能でなければなりません.HANDLEを作成するAPIがあれば、呼び出しが行われます。 –

+0

'NtCreateFile'が' HANDLE'を得る際に呼び出される唯一のシステムルーチンであるかどうかわかりません。それにもかかわらず、「ハンドル」特性を発見する方法があるはずだと私は信じています。特定のプロセスの中で 'HANDLE'は根底にある' FILE_OBJECT'に対応していなければなりません(もちろんファイルハンドルであれば)。あなたは 'ObReferenceObjectByHandle'を使用して、そのファイルハンドルを確認し(' ObjectType'をチェックして)、オブジェクトデータを 'FILE_OBJECT'にキャストすることができます。'DRIVER_OBJECT'へのポインタを含む' DEVICE_OBJECT'へのポインタを含んでいます。理論的にはすべてが見つかります – valdo

答えて

1

カーネルデバッグを行うときにのみ、ファイルハンドル情報を取得できるようです。したがって、3つのオプションがあります。

  1. ローカルマシンのカーネルデバッグを実行します。これは、ファイルハンドル情報を取得するだけで静的になるため、問題ではありません。以下を参照してください。http://msdn.microsoft.com/en-us/library/windows/hardware/ff553382(v=vs.85).aspx
  2. VMマシンのリモートカーネルデバッグを行います。あなたのマシンを爆破することはできません。
  3. あなたの箱をBSODで見て、そのようにダンプを見てください。再びあなたの箱にするのはとても素晴らしいことではありませんが、機械の状態を変えずに機械を完全に分析できるようにする必要があるときに、私はこれまで同様のことをしてきました。
1

ハンドルは継承することも、DuplicateHandle()によって作成することもできます。ハンドル上でGetFileInformationByHandleExを呼び出し、FileNameInfoを照会することができます。

+0

デバッグセッションからこれを行うにはどうすればよいですか?ターゲットプロセス内でコードを実行するためにDLL注入を実行する必要がありますか? –

+0

これは 'a'コマンドでコードを注入できる32ビットのデバッガセッションです。 'push f0''' 'push 2'' 'いくつかの有効なr/w /メモリのアドレスをpushします' 'push 200'' call kernel32!GetFileInformationByHandleEx'。 'int 3'。次に、デバッグセッションを終了するか、単に終了します。 – John

関連する問題