2017-07-06 16 views
0

私はVirtualQueryExを使用して、プロセス内のメモリ割り当てをループしています。しかし、割り振りベースを有効なIMAGE_DOS_HEADERシグネチャ/ 'MZ'と比較すると、何らかの奇妙な理由からアクセス違反が発生します...コード内で正しくないものを指摘できますか?MEMORY_BASIC_INFORMATION.AllocationBase IMAGE_DOS_HEADERの有効性チェック

MEMORY_BASIC_INFORMATION mbi; 
do 
{ 
    if (VirtualQueryEx(handle, currentAddress, &mbi, sizeof(mbi)) == 0) 
    { 
     continue; 
    } 

    if (mbi.State & MEM_COMMIT && !(mbi.Protect & PAGE_NOACCESS) && 
     !(mbi.Protect & PAGE_PROTECT)) 
    { 
     if (mbi.AllocationBase != nullptr) 
     { 
     bool hasValidDosHeader = *(WORD*)mbi.AllocationBase == 
     IMAGE_DOS_SIGNATURE; //THIS CAUSES AN ACCESS VIOLATION 
     } 
    } 
    currentAddress += mbi.RegionSize; 
} while(currentAddress < endAddress); 

PS:私も... * IMAGE_DOS_HEADERにAllocationBaseをキャストしてからも、アクセス違反が発生しIMAGE_DOS_SIGNATURE、とe_magicをチェックし、リモートメモリについて

+1

現在のプロセスまたは別のプロセスの情報をお探しですか?あなたのプロセスに属していないポインタを逆参照することはできません! –

+0

別のプロセスからの情報を探しています。ポインタを逆参照できない場合、代わりに割り当てに有効なDOSヘッダがあるかどうかを調べるにはどうすればよいですか? –

+2

[ReadProcessMemory](https://msdn.microsoft.com/en-us/library/windows/desktop/ms680553(v = vs.85).aspx)。 –

答えて

1

VirtualQueryEx戻り情報を試みたが、あなたのためにそれを読んでいない。

メモリを読み取るために、実際にリモートプロセスからプロセスにメモリをコピーするには、msdn: ReadProcessMemoryが必要です。

MEMORY_BASIC_INFORMATION mbi; 
do 
{ 
    if (VirtualQueryEx(handle, currentAddress, &mbi, sizeof(mbi)) == 0) 
    { 
     break; // we can't continue in the loop, as we don't know the size. 
    } 

    if (mbi.State & MEM_COMMIT && !(mbi.Protect & PAGE_NOACCESS) && 
     !(mbi.Protect & PAGE_PROTECT)) 
    { 
     if (mbi.AllocationBase != nullptr) 
     { 
      IMAGE_DOS_HEADER dosHeader; 
      if (ReadProcessMemory(handle, mbi.AllocationBase, &dosHeader, mbi.RegionSize, NULL)) { 

       bool hasValidDosHeader = dosHeader.e_magic == IMAGE_DOS_SIGNATURE; 
      } 
     } 
    } 
    currentAddress += mbi.RegionSize; 
} while(currentAddress < endAddress); 
関連する問題