取消引用会导致崩溃,即使对于非 NULL 指针也是如此,原因也是如此
dereferencing causes crash, even for non-NULL pointer, why?
我试图扫描整个过程,但它崩溃了。我不明白为什么会这样。还有什么等效但更安全的方法呢?
void searchAddrByValue(const int value) {
int *p = (int *)0x00FFFFFF;
while ((int *)0x0FFFFFFF >= p) {
if(value == *p)
fprintf(filePointer, "Addr:%p -- Val:%dn", p, *p);
++p;
}
display(L"Finished");
}
如果要
搜索进程内的所有内存,则应首先使用 VirtualQueryEx
找出哪些页面是有效地址,然后在可读页面内搜索。
有关管理虚拟内存的 MSDN 文章概述了如何在进程地址空间中遍历地址范围。
要遍历所有正确分配的内存,您可以使用 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,但我没有遇到这个问题。
相关文章:
- 当使用通配符和null指针调用函数时,对输出的说明
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 将位数组转换为 HBITMAP 后 bmBits 的 NULL 指针
- 在访问类的树层次结构中的对象时避免使用 null 指针
- 排序时引用绑定到 'value_type' 类型的 null 指针
- NULL指针解决方案中的C 分割故障
- 取消引用会导致崩溃,即使对于非 NULL 指针也是如此,原因也是如此
- 跟进哈希表 C++,this->next = NULL 指针
- C++中的NULL指针
- 当删除NULL指针(C/C )时,可以保证SegFault
- 引用绑定到类型 'struct value_type' 的 null 指针
- 尝试在C++中使用 NULL 指针时不会发生分段错误
- if(NULL==指针)和if(指针==NULL)之间有什么区别
- 在Linux/GCC下,将NULL指针访问转换为C++异常
- NULL指针检查线程安全
- cppcheck null指针取消引用:m_buffer-否则,针对null进行检查是多余的
- strtok() - 为什么必须传递 NULL 指针才能获取字符串中的下一个标记
- Null指针异常(int Vs char)
- 用户定义类中的Null指针无效
- 不是NULL指针,而是错误的访问错误消息