EDF4.1で学ぶ、Cheat Engineでメモリを覗く方法

ゲーム内データをプログラムから覗こう

この記事は、下記記事の続きだ。
https://drroot.page/wp/?p=222

概要

前回は人力で引っこ抜いてきた静的メモリアドレスだが、Cheat Engineにはポインタスキャンというステキ機能が備わっている。
通常のスキャンだけでは静的アドレスを特定できない場合、特定したいメモリアドレスの共通の親ポインタを探す必要がある。
今回はSteam版EDF4.1を例に、Cheat Engineで静的メモリを探し当てる方法を纏めてみた。
尚、中間言語を介するUnity製のゲームなんかはこの方法が使えないので注意。あくまでネイティブバイナリ限定だ。

前提

ゲームでよくあるチートは「HPをいじる」だ。EDFでは体力値をアーマーというので、以下APと表記する。
メモリスキャンでAPのアドレスを見つけ、エディットすればゲーム内のAPを幾らでも上げられる…というところまでは多くの解説が転がっている。
しかし、「このアドレスを対象に、別のプログラムからAPを監視する」なんてことをやろうとすると躓く事になる。
APのアドレスはゲームを起動する度に(何ならミッションを選び直す度に)変化するからだ。

何故このような挙動をするかというと、ゲームに関わらず多くのプログラムは、メモリを必要な時に確保して必要な時に開放する。
Cなら昔ながらのmallocによる動的確保、オブジェクト指向言語ならnew演算子によるインスタンスの生成などがそうだ。
つまりどこかに静的=何度起動し直しても同じメモリに配置されるポインタ変数があり、そいつが目的のAPのアドレスを指している事が予想される。
ポインタスキャンとは、目的の変数を元に、その変数を指し示すポインタを探してくれる機能だ。

共通ポインタを見つける

ポインタスキャン

毎回起動したらアドレスが変わるのだから、最低でも2回ほどゲームを起動し直し、目的の変数への道筋を探す必要がある。
2パターンのスキャンマップを生成し、どちらの場合でもヒットする変数が見つかれば勝ちと言えるだろう。

まずは目的の変数を見つけ、変数リストに突っ込んでおく。今回の例はAPの最大値だ。
次に右クリメニュー→Generate Pointermapを選択。ファイル保存画面が出るので、わかりやすい名前をてきとーにつけて保存。
早い話がメモリをダンプしてるので、若干時間はかかるものの特に設定等は不要で終わる。

ゲーム一式を再起動したら、もう一度AP最大値を探し直す。
見つかったらそのアドレスに対し、今度は「Pointer scan for this address」を選ぶ。
すると下記画像のような画面が出る。

ここで「Use saved pointer map」にチェックするとファイル選択ダイアログが出るので、さっき保存したポインタマップを選択。
その後セレクトボックスから最大アーマーの値を選ぶと、手元の変数も含めて共通の親ポインタをスキャンしてくれる。
設定周りは適当で構わないが、「Max different offset per node」はチェックした上でせいぜい5か6くらいがお勧めだ。
このオプションは何世代まで親の変数を探すかの設定だが、1増やす毎に計算量が指数関数で増える。
なので4あたりから始めて、ヒットしなければ増やすくらいの感覚で良い。

スキャン結果を読む

ポインタスキャンが終わると、共通の親ポインタの一覧がどかっと出てくる。

この時、"~exe"+XXXXXXXXの形式になっている事が重要だ。
exeファイルの配置されるアドレスは不定だが、その後ろのオフセットアドレスは静的だからだ。
なので、OSにexeファイルのアドレスを聞く→オフセット値を足す→そのアドレスの値を読む→オフセットを足す…としていけば目的のアドレスに辿り着ける。

さて、スキャン結果をざっと見た感じ、どうやら目的地への道筋は無数にあるようだ。
何も長ったらしい道筋をわざわざ選ぶ理由は無いので、今回は決め打ちでOffset 3までで辿り着ける下記ルートを選択する。
"EDF41.exe"+00CC84E8 -> 28 -> 130 -> 8 -> 168

