Engineでよくあるのが、体力や弾丸のアドレスを見つけたのにゲームを再起動すると使えないといった*問題です。これは動的に確保されたメモリ領域の場合に起こる現象です。今回はスクリプトを使ってアドレスを自動検出することで、その問題を解決してみようと思います。これをしておくと、後々ポインタースキャンをする時やその他の作業をするのが楽になります。この記事の内容はゴッドイーター3だけでなく、他のゲームにも応用できることなのでぜひ読んでみてください。Engineに問題があるわけではなく、プログラムとはそういう使用だということです。詳細はこちらの記事の「動的アドレス」をご参照ください。目次どの命令にスクリプトを組むか決めようオブジェクトを区別する値を見つけるスクリプトを作ろう!チートテーブルを整理するOPのアドレスも検出するスクリプト補足説明どの命令にスクリプトを組むか決めようHPのアドレスを見つけた状態から始めていきます。address」を使用して、HPのアドレスにアクセスしている命令を見つけにいきます。デバッガーでge3.exeにアタッチするのでYesをクリックします。アクセスしている命令を見つけました。左のCountにある数字がすごい勢いでカウントアップされているのを確認できます。これはその命令が実行されている回数を表していて、プログラム内部ではループ命令で継続的に実行されていることを意味しています。デバッグは必要ないので右下のStopをクリックして中止しましょう。スクリプトを組む命令を決めます。どの命令でもできると思いますが一番上の命令に組むことにします。ミッション開始と同時に実行される命令にスクリプトを組めば、スクリプトをオンにした瞬間に狙いの動作を実現できます。disassemblerをクリックして次に進みましょう。逆アセンブラウィンドウが表示されました。このアドレスは皆さんと異なるかもしれません。同じゲームでもバージョンによってアドレスがずれている可能性があるからです。accesses」を選択します。この命令がアクセスしているアドレスを見つけてくれます。便利な機能で使う頻度も多いです。Stopをクリックしてデバッグを中止します。画像のように3つのアドレスにアクセスしているのを確認できます。上からプレイヤーのHPのアドレス、hugoのHPのアドレス、zekeのHPのアドレスになっています。実はこの命令、ブレークポイントを設置してみればわかるのですが、プレイヤー、hugo、zekeのように順々にアクセスしながらループしているため、このままスクリプトを組んでもうまく動作しません。検出したいのはあくまでプレイヤーのアドレスだけです。したがって、自分と味方1、味方2を区別できる値を見つける必要があります。プレイヤーのアドレスをグループ1にその他をグループ2に設定しています。グループ1を設定すればその他は自動的にグループ2になります。commonalities」を選択します。逆アセンブラ画面に戻り確認するとわかりますが、この命令ではRBXにベースアドレスが格納されているので、RBXの行をダブルクリックします。Scanをクリックします。2が保持している値の相違を一目で確認できるようになりました。アドレス:値という表記になっており、一番左の黒字の数字がオフセットです。ここでは自分と味方1、味方2を区別できるような値をスクロールしながら探します。するとオフセット150にそれらしい値がありました。プレイヤーが0、hugoが1、zekeが2になっています。ここで間違いないでしょう。addresses」は、例えば銃の打ち合いをするゲームで青チームが1、赤チームが2といった具合で共通する値を探すときにも使用します。structure」でも同じことができます。これでスクリプトを作る準備ができました。スクリプトを作ろう!まずスクリプトを組む命令を左クリックで選択します。Assembleを選択しましょう。Injectionと進みます。Injectionのテンプレートが挿入されました。ここから新たにコードを追加していきます。行が変更を加えた箇所です。Assemblerスクリプトには3つのセクションがあります。Mainセクションに書いたコードはスクリプトがオンになった時、オフになった時の両方で実行されます。セクションに書いたコードはスクリプトがオンになった時に実行されます。セクションに書いたコードはスクリプトがオフになった時に実行されます。プロセス内から指定された16進数コードを探し、そのアドレスを取得する。アドレスにラベル名をつける。値が1ならcode1:、2ならcode2:にジャンプするなどの条件分岐する場合に使用。allocateの略でメモリを確保する。確保したメモリを開放する。アドレスをシンボルに登録してスクリプト外でも使えるようにする。登録したシンボルを解除する。bytesの略で、指定されたアドレスにバイト配列を書き込む。計5バイトを書き込んでいる。ありそれぞれ2バイト、4バイト、8バイトに対応している。compareの略で値を比較する。指定されたアドレスに無条件にジャンプする。equalの略で比較した値が同じでなければ指定されたアドレスにジャンプする。cmpとセットで使われることが多い。healthBase)と間にスペースを入れることで1行で書けるようになりました。Engine7.1未満をお使いの方は各所変換しながらコードを書いてください。tableを選択します。いうスクリプトが追加されているので、画像の赤枠部分をクリックしてスクリプトをオンにしましょう。スクリプトを再編集したいときは、<script>のあたりをダブルクリックします。Manually」をクリックして手動でアドレスを設定します。Pointerにチェックを入れます。スクリプトでシンボルに登録したhealthBaseとオフセットの10を入力し、TypeをFloatに変え、DescriptionはHPにしときます。チートテーブルを見ると無事にHPのアドレスを検出できています。チートテーブルを整理するここからする設定は見栄えの問題で必須ではありませんが、やっておくとチートテーブルがすっきりします。HPのアドレスの行を左クリックしたままスクリプトの行に重ねるようにドラッグ&ドロップします。deactivated」を選択します。これでスクリプトをオフにするとHPのアドレスも自動で隠れるようになります。configには他にも便利な設定があるのでいろいろ試してみてください。OPのアドレスも検出するHPとOPのアドレスを見てみるとアドレスが似ていることに気付きます。これは2つのアドレスの距離が近いことを示しています。E4になり、HPのアドレスからOPのアドレスまでの距離はE4であることが分かりました。これを利用してついでにOPのアドレスも自動で検出できるように設定します。HPのアドレスの行を選択し、Ctrl+C、Ctril+Vでアドレスを複製します。右クリックからコピー、張り付けすることもできます。Pasteをクリックします。矢印のあたりをダブルクリックしてアドレスを編集します。オフセットの10に+E4を付け足し、DescriptionをOPに変更します。これでHP、OPと、2つのアドレスを検出できるようになりました。値を固定することもできます。ゲームを再起動したり、ミッションを変えても無事検出できることを確認できたら完成です。以下のコードはコピペできます。ge3.exeプロセス内から指定された16進数コードを探し、そのアドレスを取得する。スクリプト用に0x1000バイトのメモリを確保する。-さんコメントありがとうございます。flag用のメモリを新たに確保し、1がセットされていれば改造コードを実行0がセットされていれば元のコードを実行というふうにすれば上手くいきます。originalcodecode1://改造コードoriginalcode://元のコード[DISABLE]unregistersymbol(flag)dealloc(flag)さらに下記のようなスクリプトをチートテーブルに追加してそのスクリプトに対して右クリックからホットキーを設定して完了です。名無しさん出来たようで良かったです!luaスクリプトにisKeyPressed関数とtimerクラスがあるので、それらを使うと実装できるかもしれません。自分もluaはほとんど触れたことがないので具体的にどうすればいいかまではわからないです。https://forum.cheatengine.org/index.php上のサイトのサイト内検索からisKeyPressedと検索をかけて、各記事を参考にしてみてはいかがでしょうか。16:21REPLYなんでもチートコメントありがとうございます。調べてみましたが見つかりませんでした。髪型や服などを変更するチートはありそうです。今そういったCTやトレーナーが出回ってないのであれば自分で改造するしかないのですが、中には高度な知識を要求されるものもあるので、海外勢に質問してみるのも1つの手かもしれません。お力になれず申し訳ないです。Engineのポインタースキャンを使おう!アドレスが変わって困っている方におすすめDLLインジェクションで実行中プロセスのマシンコードを書き換えるプロフィールAuthor:ちーたーリバースエンジニアリングを趣味でやっています!英語のサイトや動画から学んだ内容を記事にしていこうと思います。