Cheat Engineで実際のPCゲームをチートしてみよう!

AssaultCubeのチート画像

Cheat Engineの使い方を覚えるには、実際のPCゲームで手を動かしながらやってみるのが一番効果的です。 今回はAssault CubeというオープンソースのFPSゲームを解析して、体力が減らないように改造してみましょう。


手順と必要なツール

1.体力のアドレスを特定する
2.動的アドレスの場合、そのアドレスを格納しているポインタ変数をさかのぼっていき、
  静的アドレスを見つける(マルチレベルポインタ)
3.マニュアルでポインターとオフセットを設定
4.値をフリーズして完成

実行した環境
・Windows 10 HOME
必要なツール & ダウンロード先
・Assault Cube -  https://assault.cubers.net
・Cheat Engine -  https://www.cheatengine.org

体力のアドレスを見つけにいく

それでは、Assault CubeとCheat Engineを起動してアタッチしましょう。




まずプレイヤーの体力の初期値は100になっているのを確認できるので、これを手掛かりにスキャンをかけていきます。



Scan TypeはExact Value、Value Typeは4Bytesなのを確認し、Value:に100を入力してFirst Scanをクリックします。



そうすると、たくさんのアドレス(この場合だと596)がヒットしたので、ここから絞り込んでいきます。 絞り込むために、プレイヤーの体力を変動させる必要があります。 少しマップ内を探索してグレネードを手に入れ、自分にダメージを与えましょう。
キーボードの3を押すとグレネードに切り替えれます。



ダメージを与えれたでしょうか? 近すぎると即死するので注意しましょう。
私の場合、88になったのでこの値で再検索していきます。
Value:に88を入力して、 Next Scanをクリックします。


これでアドレスが2つに絞り込まれました。
上のアドレスをダブルクリックして、アドレスリストに追加し、値を1000に変更してみましょう。




ゲーム画面に戻ると、体力が1000になっているのを確認できますね。



この状態で値を*フリーズすると無敵になりますが、厳密に言うと即死攻撃を受ければ死んでしまいます。 これはおそらく、通常攻撃を受けた場合と、即死攻撃を受けた場合で処理ルーチンが違うためです。
※フリーズとはCheat Engineの機能で入力した値をミリ秒単位で上書きし固定します。


さらに、このアドレス(変数)はプロセスが起動してから動的に確保されたメモリ領域のため、ゲームを再起動すると参照できなくなってしまいます。これでは不便なのでまた検索をかけて、このアドレスを保持しているポインタ変数を見つけにいきます。
※スキャンしてヒットしたアドレスが黒字で表示されている場合は動的アドレスです。


Cheat Engineでアドレスを検索する

新しくスキャンを始めるので、まずNew Scanをクリックしてください。 次にValue:の左にあるHexにチェックを入れて、先ほど見つけたアドレスを入力してFirst Scanをクリックします。


ここで使うアドレスは皆さんの環境によって異なります。私の場合DFA128
Hexは16進数のことです。アドレスは16進数で表されるので、検索するときはこのチェックボックスをチェックします。



スキャンすると何もヒットしません。
これはそのままの意味でこのアドレスを格納しているポインタ変数が存在しないということです。
なので別のアプローチをしていきます。


コードファインダーを使う

Cheat Engineにはコードファインダーという機能があります。 対象のアドレスにアクセスしているコード(命令)または、書き込んでいるコードを見つけるというものです。
アドレスリストのアドレスを右クリックして「Find out what writes to this address」を選択してください。 コードファインダーでこのアドレスに書き込んでいる命令を見つけにいきます。



新しいウインドウが出現したと思うので、そのままゲームに戻り再度グレネードで自分にダメージを与えます。


↓画像のように体力のアドレスに書き込んでいる命令を見つけました。
もう少し詳細な情報を得るために「More information」をクリックしてみましょう。



アセンブリ言語を読解する


注目すべきは赤字の部分です。
mov命令でeaxの値を[edx + F8]にコピーしています。
eaxにはダメージを受けた後の体力が、edxにはアドレスが格納されています。電卓のプログラマーモードでeaxの値を16進数で入力して10進数に変換すると、現在の自分の体力と一致するはずです。


F8はオフセットです。
オフセットはベースアドレスからの相対的な距離で、再起動しても値は変わりません。
ただしゲームがアップデートされると変わることがあります。


そしてもう一つ重要なのが
「The value of the pointer needed to find this address is probably 00DFA030」
の部分です。


要約すると体力のアドレスDFA128にアクセスするために、edxの値DFA030を必要としているという意味です。DFA030というベースアドレスにオフセットのF8を足して、DFA128にアクセスしています。
電卓で計算すると、DFA030+ F8 = DFA128になりますね。


静的アドレスを見つけよう

Cheat Engineのメインウインドウに戻り、edxの値でアドレス検索をします。
New Scanをクリックし、Hexにチェックを入れDFA030を入力し、First Scanをクリックします。



いくつかアドレスがヒットしました。
少しスクロールすると緑色で表示されているアドレスが3つあります。



これが静的アドレスと呼ばれる再起動しても消滅しないアドレスです。


ここで表示されているアドレスはすべてポインターのため、正確に言うと静的なポインターのアドレスになります。Cheat Engineはスキャンしてヒットしたアドレスが、プログラムの.dataセクション内にあるかどうかで静的か動的かを判断しているようです。


3つありますが、こういう場合はアドレス値の一番小さいものを使うのが基本みたいです。 したがって、509B74を使います。先頭の0は含めても含めなくてもどちらでもよいです。


ゲームが起動してからこの509B74にプレイヤーオブジェクトが作成され、プレイヤーの様々な情報にベースアドレスとオフセットを使用してアクセスしています。体力や弾丸のアドレスを特定しても、再起動すると参照できなくなるのはプレイヤーオブジェクトが作成されるアドレスがゲーム起動毎に変わるためです。


これで必要な情報がすべてそろいました。


