Cheat Engineがインストールできない場合の解決方法

Cheat Engine 7.4をインストールしようとすると以下のエラーが出たので解決方法をご紹介します。


インストール手順


左下にあるWindowsキーをクリック。


↑画像の状態で「アプリとブラウザー コントロール」と入力。「アプリと」まで入力すれば検索に引っ掛かるはずです。「」は必要ありません。


画像の赤枠部分を選択。


評価ベースの保護設定をクリック。


望ましくない可能性のあるアプリのブロックをオフに変更。

これでCheat Engineをインストールできるようになります。
インストールが終わればオンに戻しておいてください。

インストール時の注意点


余計なソフトがインストールされるのを防ぐため、必ず画像のように
Skip All を選択しましょう!

Cheat EngineのAdd Fileについて

Cheat EngineのCTには外部ファイルを追加することができます。外部ファイルとはluaが記述されたテキストファイル、mp3ファイルなどです。例として下記のCTを見てみましょう。

eldenring.CT
https://opencheattables.org/viewtopic.php?p=1103#p1103



[ENABLE]セクションのonEnable()、collectWeaponNames()などはすべて外部ファイルに定義されています。Cheat EngineのメニューにあるTableをクリックすると以下のようにファイルが添付されています。


.luaファイルにはこのCTで使われている関数がluaで定義されています。このように機能ごとにファイルを分けることによって可読性が良くなったり、編集しやすくなるなどの利点があります。ただ単にテキストファイルを追加しただけでは関数を使うことができません。コンパイルする必要があるのです。どのようにしてコンパイルするのか、下記画像のloadTableFiles関数に注目してください。


tFileListには全部で8つのファイル名が記載されており、それらをすべてコンパイルします。

処理の流れとしては、findTableFile(name)でtFileListのTableFileオブジェクトを作成後、StringStreamオブジェクトにコピー、StringStreamオブジェクトをStringListに変換、Forループで1つずつloadString関数を使ってコンパイル。

これで外部ファイルの関数が使えるようになります。

loadString関数の仕様については下記サイトをご参照ください。

サンプルコード

Forループを使わず単一ファイルをコンパイルする場合のコードは以下の通り。
function loadTableCode(n)
  local t = findTableFile(n)
  if t ~= nil then
    local s = t.Stream
    local c = readStringLocal(s.Memory,s.Size)
    loadstring(c)()
  end
end
loadTableCode('TestFunc.lua')
testFunc()
testFunc2()
Cheat EngineメインウインドウのMemory ViewからCtrl + LでLua Engineを起動して上記のコードを貼り付ける。続いて、下記のコードを記載したTestFunc.luaというファイルを作成。
function testFunc()
 print("Hello World!")
end

function testFunc2()
 print("Hello World 2!")
end
Cheat EngineのメニューからTable → Add fileでTestFunc.luaを追加。
この状態でLua Engineの右端にあるExcuteボタンをクリックし、OutputウインドウにHello Worldが表示されれば成功です。

Cheat Engineで見つけるのが難しい値や命令を見つけよう!

前回に続き、参考になる動画シリーズ第2弾。
Cheat Engineでアセンブリ言語を追いかけないと見つけることができない値や関数を探す方法です。見つけるのが難しいチートは、ほとんどの場合この記事と同じようなやり方で探します。ぜひ読んで実践してみてください。

動画URLは以下のリンクから

この動画ではOllyDbgが使われてますが、Cheat Engineでも同じことが出来ます。

Recoil関数を見つける(和訳)

ステップ1 – チートエンジンでアドレスを見つける
ステップ2 – そのアドレスに書き込んでいる命令を見つける
ステップ3 – 書き込んでいる命令のアドレスをOllyDbgで検索する
ステップ3.5 – ハードウェアブレークポイントを設定して、その関数の最初と最後を特定する。
        例えばFiringGun関数など。
        こうすることによって、どこからどこまでをデバッグすればいいのかがわかります。
ステップ4 – すべてのジャンプ命令を逆にします。 例えば、JNZをJEにします。
ステップ5 – コメントを書き込んで命令を書き換え、一度テストする。
ステップ6 – ゲームがクラッシュした場合は、そのアドレスに戻りコメントを残すだけです。
        例えばnopクラッシュ、または命令反転クラッシュという感じに。
ステップ7 – ollydbgとゲームを毎回再起動する必要があり、面倒な場合があります

デバッグ時のコメントは非常に重要です!あなたが最後に作業した場所を確実に覚えておくために、常にコメントを入れておきましょう。

ここにいくつかのガイドラインを紹介します。

命令を変更する際の順序
1番 すべてのジャンプコマンドを逆にする
2番 すべてのCALL命令はNOPEDである必要があります

それでも目的の関数が見つからない場合はより複雑な命令を試していきます。

3番 まだNOPしていない命令をNOPする。
例:
MOV BYTE PTR DS:[EAX + 218]、BL

実際の命令がコピーされていないため

4番 クラッシュする可能性が最も高いものを最後まで残しておきます。
例:
MOV EAX、DWORD PTR DS:[ESI + 8]
ADD EAX, 4

これらの命令は非常にクラッシュしやすいです。
このような命令をNOPEDにした場合、他の命令もNOPにしなければならないことがあります。
次のCALL命令までの上、またはその下のいくつかの命令です。
なぜそうなるかというと、これらの命令の値が次の関数で使用される可能性があるためです。
使用されている場合、ゲームがクラッシュすることがあります。
これには何度もトライ&エラーが必要です。

JMP命令を逆にする

JG ⇔ JL
JLE ⇔ JG
JE ⇔ JNZ

これは主に試行錯誤についてです

以下のような命令は無視する必要があります(命令のグループの一部でない限り)
CMP – 比較の略で、これは通常、ジャンプの前に見られます
LEA  – より高度な計算に使用されます
POP、PUSH、RETNは反動、弾薬、および私たちが通常探しているその他の情報とはあまり関係がありません。Intは通常、まったく無関係です。

お役に立てれば幸いです

手順(要約)

1. 弾丸のアドレスの見つける
2. 弾丸のアドレスに書き込んでいる命令を見つける
3. その命令がある関数の先頭と終端を特定する
4. ジャンプ命令を逆にする
5. 命令を書き換える際は必ずコメントをつける
6. CALL命令を潰していき絞り込んでいく
7. 場合によってはCALL命令の上と下のいくつかの命令も潰す(クラッシュを避けるため)
8. 最後に残ったのが目的の関数

まとめ

いかがでしたでしょうか?命令を潰していき、絞り込んでいく感覚がわかったと思います。アセンブリ言語はC言語やその他の高級言語のようにコードを見て「あっ、これはプロセスIDを取得していて...」という感じで分かるわけではありません。プログラムを動かしながらデバッグすることで始めて処理内容が分かってきます。そのためのテクニックが当記事の内容です。

特に重要なのがブレークポイントの使い方です。BPを設定してみることで「ここはループしている」、「ここは銃を撃った時に1度だけ実行される命令だな」などわかってくることがたくさんあります。

また、ジャンプ命令は逆にしてみるだけでも何らかのチートが見つかることがあります。ようは条件分岐を反対にしているわけです。筆者もこのやり方でいくつかチートを見つけことがあります。

最後に、翻訳が微妙でわかりにくい部分もあると思いますが、動画を何回も見返して高度なデバッグ技術を一緒に身につけましょう!

POINT:
ジャンプ命令を逆にしてみよう
関数を潰してみよう