扫描进程内存导致崩溃
Scanning process memory causes crash
我已经将我的DLL注入到进程中,我尝试扫描内存中的地址与我的相同值,但它会导致崩溃后我得到第一个地址,它应该是10个地址
for(DWORD i = MEM_START; i< MEM_END ;i++)
{
VirtualQuery((void*)i,pMemInfo,sizeof(MEMORY_BASIC_INFORMATION));
if(pMemInfo->AllocationProtect == PAGE_READONLY || PAGE_EXECUTE_WRITECOPY || PAGE_READWRITE || PAGE_WRITECOMBINE)
{
if(*(DWORD*)i==1337)
{
addresses.push_back(i);
}
}
}
我相信我的保护检查是错误的,但不太确定。
虚拟内存扫描器
MEMORY_BASIC_INFORMATION mbi = {0};
unsigned char *pAddress = NULL,
*pEndRegion = NULL;
DWORD dwFindData = 0xBAADF00D,
dwProtectionMask = PAGE_READONLY | PAGE_EXECUTE_WRITECOPY
| PAGE_READWRITE | PAGE_WRITECOMBINE;
while( sizeof(mbi) == VirtualQuery(pEndRegion, &mbi, sizeof(mbi)) ){
pAddress = pEndRegion;
pEndRegion += mbi.RegionSize;
if ((mbi.AllocationProtect & dwProtectionMask) && (mbi.State & MEM_COMMIT)){
for (pAddress; pAddress < pEndRegion ; pAddress++){
if (*pAddress == dwFindData){
// dostaff
}
}
}
}
是的,有几个错误。您需要使用|运算符而不是||。i
的值没有意义,必须使用MEMORY_BASIC_INFORMATION。AllocationBase查找区域开始的位置。和。regionsize来知道它有多大。你传递给VirtualQuery的下一个值应该是。allocationbase + . regionsize来查找下一个区域。
这不是||
操作符的工作方式。您可能会发现使用switch
语句更可读。
for (DWORD i = MEM_START; i < MEM_END ;i++)
{
VirtualQuery((void*)i, pMemInfo, sizeof(MEMORY_BASIC_INFORMATION));
switch (pMemInfo->AllocationProtect)
{
case PAGE_READONLY:
case PAGE_EXECUTE_WRITECOPY:
case PAGE_READWRITE:
case PAGE_WRITECOMBINE:
if(*(DWORD*)i==1337)
{
addresses.push_back(i);
}
}
}
相关文章:
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 如何避免由于内存不足而导致 gcc 崩溃
- 媒体基础 多个视频播放导致内存泄漏和崩溃
- 无法避免的libxml2内存泄漏是由于尝试清理时崩溃造成的
- 分配内存并在回调时调用C++的 Rust 函数崩溃
- STD :: FSTREAM在使用预先分配的内存时在Main之后崩溃
- 是否有可能存在不会崩溃程序的内存问题
- 内存相关崩溃:Cocos2d游戏中的三维数组
- 复制赋值构造函数中的aligned_alloc内存块在释放时崩溃
- 外档导致违反内存的崩溃
- C++ 分配器在内存不足时使应用程序崩溃
- C 程序在出口时崩溃,内存中的访问违规
- 由于#Pragma Pack错误而导致的内存损坏 - std Map损坏 - 插入上崩溃
- C++ 尝试通过内存中的地址调用函数时程序崩溃(如何修复?
- 开发C++在运行大内存程序时崩溃
- 如果在进程崩溃后在进程中分配内存,会发生什么情况
- C++程序崩溃(与动态内存有关)
- 删除矢量元素指向的已分配内存会导致程序崩溃
- QTcpSocket/QTCP服务器内存管理/服务器崩溃
- 处理正则表达式字符串时编译崩溃(内存泄漏)