我正在尝试替换属于dll的内存中的特定字符串。这是代码。
我可以阅读它,它给我正确的结果,但是在编写VC ++时显示“访问冲突写入位置”。
HMODULE HMODULE1 = LoadLibrary(L"my.dll");
std::string x1(8, '\0');
std::string x2 = "CIFCDMEY";
auto startPos = (void*)((char*)(HMODULE1)+0x1158A0 + 9);
// Correct, I can read the memory
memcpy_s((void*)x1.data(), x1.size(), startPos, x1.size());
// Access violation writing location
memcpy_s(startPos, x2.size(), x2.data(), x2.size());
auto handle = GetCurrentProcess();
SIZE_T num;
auto ret = WriteProcessMemory(handle, startPos, x2.data(), x2.size(), &num);
auto lastError1 = GetLastError();
LPVOID lpMessageBuffer1 = NULL;
size_t size1 = ::FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
lastError1,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMessageBuffer1,
0,
NULL);
std::wstring errorMessage1;
if (size1 > 0) {
// errorMessage1: Invalid access to memory location.
errorMessage1 = std::wstring((LPCTSTR)lpMessageBuffer1, size1);
}
在“监视”窗口中,变量startPos
的值为my.dll!0x0f2a58a9 (load symbols for additional information)
。
我知道人们使用'WriteProcessMemory'来写进程的内存,dll呢?
答案 0 :(得分:0)
如果目标内存页面没有写权限,则需要使用VirtualProtect()
我为所有修补程序都使用了一个简单的包装函数,它使用了PAGE_EXECUTE_READWRITE memory protection constant,因为如果您正在修改代码页,这将避免当指令指针落入同一内存页面并且仅使用PAGE_READWRITE时崩溃
void Patch(char* dst, char* src, const intptr_t size)
{
DWORD oldprotect;
VirtualProtect(dst, size, PAGE_EXECUTE_READWRITE, &oldprotect);
memcpy(dst, src, size);
VirtualProtect(dst, size, oldprotect, &oldprotect);
}