2012-03-22 15 views
6

Sto tentando di risolvere l'avvio lento di un binario di terze parti (senza origine). È un'applicazione a 32 bit in esecuzione su Windows 7 a 64 bit.Intrappolamento della creazione di HANDLE in WOW64

Ho usato un debugger per entrare nell'applicazione mentre è bloccato con l'utilizzo della CPU pari allo 0% durante l'avvio e sembra che sia in attesa di ReadFile in ritorno. Il primo argomento a ReadFile è il valore di handle, 000000f0. comando di windbg !handle mi dice:

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

Voglio sapere quale dispositivo questo corrisponde a. Ma Process Explorer di Sysinternals non include questo handle nel suo elenco di handle di processo.

Ho utilizzato windbg per tracciare tutte le chiamate su ntdll!NtCreateFile e stampato il percorso e l'handle restituito: questo handle non è tra questi. I punti di interruzione su kernel32!CreateNamedPipeW, kernel32!CallNamedPipeW e kernel32!WaitNamedPipeW non vengono mai attivati ​​(il che è strano perché Process Explorer ha mostrato un altro handle con il percorso \Device\NamedPipe\).

Per riferimento, ecco il comando per tracciare NtCreateFile (akak ZwCreateFile) su Windows x64:

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.

Da dove viene una MANIGLIA di tipo File? Le altre funzioni di creazione di HANDLE non sono delegate a NtCreateFile per l'effettivo syscall (non credo)?

+1

Avete anche considerato il monitor di processo per monitorare l'avvio? Una seconda opzione sarebbe livekd per esaminare il lato del kernel delle cose da windbg. – deemok

+0

@deemok: Sì, e per quanto posso dire, procmon non vede nemmeno la chiamata 'ReadFile' che sta scadendo. Immagino di poter eseguire un debugger del kernel, con una VM non sarebbe troppo male, ma ho cercato di evitarlo. Tutte le informazioni necessarie dovrebbero essere disponibili in modalità utente, nel momento in cui viene effettuata la chiamata a qualsiasi API che crei HANDLE. –

+0

Non so se 'NtCreateFile' è l'unica routine di sistema invocata per ottenere un' HANDLE'. Ma credo che ci dovrebbe essere comunque un modo per scoprire le proprietà di "MANIGLIA". All'interno del processo specifico il 'HANDLE' dovrebbe corrispondere al' FILE_OBJECT' sottostante (se è ovviamente un handle di file). Puoi usare 'ObReferenceObjectByHandle', verificarne l'handle di un file (controlla' ObjectType'), quindi lanciare i dati dell'oggetto su 'FILE_OBJECT'.Contiene tra le altre cose un puntatore a 'DEVICE_OBJECT', che contiene un puntatore a' DRIVER_OBJECT'. Quindi tutto teoricamente può essere scoperto – valdo

risposta

1

Sembra che si possano ottenere le informazioni di handle del file solo quando si esegue un debug del kernel. Quindi ci sono 3 opzioni.

  1. Eseguire un debug del kernel della macchina locale, questo non dovrebbe essere un problema poiché è necessario solo ottenere le informazioni sull'handle del file e che rimarranno statiche. Vedere quanto segue: http://msdn.microsoft.com/en-us/library/windows/hardware/ff553382(v=vs.85).aspx
  2. Eseguire un debug del kernel remoto di una macchina virtuale. "Più sicuro" nel senso che non puoi far saltare in aria la tua macchina.
  3. BSOD la tua scatola e guarda la discarica in questo modo. Ancora una volta non è una cosa molto carina da fare nella tua confezione, ma ho fatto cose simili in passato quando avevo bisogno di essere in grado di fare un'analisi completa sulla macchina senza che lo stato della macchina cambiasse.
1

Le maniglie possono essere ereditate e possono anche essere create da DuplicateHandle(). Puoi provare a chiamare GetFileInformationByHandleEx sull'handle e interrogare per FileNameInfo.

+0

Come posso farlo da una sessione di debug? Devo eseguire l'iniezione DLL per eseguire il codice all'interno del processo di destinazione? –

+0

È una sessione debugger a 32 bit che è possibile iniettare codice con il comando 'a'. 'push f0'' push 2' 'push ' 'push 200'' chiama kernel32! GetFileInformationByHandleEx'. 'int 3'. Quindi aggiustare le cose o semplicemente uscire dalla sessione del debugger. – John