c2i forums
ZwAllocateVirtualMemory kończy się niepowodzeniem dla procesów WOW64 - Printable Version

+- c2i forums (http://c2i.pl)
+-- Forum: Public (http://c2i.pl/forum-1.html)
+--- Forum: General (http://c2i.pl/forum-5.html)
+--- Thread: ZwAllocateVirtualMemory kończy się niepowodzeniem dla procesów WOW64 (/thread-4823.html)



ZwAllocateVirtualMemory kończy się niepowodzeniem dla procesów WOW64 - nurikoo - 10-12-2018

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?


RE: ZwAllocateVirtualMemory kończy się niepowodzeniem dla procesów WOW64 - williamhopperr - 10-12-2018

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


RE: ZwAllocateVirtualMemory kończy się niepowodzeniem dla procesów WOW64 - ozchemimpex - 10-12-2018

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.


RE: ZwAllocateVirtualMemory kończy się niepowodzeniem dla procesów WOW64 - ghorthas - 10-12-2018

Kod: (PVOID *) p_data -> p_adress robisz to źle. Przekaż mu wskaźnik, aby api mógł zapisać wynik.


RE: ZwAllocateVirtualMemory kończy się niepowodzeniem dla procesów WOW64 - bubbles.47th - 10-12-2018

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)


RE: ZwAllocateVirtualMemory kończy się niepowodzeniem dla procesów WOW64 - smithlock11 - 10-12-2018

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.


RE: ZwAllocateVirtualMemory kończy się niepowodzeniem dla procesów WOW64 - davidawilkinson - 10-12-2018

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


RE: ZwAllocateVirtualMemory kończy się niepowodzeniem dla procesów WOW64 - danny.goldie - 10-12-2018

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