【问题标题】:WriteProcessMemory in debugged process已调试进程中的 WriteProcessMemory
【发布时间】:2012-11-21 02:17:48
【问题描述】:

我尝试编写简单的调试器。为简单起见,假设调试器在 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(尝试访问无效地址)和 ReadProcessMemory 也返回 false 并且 GetLastError = 299(仅完成了 ReadProcessMemory 或 WriteProcessMemory 请求的一部分。)

调试权限已启用,但没有效果。

【问题讨论】:

  • 肯定是因为你用错了地址。从您的 sn-p 中完全不清楚您是如何确保得到正确的。至少需要 VirtualQueryEx() 才能找到正确的基地址。

标签: windows debugging winapi


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-11-28
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多