如何写一个dll的内存?

时间:2019-04-07 08:27:39

标签: winapi visual-c++

我正在尝试替换属于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呢?

1 个答案:

答案 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);
}