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

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


使用するゲームは"Arma 3"です。
https://www.youtube.com/watch?v=rAdKfoRCXXE


動画の内容

使用ツール

・Binary Ninja
・WinDbg
・ReClass.NET


目的

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


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


参考になる箇所

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


x64の呼び出し規則

第一引数 rcx
第二引数 rdx
第三引数 r8
第四引数 r9


https://docs.microsoft.com/ja-jp/cpp/build/x64-calling-convention?view=msvc-160


WinDbgの各種コマンド

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

http://windbg.info/doc/1-common-cmds.html


まとめ

私も同じゲーム、同じ環境でやってみました。やはり、スタックへの対処が難しいです。特に最後のほう。ゲームのチートでWinDbgは必ずしも必要ではないのですが、使ってみると新しい発見がありました。OllyDbgやCheat Engineを使っている方ならすぐ慣れると思います。この動画はアセンブリ言語に慣れるにはもってこいの内容なので、ぜひ実践してみてください。


ポイント

Youtubeの動画は右下の字幕アイコンをクリックすると英語字幕がでるので、それを見ながらやると取りこぼしがないです。

関連記事

0 Comments