Cheat Engineで見つけるのが難しい値や命令を見つけよう!
前回に続き、参考になる動画シリーズ第2弾。
Cheat Engineでアセンブリ言語を追いかけないと見つけることができない値や関数を探す方法です。見つけるのが難しいチートは、ほとんどの場合この記事と同じようなやり方で探します。ぜひ読んで実践してみてください。
動画は以下のリンクから
OLLYDBG Tutorial - How to Hack Any Game With a Debugger
この動画ではOllyDbgが使われてますが、Cheat Engineでも同じことが出来ます。
リコイル関数を見つける(和訳)
- チートエンジンでアドレスを見つける
- そのアドレスに書き込んでいる命令を見つける
- 書き込んでいる命令のアドレスをOllyDbgで検索する
- ハードウェアブレークポイントを設定して、その関数の最初と最後を特定する。例えばFiringGun関数など。こうすることによって、どこからどこまでをデバッグすればいいのかがわかります。
- すべてのジャンプ命令を逆にします。 例えば、JNZをJEにします。
- コメントを書き込んで命令を書き換え、一度テストする。
- ゲームがクラッシュした場合は、そのアドレスに戻りコメントを残すだけです。例えばnopクラッシュ、または命令反転クラッシュという感じに。
- ollydbgとゲームを毎回再起動する必要があり、面倒な場合があります
デバッグ時のコメントは非常に重要です!あなたが最後に作業した場所を確実に覚えておくために、常にコメントを入れておきましょう。
以下にいくつかのガイドラインを紹介します。
命令を変更する際の順序
1番 - すべてのジャンプコマンドを逆にする
2番 - すべてのCALL命令はNOPEDである必要がある
それでも目的の関数が見つからない場合はより複雑な命令を試していきます。
3番 - まだNOPしていない命令をNOPする
例:
MOV BYTE PTR DS:[EAX + 218]、BL
4番 - クラッシュする可能性が最も高いものを最後まで残しておく
例:
MOV EAX、DWORD PTR DS:[ESI + 8]
ADD EAX, 4
これらの命令は非常にクラッシュしやすいです。このような命令をNOPEDにした場合、他の命令もNOPにしなければならないことがあります。次のCALL命令までの上、またはその下のいくつかの命令です。なぜそうなるかというと、これらの命令の値が次の関数で使用される可能性があるためです。使用されている場合、ゲームがクラッシュすることがあります。
これには何度もトライ&エラーが必要です。
JMP命令を逆にする
JG ⇔ JL
JLE ⇔ JG
JE ⇔ JNZ
以下のような命令は無視する必要があります(命令のグループの一部でない限り)
CMP – 比較の略で、これは通常、ジャンプの前に見られます
LEA – より高度な計算に使用されます
POP、PUSH、RETNはリコイル制御、弾薬、および私たちが通常探しているその他の情報とはあまり関係がありません。Intは通常、まったく無関係です。
お役に立てれば幸いです
手順(要約)
1. 弾丸のアドレスの見つける
2. 弾丸のアドレスに書き込んでいる命令を見つける
3. その命令がある関数の先頭と終端を特定する
4. ジャンプ命令を逆にする
5. 命令を書き換える際は必ずコメントをつける
6. CALL命令を潰していき絞り込んでいく
7. 場合によってはCALL命令の上と下のいくつかの命令も潰す(クラッシュを避けるため)
8. 最後に残ったのが目的の関数
まとめ
いかがでしたでしょうか?命令を潰していき、絞り込んでいく方法がわかったと思います。アセンブリ言語はC言語やその他の高級言語のようにコードを見て「あっ、これはプロセスIDを取得していて...」という感じで分かるわけではありません。プログラムを動かしながらデバッグすることで始めて処理内容が分かってきます。そのためのテクニックが当記事の内容です。
特に重要なのがブレークポイントの使い方です。BPを設定してみることで「ここはループしている」、「ここは銃を撃った時に1度だけ実行される命令だな」などわかってくることがたくさんあります。
また、ジャンプ命令は逆にしてみるだけでも何らかのチートが見つかることがあります。ようは条件分岐を反対にしているわけです。私もこのやり方でいくつかチートを見つけたことがあります。
POINT:
ジャンプ命令を逆にしてみよう
関数を潰してみよう