2011-06-18 10 views
1

私は現在、これらのゲームトレーナの1つを小さなプロジェクトとして作っています。私はすでに問題に遭遇しました。あなたが「別のレベルに入る」と、燃料、現金、弾丸、住所などの住所が変わります。これは、アプリケーションを再起動する場合にも起こります。プロセス間メモリの編集 - 変更されたアドレスの検索

これらのアドレスはどのように再配置できますか?

私はそれがかなり基本的な質問であると思っていますが、それは私には「それは可能か不可能か」という質問の1つです。私はちょうど見ることをやめ、概念を完全に忘れるべきですか? "あまりにもハード?"

+0

最初のインスタンスでどのようにそれらを探しますか? –

+0

"住所の再配置"とはどういう意味ですか? – foxy

+0

あなたは他の人からのアドレスを見つけます(これはダイナミックであると考えています)。または、メモリ内でその値を検索します。あなたのお金は50,000ですか?それは無署名intだと思いますか?メモリ内で50000を検索し、正しいものを探します。それらを再配置することによって、私は住所の変更について話しています。お金へのポインタが各レベルを変更し、プログラムを開始するたびに変更されます。 –

答えて

1

あなたが勉強しているプログラムに大きく依存し、あなたの人生を困難にする方法があれば著者が出て行ったかどうかを正確に説明するのは少し難しいです。私はこれを一度だけ行ったことに注意してください。しかし、小さなアセンブリしか知りませんでしたが、それは合理的にうまく機能しました。

おそらく、値がmalloc/newの呼び出しを使用してヒープに割り当てられ、レベルを変更するたびにそれらがクリーンアップされ、別の場所に再割り当てされることが考えられます。したがって、プログラムのアセンブリコードを見て、mallocによって返されたポインタがどこに格納されているかを調べ、ポインタの内容を確実に読み取って、探している値を見つける方法を見つけ出すことです。

まず、OllyDbgのようなデバッガとアセンブリの基本知識が必要です。その後、検査する変数に読み書きブレークポイントを設定して開始します。変数がどこにあるのか正確には分からないと言ったので、実行中にプロセスを一時停止し、プログラムのメモリでその値を検索する必要があります。うまくいけば、関数呼び出しやローカルでの使用のためのコピーであるかもしれないので、スタックに入っているものは何かを調べるためにいくつかの結果しか得られないでしょう。

ブレークポイントが設定されたら、ブレークが発生するまでプログラムを実行してください。コードを見て、変数がどのようにアクセスされているか調べるだけです。それがパラメータとして渡されている場合は、関数の呼び出しサイトを調べてください。それがポインタを介してアクセスされている場合は、それを書き留めて、ポインタの検査を開始します。それがポインタのオフセットとしてアクセスされている場合、それはデータ構造の一部であることを意味するので、それを記録し、他の変数の検査を開始します。等々。

滞在はあなたの変数に焦点を当て、あなたは最終的に2つのいずれかであることができ、ルートを見つけるまで、単にコードを調べておいてください。

  • 静的アドレスを持つグローバル変数を。これは、データ構造を確実に処理するために使用できる静的アドレスがコードに直接ハードコードされているため、最も簡単なシナリオです。

  • スタック割り当て変数。これは手間がかかり、このシナリオを確実に処理する方法が完全にはわかりません。そのアドレスは、ほとんどの場合、スタックの先頭から同じオフセットを持つ可能性がありますが、そうではない可能性があります。スタックを歩いて、対応する関数とそのパラメータを見つけることもできますが、これはちょっと難解です。

あなたはアドレスを持っていたらやって残っているすべてはあなたが見つけた情報を使用して、変数を見つけるためにReadProcessMemoryを使用しています。例えば、あなたが持っているアドレスがオフセット0x40で燃料値が格納されているデータ構造体へのポインタを表しているなら、アドレスの値を読み込み、0x40を加えて結果をもう一度読み取らなければなりません。

アドレスは、実行ファイルが変更されない限り、有効であることに注意してください。それが再コンパイルまたはパッチ適用されている場合は、最初からやり直す必要があります。私はあなたがプログラムを起動するたびにアドレスを変更するかもしれないWindowsのASLRについて注意する必要があると思います。


コメントボックスが小さすぎるため、ここに入力してください。

espに定数を加えた場合、これはパラメータでありローカル変数ではないと考えられます(呼び出し規約のレイアウトを確認して確認してください)。その場合、プログラムが呼び出し元に戻ってパラメータがどのように設定されているかを把握し(呼び出し命令の前にプッシュ命令を探して)、そこから探索を続けます。私がこれをしたとき、私はデータ構造へのグローバルポインタを見つける前に、スタックを1〜2回巻き戻さなければなりませんでした。

また、esiレジスタはスタックに関連していません(私はlook it upでした)ので、どのように設定されているか確認します。それはデータ構造のアドレスを含み、定数は変数へのオフセットです。レジスタがどのように設定されているかを把握すれば、ポインタにもっと近くなるでしょう。

+0

ねえ、もう少し調べてみましたが、残念ながらスタックが割り当てられました。 ** **静的ポインタはありません。 (そして、ポインタへのポインタはありません) - そしてそうです。私も以前にそれをやったことがありますが、スタックに割り当てられた変数ではありません。私は、お金が[esi + a30](a30は**静的**です)ということを知っています。だから私は編集したいことを指摘していますが、あなたにはアドレスを引き出すように求めることはできません彼らのお尻の。私もメモリを巡っていくつか動き回っていましたが、この関数はスタックの4バイト(mov eax、[esp + 04])しか使いません。それは本当に私が知っているすべてです。 –

+0

@Saustin小さなコメントボックスで返信することはできませんので、代わりに答えを更新しました。うまくいけば助けになると思う。 –

+0

お返事ありがとうございます。スレッドと無関係なものがあれば、ゲームをデバッグすることは決して簡単ではありませんが、私はベストを尽くします。回答いただきありがとうございます、私は研究を続けます。 –

関連する問題