`VirtualAllocEx` возвращает один и тот же адрес при указании разных начальных адресов?

Я пытаюсь принести calc.exe, чтобы показать окно сообщения, но calc.exe всегда вылетает, как только я запускаю свою программу. Поэтому я попытался внедрить код в свой собственный процесс, чтобы увидеть сообщения отладки. Это дает мне исключение «Нарушение доступа при … Невозможно выполнить …», указывающее на pData->msg, Потом я узнал, что pThread а также pData получить тот же адрес. Как это возможно? Я на самом деле поставил lpAddress из VirtualAllocEx в pPage а также pPage + 128 не получить тот же начальный адрес.

// Allocate page
void *pPage = VirtualAllocEx(hProcess, NULL, 256, MEM_RESERVE, PAGE_EXECUTE_READWRITE);

// Commit memory for thread procedure
void *pThread = VirtualAllocEx(hProcess, pPage, 128, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

// Commit memory for thread data
void *pData = VirtualAllocEx(hProcess, (void*)((long long)pPage + 128), 128, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

// WriteProcessMemory, do stuff

// Release memory
VirtualFreeEx(hProcess, pPage, 256, MEM_RELEASE);

0

Решение

VirtualAllocEx распределяет память по частям, разделяемым размером страницы памяти, которая составляет 4096 байт

dwSize [in] Размер области в байтах. Если параметр lpAddress равен NULL, это значение округляется до границы следующей страницы. В противном случае выделенные страницы включают все страницы, содержащие один или несколько байтов в диапазоне от lpAddress до lpAddress + dwSize. Это означает, что 2-байтовый диапазон, охватывающий границу страницы, приводит к тому, что обе страницы включаются в выделенную область.

lpAddress [in, необязательно] Указатель, который указывает желаемый начальный адрес для области страниц, которые вы хотите выделить.
Если вы резервируете память, функция округляет этот адрес до ближайшего кратного гранулярности распределения.

Попробуйте использовать функцию Heap (HeapAlloc, HeapFree, HeapCreate).

Или вы можете сделать что-то вроде этого:

// Allocate page
void *pPage = VirtualAllocEx(hProcess, NULL, 256, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);

// Commit memory for thread data
void *pData = (char*)pPage + 128;

// WriteProcessMemory, do stuff

// Release memory
VirtualFreeEx(hProcess, pPage, 256, MEM_RELEASE);
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]