WriteProcessMemory在调试过程中

时间:2012-12-03 15:21:35

标签: windows debugging winapi

我尝试编写简单的调试器。为简单起见,假设调试器在Windows XP下运行。

首先,我按如下方式创建新流程:

CreateProcess(processName,
        NULL, 
        NULL, 
        NULL, 
        false, 
        DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS, 
        NULL, 
        NULL, 
        &startInfo, 
        &openedProcessInfo);

当我尝试在调试过程的内存中读取或写入某些内容时,存在一些问题。例如:

    DWORD oldProtect;
    if(!VirtualProtectEx(hProcess, breakpointAddr, 1, PAGE_EXECUTE_READWRITE, &oldProtect)) {
        printf("Error: %d\n", GetLastError());
    }

    SIZE_T bytesRead = 0;
    SIZE_T bytesWritten = 0;        
    BYTE instruction;

    BOOL isOk = ReadProcessMemory(hProcess, breakpointAddr, &instruction, 1, &bytesRead);
    BYTE originalByte = instruction;

    instruction = 0xCC;
    if(isOk && bytesRead == 1) {
        isOk = WriteProcessMemory(hProcess, breakpointAddr, &instruction, 1, &bytesWritten);
        if(isOk) {
            isOk = FlushInstructionCache(hProcess, breakpointAddr, 1);
        }
    }
    if(!isOk) {
        printf("Error: %d\n", GetLastError());
    }

它有效但不是无处不在。当我想要写入(读取)某些内容的地址位于可执行模块(.exe)中时,它可以正常工作。

但是当我尝试在DLL库中编写(读取)某些内容时(例如,在函数VirtualAlloc的地址读取) VirtualProtectEx返回false并且GetLastError = 487 (尝试访问无效地址)和< strong> ReadProcessMemory也返回false并且GetLastError = 299 (只完成了ReadProcessMemory或WriteProcessMemory请求的一部分。)

启用了调试权限但它没有效果。

1 个答案:

答案 0 :(得分:0)

如果您以管理员身份运行,则您的代码看起来不错,而不是该问题最可能的原因是breakpointAddr是无效的地址。 VirtualProtectEx给出“尝试访问无效地址”错误支持此结论。