我已将我的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);
}
}
}
我相信我的保护检查是错误的,但不太确定。
答案 0 :(得分:3)
虚拟内存扫描程序
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
}
}
}
}
答案 1 :(得分:1)
是的,有几个错误。你需要使用|运算符而不是||。 i
的值没有意义,您必须使用MEMORY_BASIC_INFORMATION.AllocationBase来查找区域的开始位置。并且.RegionSize知道它有多大。传递给VirtualQuery的下一个值应该是.AllocationBase + .RegionSize来查找下一个区域。
答案 2 :(得分:0)
这不是||
运算符的工作原理。您可能会发现使用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);
}
}
}