Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
ZwAllocateVirtualMemory kończy się niepowodzeniem dla procesów WOW64
#1
Cześć chłopaki,   więc właśnie zaimplementowałem procedurę, która pozwala mojemu kierowcy przydzielić pamięć wewnątrz procesu.   Dziwne jest to, że działa tylko dla procesów 64-bitowych, dla procesów 32-bitowych ZwAllocateVirtualMemory kończy się niepowodzeniem z kodem błędu 0xC0000017:     Ten obraz został przeskalowany. Kliknij ten pasek, aby wyświetlić pełny obraz. Oryginalny obraz ma rozmiar 920 x 366.   Mój kod     Kod:   NTSTATUS allocate_process_memory (allocate_process_memory_data * p_data) {Wynik NTSTATUS = - 1; KAPC_STATE apc = {0}; PEPROCESS process_object = NULL; jeśli (p_data == NULL) wynik; __try {DbgPrint ("[POISON] allocate_process_memory: process_id% d \ n", p_data -> process_id); DbgPrint ("[POISON] allocate_process_memory: p_adress 0x% X \ n", p_data -> p_adress); DbgPrint ("[POISON] allocate_process_memory: * p_adress 0x% X \ n", * (uint64 *) p_data -> p_adress); DbgPrint ("[POISON] allocate_process_memory: p_size 0x% X \ n", p_data -> p_size); DbgPrint ("[POISON] allocate_process_memory: * p_size 0x% X \ n", * (uint64 *) p_data -> p_size); DbgPrint ("[POISON] allocate_process_memory: type 0x% X \ n", p_data -> type); DbgPrint ("[POISON] allocate_process_memory: protection 0x% X \ n", p_data -> protection); if (! NT_SUCCESS (result = PsLookupProcessByProcessId ((HANDLE) p_data -> process_id i process_object))) zwraca wynik; KeStackAttachProcess (process_object, & apc); result = ZwAllocateVirtualMemory (ZwCurrentProcess (), (PVOID *) p_data -> p_adress, 0, (PSIZE_T) p_data -> p_size, (ULONG) p_data -> typ, (ULONG) p_data -> ochrona); if (! NT_SUCCESS (result)) DbgPrint ("[POISON] ZwAllocateVirtualMemory nie powiodło się z 0x% X \ n", wynik); KeUnstackDetachProcess (& apc); wynik zwrotu; } __except (EXCEPTION_EXECUTE_HANDLER) {return STATUS_UNHANDLED_EXCEPTION; }}   Jakieś sugestie?
Reply
#2
Zacytować: Originally Posted by BuckshotYT ~ snip ~ sprawdź rozmiar adresu danych przekazywanych do ZwAllocateVirtualMemory również możesz użyć 0x% llx zamiast 0x% x do drukowania wartości heksadecjalnych, ponieważ pracujesz z 64-bitowym kodem
Reply
#3
Czy przyjrzałeś się awarii w WinDbg? Jakie były twoje wyniki? Wyjście DebugView i twój kod pokazują tylko tyle. Możliwe, że próbujesz przydzielić zbyt dużo pamięci, to znaczy - przecież - co mówi kod błędu.
Reply
#4
Kod: (PVOID *) p_data -> p_adress robisz to źle. Przekaż mu wskaźnik, aby api mógł zapisać wynik.
Reply
#5
Zacytować: Originally Posted by learn_more Kod: (PVOID *) p_data -> p_adress robisz to źle. Przekaż mu wskaźnik, aby api mógł zapisać wynik. To już jest wskaźnik do mojej pamięci aplikacji trybu użytkownika. Więc okazuje się, że jestem w 100% opóźniony i spieprzyłem mój typedefs. Zdefiniowałem mój "uint64" jako 4-bajtowy int dla celów x86. Działa dobrze teraz, dzięki i tak Btw, co to jest ze ZwProtectVirtualMemory? po prostu "zaimportowałem" to tak: Kod: NTSYSAPI NTSTATUS NTAPI ZwProtectVirtualMemory (IN HANDLE ProcessHandle, IN PVOID * BaseAddress, IN SIZE_T * NumberOfBytesToProtect, IN ULONG NewAccessProtection, OUT PULONG OldAccessProtection); i później użyłem go w moim kodzie. Mogę skompilować, ale czy to właściwa droga? (Nie chcę wpaść na bsod, więc to dlaczego pytam)
Reply
#6
Zacytować: Originally Posted by BuckshotYT Btw, co to jest ze ZwProtectVirtualMemory? po prostu "zaimportowałem" to tak: Kod: NTSYSAPI NTSTATUS NTAPI ZwProtectVirtualMemory (IN HANDLE ProcessHandle, IN PVOID * BaseAddress, IN SIZE_T * NumberOfBytesToProtect, IN ULONG NewAccessProtection, OUT PULONG OldAccessProtection); i później użyłem go w moim kodzie. Mogę skompilować, ale czy to właściwa droga? (Nie chcę wpaść na bsod, więc to dlaczego pytam) Jeśli jesteś na Win10, to w porządku. Jądro Win7 i Win8 nie eksportuje ZwProtectVirtualMemory, więc nie będzie działać na tych systemach.
Reply
#7
Zacytować: Napisał MarkHC Jeśli jesteś na Win10, to w porządku. Jądro Win7 i Win8 nie eksportuje ZwProtectVirtualMemory, więc nie będzie działać na tych systemach. tak, właśnie miał powiedzieć "od kiedy została wyeksportowana ta funkcja". Kod: KiOpPatchCode + C5 48 83 C9 FF lub rcx, 0FFFFFFFFFFFFFFh KiOpPatchCode + C9 E8 E2 93 EF Wywołanie FF ZwProtectVirtualMemory KiOpPatchCode + CE 3B C3 cmp eax, ebx można go znaleźć na win8 i poniżej, zaznaczając tę część sekcji KiOpPatchCode (ntoskrnl .TEXT). ale jak zawsze z niezgłoszonymi funkcjami, nie jest to niezawodny sposób. także jeśli jesteś tylko stosem dołączającym do procesu trybu użytkownika, a następnie wywołującego ZwProtectVirtualMemory ze ZwCurrentProcess (), lepiej wyłączyć wywołanie MiProtectVirtualMemory, ponieważ ZwProtectVirtualMemory jest stosem dołączającym do procesu już i następnie wywołującym MiProtectVirtualMemory
Reply
#8
Zacytować: Originally Posted by BuckshotYT Więc okazuje się, że jestem w 100% opóźniony i spieprzyłem mój typedefs. Zdefiniowałem mój "uint64" jako 4-bajtowy int dla celów x86. Działa dobrze teraz, dzięki i tak to prawie nie jest wklejone, naprawdę nie rozumiem, dlaczego ludzie tak szybko zadają pół pytania ...
Reply




Users browsing this thread: 1 Guest(s)