Задать вопрос
@disney1337

Почему не получается записать данные в память?

Пытаюсь с помощью ntapi функций выделить память и записать в нее массив байт.

hProcess = GetCurrentProcess();


status = mem.nAllocateVirtualMemory(hProcess, &rBuffer, 0, &shellSize, (MEM_COMMIT | MEM_RESERVE), PAGE_READWRITE); // пробовал PAGE_EXECUTE_READWRITE, ведь ошибка 8000000d указывает на то, что что произошел конфликт с защитой памяти 
if (!NT_SUCCESS(status)) {
    error("failed to allocate virtual memory | ");
    cout << "NTSTATUS code: " << hex << (int)status << endl;
    cout << "GetLastError code: " << GetLastError() << endl << endl;
}
else {
    okay("memory was allocated successfully | address: ");
    cout << rBuffer << endl << endl;
}

status = mem.nWriteVirtualMemory(hProcess, rBuffer, shellCode, shellSize, &bytesWritten);
if (!NT_SUCCESS(status)) {
    error("failed to write virtual memory | ");
    cout << "NTSTATUS code: " << hex << (int)status << endl;
    cout << "GetLastError code: " << GetLastError() << endl << endl;
}
else {
    okay("memory was wrote successfully | address : ");
    cout << rBuffer << " bytes written " << bytesWritten << endl << endl;
}


при попытке записать какие-либо данные с помощью функции NtWriteVirtualMemory я получаю код ошибки 0x8000000d. Из документации Microsoft ясно, что речь идет о конфликте защиты региона памяти, но проблема в том, что функция NtAllocateVirtualMemory вызывается с AllocationType PAGE_READWRITE или же PAGE_EXECUTE_READWRITE

несколько раз перепроверял прототипы функций и методы которыми я те самые Nt функции получаю, все верно

из-за чего возникает подобная ошибка я даже не могу предположить, ведь при использовании стандартной функции WINAPI VirtualAlloc таких проблем не наблюдается (следовательно никаких проблем с функцией записи нету)

надеюсь на помощь
  • Вопрос задан
  • 123 просмотра
Подписаться 1 Простой 4 комментария
Пригласить эксперта
Ответы на вопрос 2
AshBlade
@AshBlade
Просто хочу быть счастливым
Попробуй вместо Read/WriteVirtualMemory - Read/WriteProcessMemory https://learn.microsoft.com/en-us/windows/win32/ap...
Я так полагаю тебе надо работать с памятью другого процесса
Ответ написан
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
У вас rBuffer зануляется перед выделением памяти?

Еще стоит проверять размер выделенной памяти. shellSize может вернуться больше исходного размера и вы потом в Write будете записывать больше данных, чем у вас в shellCode есть.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы