2017-08-02 6 views
0

チートエンジンの使用アドレス0x10456554のバイトの配列を見つけます。私はC#でバイトの配列を探したいので、最初にアクセス許可0x1F0FFF(すべてのアクセス)でゲームプロセスを開き、その後、0x00000000〜0x7FFFFFFF(全体のプロセス)とそのセクション(0x10000000など)からReadProcessMemory 。)はすべて空です。ReadProcessMemoryはバイトアドレスの配列を見つけることができません

私はすべてのモジュールをステップ実行し、個々のダンプファイルにデータをダンプしようとしました。しかし、アドレスセクション(0x10000000)はダンプされず、ほとんどスキップされたようなものでした。チートエンジンでさえ、メモリのセクションは特定のモジュールに属していないと言います。だから私はどこから来ているのか分からない。

public IntPtr pHandle = OpenProcess(0x1F0FFF, 1, id); 
public Process procs = Process.GetProcessById(id); 

//dump main module first 
byte[] test = new byte[procs.MainModule.ModuleMemorySize]; 
ReadProcessMemory(pHandle, (UIntPtr)((int)procs.MainModule.BaseAddress), test, (UIntPtr)procs.MainModule.ModuleMemorySize, IntPtr.Zero); 
File.WriteAllBytes(procs.MainModule.BaseAddress.ToString("x8") + " " + procs.MainModule.ModuleName + ".dmp", test); 

//now dump all other modules 
foreach (ProcessModule p in procs.Modules) 
{ 
    byte[] test2 = new byte[p.ModuleMemorySize]; 
    ReadProcessMemory(pHandle, (UIntPtr)((int)p.BaseAddress), test2, (UIntPtr)p.ModuleMemorySize, IntPtr.Zero); 
    File.WriteAllBytes(p.BaseAddress.ToString("x8") + " " + p.ModuleName + ".dmp", test2); 
} 
+1

でこのコードを発見しました。コード内のダイナミックリージョンを読み込むことさえできません。なぜあなたは0x10000000の周りのメモリがゼロだと思いますか?私はあなたがそれを読む/書く場所がわかりません –

+0

ダンプファイルに0x00000000 - 0x7FFFFFFFをダンプし、16進数のセクションで0x10000000を読み込むと、すべて0になります。 –

+1

未割り当てページを読み取ることができないため、読み取り全体が失敗します。出力をチェックすると、0x1000000だけでなく、配列全体が0になります。 bytesReadCount outパラメータをチェックすることによって、読み込みが成功したかどうかを確認することができます –

答えて

0

お返事ありがとうございます@Tamas Hegedus。私はMEMORY_BASIC_INFORMATIONでVirtualQueryExを使うことで良い解決策を見つけました。

それはそれは例えばVirtualAlloc` `で実行時に割り当てられ、その後どのモジュールにも属していない場合、私はhttps://www.codeproject.com/Articles/716227/Csharp-How-to-Scan-a-Process-Memory

long proc_min_address_l = (long)procs.MainModule.BaseAddress; 
long proc_max_address_l = (long)procs.VirtualMemorySize64; 

MEMORY_BASIC_INFORMATION mem_basic_info = new MEMORY_BASIC_INFORMATION(); 
while (proc_min_address_l < proc_max_address_l) 
{ 
    VirtualQueryEx(pHandle, proc_min_address, out mem_basic_info, Marshal.SizeOf(mem_basic_info)); 
    byte[] buffer = new byte[(int)mem_basic_info.RegionSize]; 
    UIntPtr test = (UIntPtr)((int)mem_basic_info.RegionSize); 
    UIntPtr test2 = (UIntPtr)((int)mem_basic_info.BaseAddress); 

    ReadProcessMemory(pHandle, test2, buffer, test, IntPtr.Zero); 
    proc_min_address_l += (int)mem_basic_info.RegionSize; 
    proc_min_address = new IntPtr(proc_min_address_l); 
} 
関連する問題