NtAllocateVirtualMemory завершается с ошибкой 0xC0000005 ⇐ C++
-
Anonymous
NtAllocateVirtualMemory завершается с ошибкой 0xC0000005
При попытке выделить память через NtAllocateVirtualMemory (работает через VirtualAlloc, но мне интересно, как это будет работать через NTAPI) и я не понимаю, в чем причина, я дал разрешения PAGE_EXECUTE_READ, но мне тоже не удалось выделить
#include #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) беззнаковый символьный буфер[] = { 0x90, // НЕТ 0x90, // НЕТ 0xcc, // ЦЕЛОЕ3 0xc3 // ОТМЕНА }; без знака int buffer_len = 4; typedef NTSTATUS(NTAPI* pNtAllocateVirtualMemory)( РУЧКА ProcessHandle, PVOID* Базовый адрес, УЛОНГ ЗероБитс, ПУЛОНГ РегионРазмер, Тип распределения ULONG, УЛОНГ Защитить ); typedef NTSTATUS(NTAPI* pNtWriteVirtualMemory)( РУЧКА ProcessHandle, Базовый адрес PVOID, ПВОИД-буфер, SIZE_T Размер Буфера, PSIZE_T Число записанных байтов ); интервал основной() { PVOID exec_mem; БУЛ рв; РУЧКА рт; pNtAllocateVirtualMemory ntAllocateVirtualMemory = (pNtAllocateVirtualMemory)GetProcAddress(GetModuleHandleA("ntdll"), "NtAllocateVirtualMemory"); Статус NTSTATUS = ntAllocateVirtualMemory( ПолучитьТекущийПроцесс(), &exec_mem, 0, (ПУЛОНГ)&buffer_len, MEM_COMMIT | МЕМ_РЕЗЕРВ, PAGE_READWRITE ); если (!NT_SUCCESS(статус)) { вернуть -1; } pNtWriteVirtualMemory ntWriteVirtualMemory = (pNtWriteVirtualMemory)GetProcAddress(GetModuleHandleA("ntdll"), "NtWriteVirtualMemory"); SIZE_T записано байт; статус = ntWriteVirtualMemory( ПолучитьТекущийПроцесс(), exec_mem, буфер, буфер_лен, &байтыНаписано ); rt = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)exec_mem, 0, 0, 0); WaitForSingleObject(rt, -1); вернуть 0; } Я пытался изменить разрешения, длину, пытался передать длину как указатель, но все равно не получилось.
При попытке выделить память через NtAllocateVirtualMemory (работает через VirtualAlloc, но мне интересно, как это будет работать через NTAPI) и я не понимаю, в чем причина, я дал разрешения PAGE_EXECUTE_READ, но мне тоже не удалось выделить
#include #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) беззнаковый символьный буфер[] = { 0x90, // НЕТ 0x90, // НЕТ 0xcc, // ЦЕЛОЕ3 0xc3 // ОТМЕНА }; без знака int buffer_len = 4; typedef NTSTATUS(NTAPI* pNtAllocateVirtualMemory)( РУЧКА ProcessHandle, PVOID* Базовый адрес, УЛОНГ ЗероБитс, ПУЛОНГ РегионРазмер, Тип распределения ULONG, УЛОНГ Защитить ); typedef NTSTATUS(NTAPI* pNtWriteVirtualMemory)( РУЧКА ProcessHandle, Базовый адрес PVOID, ПВОИД-буфер, SIZE_T Размер Буфера, PSIZE_T Число записанных байтов ); интервал основной() { PVOID exec_mem; БУЛ рв; РУЧКА рт; pNtAllocateVirtualMemory ntAllocateVirtualMemory = (pNtAllocateVirtualMemory)GetProcAddress(GetModuleHandleA("ntdll"), "NtAllocateVirtualMemory"); Статус NTSTATUS = ntAllocateVirtualMemory( ПолучитьТекущийПроцесс(), &exec_mem, 0, (ПУЛОНГ)&buffer_len, MEM_COMMIT | МЕМ_РЕЗЕРВ, PAGE_READWRITE ); если (!NT_SUCCESS(статус)) { вернуть -1; } pNtWriteVirtualMemory ntWriteVirtualMemory = (pNtWriteVirtualMemory)GetProcAddress(GetModuleHandleA("ntdll"), "NtWriteVirtualMemory"); SIZE_T записано байт; статус = ntWriteVirtualMemory( ПолучитьТекущийПроцесс(), exec_mem, буфер, буфер_лен, &байтыНаписано ); rt = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)exec_mem, 0, 0, 0); WaitForSingleObject(rt, -1); вернуть 0; } Я пытался изменить разрешения, длину, пытался передать длину как указатель, но все равно не получилось.
Мобильная версия