2012-03-22 13 views
6

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)?

+1

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

+0

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

+0

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

Odpowiedz

1

Wygląda na to, że informacje na temat obsługi plików można uzyskać tylko podczas debugowania jądra. Dostępne są 3 opcje.

  1. Wykonaj debugowanie jądra lokalnego komputera, nie powinno to stanowić problemu, ponieważ potrzebujesz tylko informacji o uchwytach plików, które pozostaną statyczne. Zobacz: http://msdn.microsoft.com/en-us/library/windows/hardware/ff553382(v=vs.85).aspx
  2. Wykonaj zdalne debugowanie jądra maszyny VM. "Bezpieczniej" w tym sensie, że nie możesz wysadzić swojej maszyny.
  3. BSOD swoje pudełko i spójrz na zrzut w ten sposób. Znowu niezbyt przyjemna rzecz do zrobienia w pudełku, ale robiłem podobne rzeczy w przeszłości, kiedy musiałem być w stanie przeprowadzić pełną analizę na komputerze bez zmiany stanu maszyny.
1

Uchwyty mogą być dziedziczone i mogą być również tworzone przez DuplicateHandle(). Możesz spróbować wywołać GetFileInformationByHandleEx na uchwycie i kwerendy dla FileNameInfo.

+0

Jak mogę to zrobić z sesji debugowania? Czy muszę wykonać wstrzyknięcie DLL, aby uruchomić kod w docelowym procesie? –

+0

Jest to 32-bitowa sesja debuggera, do której można wprowadzić kod za pomocą komendy 'a'. 'push f0'' push 2' 'push ' 'push 200'' call kernel32! GetFileInformationByHandleEx'. 'int 3'. Następnie albo napraw je, albo po prostu zakończ sesję debuggera. – John

Powiązane problemy