ポインターを設定する

Cheat Engineメインウィンドウの右下にある「Add Address Manually」をクリックしてアドレスを追加します。



□Pointerをチェックします。



先ほど見つけたアドレス「509B74」とオフセットの「F8」を下記画像のように入力しOKをクリックします。



画像のようにアドレスリストにP->00DFA128と表示され、Valueが正しいことを確認できたらチート完成です。このチートテーブルを保存し、ゲームを再起動して再度アタッチするとそのまま使用できることを確認できます。


このポインター509B74に格納されているアドレスの近辺には、体力以外にもプレイヤーの様々な情報があります。参考までにオフセットのF8を158に変更すれば、グレネードの保持数のアドレスになるので試してみてください。


まとめ

以上で終わりになります。
この記事では静的アドレスを見つけることにフォーカスしていますが、絶対に見つけなければいけないというわけではありません。Cheat Engineのスクリプトを使い、コードを書き換えてしまえば同じことが出来ます。任意のタイミングでスクリプトをオン、オフにすることも可能です。


スクリプトでアドレスを自動で検出する方法


またポインタースキャンという機能もあり、ある程度自動で静的アドレスを見つけ出すことも出来ます。3レベル、4レベルポインターになるとこの記事のやり方では見つけ出すのが大変になります。


ポインタースキャンの使い方。アドレスが変わって困っている方におすすめ


ゲームをチートするにはC言語とアセンブリ言語の知識が必要になりますが、ポイントを絞って学習すれば覚えることはそんなに多くありません。このAssaulet Cubeを一通りチートすることで他のゲームでも出来るようになるのでぜひ挑戦してみてください。


書籍紹介

プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識


Ads for Amazon


管理人も愛読しているおすすめの書籍。
CPUの仕組みからポインター、アセンブラまで幅広く解説されており、
この1冊でチートするうえでの基礎知識を身に付けることが出来ます。


第3版が出版されました。


関連記事

46 Comments

sakai

cheat engineについて

こちらの記事通りの手順でベースアドレスの取得まではいけたのですが、16進数にチェックをいれて4バイトを選択して検索しても一つも見つかりませんでした。
検索範囲はffffffffffffffという感じ広げており設定でも検索に関係しそうな項目はチェックしてます。
8バイトにしても見つからないです。
バイトと2バイトで検索するとたくさんでてきますが数が多すぎて(100万くらい)分かりませんし、絞る方法も分からないです。
もちろん記事通り成功したアドレスもあります。
しかしHP,ST関連のアドレスだと上記のようにヒットしません。
どうすればよいのか教えて頂けませんか?

  • 2020/07/01 (Wed) 13:01
  • REPLY

なんでもチート

To sakaiさん

コメントありがとうございます!
「Find out what writes to this address」で書き込んでいる命令を見つけることは出来ましたか?
もし出来ているなら下記画像のようなウインドウが出現しているはずなので、あとはEDXの値(画像赤枠の部分)でアドレス検索をするだけです。
Value Typeは4バイトです。
https://dotup.org/uploda/dotup.org2189372.png

それでもダメなら、Cheat Engineメインウインドウにある「Add Address Manually」をクリックして、下記画像のようにPointerにチェックを入れ、赤枠に509b74を入力し、緑枠のアドレスをコピーしてアドレス検索してみてください。
緑枠のアドレスがプレイヤーベースになります。
これで静的アドレスが見つかるはずです。
https://dotup.org/uploda/dotup.org2189379.png

現在取得されているベースアドレスと緑枠のアドレスが一致していなければ、ベースアドレスを見つけるまでの手順が間違っているということになります。

  • 2020/07/01 (Wed) 19:42
  • REPLY

sakai

cheat engineについて

下記画像の通りオフセットは分かるのですが、ベースアドレスの取得?ができません。4バイトで16進数にチェックしてサーチしても何もでてきません。
https://32.gigafile.nu/0831-df8d234399c2a870232e8f924f38273ff

画像の共有方法が分からなかったので無料のオンラインストレージを選びました。

  • 2020/07/02 (Thu) 00:19
  • REPLY
ちーたー

なんでもチート

To sakaiさん

この場合スクリプトを組んだほうが早いかもしれません。
OPのアドレスが仮に11A8AE8E704の場合、それに4バイト足した11A8AE8E708に最大値の100が格納されているのですが、確認できますか?
画像の通りだと、[rcx+000000F0]がOPのアドレス、[rcx+000000F4]がOPの最大値のアドレスになるはずです。
間違っていたら申し訳ないです。

  • 2020/07/02 (Thu) 10:42
  • REPLY

チリーン

ゴッドイーターリザレクションでスキン変更のチートをしらべてくれませんかー

  • 2020/07/02 (Thu) 15:13
  • REPLY

sakai

cheat engineについて

https://39.gigafile.nu/0831-b331d293aa7861202a777e70a9180878d

確認が取れました。確かにOPの上限値はOPのアドレスから+4バイトの位置にありました。OPのアドレスは60から63で上限値は64から67です。
それからこのHP,OP,STのアドレスですが、ゲームを再起動する度ではなくミッション毎に変動するようです。なので次のミッションを始めるとこのアドレスは無効になり再度サーチする必要があります。
スプリクトですがここからどうやって組めばいいですか?

  • 2020/07/02 (Thu) 15:40
  • REPLY

sakai

cheat engineについて

とりあえず色々弄ってみて自動アセンブラスクリプトというのをアドレスリストに追加しました。
内容は

{ Game : ge3.exe
Version:
Date : 2020-07-02
Author : tetsu

This script does blah blah blah
}

define(address,"ge3.exe"+68A861)
define(bytes,F3 0F 11 81 F0 00 00 00)

[ENABLE]

assert(address,bytes)
alloc(newmem,$1000,"ge3.exe"+68A861)

label(code)
label(return)

newmem:

code:
movss [rcx+000000F0],xmm0
jmp return

