Cheat Engine

Reading time: 18 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

Cheat Engine は、実行中のゲームのメモリ内に重要な値がどこに保存されているかを見つけて変更するための便利なプログラムです。
ダウンロードして実行すると、ツールの使い方のチュートリアル表示されます。ツールの使い方を学びたい場合は、これを完了することを強くお勧めします。

何を検索していますか?

このツールは、プログラムのメモリ内にどこに値(通常は数値)が保存されているかを見つけるのに非常に便利です。
通常、数値4バイト形式で保存されますが、ダブルフロート形式で見つかることもありますし、数値以外の何かを探すこともあるかもしれません。そのため、検索したいものを選択することを確認する必要があります:

また、異なるタイプの検索を指定することもできます:

メモリをスキャンしている間にゲームを停止するためのチェックボックスをオンにすることもできます:

ホットキー

Edit --> Settings --> Hotkeys では、ゲームを停止するなどの目的のために異なるホットキーを設定できます(これは、メモリをスキャンしたいときに非常に便利です)。他のオプションも利用可能です:

値の変更

探しているがどこにあるかを見つけたら(このことについては次のステップで詳しく説明します)、それをダブルクリックして、次にその値をダブルクリックすることで変更できます:

最後に、メモリ内で変更を行うためにチェックを入れることが必要です:

メモリへの変更はすぐに適用されます(ゲームがこの値を再度使用するまで、値はゲーム内で更新されません)。

値の検索

重要な値(ユーザーのライフなど)を改善したいと仮定し、その値をメモリ内で探しているとします。

既知の変更を通じて

値100を探していると仮定し、その値を検索するためにスキャンを実行すると、多くの一致が見つかります:

次に、値が変更されるような操作を行い、ゲームを停止して次のスキャンを実行します:

Cheat Engineは、100から新しい値に変わった値を検索します。おめでとうございます、探していたアドレス見つけました。これで、値を変更できます。
まだ複数の値がある場合は、再度その値を変更する操作を行い、もう一度「次のスキャン」を実行してアドレスをフィルタリングします。

不明な値、既知の変更

値がわからないが、どのように変更されるか(変更の値も含む)を知っている場合は、数値を探すことができます。

まず、不明な初期値のスキャンを実行します:

次に、値を変更し、どのようにその値が変更されたかを示し(私の場合は1減少しました)、次のスキャンを実行します:

選択した方法で変更されたすべての値が表示されます:

値を見つけたら、それを変更できます。

多くの可能な変更があることに注意し、結果をフィルタリングするためにこれらのステップを何度でも行うことができます

ランダムメモリアドレス - コードの発見

これまで、値を保存しているアドレスを見つける方法を学びましたが、ゲームの異なる実行ではそのアドレスがメモリ内の異なる場所にある可能性が高いです。では、そのアドレスを常に見つける方法を見つけましょう。

前述のトリックのいくつかを使用して、現在のゲームが重要な値を保存しているアドレスを見つけます。次に(ゲームを停止しても構いません)、見つけたアドレスを右クリックし、**「このアドレスにアクセスするものを見つける」または「このアドレスに書き込むものを見つける」**を選択します:

最初のオプションは、このアドレス使用しているコードの部分を知るのに役立ちます(これは、ゲームのコードを変更できる場所を知るのに役立ちます)。
2番目のオプションはより具体的で、この値がどこから書き込まれているかを知るのに役立ちます。

これらのオプションのいずれかを選択すると、デバッガがプログラムに接続され、新しい空のウィンドウが表示されます。今、ゲームをプレイし、その値を変更します(ゲームを再起動せずに)。ウィンドウは、値を変更しているアドレス埋まるはずです:

値を変更しているアドレスを見つけたら、自由にコードを変更できます(Cheat Engineでは、NOPにすぐに変更できます):

これで、コードがあなたの数値に影響を与えないように変更することができますし、常にプラスの影響を与えるようにすることもできます。

ランダムメモリアドレス - ポインタの発見

前のステップに従って、興味のある値がどこにあるかを見つけます。次に、**「このアドレスに書き込むものを見つける」**を使用して、この値を書き込むアドレスを見つけ、ダブルクリックしてディスアセンブリビューを取得します:

次に、"[]"の間の16進数値を検索する新しいスキャンを実行します(この場合は$edxの値):

(複数のアドレスが表示される場合は、通常、最小のアドレスのものが必要です)
これで、興味のある値を変更するポインタを見つけました

**「アドレスを手動で追加」**をクリックします:

次に、ポインタのチェックボックスをオンにし、テキストボックスに見つけたアドレスを追加します(このシナリオでは、前の画像で見つけたアドレスは「Tutorial-i386.exe」+2426B0でした):

(最初の「アドレス」は、入力したポインタアドレスから自動的に入力されることに注意してください)

OKをクリックすると、新しいポインタが作成されます:

これで、その値を変更するたびに、値がどのメモリアドレスにあっても重要な値を変更しています

コードインジェクション

コードインジェクションは、ターゲットプロセスにコードの一部を注入し、その後、コードの実行を自分が書いたコードを通過させる技術です(例えば、ポイントを与える代わりに減らすことなく)。

プレイヤーのライフから1を引いているアドレスを見つけたと想像してください:

ディスアセンブラを表示してディスアセンブルコードを取得します。
次に、CTRL+aをクリックしてオートアセンブルウィンドウを呼び出し、Template --> Code Injection を選択します。

変更したい命令のアドレスを入力します(通常は自動的に入力されます):

