0

私は自分の 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);
        }
    } 
}

私の保護チェックは間違っていると思いますが、よくわかりません。

4

3 に答える 3

4

仮想メモリ スキャナ

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  
             }
         }
    }
}
于 2013-01-03T12:20:12.260 に答える
1

はい、いくつかの間違い。|を使用する必要があります ||の代わりに演算子。の値iは意味がありません。MEMORY_BASIC_INFORMATION.AllocationBaseを使用して、リージョンの開始位置を見つける必要があります。そして、.RegionSizeはそれがどれくらい大きいかを知るために。次のリージョンを見つけるには、VirtualQueryに渡す次の値は.AllocationBase+.RegionSizeである必要があります。

于 2013-01-03T00:21:51.617 に答える
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);
        }
    } 
}
于 2013-01-02T23:54:24.520 に答える