Cheat Engineで見つけるのが難しい値や命令を見つけよう!

前回に引き続き、参考になる動画があったのでご紹介します。Cheat Engine等でアセンブリ言語を追いかけないと見つけることができない値や関数を探す方法です。見つけるのが難しいチートは、ほとんどの場合この記事と同じようなやり方で探します。ぜひ読んで実践してみてください。

動画URLは以下のリンクから

この動画ではOllyDbgが使われてますが、Cheat Engineでも同じことが出来ます。

Recoil関数を見つける(和訳)

ステップ1 – チートエンジンでアドレスを見つける
ステップ2 – そのアドレスに書き込んでいる命令を見つける
ステップ3 – 書き込んでいる命令のアドレスをOllyDbgで検索する
ステップ3.5 – ハードウェアブレークポイントを設定して、その関数の最初と最後を特定する。
        例えばFiringGun関数など。
        こうすることによって、どこからどこまでをデバッグすればいいのかがわかります。
ステップ4 – すべてのジャンプ命令を逆にします。 例えば、JNZをJEにします。
ステップ5 – コメントを書き込んで命令を書き換え、一度テストする。
ステップ6 – ゲームがクラッシュした場合は、そのアドレスに戻りコメントを残すだけです。
        例えばnopクラッシュ、または命令反転クラッシュという感じに。
ステップ7 – 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:
ジャンプ命令を逆にしてみよう
関数を潰してみよう

Arma 3のチート。Win32APIを利用してプレイヤーの座標を見つける

すごく参考になる動画があったのでご紹介します。マルチレベルポインターをポインタースキャンを使わず、手動でバックトレースしてベースポインターとオフセットを見つける、というものです。ゲーム名はArma 3


使用ツール
Binary Ninja
WinDbg
ReClass

動画の目的
X3DAudioCalculateの引数として渡されるLisnterオブジェクトを利用し、プレイヤーの座標を見つける。ベースポインターとオフセットも同時に見つける。

結果的に2つのカメラオブジェクトとプレイヤーの座標が見つかる。

参考になる箇所
・スレッドの応答が遅いと例外アクセス違反が発生するのでそれを無効化
・Binary Ninjaと実際のアドレスが違うのでリベースする
・X3DAudioCalculateが定義されているモジュール名がわからないので、WinDbgのxコマンドで見つける
・コールスタックを使って関数のリターンアドレスを取得し、一つ前の関数に飛ぶ
・call [rax+0x10] は仮想関数を呼び出している。Binary Ninjaでステップインするにはブレークポイントを設置し、[rax+0x10]が何かを調べなければならない。
・いつ rsp + 74 (スタック)に書き込みがあったのかを調べるため関数の先頭ではなく、スタックフレームが形成されてからメモリ書き込みブレークポイントを設定する
・スタックのオフセットは必要ない  ←  重要

x64の呼び出し規則
第一引数 rcs
第二引数 rdx
第三引数 r8
第四引数 r9


WinDbgの各種コマンド
モジュール名を調べる
x *!X3DAudioCalculate
ブレークポイント(メモリ書き込み)
baw 4 [Address]
ブレークポイントをすべて消去
bc *
コールスタック呼び出し
k
式の評価(アドレスのリベース)
? rip - arma3_x64 + 140000000
アンアセンブル
u


まとめ
私も同じゲーム、同じ環境でやってみました。やはり、スタックへの対処が難しいです。特に最後のほう。ゲームのチートでWinDbgは必ずしも必要ではないのですが、使ってみると新鮮でした。OllyDbgやCheat Engineを使っている方ならすぐ慣れると思います。Youtubeの動画は右下の字幕アイコンをクリックすると英語字幕がでるのでそれを見ながらやると取りこぼしがないです。気合のある方はぜひやってみてください!

1カ月で習得できるアセンブリ言語の勉強法とおすすめの書籍

私がアセンブリ言語を勉強する際に読んだ書籍をご紹介します。


上記の2冊です。

独習アセンブラ(旧版)

独習アセンブラはハードウェアの解説から、mov, jmp, push, callなどの基本的な命令の使い方、また付録として命令セットリファレンスもついています。

注意点として、この本に出てくるサンプルプログラムは16bitアプリケーションなので別途WindowsXPをインストールした仮想マシンを用意する必要があります。アセンブラはNASMが使用されています。


※独習アセンブラは2021/9/8に新版がでるのでそのあたりご注意ください。旧版は中古もあり財布に優しいです。


解析魔法少女美咲ちゃん マジカル・オープン!

解析魔法少女美咲ちゃんはOlly Dbgの使い方、解説がメインです。解析プログラムとしてCrackMeが用意されており、レジスタ、メモリ、スタックをどのように見ながら解析するのかを学べます。アセンブリ言語とデバッガの使い方はワンセットで覚えてしまいましょう。どちらかというと、この本のほうが実践的な内容です。


Cheat EngineでいうところのMemory Viewer画面(↓画像参照)、この画面の使い方を習得できます。リバースエンジニアリングやゲームのチートをするうえで避けて通れません。
本書籍のCrackMeはこちらのサイトからダウンロードできるので試しに見てみてください。
この2冊で基本を学んだら、あとはWEBサイトやYoutubeの動画で逐一調べながらひたすら実践あるのみ!

参考になりそうなサイトと動画

OllyDbgを使ってx86アセンブラとデバッガの基礎の基礎を学ぼう
How to crack WinRAR

Game Hacking Academy


Writing a keygen part 2/4(part1が削除されています)
Writing a keygen part 3/4
Writing a keygen part 4/4

Reverse Engineering the LaFarge Crackme #2 and keygen
Finding game player structures through audio libraries

どうでしょうか?見てるだけでワクワクしてきませんか。
リバースエンジニアリングは他では経験できない達成感を味わえるのでぜひ習得してください。

当ブログの関連記事

筆者が作成したとあるソフトウェアのキージェネレーター