address:
jmp newmem
nop
nop
nop
return:

[DISABLE]

address:
db bytes
// movss [rcx+000000F0],xmm0

dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "ge3.exe"+68A861

"ge3.exe"+68A83D: CC - int 3
"ge3.exe"+68A83E: CC - int 3
"ge3.exe"+68A83F: CC - int 3
"ge3.exe"+68A840: F3 0F 58 89 F0 00 00 00 - addss xmm1,dword ptr [rcx+000000F0]
"ge3.exe"+68A848: F3 0F 10 91 F4 00 00 00 - movss xmm2,[rcx+000000F4]
"ge3.exe"+68A850: 0F 57 C0 - xorps xmm0,xmm0
"ge3.exe"+68A853: 0F 57 DB - xorps xmm3,xmm3
"ge3.exe"+68A856: 0F 2F D9 - comiss xmm3,xmm1
"ge3.exe"+68A859: F3 0F 5D D1 - minss xmm2,xmm1
"ge3.exe"+68A85D: F3 0F 5F C2 - maxss xmm0,xmm2
// ---------- INJECTING HERE ----------
"ge3.exe"+68A861: F3 0F 11 81 F0 00 00 00 - movss [rcx+000000F0],xmm0
// ---------- DONE INJECTING ----------
"ge3.exe"+68A869: 76 34 - jna ge3.exe+68A89F
"ge3.exe"+68A86B: F3 0F 58 89 F8 00 00 00 - addss xmm1,dword ptr [rcx+000000F8]
"ge3.exe"+68A873: F3 0F 10 91 FC 00 00 00 - movss xmm2,[rcx+000000FC]
"ge3.exe"+68A87B: 0F 28 C2 - movaps xmm0,xmm2
"ge3.exe"+68A87E: 0F 2F CA - comiss xmm1,xmm2
"ge3.exe"+68A881: F3 0F 5D C1 - minss xmm0,xmm1
"ge3.exe"+68A885: F3 0F 5F D8 - maxss xmm3,xmm0
"ge3.exe"+68A889: F3 0F 11 99 F8 00 00 00 - movss [rcx+000000F8],xmm3
"ge3.exe"+68A891: 76 0C - jna ge3.exe+68A89F
"ge3.exe"+68A893: F3 0F 5C CA - subss xmm1,xmm2
}

です。
ここからどうように変更したらよいのかが分かりません。
命令する文字を変更したり追加して調整するということは何となく分かりますが命令の意味やスペルは分かりません。(アセンブラ言語とは触れたことないです)
EnableとDisbleのコード入力も必要だと思います(ONとOFFの切り替えのため)
やりたいことはOPの値を固定して無限に弾丸を射てるようにすることです。

  • 2020/07/02 (Thu) 16:33
  • REPLY
ちーたー

なんでもチート

To sakaiさん

ge3.exe+68A861を左クリックで選択後、
Tools -> Auto assemble -> Template -> AOB Injectionと進めてください。
スクリプトの真ん中あたりにnewmem:とあるのでその下に以下の3行を追加
fld [rcx+000000F0]
fstp [rcx+000000F4]
jmp return

File -> Assign to current cheat table
あとは一番左にあるActiveにチェックを入れると完成です。
チェックをはずすと書き換えたコードが元に戻ります。

  • 2020/07/02 (Thu) 18:21
  • REPLY
ちーたー

なんでもチート

To sakaiさん

すいません、間違えました。
fld [rcx+000000F4]
fstp [rcx+000000F0]
jmp return
です。
これでいけるはずです。

  • 2020/07/02 (Thu) 18:40
  • REPLY

sakai

cheat engineについて

ありがとうございます!
AOB注入からではチェックボックスにチェックを入れることができませんでした。(有効化ができません)
AOBの一つ下にある完全注入からやったらできました。
ゲームを再起動しても影響せず有効化できてますが、AOB注入と完全注入とで違いと変更しておく所などありますか?

それから話が少し変わります。
例えばの話なんですけど、ゲームのアイテムアドレスがあると思います。
+16バイトの間隔で600箇所を16進数で+1ずつ追加していくようにするスクリプトを作るにはどのような書き方になりますか?

例 11A8AE8E700から0001(メモリー表示だと01 00)
11A8AE8E710から0002
11A8AE8E720から0003

これを600回続けるという感じです。

またアイテムアドレスが途中から離れている場合
例 11A8AE8E700から0001
11A8AE8E710から0002
11A8AE8E720から000A
11A8AE8E730から000B
11A8AE8E740から000C
11A8AE8E750から0060
11A8AE8E760から0061

などです。
この場合どこからいくつ変わるのかが分かっていることを前提とします。(アイテムアドレスを全て知っている場合)
途中でこのような変化も挟みながらの場合の書き方もお願いします。

  • 2020/07/02 (Thu) 20:28
  • REPLY

sakai

cheat engineについて

OPのスクリプトです。
スクリプト適応時同時にOPの数値とOPの上限値の数値を9999にしたいのですが、どう追記したらいいですか?

9999にしたときのアドレスはOPとその上限値とも00 3C 1C 46(メモリー表示から見た場合) 16進数だと461C3C00になると思います。

何度もすみませんが、よろしくお願いします!

  • 2020/07/02 (Thu) 22:25
  • REPLY

なんでもチート

To sakaiさんTo sakaiさん

AOB Injectionにしておくと、ゲームがアップデートされアドレスがずれ込んだ時も使用できます。
Full Injectionだとassertが実行され、スクリプトがオンに出来なくなります。
違いはそれだけです。

2つ目の質問です。
まずアイテムのアドレスに常時アクセスしている命令を見つけます。
その命令にスクリプトを組んでアイテムのベースアドレスを自分が確保したメモリにコピーし、シンボルに登録してスクリプト外でも使えるようにします。
シンボル名を仮にitemBaseとします。
これでスクリプトをオンにした瞬間にアイテムのベースアドレスを検出できます。
各種アイテムにアクセスするためにオフセットが使用されているはずなので、それをCheat Engineの機能Dissect data structuresを使ってすべて洗い出します。
オフセットF0がアイテム1
オフセットF4がアイテム2
のような感じになってるはずです。