テンプレートが生成されます:

そのため、newmemセクションに新しいアセンブリコードを挿入し、originalcodeから元のコードを削除します(実行したくない場合)。この例では、注入されたコードは1を引く代わりに2ポイントを追加します:

実行をクリックすると、あなたのコードがプログラムに注入され、機能の動作が変更されるはずです!

Cheat Engine 7.xの高度な機能(2023-2025)

Cheat Engineは7.0以降進化を続けており、現代のソフトウェア(ゲームだけでなく!)を分析する際に非常に便利な生活の質や攻撃的リバース機能が追加されています。以下は、レッドチーム/CTF作業中に最も使用する可能性が高い追加機能の非常に簡潔なフィールドガイドです。

ポインタスキャナー2の改善

  • ポインタは特定のオフセットで終了する必要があります、新しいDeviationスライダー(≥7.4)は、更新後に再スキャンする際の誤検知を大幅に減少させます。これをマルチマップ比較(.PTR他の保存されたポインタマップと結果を比較)と組み合わせて、わずか数分で単一の耐障害性ベースポインタを取得します。
  • バルクフィルタショートカット:最初のスキャン後にCtrl+A → Spaceを押してすべてをマークし、次にCtrl+I(反転)を押して再スキャンに失敗したアドレスを選択解除します。

Ultimap 3 – Intel PTトレース

*7.5以降、古いUltimapはIntel Processor-Trace (IPT)の上に再実装されました。これにより、ターゲットが取るすべての分岐を単一ステップなしで記録できるようになりました(ユーザーモードのみ、ほとんどのアンチデバッグガジェットには引っかかりません)。

Memory View → Tools → Ultimap 3 → check «Intel PT»
Select number of buffers → Start

数秒後にキャプチャを停止し、右クリック → 実行リストをファイルに保存します。ブランチアドレスを Find out what addresses this instruction accesses セッションと組み合わせて、高頻度のゲームロジックホットスポットを非常に迅速に特定します。

1バイト jmp / 自動パッチテンプレート

バージョン7.5では、SEHハンドラをインストールし、元の位置にINT3を配置する1バイト JMPスタブ(0xEB)が導入されました。これは、5バイトの相対ジャンプでパッチできない命令に対してAuto Assembler → Template → Code Injectionを使用すると自動的に生成されます。これにより、パックされたりサイズ制約のあるルーチン内で「タイト」なフックが可能になります。

カーネルレベルのステルスとDBVM(AMD & Intel)

DBVMはCEの組み込みType-2ハイパーバイザーです。最近のビルドでは、AMD-V/SVMサポートが追加され、Ryzen/EPYCホストでDriver → Load DBVMを実行できるようになりました。DBVMを使用すると:

  1. Ring-3/アンチデバッグチェックに対して見えないハードウェアブレークポイントを作成できます。
  2. ユーザーモードドライバが無効になっている場合でも、ページング可能または保護されたカーネルメモリ領域を読み書きできます。
  3. VM-EXITなしのタイミング攻撃バイパスを実行できます(例:ハイパーバイザーからrdtscをクエリ)。

ヒント: Windows 11でHVCI/メモリ整合性が有効になっていると、DBVMは読み込むことを拒否します → 無効にするか、専用のVMホストを起動してください。

リモート / クロスプラットフォームデバッグとceserver

CEは現在、ceserverの完全な書き換えを提供し、Linux、Android、macOS & iOSターゲットにTCPで接続できます。人気のフォークはFridaを統合し、動的計測とCEのGUIを組み合わせます – 電話で実行されているUnityまたはUnrealゲームをパッチする必要がある場合に最適です:

# on the target (arm64)
./ceserver_arm64 &
# on the analyst workstation
adb forward tcp:52736 tcp:52736   # (or ssh tunnel)
Cheat Engine → "Network" icon → Host = localhost → Connect

For the Frida bridge see bb33bb/frida-ceserver on GitHub.

その他の注目すべき機能

  • Patch Scanner (MemView → Tools) – 実行可能セクションの予期しないコード変更を検出; マルウェア分析に便利です。
  • Structure Dissector 2 – アドレスをドラッグ → Ctrl+D、次に Guess fields でC構造体を自動評価します。
  • .NET & Mono Dissector – Unityゲームのサポートが改善されました; CE Luaコンソールから直接メソッドを呼び出します。
  • Big-Endianカスタムタイプ – バイト順序を逆にしてスキャン/編集(コンソールエミュレーターやネットワークパケットバッファに便利です)。
  • Autosave & tabs for AutoAssembler/Luaウィンドウ、さらに reassemble() で複数行の命令を書き換えます。

インストール & OPSECノート (2024-2025)

  • 公式インストーラーはInnoSetup 広告オファーRAVなど)でラップされています。常に Decline をクリック するか、ソースからコンパイルしてPUPを避けてください。AVは依然として cheatengine.exeHackTool としてフラグしますが、これは予想されることです。
  • 現代のアンチチートドライバー(EAC/Battleye、ACE-BASE.sys、mhyprot2.sys)は、名前を変更してもCEのウィンドウクラスを検出します。リバースコピーを使い捨てのVM内で実行するか、ネットワークプレイを無効にした後に実行してください。
  • ユーザーモードアクセスのみが必要な場合は、Settings → Extra → Kernel mode debug = off を選択して、Windows 11 24H2 Secure-BootでBSODを引き起こす可能性のあるCEの署名されていないドライバーの読み込みを避けてください。

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする