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)?
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
@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. –
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