上で作ったスクリプト1の子供としてもう一つスクリプト2を作ります。
スクリプト2では[ itemBase + F0 ]という感じで各種アイテムにアクセスできる状態になっています。
あとはスクリプト2の [ENABLE] セクションにアセンブラで各種アイテムを1ずつ増やしながら、600回ループするように書きます。
スクリプト1をオンにすれば自動でスクリプト2をオンにするように設定します。
スクリプト1にホットキーを設定します。F1など
これでゲーム中、任意のタイミングでオン、オフできるはずです。

スクリプト1に全ての処理を書いてしまうと、このスクリプトを組んだ命令自体がミリ秒単位で実行されているため、すぐカンストしてしまい下手するとゲームがクラッシュします。なので1と2に分けています。

だいたいこんなイメージです。
実際にやっていないので、間違っているかもしれませんがご了承ください。

  • 2020/07/02 (Thu) 22:28
  • REPLY

sakai

cheat engineについて

まだOP9999についての質問の途中ですみません!
加えて聞きますが、アイテム1(始めのアドレス)のアドレスとオフセットは分かりますが、OPの時と同様にサーチしてもベースアドレスの取得ができない場合どうしたらいいですか?

  • 2020/07/02 (Thu) 22:54
  • REPLY

sakai

cheat engineについて

HP,OP,STのアドレスとそれらの上限値は+4バイトした位置にあるみたいです。
なので、HP,OP,STのスクリプトは同じようは手順の書き方で適応できるとおもいました。
OPを9999にしたいというのは、OP同様にHPを固定するスクリプトを有効にしても一撃で即死する強攻撃を受けると一気にHPが0になってしまい死んでしまうからです。ちなみにサーチして取得したHPのアドレスの数値を固定して試した場合は即死する攻撃を受けても死なないです。
それと毒などの継続ダメージも固定できているようで150→149→150といった感じです。
しかしスクリプトの方だと継続ダメージは受付ずそのままHPが減っていきます。
その状態で敵の攻撃を受けて実際に死なないダメージならHPが全回復して即死ダメージだと死にます。
なのでこのダメージ処理を無効化するか常時固定化できるまたは、固定化を最優先にできるようにしたいと思ったためです。
なのでスクリプトで上記の内容+値を9999にするか、どちらか一つは適応したいです。

  • 2020/07/03 (Fri) 00:55
  • REPLY

なんでもチート

To sakaiさん

mov [rcx+000000F4], (float)9999  <- この行を追加
fld [rcx+000000F4]
fstp [rcx+000000F0]
jmp return

このようにすればOPを9999に出来るのを確認しました。
ただスクリプトオンと同時にではなく銃を撃つと9999になります。
スクリプトを組んだ命令が、銃を撃った時に実行される命令だからです。
HPに関しては、「Find out what writes to this address」を実行した状態で即死攻撃を受ければ何かわかるかもしれません。
このゲーム自体チートをするために少し触っただけなので、完全にテストできていません。
「サーチしてもベースアドレスの取得ができない」についてですが、これは静的アドレスのことでしょうか?
それでしたら、ポインタースキャンを使えば見つかるかもしれません。
参考になる動画
https://www.youtube.com/watch?v=SFr0nRjDJfE
あとHPのアドレスを自動検出するスクリプトを作りましたので、これで値を固定すれば無敵になっているはずです。

手順は以下のようになります。
・自分と味方のHPを見つける
・自分と味方1と味方2を区別する値を見つける
・自分のHPにアクセスしている命令を見つける
・その命令にスクリプトを組む
・手動でシンボルに登録したアドレスとオフセットを入力して完成
後日記事にします。





  • 2020/07/04 (Sat) 09:22
  • REPLY
ちーたー

なんでもチート

To チリーンさん

コメントありがとうございます!
ゴッドイーターリザレクションは持ってないですねー。
申し訳ないです。
検索範囲を絞り、スキンを変更した後と前で変わった値を見つけにいく感じですかね。
Googleで検索すれば似たようなケースが見つかるかもしれないです。

  • 2020/07/04 (Sat) 21:42
  • REPLY

sakai

cheat engineについて

OPの9999できました!
HPとSTも同様にできました。
HP9999も攻撃受けてからなるのですが、最初の一撃が即死ダメージだと上限値が9999になりますがHPが0になり死にます。
それからHPのアドレスにアクセスしてある命令を見ていると戦闘不能になったときに一つだけ別のアドレスに思える命令を見つけました。
これをスクリプトにしてHP,OP,ST同様に追記すると戦闘不能にならなくなりました。
正確に言うとHPが0になると戦闘不能にならずそのままHPが全回復します。
即死ダメージではなかった場合はそのままダメージを受けHPが減ります。(inf HPのスクリプトと併用すればHP全回復)
そして問題はここからです。
これはサーチして特定したHPのアドレスを直接固定しても同じ結果になります。
即死ダメージを受けて死ななかった場合、JG(ジャストガード)とダイブガード(ダイブJGも含む)ができなくなります。
JGに関しては判定そのものがない感じで攻撃がすり抜けます。
ガードとジャストガードの処理は別物ということかもしれないですね。
通常ガードだけならできます。
加えてこの状態でスクリプトまたは、固定をOFFにして攻撃を受けてもHPが一切減らなくなります。
その問題はきっとゲーム内部の処理ではHPが0だからだと思います。
これを解決するにはゲーム内部の処理でHPを減らしたり増やすことで解決します。
具体的にはアイテムの回復錠を使ったり回復効果のあるアクセルトリガーを発動させる、敵の能力であるフィールドで継続回復または継続ダメージを受けることでJGとダイブガード(ダメージJGも含む)ができるようになり敵の攻撃を受けるとちゃんとHPが減るようになります。
この問題にならないようにスクリプトを組むことは難しそうですか?

