Я пытаюсь принести 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);
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);
Других решений пока нет …