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の動画は右下の字幕アイコンをクリックすると英語字幕がでるのでそれを見ながらやると取りこぼしがないです。気合のある方はぜひやってみてください!
関連記事

0 Comments

Post a comment