アイテムのアドレスについてはそうだと思います!(サーチして緑色のアドレスです)
この緑色のアドレスはもちろんヒットするのは0件で全くダメでした!
ポインタースキャンの動画見てみたんですがよく分かりませんしでした。(どうしてこうなったんだろうとか今のどうやってやったんだろうとばかりw)
できればで大丈夫なのですがポインタースキャンの方法を具体的に教えて頂けると嬉しいです!

スクリプトでHPのアドレスを特定する方法ですか!
記事楽しみにしています。
本当にありがとうございます!
このゲームはHPの上限値は表示されても現在のHPが表示されないのでNPCのHPを特定するのが自分にはできませんでした笑

  • 2020/07/05 (Sun) 14:29
  • REPLY
ちーたー

なんでもチート

To sakaiさん

ガード判定がなくなるのは謎ですね。
即死攻撃とアイテムを使って回復したときの処理ルーチン付近を、見ていくのが1つの手です。
「Find out what writes to this address」を実行した状態で即死攻撃を受けると、通常攻撃を受けた場合とは別の命令が表示されるはずです。
その命令を逆アセンブラ画面で右クリックから「Replace with code that does nothing」で潰してみたり、その付近の命令や関数をブレークポイントを設定しながら観察するのも効果的です。
アイテムのアドレスはこちらでも調べてみます。

あと新しい記事追加したので、よかったら見てみてください。
説明が足らない部分がありますが、後々肉付けしていきます。
ポインタースキャンの記事は前々から書こうと思っていたので、さっそく書き進めていきます。

  • 2020/07/06 (Mon) 21:30
  • REPLY

sakai

cheat engineについて

新しい記事全て目を通させて頂きました!
早速ですが記事内で、これでスクリプトを組む準備ができました。からが分からないです。オフセットが150でプレイヤーをグループ1にNPCをグループ2に分ける所までは分かります。そこからどうやって7FF74CB28FDAのアドレスに飛んだのかが分かりません。
また、とりあえずHPのアドレスにアクセスしてくるアドレスを逆アセンブラを表示からAOB注入して記事通り追記してリストに追加しようとするとINJECT healthBaseはシンボルリストに追加されることになっていますが、宣言されていませんと出て追加ができませんでした。
既に作成して追加してあるOPスクリプトを複製してからコピペで無理やり追加はできましたが一部注入出来ないコードが存在します。(INJECT healthBaseはシンボルリストに追加されることになっていますが、宣言されていません)これを編集しますか?とでます。いいえを押すと保存されずはいを押すと保存されます。文字は特に変わらずそのまま保存されるだけです。
それから以前OP無限のスクリプトを教えて頂いたときもそうでしたが、AOB注入だとチャックを入れることができず有効化ができません。
それと、アドレスを手動追加からポインターにチェックしてオフセットの下にあるベースアドレスのとこにhealthBaseを入れると赤字になってしまうのとオフセット10と合わせても???????しかでてきませんでした。

  • 2020/07/07 (Tue) 01:46
  • REPLY
ちーたー

なんでもチート

To sakaiさん

「どうやって7FF74CB28FDAのアドレスに飛んだのかが分かりません。」
スクリプトにINJECTと記載がありますが、これは7FF74CB28FDAをINJECTという文字に置き換えています。
記事の一番下に説明を付け足したので読んでみてください。

「AOB注入だとチェックを入れることができず有効化ができません」
ひとまずCheat Engine最新版の7.1を入れてみてはどうでしょうか?
いまインストールしているCheat Engineと共存できるはずです。
私は7.0と7.1の両方がインストールされている状態です。
それをした上でAOB注入のチェックを入れることができるか確かめてみてください。

「healthBaseを入れると赤字になってしまう」
このhealthBaseはスクリプトをオンにしていないと使用できません。
スクリプトが正常に動作していて、かつオンになっている必要があります。
オフにするとhealthBaseはメモリ上のガベージを読み込み使用できません。

  • 2020/07/08 (Wed) 07:23
  • REPLY

sakai

cheat engineについて

cheat engine7.1をインストールしてきました。今は6.82と両方入っている状態です。
7.1ではAOB注入でもチェックを入れることができ有効にできました。情報をありがとうございます!
6.82では書かれていない文字がいくつかありました。
7.1で有効化できたスクリプトを6.82で使用できるか試してみましたがAOB注入だとチェックを入れられず有効化は不可能でした。

7.1でスクリプトを有効にした状態で敵の攻撃を受ける(JGも含む)と検出されるみたいです。
初回の攻撃は受けるとダメージが減り、即死ダメージだとやはり一撃で死んでしまうようです。
しかし初回の攻撃を耐えると2回目の攻撃からダメージを一切受けなくなり通常ガードしかできない(前に記載した内容と同じ現象です)状態になります。
これはスクリプトのみ有効にしていてHPの数値は固定していません。
また、スクリプトをオフにしても被弾してダメージは受けないままです。
やはりゲーム内のアイテムなどを使用して回復すると正常な状態に戻ります。

このスクリプトで2回目の攻撃からダメージを受けなくなってしまうのを無効にすることはできますか?
HP、OP、STのアドレスのみ自動で特定したい場合です。

またSTのアドレスはHPのアドレスから+F0の位置にありました!
STの上限値は+4なのでF4です。

  • 2020/07/09 (Thu) 22:39
  • REPLY
ちーたー

なんでもチート

To sakaiさん

有効化できたようで良かったです!
「通常ガードしかできない状態になり、
スクリプトをオフにしてダメージは受けないままです。」
この辺はなぜだかわかりません。。

そちらの環境で使えるかわかりませんが、チートテーブルをアップロードしたので良ければ使ってみてください。
https://36.gigafile.nu/0721-dab54d83d725bfb7f2d4d2a76460c7aec
F8を押すとアドレスを検出し、F9を押すとHPが9999のままになります。
毒を受けても9999を維持できています。
再度、F9を押すとダメージを受けるようになります。

  • 2020/07/14 (Tue) 20:30
  • REPLY

