【3DSチート入門⑤】Gatewayチートコードの作成方法

3DSチート

はじめに

前回の続きです

今回はGateway条件と呼ばれるコード形式について書きます

これを抑えれば、自分で自由にチートを作ったり、他人のコードを読むこともできるでしょう

コードの形

これは前回、サーチした結果から、New cheatを押して、自動で生成されたコードです

D3000000 08000000
00971F90 42F8D46F
D2000000 00000000

左に8桁、右に8桁と書いて、1行で1つの命令となります

行始め(左側の頭文字)で命令を指定し、あとはその命令の書式に従います

上記画像の赤くなっている文字(1行目D3、2行目0、3行目D2)が命令を指定している箇所になります

以下にその命令と書式を書いていきます

D3 offset(オフセット)

上記コードの1行目から順に見ていきます

D3000000 08000000

D3から始まる命令になります

これの書式は

オフセットにxの値を代入

D3000000 xxxxxxxx

x = 任意の値

になります

オフセットは後に紹介する命令で使います

多くの命令で、「アドレス + オフセットを〇〇する」のように使われます

また、もう一度同じ画像を貼りましたが、右側にはコードの説明が書かれています

Offset#1 = 08000000

「=」は代入、「==」が等しいを表していますので、これはオフセットに「8000000」を代入する意味になります(#1となっているのは別のオフセットを保持できる#2も用意されている為です、次回完全版のGatewayリストを載せます)

0, 1, 2 byte指定の書き込み

上記コードの2行目がこれに当たります

00971F90 42F8D46F

0から始まる命令です

これの書式は

4byte書き込み

0xxxxxxx yyyyyyyy

x = アドレス
y = 書き込む値

になります

xで指定したアドレス + オフセットに、4byteで、yの値を書き込みます

上記コードでは、offset + アドレス「971F90」に、値「42F8D46F」を書き込む命令になります

また、2byte、1byte単位で書き込みたい場合は頭文字12を使用します

2byte書き込み

1xxxxxxx 0000yyyy

x = アドレス
y = 書き込む値
1byte書き込み

2xxxxxxx 000000yy

x = アドレス
y = 書き込む値

4byte書き込みで「000000yy」だとyyの隣3byteを00で書き込んでいるので注意

逆に1byte書き込みで「yyyyyyyy」だと始めのy6つは無視されます

また、【3DSチート入門③】で紹介したエンディアンの違いもあるので注意

1byte(2桁の英数字)ごとに、HexEditorとGatewayコードでは並び順が逆になります

サンプルコード
MH4Gアイテムポーチ1枠目に怪力の種を5個セット

D3000000 00000000
0833CD8C 000500C5
D2000000 00000000

それぞれ2byteで、アドレス「833CD8C」「833CD8D」がアイテムポーチ1枠目のアイテムID、アドレス「833CD8E」「833CD8F」が個数のデータなので、4byte書き込みでアドレス「833CD8C」から怪力の種のID「00C5」、個数を16進数で「0005」をコードに入れました

アドレスが7桁で書き込み命令だとオフセットを使う必要はないので、以下の1行のみでも問題ないです

D2 終了宣言

3行目で使用している

終了宣言

D2000000 00000000

オフセットなど全てを初期化するので、チートを複数に分けなくても、1つに纏めて書くことができます

B ポインター

オフセットに、オフセット + xのアドレスにある値(4byte)をオフセットに設定

Bxxxxxxx 00000000

x = アドレス
サンプルコード
MH4G万能湯けむり玉無限設置

B1062ED4 00000000
2000A840 00000000
D2000000 00000000

アドレス「1062ED4」はクエスト中プレイヤー関係のデータを指し示すベースアドレスです

オフセットに、オフセット(この時点では0) + 「1062ED4」の値を代入し、その値 + A820したアドレスの値を書き換えています

プレイヤー関係データの始まりから+A840した位置の値が「00」の時は湯けむり設置可能状態、「01」の時は湯けむり設置不可状態なので、「00」で固定することで無限設置ができます

D4 ~ DB データレジスタ

オフセットはアドレスを入れる箱として使われますが、値(データ)を入れる箱として使われるのがデータレジスタです

D4000000 XXXXXXXX – レジスタにxの値を加算

D5000000 XXXXXXXX – レジスタにxの値を代入

D6000000 XXXXXXXX – オフセット + xのアドレスにdataを4byteで書き込み、オフセットを+4する

D7000000 XXXXXXXX – オフセット + xのアドレスにdataを2byteで書き込み、オフセットを+2する

D8000000 XXXXXXXX – オフセット + xのアドレスにdataを1byteで書き込み、オフセットを+1する

D9000000 XXXXXXXX – dataに4byteでオフセット + xのアドレスの値を代入

DA000000 XXXXXXXX – dataに2byteでオフセット + xのアドレスの値を代入

DB000000 XXXXXXXX – dataに1byteでオフセット + xのアドレスの値を代入
サンプルコード
MH4GモンスターHP表示(アイテムポーチ1枠目の個数にモンスター1のHPを代入)

B81A6450 00000000
DA000000 00001218
D3000000 00000000
B1062ED4 00000000
D7000000 00001090
D2000000 00000000

「81A6450」にはモンスター1体目のベースアドレスがあり、その値に+1218した場所がHPです

「1062ED4」にはプレイヤーデータのベースアドレスがあり、その値に+1090した場所がクエスト中アイテムポーチ1枠目の個数です(クエスト中はセーブデータアドレスの値が変動しない)

どちらも2byteのデータですので、DA, D7を使用してHPをアイテム個数に代入します

1行目でオフセットにアドレス「81A6450」の値が入り、2行目でその値+1218したアドレスの値(HP)をDAでデータレジスタに格納します

3行目でオフセットを0に初期化します

4行目でオフセットにアドレス「1062ED4」の値が入り、5行目でその値+1090したアドレスの値(ポーチ1個数)にD7でデータレジスタに格納されている値(HP)を代入しています

C0, D0 ループ(繰り返し)

C0000000 xxxxxxxx – ループ回数

D1000000 00000000 – ループの実行

ループを開始する行にC0、ループを終了する行にD1を記述します

サンプルコード
MH4Gアイテムboxの全中身を個数99個に

D3000000 083303D8
C0000000 00000578
10000000 00000063
DC000000 00000004
D1000000 00000000
D2000000 00000000

アイテムboxはアドレス「83303D6」から始まり(アイテムID)、1枠目の個数はその隣の「83303D8」にあり、どちらも2byteで、以降のアドレスは+4ずつ加算されるので、ループの度にオフセットを4加算することで、ループ毎に違うアドレスの値を書き換えることができます

1行目でオフセットを設定、2行目でループ回数をbox1ページ100個が14ページあるので1400回の16進数で578回に設定、3行目でオフセットのアドレスの値を99個の16進数で63個に書き込み、4行目のDCはオフセットを加算する命令でアドレスを+4、5行目でループの実行、6行目で終了宣言です

3, 4, 5, 6, DD if条件

もし条件を満たしていた場合のみ、以下のコードが実行される命令です

全て4byteの比較

3XXXXXXX YYYYYYYY – yがオフセット + xのアドレスにある値より大きい時

4XXXXXXX YYYYYYYY – yがオフセット + xのアドレスにある値より小さい時

5XXXXXXX YYYYYYYY – yとオフセット + xのアドレスにある値が等しい時

6XXXXXXX YYYYYYYY – yとオフセット + xのアドレスにある値が等しくない時
ボタン入力がされている間のみ条件を満たす

DD000000 xxxxxxxx

x = 

0x1         A
0x2         B
0x4         Select
0x8         Start
0x10        Right
0x20        Left
0x40        Up
0x80        Down
0x100       R
0x200       L
0x400       X
0x800       Y
0x1000      Debug	
0x2000      Not-Folded
0x4000      ZL (N3DS Only)
0x8000      ZR (N3DS Only)
0x100000    Touchpad (any position)
0x1000000   CStick-Right (N3DS Only)
0x2000000   CStick-Left (N3DS Only)
0x4000000   CStick-Up (N3DS Only)
0x8000000   CStick-Down (N3DS Only)
0x10000000  CPad-Right
0x20000000  CPad-Left
0x40000000  CPad-Up
0x80000000  CPad-Down
サンプルコード
R+Downボタンが押されている場合に以下のコードを実行する(これを頭につける)

DD000000 00000180

おわり

これくらい抑えれば、後は命令と書式を見て自由にコードが作れると思います

次回Gateway条件一覧を、日本語で見やすくまとめたいです

コメント

  1. 【3DSチート入門⑤】Gatewayチートコードの作成方法 | blog.mh4.jp
    [url=http://www.gacw427m1w062a1p01sdyp837nlqm395s.org/]uxfmrjymrl[/url]
    axfmrjymrl
    xfmrjymrl http://www.gacw427m1w062a1p01sdyp837nlqm395s.org/

  2. 初めまして失礼します。
    アイテムの個数で並びを確認したいと思っているのですが、Gatewayコード形式でどう記入すればいいのか分りません。
    C0000000 000001FC
    20111111 00000001
    DC000000 00000002
    D1000000 00000000
    このコードのままでは全部1個で書き換えなので、次のアドレスに進む毎に+1づつ増やしたいのですが、どの様にすれば良いでしょうか。お手数ですが教えて頂きたいです。

  3. コメント失礼します
    ポインターで指定したアドレスから数を引きたいのですがどういったコードを書けば良いのか分かりません。
    B0676D64 00000000
    00001F50 43A00000
    上のコードだとポインターアドレスの値から1F50を足したアドレスに43A0~を代入する事になると思うのですが1F50引くにはどうすれば良いでしょうか?

    • 記事を読み返して、試したら解決しました💦
      お騒がせしました

  4. アイテムを譲渡する時のレア度による制限を無効化するなんてことも可能なのでしょうか?

    • 過去に挑戦してみましたができなかったです
      絶対できないとは言い切れないんですが、チート使える自分側で渡せるようにしても、チート使えない相手側でチェック入っちゃって渡せないのかなと思います