Luaスクリプトをデバッグしよう

Luaスクリプトをデバッグする方法をご紹介します。デバッグとは動作確認のことです。頭の中でコードを追いかけるのは限界があるので、わからない箇所にブレークポイントを設定し1つずつ確認しながらプログラムを動かすことで読めるようになってきます。使用するゲームはWinning Post 10の体験版です。


CTファイルは以下のURLから
https://ux.getuploader.com/wp8/download/717


▼クリックで拡大できます

Luaスクリプト

上記はAAスクリプト内に書かれたLuaのコードです。デバッグするにはコードをCheat EngineのLua Engineに丸ごとコピー&ペーストします。


コピペする際は{$lua}、{$asm}、[ENABLE]、[DISABLE]などは不要なので消去しておいてください。



矢印部分を左クリックするとブレークポイントを設定できます。


ブレーク後はContinue, Single Step, Stopの3つのアイコンが出現するので、この3つをうまく使ってデバッグを行います。基本はブレーク → シングルステップ連打という流れです。


printf デバッグを活用する

Cheat Engine Luaにはprintf関数が用意されています。C言語のprintfと同じ要領で使うことが出来るラッパー関数です。わからない箇所でブレークさせ、命令と命令の間にprintf関数を挿入し変数の中身を表示しながらデバッグすると理解できるようになります。


備考

このLuaスクリプトは外部ライブラリが使用されています。外部ライブラリについては以下の記事が参考になります。
https://cheatwhatever.com/blog-entry-49.html

チートエンジン 小ネタ集

【驚愕】チートエンジンの初期バージョンていつ出たの?

2000年、約23年前です。


麻呂aa

出典:麻呂aa


勝手に2009年ぐらいだと思っていたので、これはびっくり。今上映されているWinnyより前でした。


https://www.cheatengine.org/forum/viewtopic.php?t=608620&sid=d8d58343632df820e9643727eabb3b70


エイプリルフール

Cheat Engineは4月1日になると起動時にジョークがメッセージとして出現します。

"課金しないとNext Scanが押せなくなる"

といったユニークなものです。このメッセージを真に受けてブチ切れている人がいました。また、このジョークを見たユーザーがびっくりしてtorrentサイトにCrackバージョンを探しに行ったという面白いエピソードもあります。


ゲームのアップデートでオフセットが変わる時の対処法

アップデートに強いスクリプトを作る方法です。


Cheat Engine 7.5

Tutorial-x86_64.exe (Step 2)


[ENABLE]

aobscanmodule(INJECT,Tutorial-x86_64.exe,29 83 ?? ?? ?? ?? 48 ?? ?? ?? E8 ?? ?? ?? ?? 8B ?? ?? ?? ?? ?? 41)
alloc(newmem,$1000,INJECT)

label(code)
label(return)

alloc(originalbytes,6) // オリジナルのバイトを保存する用のメモリ

originalbytes:
  readmem(INJECT,6) // 確保したメモリにオリジナルのバイトを6バイト読み込む

newmem:

code:
  push rax // raxレジスタの値をスタックに退避
  xor rax,rax // raxレジスタの値をクリア(0にする)
  mov ax,word ptr [originalbytes+2] // raxレジスタ(ax)に2バイト(オフセット)をコピー
  mov [rbx+rax],#100 // raxレジスタを使用してHelathに100をコピー
  // sub [rbx+000007F8],eax ← コメントアウトしてオリジナルの命令を消去
  pop rax // 退避した値を戻す
  jmp return

INJECT:
  jmp newmem
  nop
return:
registersymbol(INJECT originalbytes) // originalbytesをシンボルに登録していないとDISABLEセクションでエラーが発生する

[DISABLE]

INJECT:
  readmem(originalbytes,6) // ここでoriginalbytesを使うためシンボルに登録しておく必要がある

unregistersymbol(INJECT originalbytes) // シンボルを解除
dealloc(newmem originalbytes)          // メモリを解放


アップデートされたと想定するため、逆アセンブラウインドウでオフセットの7f8を800に変更してみます。変更後もスクリプトを有効/無効にできるのを確認できました。


レジスタが変わった場合はaobscanに失敗するため、スクリプトを有効にできません。バイトでいうと83の部分です。少し改良すればレジスタの変更にも対応できると思います。


参考リンク
https://forum.cheatengine.org/viewtopic.php?p=5777881&sid=a0711dd66db54a800d2453de2dfbff59


追記:

Cheat Engine 7.1、7.5の両方でスクリプトの動作を確認できました。Tutorial-x86_64のStep 2でオフセットが以下のように変化しています。

7.1 -> 7f0
     ↓
7.5 -> 7f8


その他の方法

code:
  db C7 83
  readmem(INJECT+2,4)
  db 64 00 00 00
  jmp return

dbとreadmemで命令を作る方法です。上記の場合
mov [rbx+offset],00000064
というコードを生成しています。


また、reassembleというAuto Assemblerコマンドもあります。
https://wiki.cheatengine.org/index.php?title=Auto_Assembler:reassemble

チート専用の掲示板つくりました。

チートエンジン掲示板

https://plumsnake6.sakura.ne.jp/bbs/


・チートをリクエスト
・値の見つけ方
・スクリプトなど