sakai

cheat engineについて

CTファイルを確認しました。
結果スクリプトをチェックできず有効化ができませんでした。
HPアドレスも違い、こちらはrbxではなくrdxです。
それからアドレスもこちらでは後ろになっているためゲームのバージョンが違うものとア思われます。
最新のバージョンは2.51となっています。
2.51に更新してからもう一度確認できますか?

一応こちらでdbから続くアドレスやrbx→rdxなどの部分を修正したらチェックできるようになりました。
敵の攻撃を受けるとHPアドレスを検出します。ですがやはり2回目の攻撃からは前回書いた内容と同様にダメージを受けなくなります。
それからF9で有効、無効にできるHP9999のスクリプトですが、こちらは攻撃を受けるとHPの上限値は9999になりますがHPは1になってしまいます。
ガードしても1になります。(ジャストガードでも)
尚、即死ダメージだった場合はそのまま死にます。
このスクリプトも2回目からダメージを受けません。(スクリプトを有効、無効どちらも)
それから毒や継続ダメージでHPは固定されず徐々に減っています。
検出したHPアドレスを固定すればもちろん減らないです。
おそらく管理人さんの方でHPが9999であったためHPゲージの減り方の見分けが付かなかったのではと思っています。
cheatengineの方で検出したHPアドレスの数値を確認していると徐々に減っていました。
ゲージ内のHPゲージで確認する場合cheatengineのスクリプトの(float)150にすると分かりやすいと思います。
一応150が通常プレイでの最大値になります。
なので9999にすると通常の約67分の1の減り方になります。
またゲーム内で回復錠などを使うとガードができるようになりダメージも受けるようになりますが2回目からまたガードを受け付けずダメージも受けなくなります。

スクリプトでHPの固定(毒や継続ダメージなど)できるようにしたいです。
これはHPアドレスを検出する方ではなくinf HPの方で大丈夫です。

そして可能ならHPアドレスを検出するスクリプトの方でHPの固定、2回目からダメージを受けなくなるのと地上の通常ガードしかできなくなるのを修正してほしいです。

  • 2020/07/17 (Fri) 14:44
  • REPLY
ちーたー

なんでもチート

To sakaiさん

こちらのGE3はVer1.11ですが、諸事情によりアップデートできないです。
また、スクリプトもこちらでは正常に動作しています。

代替え案としてポインタースキャンをやってみてください。
記事を書きました。
それを見てGE3で静的アドレスを見つければ、値を固定してinf HPを実現できるかもしれません。

手順は以下の通りです。
1. HPのアドレスを見つける(HP1)
2. HP1のポインターマップを作る(マップ1)
3.ミッションを再始動する
4. 再度、HPのアドレスを見つける(HP2)
5. HP2のポインターマップを作る(マップ2)
6. マップ1とマップ2を使いポインタースキャンをする

最後OKをクリックする前に設定を以下の画像のように変更してください。
変更する箇所は赤枠の3か所です。
https://dotup.org/uploda/dotup.org2202314.png
スキャンが終わると、おそらく130ほどポインターがヒットするはずです。
それを下画像の赤枠部分をクリックして、オフセットの少ない順にソートします。
ソートしたポインターを上から3,4つほどアドレスリストに追加して、ミッションを変えたり、ゲームを再起動しても使えるかテストして使えれば成功です。
https://dotup.org/uploda/dotup.org2202310.png

  • 2020/07/17 (Fri) 20:56
  • REPLY

sakai

cheat engineについて

ポインタースキャンを行った結果、上手く特定できました!
今のところ2つアドレスがあります。
1つはミッション開始直前のロード画面でアドレスが変わり、ロードが終わって開始されると同時にHPアドレスに切り替わります。
2つ目は、ミッション開始と同時にHPアドレスに切り替わります。
どちらもミッション開始時にはHPアドレスになるのでどっちが正しいのかは分からないです。
それからHPの上限値もスキャンしてみました。
結果3つヒットしました。
3つともミッション中10秒に1回くらいアドレスが切り替わるので、よく分かりませんでした。
とりあえず3つとも正しいと考えています。

ここから話が変わります。
HPアドレス以外も基本的にゲーム内の現在の数値がcheatengineの値に表示されると思います。
これを予め書き換えたい数値に変更したらゲームとcheatengineを再起動しても値を固定しなくても書き換えた数値を維持するようにする方法はありませんか?
少し説明が複雑ですが、要はcheatengineがアドレスの値の読み込みをしないようにし、固定にチェックを入れることで有効になり変更したい値になるという感じです。

  • 2020/07/20 (Mon) 00:52
  • REPLY

sakai

cheat engineについて

主に下記リンクのゲームでやりたいことがあります。
目を通して置いて頂けると嬉しいです。
https://jrbt.pw/5tA

ちーたー

なんでもチート

To sakaiさん

ポインタースキャンうまくいったようで良かったです!
Cheat Engineなしで目的の値にしたい場合はexeファイルを直接書き換えるやり方があります。
メモリが必要になるので、CodeCaveと呼ばれる使われていないメモリを見つけ、そこに自分のコードを書きこむと出来るかもしれません。
ただ少し上級者向けだと思います。
GodEaterシリーズ、Googleで検索したり、下記のサイトで調べればCTやトレーナーが見つかるはずです。
https://fearlessrevolution.com/index.php

  • 2020/08/01 (Sat) 15:51
  • REPLY

sakai

cheat engineについて

cheat engineで変更したいアドレスの箇所が1000箇所以上あります。それらの箇所を武器、銃、装甲別にアドレスを頻繁に変更する必要があります。それらの1000箇所以上のアドレスを一度変更したい値に書き変えます。ですが、cheat engineは再起動したり新規のセーブデータに適応しようとすると新規は当然アイテムなどは所持していない状態のためそれらのアドレスの値が全て0になってしまいます。
これはcheat engineが現在のアドレスの値を表示しているからです。
なのでcheat engineの値を現在の値ではなく指定した値を表示するだけにしたいのです!それで固定にチェックを入れると実際に書き変えられたらと思いました。

HPのアドレスで例えるとcheat engineの値に現在のHPが表示されていると思いますが、これを150(固定にチェックを入れない限りcheat engineで値を書き変えてもゲーム内には反映されないようにする感じ)にしたらゲーム内でHPが30とか70になってもcheat engineの値を150のままにしたいです。
これで固定にチェックをいれると150になりcheat engineが有効になりゲームでもHPが150固定になるという感じです。

つまり一個一個毎回値を書き変えてから固定するのが大変なのでcheat engineのアドレスの値の読み込みを停止して予め変更した値だけを表示し続けるようにする感じです。

  • 2020/08/06 (Thu) 14:24
  • REPLY
ちーたー

なんでもチート

大変遅くなり申し訳ありません。
同時期にコメントがあったため見逃していました。
おそらく下記のやり方で解決できると思うので、試してみてください。

アドレスリストのどこかを左クリックしてCtrl+Aで全選択し、右クリックからChange Record、Valueを選択すれば一気に値を変更できます。
値をフリーズしたい場合はスペースキーを押します。
20番目から50番目までのアドレスの値を変更したい場合は、20番目を左クリックし、Shiftキーを押しながら50番目を左クリックして上と同じ手順をたどれば出来ます。
別の方法でアドレスリストのどこかを右クリックからCreate HeaderでGroup 1というヘッダーを作成します。そこにアイテムのアドレスの行をドラッグ&ドロップし(複数でも可)、Group 1を右クリックからGroup Config、Activating this entry activates it's childrenでグループ分けした特定のアイテムの値を一気に固定できます。

  • 2020/12/04 (Fri) 20:07
  • REPLY

-

ポイントスキャンしても何も表示されません。
ポイントマップもだめで、色々なバージョンを
インストールしましたが解決されません。
どうすればポイントスキャンできますか?
特別な設定などあるのでしょうか。

  • 2021/01/16 (Sat) 21:04
  • REPLY
ちーたー

なんでもチート

To -さん

いったん別のゲームでやってみてはどうでしょうか。
私もいろんなゲームでポインタースキャンをやってきましたが、できなかったゲームは今のところないです。
ポインタースキャンの記事はこちらにあります。
http://cheatwhatever.com/blog-entry-20.html
記事の最後に実際のゲームでやる場合の手順が書いてあるので、それを見ながらやってみてください。

  • 2021/01/19 (Tue) 19:07
  • REPLY

七色侍

No title

最近cheat engineの勉強を始めました。内容が分かりやすくて参考になります。

このページの『アセンブリ言語を解読する』の章で質問があります。
以下のようにベースアドレスのほかにもアドレスが使用されている
場合、ポインターのオフセット設定はどのように進めればいいでしょうか?
7FF764ED4A65 - 89 7C 33 00 - mov [rbx+rsi+00],edi <<

また、現在解析中のゲームでは上記コードの<rsi>が格納されている
アドレスが特定できません。(ヒット数0個)
この場合の特定方法も知りたいです。

よろしくお願いします。

  • 2021/02/17 (Wed) 18:08
  • REPLY
ちーたー

なんでもチート

To 七色侍さん

コメントありがとうございます。
頂いた質問の回答は以下のようになります。

>ポインターのオフセット設定はどのように進めればいいでしょうか?
一番手っ取り早い方法は、ポインタースキャンです。

通常何らかの値のアドレスを見つけても、ゲームを再起動すると使えなくなりますよね。これを解決するには静的アドレス(静的なポインターのアドレス)とオフセットが必要です。ポインタースキャンを使えばそれらを自動で見つけることが出来ます。
スクリプトでもできますが、Cheat Engineを使い始めたばかりの方にとっては少し敷居がたかくなります。

http://cheatwhatever.com/blog-entry-20.html
上の記事のtutorialをやってみて、何となく使い方がわかったら、実際のゲームで挑戦してみてください。

  • 2021/02/19 (Fri) 20:19
  • REPLY

星野

静的アドレスが見つかりません

全く同じゲームなのですが movではなく sub {ebx + 04} , edi となってしまいます・

ちーたー

なんでもチート

To 星野さん

Find out what writes to this addressではなく、
Find out what accesses this addressでやってみてください。

デモマップとSingleplayerとで命令が違ってきます。
この記事はデモマップでプレイした場合の内容です。

LocalPlayerのHPへのオフセットはF8です。通常、オフセットというのは構造体の先頭アドレス + オフセットになります。

sub [ebx + 04], ediは構造体の途中のアドレス + オフセットとなっており、これはおそらくコンパイラがそれが最適と判断し、生成されたオフセットです。仮のオフセットといえます。

Find out what accesses this addressでやると命令がいくつか出てくるので、一番よく使われている'F8'が正解ということになります。
あとは[xxx + F8]のxxxに格納されているアドレスで検索すれば静的アドレスがヒットするはずです。

  • 2021/05/09 (Sun) 10:34
  • REPLY

-

同じ処理が使いまわしされている場合

例えば取得経験値の計算に
mov [eax],edx
という処理が使われていたとして、この処理がアクセスしているアドレスが数カ所、数十箇所ならまだどうにでもなるのですが、数百数千箇所にアクセスしている場合どうしたらいいのでしょうか
地道にScan for commonalitiesしてやっていくしかないのでしょうか

  • 2021/05/13 (Thu) 16:33
  • REPLY
ちーたー

なんでもチート

Find out what addresses this instruction accesses -> 右クリックからshow register statesでレジスタとスタックのスナップショットが見れます。
経験値のアドレスにアクセスしている場合と、その他でレジスタとスタックの違いを見つけてスクリプト内で選別すればできると思います。