あとはコードを書けばプログラムから各種値をすっこ抜ける。
コードは前回記事とほぼほぼ共通なのでそっち参照。
ただし、前回が32ビットアプリ向けだったのに対し、今回は64ビット長でメモリを扱う必要があるので注意。

カテゴリー: IT | コメントする

Unreal Engine 3製ゲーム(Xcom等)で、ゲーム起動後時間経過で動作不良になる問題

長年の問題、解決

概要

Xcom Enemy Withinにて発生し、Xcom Chimera Squadではさらに悪化したこの問題。
ゲーム起動後、時間が経過するにつれて「システムの割り込み/System Interrupt」プロセスのCPU使用率が上がっていき、それにともなって音声がプツッたりFPSが落ちたりする。
ゲームの設定ファイルやらNvidiaの設定やら、あらゆる問題をあたっても直らなかったが、数年を費やしとうとう原因を特定した。

結論

何かしらのハードウェアが悪さをしている。
つまり、USB機器を全部引っこ抜いてゲームを起動し、再発しなければ一本ずつUSB機器を差し直して犯人を特定しろということだ。
UE3は謎の最適化をしており、その影響でこのような事になるらしい(そもそもシステムの割り込みが出てくる時点でハード周りが確黒だ)。
参考にしたフォーラムでは特定のマウスが原因との事だったが、自分の環境ではDUAL SHOCK2とUSB パッドの変換器が犯人だった。
これを外すだけで問題が起こらなくなった。そんな程度の事に全く気づかなかったとは…。

これでようやく宇宙人共を快適に叩き殺せるぞ!

カテゴリー: IT, 未分類 | コメントする

Mbed CliでMbed OS 2系のコンパイルをする(延長戦)

Mbedローカルコンパイルバトル 2回戦

がいよう

この記事は下記の続き。
https://drroot.page/wp/?p=234

mbed cliでmbed new testproj --mbedlibと叩くと、Mbedライブラリを落としてくる段階で

ERROR: OS Error: プロセスはファイルにアクセスできません。別のプロセスが使用中です。

とか言われてコケるケース。

続きを読む

カテゴリー: IT, 電子工作 | コメントする

Mbed CliでMbed OS 2系のコンパイルをする(LPC11U35をローカルビルドする)

Mbed ローカルコンパイルバトル

概要

Mbedのローカルコンパイルに関しては公式でドキュメントがあるように見せかけて、書いてある通りにやっても上手く行かなかったりする。
そもそも現行のMbedはMbed OS 5がメインストリームで開発されており、LPC11u35含む一部マイコンはこの系列に対応していない。
これら旧式のMbedライブラリは所謂Mbed OS 2系としてサポ終みたいな扱いになっており、何かと不遇である。
色々手こずったので備忘録を残す。

続きを読む

カテゴリー: 電子工作 | コメントする

【2021年1月版】API無しでYoutube Liveのコメントを取得する

https://github.com/taizan-hokuto/pytchat
本記事で書いたコードは、ほぼ上記Pythonリポジトリの劣化品だ。

続きを読む

カテゴリー: IT | コメントする

Electron-Builder (Vue-CLI-Plugin Electron Builder) エラーもないのにアプリが起動すらしなくなる問題

クソ悩んだ

https://drroot.page/wp/?p=201
この記事は、上記記事の続きだ。

概要と症状

2021年1月末現在、こんな感じで再現できる。

vue-cli-pluginでプロジェクト作成

vue add electron-builderコマンドでElectron-builderブチ込む

yarnなりnpmなりでserialportを入れる(というか、ネイティブ向けパッケージを入れる)

electron:serveすると普通に動く

electron:buildしたexeを実行しても即座に終了してなんも起きない

気づいたらelectron:serveも即終了するようになってる

エラーコードも何も起きず、正常終了するフリして即落ちするからマジで何かと思った。

原因

