解除引用导致崩溃,甚至不是NULL指针,为什么呢?

时间:2018-02-03 04:16:27

标签: c++

我出于某种原因尝试扫描整个过程,但它发现了崩溃。我不明白为什么会这样。什么是另一种等效但安全的方法呢?

void searchAddrByValue(const int value) {
    int *p = (int *)0x00FFFFFF;
    while ((int *)0x0FFFFFFF >= p) {
        if(value == *p)
            fprintf(filePointer, "Addr:%p -- Val:%d\n", p, *p);
        ++p;
    }
    display(L"Finished");
}

2 个答案:

答案 0 :(得分:0)

如果要搜索流程中的所有内存,应首先使用VirtualQueryEx找出哪些页面是有效地址,然后在可读页面内搜索。

Managing Virtual Memory上的MSDN文章概述了如何在进程地址空间中遍历地址范围。

答案 1 :(得分:0)

要遍历所有正确分配的内存,您可以使用VirtualQueryEx,在执行其他操作之前,请确保该区域的状态为MEM_COMMIT并且保护不是PAGE_NOACCESS。如果您想将每个区域ReadProcessMemory()读入本地缓冲区,您当然可以这样做,只需将此代码中的控制台输出替换为要在每个区域上执行的代码:

MEMORY_BASIC_INFORMATION meminfo;
unsigned char* addr = 0;

HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());

MEMORY_BASIC_INFORMATION mbi;

while (VirtualQueryEx(hProc, addr, &mbi, sizeof(mbi)))
{
    if (mbi.State == MEM_COMMIT && mbi.Protect != PAGE_NOACCESS)
    {
        std::cout << "base : 0x" << std::hex << mbi.BaseAddress << " end : 0x" << std::hex << (uintptr_t)mbi.BaseAddress + mbi.RegionSize << "\n";
    }
    addr += mbi.RegionSize;
}

CloseHandle(hProc);

此代码将打印出每个区域的开始和结束地址

请确保您以管理员身份运行,并且还可能要检查PAGE_GUARD,但我没有遇到任何问题。