参考動画
https://www.youtube.com/watch?v=niKhAvHm2OA&t=1317s

eaxにアドレスが格納されているのであれば、そのアドレスをポインタースキャンにかけても良さそうです。

  • 2021/05/16 (Sun) 20:10
  • REPLY

-

To なんでもチートさん

レジスタを使うことはありましたが、スタックは完全にスルーしてました…ちょっと試してみます
初歩的な質問にわざわざ答えていただきありがとうございました

  • 2021/05/16 (Sun) 20:48
  • REPLY

ハックルベリー

No title

エミュでゲーム動かして30fpsのゲームを60fps化させたいのですが・・・。
1つだけそうしたいゲームがあるのですが苦節10年
ただ、幸運なことにそのポリゴンゲームはバトル中に演出で一定時間スローモーションになることがあるんです(0.03倍速)
また、技を発動させるとスローになり(同時にグラフィックもおかしくなりますが)、効果が消えると1倍速に戻ります
また、攻撃を当てると一定時間スローになることもあります(グラフィックは正常)(0.2倍速)
つまり、ここを解析すればゲームをスロー状態で遊べるのではないかと
そうすれば倍速で動かせば60fps化できるので感激です
幸運にも半分以下にゲーム速度が落ちる場面が割とあるんです
また、エミュ側で絵だけ倍速にできるため音声は気にしなくてよく
・・・・ということなのですが、これって正解ですかね?
また、fps変更は高難度だと思うのですが、このような好条件のゲームだと素人の私でもできそうでしょうか?
もしくはできる人に頼んだら簡単にできるとかだと嬉しいのですが

  • 2021/07/25 (Sun) 08:18
  • REPLY

-

To ハックルベリーさん

そもそもエミュで倍速にしたところで速度は変えられてもFPS自体は30から変わらないのでは?

  • 2021/07/26 (Mon) 14:40
  • REPLY

ハックルベリー

fpsが60になってゲーム速度が2倍になります。3倍にすれば90fps、4倍なら120fpsでます。その場合はモニターも144Hz必要になりますが

  • 2021/07/27 (Tue) 09:06
  • REPLY

bb

書き換えた値が元に戻る問題等について

非常にためになるサイトを作成いただきありがとうございます。
なんでもチート様のサイトを参照しながら、3D格闘ゲームの場内、場外判定を改ざんするチートを作ろうとしているのですが、以下2点アドバイスをいただけないでしょうか?

1.書き換えた値が元に戻る問題について
場内、場外で変わる値を含むアドレスを2つに絞り、アドレスリストに追加の上、値を変更(場外にいるときに場内の値、逆も同様)したところ、勝手に元の数字に戻ってしまいます。
これはキャラの位置情報によって自動的に判定を書き換える命令がされていると考えられるのでしょうか?(例:リング外の座標にキャラがいるとき、場外判定の値にする)
次にどんな作業を進めていけばいいのかわからず、困っています。
よかったらアドバイスをいただけないでしょうか?

2.命令に変数が複数ある時のポインタとオフセットの設定について
現状にて上記2つの動的アドレスに対する命令をコードファインダーで検索したところ、
A0AE7EDE - movbe[rdi+rax+24],r10d
The value of the pointer needed to find this address is probably 1000000000
RAX=A65FDF70 RDI=100000000
と表示されました。
仮に上記1の元に戻る問題がクリアできたとして、ポインタとオフセットの設定にあたっては、rdiの値で16進数スキャンを行い、表示された静的アドレスをリストに追加、場内場外情報のアドレスのポインタに張り付け、オフセットを24に設定することでクリアできるのでしょうか?現状ではこの作業を行うと、値は場外、場内のいずれの値にもならず、??となってしまいます。

以上2点について、お手数ではございますがご教示いただけたらありがたいです。よろしくお願いいたします。

  • 2021/11/11 (Thu) 12:04
  • REPLY

Kin-Nikuo

FirstScanについて、

最近このサイトを参考に、「cheatengine」や「HxD」でオフラインゲームの内部データをちまちまと弄っている初心者です。
CheatEngineを使っていて、以下の二点について困っているのですがアドバイスいただけたら嬉しいです。

・ゲームによってValueTypeを[all]で検索しても、特定したいそれらしきAddressが見つからない場合があるのですが、そんな場合は他に何かできる事は無いでしょうか?
・addressを特定し、その後アドレスリストでValueを変更しても、数字が任意の数字にならなかったりするケースがあるのですが、これをCheatEngineで自分の任意の数字に変更させる方法はあるのでしょうか?
具体例:
Valueに999と打ち込んでもマックスが255で固定される、
Value打ち込んだ三桁の数字が二桁の他の数字になる、など・・・

  • 2022/05/09 (Mon) 04:25
  • REPLY

-

コードファインダーの段階でゲームが落ちるのですが…

-

記事内体力アドレスが体力を表していない件

体力のアドレスを見つけにいくセクションで2つに絞ったアドレスで、記事では上のアドレスを採用していますが、上の値は私の環境では画面表示用の値を格納している一時保管場所になっており、下の値が実際のHP格納のアドレスになっていました。
つまり、下の値を毎度コピーして上の値が作られているようです。

なので、上の値を固定してもなんどもグレネードでダメージを与え続けると致命ダメージを受けなくても(下の値は減り続けるので)死ぬようです。

  • 2022/09/18 (Sun) 12:53
  • REPLY
ちーたー

なんでもチート

To -さん

コメントありがとうございます。
Assault Cubeの場合、体力とプレイヤーの座標が同じオブジェクトに存在するため、
体力のアドレス - EC = プレイヤーのZ軸(Float型)
上記の式が成り立てば正解のアドレスです。

また、体力のアドレス - F8 = 仮想関数テーブルポインター
このやり方でも正解かどうかを確認できます。

  • 2022/09/19 (Mon) 22:21
  • REPLY