チートエンジン おすすめ記事一覧
Cheat Engineがインストールできない場合の解決方法
https://cheatwhatever.com/blog-entry-50.html
1分で見つかるCTファイルの探し方・ダウンロード方法
https://cheatwhatever.com/blog-entry-47.html
Cheat Engineで使う重要な用語
https://cheatwhatever.com/blog-entry-6.html
まずはこの記事を見て!超便利なポインタースキャンの使い方
https://cheatwhatever.com/blog-entry-20.html
最強!Cheat EngineのAuto Assemblerスクリプト
https://cheatwhatever.com/blog-entry-19.html
ワンステップ上を目指す。Cheat Engine Luaとは?
https://cheatwhatever.com/blog-entry-34.html
Luaスクリプトをデバッグしよう
Luaスクリプトをデバッグする方法をご紹介します。デバッグとは動作確認のことです。頭の中でコードを追いかけるのは限界があるので、わからない箇所にブレークポイントを設定し1つずつ確認しながらプログラムを動かすことで読めるようになってきます。
使用するゲームはWinning Post 10 体験版です。
CTファイルは以下のURLから
https://ux.getuploader.com/wp8/download/717
上記は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年前です。
勝手に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