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の動画は右下の字幕アイコンをクリックすると英語字幕がでるので、それを見ながらやると取りこぼしがないです。
- 関連記事
-
-
EdrawMindで複数のマップを同時に開く方法
-
x64dbgの使い方メモ
-
Arma 3のチート。Win32APIを利用してプレイヤーの座標を見つける
-
1カ月で習得できるアセンブリ言語の勉強法とおすすめの書籍
-
リバースエンジニアリングの勉強法
-
CSGOをチートしよう!チート対策を回避!?
-
ユーザーアカウント制御を回避しよう!
-