Próbuję rozwiązać problem powolnego uruchamiania pliku binarnego innej firmy (brak źródła). Jest to 32-bitowa aplikacja działająca w 64-bitowym systemie Windows 7.Trapping UCHWYTU URZĄDZENIA w WOW64
Użyłem debuggera, aby włamać się do aplikacji, gdy jest zawieszony przy użyciu 0% użycia procesora podczas uruchamiania i wygląda na to, że czeka na ReadFile
powrót. Pierwszym argumentem dla ReadFile
jest wartość uchwytu, 000000f0. !handle
komenda WinDBG opowiada mi:
Handle f0 Type File Attributes 0 GrantedAccess 0x120189: ReadControl,Synch Read/List,ReadEA,ReadAttr,WriteAttr HandleCount 2 PointerCount 4 No Object Specific Information available
Chcę wiedzieć, jakie urządzenie to odpowiada. Ale Sysinternals Process Explorer nie uwzględnia tego uchwytu na liście uchwytów procesów.
Użyłem windbg do śledzenia wszystkich połączeń do ntdll!NtCreateFile
i wydrukowałem ścieżkę i zwracany uchwyt: Ten uchwyt nie jest wśród nich. Punkty przerwania na kernel32!CreateNamedPipeW
, kernel32!CallNamedPipeW
i kernel32!WaitNamedPipeW
nigdy nie są wyzwalane (co jest nieparzyste, ponieważ Process Explorer pokazał inny uchwyt ze ścieżką \Device\NamedPipe\
).
Dla porównania, tutaj jest komenda prześledzić NtCreateFile
(akak ZwCreateFile
) w systemie 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.
Gdzie jeszcze można uzyskać UCHWYT typu File
? Czy inne funkcje tworzenia HANDLE nie delegują na NtCreateFile
dla rzeczywistej syscall (chyba nie)?
Czy rozważałeś także monitorowanie procesu w celu monitorowania uruchomienia? Drugą opcją będzie livekd, aby zajrzeć do jądra strony z windbg. – deemok
@deemok: Tak, i o ile wiem, prokmon nie widzi nawet wywołania "ReadFile", które wyczerpywało czas. Myślę, że mógłbym uruchomić debugger jądra, z VM nie byłoby tak źle, ale starałem się tego uniknąć. Wszystkie niezbędne informacje powinny być dostępne w trybie użytkownika, w czasie, gdy wywoływane jest to, co API tworzy UCHWYT. –
Nie wiem, czy 'NtCreateFile' jest jedyną procedurą systemową wywoływaną przy uzyskiwaniu" UCHWYTU ". Sądzę jednak, że powinien istnieć sposób na poznanie właściwości "UCHWYTU". W ramach określonego procesu "UCHWYT" powinien odpowiadać ukrytemu "FILE_OBJECT" (jeśli oczywiście jest to uchwyt pliku). Możesz użyć 'ObReferenceObjectByHandle', sprawdzić jego uchwyt pliku (sprawdź' ObjectType'), a następnie przesuń dane obiektu do 'FILE_OBJECT'.Zawiera między innymi wskaźnik do 'DEVICE_OBJECT', który zawiera wskaźnik do' DRIVER_OBJECT'. Wszystko więc teoretycznie można odkryć – valdo