[Hack] IPSwitchコード作成を楽にするIPSw1tchつくった

Hack

IPSwitchとは

3096/ipswitch
Use text to generate cheats or `.ips` patches to use with Atmosphere. - 3096/ipswitch

ニンテンドースイッチのゲームの実行ファイルにあてるパッチを作成してくれる神ツール。

スイッチ本体に当てたいパッチのリストを送っておいて、それをHBからIPSwitchを起動して好きなものを有効化するという仕組みです。

IPSwitchの問題点

コードを有効化・無効化するという点では全くケチのつけようがないIPSwitchなのですが、コードを検証する側としては若干めんどくさい場面がいくつかありました。

たとえば、SeedHackなどであれば5.1.0向けのコードは以下のような感じでした。

// SeedHack 000000(7) [tkgling]
@disabled
0036C0C0 E00080D2

このコードはシード値として7を設定し、その結果として称号がいちにんまえ以上であれば三つのWAVEすべてで干潮イベントなしというWAVEが発生するコードです。

で、次に例えばシード値として0xB1A6を使いたくなったとしましょう。このとき、コードを変更するというのが大変に煩わしかったのです。

  • まず、SeedHack.exeで求めたいWAVEのシードを出力
    • ここでは仮にそれが0xB1A6とする
  • HEXtoARMでE00080D2をARM命令に変換する
    • MOVZ X0, #0x7というARM命令を得る
  • ARMtoHEXでMOVZ X0, #0xB1A6をHEXに変換する
    • C03496D2というHEXを得る

こういう手順を踏んでようやく、

// SeedHack 212421(B1A6) [tkgling]
@disabled
0036C0C0 C03496D2

こういうIPSwitch形式のコードを作成することができました。でもこれ、正直めんどくさいんですよね。

まず、HEXは機械語で人間が読みやすいようにできていません。それに対してARMは低級ではありますが可読性はありますし、どんな命令が実行されているかもわかるので値を変更することも楽なんですよね。

例えば以下のコードは5.2.0で動作するサーモンランの1WAVEの長さを変更するコードなのですが、00C28152を見て一体これが秒数をいくらにするかさっぱりわかりませんよね?

// Change Salmon Run TotalFrame [tkgling]
@disabled
007260B0 00C28152

で、秒数を変えたいなってなったときにまたさっきのようなめんどくさい手順をとらないといけないのです。

IPSw1tchについて

結局のところIPSwitchの問題点はインラインアセンブラが書けないということに尽きます。これがかければアドレスとアセンブラを書いておしまいなんです。

あれ、でもよく考えたらインラインアセンブラが書ける便利なツールがアリましたよね?そう、当HPでもたびたび紹介しているStarlightです。

[version=310, target=main]
gsys::SystemTask::invokeDrawTV_+284 NOP // enable display debug stuff (which is used for hook)
gsys::SystemTask::invokeDrawTV_+390:
    MOV X1, X0
    MOV X0, X25
    ADRP X2, #0x29A4000 // CoopSetting
    LDR X2, [X2, #0xE08]
    LDR X2, [X2]
    ADRP X3, #0x29AB000 // EventDiretor
    LDR X3, [X3, #0xBC0]
    LDR X3, [X3]
    ADRP X4, #0x29A9000 // PlayerDirector
    LDR X4, [X4, #0xDB8]
    LDR X4, [X4]
    BL renderEntrypoint
    B #0x294

Starlightではこのようにcodehook.slpatchにアセンブラを書いておくことでpythonライブラリの一つであるkeystoneを使ってHEXをすっとばして直接IPS形式のパッチをつくることができました。

で、本来であればこのような仕組みにするのがベストなんですがkeystoneの環境をつくるのが死ぬほどめんどくさいんです。なので今回はkeystoneを使わずにインラインアセンブラが書けるうまい仕組みを考えました。

ARM to HEX Converter

コード開発においてものすごくお世話になっているARM to HEX Converterなのですが、なぜかここ数日繋がらない状況が続いていました。

サービス終了だったら代替サービスがなくて困るなあと思っていたのですが、それは杞憂だったらしくなんとなんとアップデートされてかえってきました!

地味にSSLに対応してる!

そしてアプデされたARM to HEX Converterを開発者ツールで眺めているときに気付いたのです。

convert … ?

これ、変換用のAPIがあるのでは…?

APIをみつけた

これがまさにビンゴでconvertという(内部?)APIがあることがわかりました。

開発者ツールではどんなリクエストを送っているのかはわかりませんが、レスポンスとしてARM64のHEXがJSON形式で返ってきているのがわかります。リクエスト自体はFiddlerなどのパケットキャプチャソフトを使えば調べるのは簡単です。

調べたところ、POSTに必要なヘッダーはContent-LengthとHostだけでした。

完成したもの

そこまでわかればPythonライブラリの一つであるrequestsを使って簡単にAPIを叩けます。おおっぴらにAPIが公開されているわけではないのでなんか怪しい気もしますが…

tkgstrator/IPSw1tch
Contribute to tkgstrator/IPSw1tch development by creating an account on GitHub.
IPSw1tchの実行

ARM命令をHEXに変換してIPSwitch用のパッチができているのがわかりますね!

今後の展望

現在はARM to HEXしかサポートしていないのですが、HEX to ARMもサポートできればいいなと考えています。あとはインスタンス呼び出す際になにか特殊なコマンドを考えて一発で出せるようにしたら楽しいかななんて思ったり。

まあこれもそれもAPIのおかげです、さまさまです。

記事は以上。

コメント

  1. ナカヤマ より:

    知人、友達が承認しているうえでプライベートマッチは違法ですか?

    • えむいー より:

      プライベートマッチをすることは全く違法ではありませんし、LanPlayを使ってイカッチャでプライベートマッチをすることも同様に全く違法性はありません。ニンテンドーネットワークの規約上は外部ツールを利用・経由して「ニンテンドーネットワーク」に接続することは禁止行為となっているのでLanPlay状態でオンラインに繋ぐのは任天堂の規約違反になる可能性がありますが、LanPlay(イカッチャ)はニンテンドーネットワークを経由しないため全く問題ありません(その代わりイカリング2に履歴が残りませんが)

  2. 匿名 より:

    バージョン5.2.1で1 WAVEの長さをどのように拡張しますか?

タイトルとURLをコピーしました