NtAllocateVirtualMemory ошибка 0xC0000005


yum

Пользователь
Форумчанин
Регистрация
30.11.2023
Сообщения
47
Репутация
5
Почему не получается алоцировать память через NTAPI , что я делаю не так , ошибка 0xC0000005
C++:
#include <Windows.h>

#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)

unsigned char payload[] = {
    0x90,        // NOP
    0x90,        // NOP
    0xcc,        // INT3
    0xc3        // RET
};
unsigned int payload_len = 4;

typedef NTSTATUS(NTAPI* pNtAllocateVirtualMemory)(
    HANDLE             ProcessHandle,
    PVOID*               BaseAddress,
    ULONG              ZeroBits,
    PULONG             RegionSize,
    ULONG              AllocationType,
    ULONG              Protect
);
typedef NTSTATUS(NTAPI* pNtWriteVirtualMemory)(
    HANDLE ProcessHandle,
    PVOID BaseAddress,
    PVOID Buffer,
    SIZE_T BufferSize,
    PSIZE_T NumberOfBytesWritten
);

int main()
{

    PVOID exec_mem;
    BOOL rv;
    HANDLE rt;

    pNtAllocateVirtualMemory ntAllocateVirtualMemory =
        (pNtAllocateVirtualMemory)GetProcAddress(GetModuleHandleA("ntdll"), "NtAllocateVirtualMemory");

    NTSTATUS status = ntAllocateVirtualMemory(
        GetCurrentProcess(),
        &exec_mem,
        0,
        (PULONG)&payload_len,
        MEM_COMMIT | MEM_RESERVE,
        PAGE_READWRITE
    );
    if (!NT_SUCCESS(status)) {
        return -1;
    }

    pNtWriteVirtualMemory ntWriteVirtualMemory =
        (pNtWriteVirtualMemory)GetProcAddress(GetModuleHandleA("ntdll"), "NtWriteVirtualMemory");
    
    SIZE_T bytesWritten;
    status = ntWriteVirtualMemory(
        GetCurrentProcess(),
        exec_mem,
        payload,
        payload_len,
        &bytesWritten
    );

    rt = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)exec_mem, 0, 0, 0);
    WaitForSingleObject(rt, -1);

    return 0;
}
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 085
Репутация
8 208
Вместо GetCurrentProcess() попробуй (HANDLE)-1.
 

yum

Пользователь
Форумчанин
Регистрация
30.11.2023
Сообщения
47
Репутация
5
Вместо GetCurrentProcess() попробуй (HANDLE)-1.
Оказалось все проще , нужно было указать ULONG_PTR , вместо ULONG , ULONG_PTR - для х64 , ULONG для х86
Код:
typedef NTSTATUS(NTAPI* pNtAllocateVirtualMemory)(
    HANDLE             ProcessHandle,
    PVOID*               BaseAddress,
    ULONG_PTR          ZeroBits,
    PULONG             RegionSize,
    ULONG              AllocationType,
    ULONG              Protect
);
, я билдил для х64 , вот и не работало , и да я поменял на это (HANDLE)-1, тоже спасибо не знал об этом
 
Автор темы Похожие темы Форум Ответы Дата
yum ВОПРОС-ОТВЕТ. БАРАХОЛКА 7
Похожие темы
Ошибка линковки
Верх Низ