检查页面权限+页面支持后,ReadProcessMemory错误299

时间:2016-07-07 04:34:06

标签: c++ memory reverse-engineering shared-memory

我正在尝试在某个进程中扫描某个模块的内存并找到内存中的所有内容,然后输出它们。

我这样做是通过获取模块的基地址(在这种情况下模块是exe的名称),然后使用模块大小来计算模块的结束地址。

然后迭代遍历每个地址并尝试读取int。它在某些情况下有效,但在很多时候,RPM返回错误299(ERROR_PARTIAL_COPY)。我不确定为什么,因为我检查页面权限,并检查页面是否有支持。

它似乎适用于x86进程(当我在x86中编译时)而不是x64进程(当我在x64中编译时)?任何建议都表示赞赏,我有点失落。我的RPM调用也是正确的,因为它适用于某些进程。谢谢!

void ScanProcess(DWORD processID){
    char szProcessName[MAX_PATH];

    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);
    HMODULE hMod = NULL;
    if (hProcess){
            DWORD cbNeeded;
        if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) {
            GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName));
            MODULEINFO lpm;
            GetModuleInformation(hProcess, hMod, &lpm, sizeof(lpm));

            DWORD start, end;

            start = (DWORD)hMod;
            end = start + lpm.SizeOfImage;
            printf("Scanning module %s  (PID: %u) Range: %x to %x\n", szProcessName, processID, start, end);

            for (uintptr_t i = start; i < end; i++) {
                PSAPI_WORKING_SET_EX_INFORMATION * pWSX = (PSAPI_WORKING_SET_EX_INFORMATION *)malloc(sizeof(PSAPI_WORKING_SET_EX_INFORMATION));
                pWSX->VirtualAddress = reinterpret_cast<void*>(i);
                QueryWorkingSetEx(hProcess, &pWSX, sizeof(PSAPI_WORKING_SET_EX_INFORMATION));

                if (pWSX->VirtualAttributes.Valid == 1) {
                    if ((pWSX->VirtualAttributes.Win32Protection & PAGE_READWRITE) || (pWSX->VirtualAttributes.Win32Protection & PAGE_READONLY) || (pWSX->VirtualAttributes.Win32Protection & PAGE_EXECUTE_READWRITE) || (pWSX->VirtualAttributes.Win32Protection & PAGE_EXECUTE_READ)) {
                        printf("Page: %x. Page backing is %s. Page protection: %X\n", i, pWSX->VirtualAttributes.Valid ? "valid" : "invalid", pWSX->VirtualAttributes.Win32Protection);
                        int j = 0;
                        if (ReadProcessMemory(hProcess, (LPCVOID)i, &j, sizeof(int), 0))
                            printf("%s SUCCESS %i\n",szProcessName, j);
                        else
                            printf("Error: %x", GetLastError());
                    }
                }
            }
        }
    }


    CloseHandle(hProcess);
}

0 个答案:

没有答案