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は必ずしも必要ではないのですが、使ってみると新鮮でした。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

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

当ブログの関連記事

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

見やすい!Cheat Engineのコンパクトモード

Cheat Engineでチートの数が増えてくると、ウィンドウに収まらなくなり見づらくなりませんか?今回はCheat Engine Forumにあった便利なLuaスクリプト「コンパクトモード」をご紹介します!


スクリプト実行後


function cycleFullCompact(sender,force)
  local state = not(compactmenuitem.Caption == 'Compact View Mode')
  if force~=nil then state = not force end
  compactmenuitem.Caption = state and 'Compact View Mode' or 'Full View Mode'
  getMainForm().Splitter1.Visible = state
  getMainForm().Panel4.Visible    = state
  getMainForm().Panel5.Visible    = state
end

function addCompactMenu()
  if compactmenualreadyexists then return end
  local parent = getMainForm().Menu.Items
  compactmenuitem = createMenuItem(parent); parent.add(compactmenuitem)
  compactmenuitem.Caption = 'Compact View Mode'
  compactmenuitem.OnClick = cycleFullCompact
  compactmenualreadyexists = 'yes'
end

addCompactMenu()
上記のスクリプトを実行すると↓画像のようにCompact View Modeというメニューが追加され、
クリックするとコンパクトモードに、もう一度クリックすると元に戻ります。


CTを開いてすぐにコンパクトモードにしておきたい場合は、1番下のaddCompactMenu()の下にcycleFullCompact(nil,true)を付け足し、Table -> Show Cheat Table Lua Scriptに貼り付けてください。コンパクトモードとCheat Engineのオートアタッチ機能を併用すれば快適にゲームをスタートできます。

常時メニューに表示しておきたい場合は、Cheat EngineがインストールされているディレクトリにautorunフォルダがあるのでそこにLuaスクリプトをコピーすれば完成です。


Auto AssemblerスクリプトからCompact View、Full Viewを切り替えたいときは以下のようになります。
[ENABLE]
LuaCall(cycleFullCompact(nil,true))
 
[DISABLE]
LuaCall(cycleFullCompact(nil,false))

参考リンク