2016-06-13 23 views
0

私は起動するたびにランダムなベースアドレスを持つ.exeのベースアドレスアドレスを取得する必要があります。私はこれを試しましたが、動作していないようです:別のプロセスのベースアドレスを取得するにはどうすればよいですか? (ASLR)

int Base = (DWORD)GetModuleHandle("Test.exe"); 

何が問題なのですか?

+0

私はそう思わないでしょうか? – Customality

+0

方法は私のテストでは正しいです。コード全体を貼り付けることができますか?あるいは、別のプロセスのベースアドレスを取得しようとしていますか? –

+2

なぜあなたは 'GetModuleHandle'を呼び出すのがあなたの望むことをすると思われますか? –

答えて

2

他のプロセスのベースアドレスを取得しようとしているようです。残念ながら、GetModuleHandleは、現在のプロセスのモジュールでのみ動作します。目標を達成するには、PSAPIまたはCreateToolhelp32Snapshotを使用して、別のプロセスのモジュールリストを抽出する必要があります。そして、ベースアドレスがリストにあります。

+0

@カスタム、これを参照してください:http://stackoverflow.com/questions/14467229/get-base-address-of-process –

+1

OPはとにかく他のプロセスのメモリとバイブルするので、より直接的なソリューションは、 DLL(例えば、[CreateRemoteThread](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682437.aspx)を使用します)。他人の家に侵入すると、 'GetModuleHandle(NULL)'を呼び出して、プロセスの作成に使用された実行可能イメージのベースアドレスを取得できます。 – IInspectable

1

起動するたびにランダムなベースアドレスを持つ.exeのベースアドレス/エントリポイントアドレスを取得する必要があります。プログラムはASLRを使用します。する必要があります

...

私は別のプロセスにデータを書き込むために正しいプロセス

内部メモリの特定のチャンクを編集するためにそれを使用します、あなたはWriteProcessMemory()を使用する必要があり、書き込まれるプロセスにHANDLEを開きます。

あなたはOpenProcess()を使用してHANDLEを取得し、PROCESS_VM_OPERATIONPROCESS_VM_WRITEのアクセス権を要求します。

Process EnumerationEnumerating All Processesを参照してください。

書き込み先のプロセスのベースアドレスを決める必要はありません。システムがあなたのためにその情報を追跡するようにします。あなたが必要とするのは、プロセスへのオープンHANDLEです。

+0

ええと...確かに、読んだり修正したい静的変数やコードブロックの仮想アドレスを計算するには、ベースアドレスが必要ですか? (私はあなたがModule32First/Module32Nextを使って行うことができると仮定します) –

+0

@HarryJohnston: 'ReadProcessMemory()'と 'WriteProcessMemory()'に渡されるアドレスは、指定されたアドレスで表されるプロセスのベースアドレス'HANDLE'これは、特定のモジュールに相対的ではありません。したがって、プロセスのベースアドレス、プロセス内のターゲットメモリブロックの相対仮想アドレスのみを知る必要はありません。そのアドレスをどうやって取得するかは別の問題です。これは、事前に静的に知られているかもしれません。それは、他のメモリブロックを処理しポインタを追うことによって動的に決定することができる。それは非常に広い話題です。 –

+0

@HarryJohnston:静的変数の場合、モジュール内の固定オフセットを知っている可能性があります。はい、プロセス内のモジュールのベースアドレスを取得できます。これから、プロセス内の変数の仮想アドレスを判別できます。 –

関連する問題