【问题标题】:Access denied when reading debuggee memory读取调试对象内存时访问被拒绝
【发布时间】:2018-09-30 11:16:19
【问题描述】:

我打开了一个进程:

HANDLE CreateDebuggedProcess(LPCSTR lpApplicationName)
{
    STARTUPINFO startupInfo;
    PROCESS_INFORMATION processInformation;

    ZeroMemory(&startupInfo, sizeof(startupInfo));
    startupInfo.cb = sizeof(startupInfo);
    ZeroMemory(&processInformation, sizeof(processInformation));

    if (!CreateProcessA(
        lpApplicationName,
        NULL,
        NULL,
        NULL,
        FALSE,
        DEBUG_PROCESS,
        NULL,
        NULL,
        &startupInfo,
        &processInformation
    ))
    {
        return INVALID_HANDLE_VALUE;
    }

    return processInformation.hProcess;
}

我正在等待第一个 BreakPoint 事件,然后我正在尝试打印内存撕裂指向的内容。我被 Get 搞砸了

void * getRip(DWORD threadId)
{
    BOOL status = FALSE;
    CONTEXT context = { 0 };

    context.ContextFlags = CONTEXT_ALL;
    HANDLE threadHandle = OpenThread(THREAD_GET_CONTEXT, FALSE, threadId);
    if (NULL != threadHandle)
    {
        if(!GetThreadContext(threadHandle, &context))
        {
            status = FALSE;
            return 0;
        }

        return (void *)context.Rip;
    }

    return 0;
}

并且返回的值似乎是正确的。然后我尝试调用 ReadProcessMemory,但我收到错误 299:ReadProcessMemory: invalid argument (Only part of a ReadProcessMemory or WriteProcessMemory request was completed.)

BOOL queryMemory(HANDLE processHandle, void * address)
{
    MEMORY_BASIC_INFORMATION memoryInformation = { 0 };

    if (0 == VirtualQueryEx(processHandle, address, &memoryInformation, sizeof(memoryInformation)))
    {
        printf("failed :( Lasr error: %x\n", GetLastError());
        return FALSE;
    }

    printf("AllocProtect: %x, state: %x, type: %x\n", memoryInformation.Protect
                                                    , memoryInformation.State
                                                    , memoryInformation.Type);
    return TRUE;
}

返回AllocProtect: 1, state: 10000, type: 0。这意味着我没有访问权限,但这很奇怪,因为我应该可以访问所有内容,因为我已经创建了流程。

我做错了什么?

【问题讨论】:

  • 您尝试读取未分配的内存 (state == MEM_FREE) - 您必须在这里遇到错误。您没有关闭CreateDebuggedProcessgetRip 中的线程句柄。你不需要在getRip 中打开线程。你没有显示你如何称呼ReadProcessMemory
  • 你也不需要零初始化PROCESS_INFORMATIONMEMORY_BASIC_INFORMATION

标签: c debugging winapi


【解决方案1】:

AllocProtect: 1, state: 10000

0x1 作为保护常数 = PAGE_NOACCESS

状态 0x10000 = MEM_FREE

您无法读取 NOACCESS 或 FREE 的内存。必须是MEM_COMMIT,不能是PAGE_NOACCESS。

我假设您的 getRip() 函数返回 0,因为 OpenThread 或 GetThreadContext 失败。单步执行代码并确认每一行都正常工作,在每次调用 WinAPI 函数后检查 GetLastError() 的返回值以查找错误。

如果您找不到错误,请确保您以管理员身份运行并且正在为与目标进程相同的架构进行编译。

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2021-02-21
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多