electron-builderが、buildコマンド時にネイティブパッケージを変なふうにリビルドするのが原因
どうもこの時おかしなリビルドをするらしく、起動後即座にbindings(ネイティブバイナリと橋渡しするやつ)を掴み損なって落ちるらしい。
これもビルド時のログを5千億回くらい読み直してようやく理解できたんだが、どうも「electron-rebuild -f -w serialport」すべきところを「npm-rebuild」してるらしく…
もしかしたら、electronにバンドルするnodeではなく、開発で使ってるnpm向けにビルドしちゃってるんじゃないだろうか。

直し方

electron-builderに、ビルド時の余計なネイティブパッケのリビルドやめろと伝えれば良い。
ドキュメントによれば、npmRebuildをfalseにすればいいとある。
https://www.electron.build/configuration/configuration#configuration

electron+vue構成の場合、プロジェクトのルートにvue.config.jsを作り、そこにbuilderへ渡すオプションを書ける。
https://nklayman.github.io/vue-cli-plugin-electron-builder/guide/configuration.html#configuring-electron-builder

今回はserialportを使っているので、こいつをビルドから除外するコードも含めると(前回記事参照)こんな感じだ。

module.exports = {
  pluginOptions: {
    electronBuilder: {
      externals: ["serialport"],
      builderOptions: {
        npmRebuild: false
      }
    }
  }
};

で、もしこの症状に陥った場合、既にBuilderがゴミをリビルドしてしまっているので、もっかい手動でネイティブバイナリのリビルドをする必要がある。
即ち、「electron-rebuild -f -w serialport」を叩き直せばいい…このあたりは前回記事の内容を参照だ。

ちなみに

yarnを使ってるだけでも、何かしらaddした時この余計なリビルド処理が発生しやがるぞ。どうしろってんだ。
今の所気付き次第Rebuildする以外に思いつかんね。

カテゴリー: IT | コメントする

ゲームのメモリを監視する ~ ASLRが有効な場合

メモリを監視する

もくてき

ゲームのHPとかを監視するプログラムを作る。
今回はSONIC MANIAを対象に、ゲーム内のデータを取得してみよう。

続きを読む

カテゴリー: IT | コメントする

VSCodeでデバッグしようとしたら「パラメーターの書式が違います /d」とか怒られる

VSCodeの進化は早いので(?)、VSCodeのcmdをUTF-8で使うみたいな古めの記事を参考にして、

"terminal.integrated.shellArgs.windows": [
        "/k",
        "chcp",
        "65001"
    ]

とかSettingsに書いてるとデバッグ走らせようとした時変なコマンド叩きに行ってコケるぞ
1日溶かした ファッキン

カテゴリー: 雑記 | コメントする

ニコニコ動画に対応したYoutube-dlをリビルドした(チャンネル限定動画もDL可能)

がいよー

早い話が、有料のチャンネル限定動画も含め、ニコニコから、動画を落としてこれるよと。
そういう記事だ。

続きを読む

カテゴリー: IT | コメントする

Electronでserialportを使おうとするとあれこれエラー

App threw an error during load
TypeError: Cannot read property 'indexOf' of undefined
    at Function.getFileName (webpack:///./node_modules/bindings/bindings.js?:178:16)
    at bindings (webpack:///./node_modules/bindings/bindings.js?:82:48)
    at eval (webpack:///./node_modules/@serialport/bindings/lib/win32.js?:1:91)
    at Object../node_modules/@serialport/bindings/lib/win32.js (path\to\your\project\dist_electron\index.js:261:1)
    at __webpack_require__ (path\to\your\project\dist_electron\index.js:20:30)
    at eval (webpack:///./node_modules/@serialport/bindings/lib/index.js?:6:22)
    at Object../node_modules/@serialport/bindings/lib/index.js (path\to\your\project\dist_electron\index.js:173:1)
    at __webpack_require__ (path\to\your\project\dist_electron\index.js:20:30)
    at eval (webpack:///./node_modules/serialport/lib/index.js?:2:17)
    at Object../node_modules/serialport/lib/index.js (path\to\your\project\dist_electron\index.js:1517:1)

環境はwindows8.1、electronが9.0.0、serialportも9.0.0。
実行時に上記エラー。だいぶハマったので解決策を残す。

続きを読む

カテゴリー: IT | コメントする