ソース コードにアクセスできないコンパイル済みの実行可能ファイルがあります。実行するたびに、変数がメモリ アドレス 0x7B008C に割り当てられます。毎回ではなく、別のアドレスを使用するようにしています。私の目的は、ソース プログラムの動作を変更する既存のアプリケーションを壊すことだけなので、動的である必要はありません。
私の質問は、プログラムの動作を壊さずにこれを達成する最も簡単な方法は何ですか?
ソース コードにアクセスできないコンパイル済みの実行可能ファイルがあります。実行するたびに、変数がメモリ アドレス 0x7B008C に割り当てられます。毎回ではなく、別のアドレスを使用するようにしています。私の目的は、ソース プログラムの動作を変更する既存のアプリケーションを壊すことだけなので、動的である必要はありません。
私の質問は、プログラムの動作を壊さずにこれを達成する最も簡単な方法は何ですか?
一般的には、できません。
実行可能ファイルがコンパイルされると、静的変数への参照は、リンカによってマシン コード内で変数の生のアドレスに解決されます。そのような参照が存在したという兆候は残されておらず、x86 マシン コードの性質上、後でこれらの参照を見つけることは非常に困難です (命令がどこから始まるかを明確に判断できるとは限りません)。
さらに、それが単なる変数かどうかもわかりません。静的クラスまたは構造の一部である可能性があります。これらの区別はコンパイル後に失われますが、変数を移動しようとすると、コードが別の変数 (つまり、構造体の開始) からのオフセットに基づいて変数を参照している可能性があります。
ここで本当に何を達成しようとしていますか?仮想メモリのレイアウトをいじるよりも良い方法があるかもしれません。
既存のトレーナーを壊そうとしているだけなら、1 つのアプローチ (テストされていません!) は、プロセス ACL を変更することかもしれません。プロセスを作成するときは、 と のカスタム セキュリティ記述子を使用しCreateProcess
て渡します (既に実行中のプロセスの場合は、 でこれを行うことができます)。セキュリティ記述子に DACL を設定して、権利のみが付与されるようにします (つまり、すべての DACL エントリの他のすべての権利を取り消します)。この手法は絶対確実ではありません。これを行っていることを認識しているトレーナーは、単に DACL をデフォルトに戻すことができます。ただし、デバッグ アクセスを拒否することで、既存のトレーナーを壊す必要があります。lpProcessAttributes
lpThreadAttributes
SetSecurityInfo
SYNCHRONIZE | PROCESS_QUERY_INFORMATION | PROCESS_SUSPEND_RESUME | PROCESS_TERMINATE
おそらく、BEAEngine を使用して実行可能ファイル全体を調べることで実行できます(BEAEngine を使用したことがあり、それを実行できると思っていたので、おそらく実行したことがないためと言います)が、非常に複雑で、おそらくかなり複雑です。
とはいえ、bdonlan のように、シングル プレイヤー ゲームでトレーナーを使用している人を気にかけないので、時間を無駄にするつもりはありません。そして、あなたが説明したものよりも、トレーナーを壊すためのそれほど複雑ではない方法があります.