最後にコードの自作の目的と意味IPSwitchでいろいろなコードを試している人はたくさんいるように思います。中にはコードを使うだけで楽しい人もいるかも知れませんが、「自分でもコードを見つけたい」と思っている人もいるかも知れません。いうのは、コードを見つければそのコードはくだらないものであったとしても自身の名前が残る可能性があるからです。ぼくが見つけたのは金イクラドロップ数変更とサーモンランでのスペシャル使用回数変更のコードなので、たまに動画の紹介で名前が載っていることがありますね。ぼくより先にコード見つけた人がいるかも知れませんが、こういうのは公開しないと名前が載りません。実際のところコードはチーム内以外では非公開だったので「なんで勝手に動画化されてるん?」っていう気はしないでもないですが、ちゃんとクレジットがついていてコード自体は公開されていないことを考えると最低限のモラルを持っている人は多いように思います。自作しやすいコードコードの中にも自作しやすいものとそうでないものが存在します。簡単なのは実行ファイル内で定義されている値を変更するもので、これはとてつもなく簡単です。基本的には必要なパラメータが記述されているアドレスを探すだけの作業になります。いう箇所があるのでそこを見れば簡単に見つけることができます。どのあたりにそれらのテーブルがあるかは下のテーブルに載せておくので参考にしてください。テキスト検索をすれば割りと早く見つけられると思います。これらは文字列なのでソースコードのコメントが削除されたVer3.1.0以降のNSOであっても比較的読みやすいはずです。ここから自分がいじりたいと思うパラメータを検索する必要があります。パラメータ名はどこかで見たことがあるものばかりだと思うので、見つけること自体は簡単だと思います。以下にパラメータ名の一例を挙げておきます。メッセージなどとにかくパラメータは多すぎるので、全部書ききることはできません。値を0にするコード先程、最も書きやすいコードは実行ファイル内で定義されている変数を変更するものだと述べました。それらのうち、その値を0にするコードは最も書きやすいです。これを100や1000にするのは意外と難しいのです。スペシャル必要量を0にするコードを書いてみましょう。GHIDRAでELFを分析する場合、メモリ使用量がデフォルトだと1024MBしか使えないためオーバーフローしてしまいます。4096MBを指定すれば最後まで実行できたので、大きめに設定してください。%*GHIDRAを起動させるためのバッチファイル内で最大メモリ使用量が指定できるので、変更しましょう。SpecialCosアドレスは7103711e8aで、その右を見るとXREF[2]の記述から7100038e98でこの値が使われていることがわかります。ダブルクリックするとこのアドレスにとぶことができるので、実際にそのサブルーチンを見てみましょう。サブルーチンというのは、関数(メソッド)内で動く関数みたいなイメージです。サブルーチンの中身ここのサブルーチンの上五行の命令を覚えておきましょう。オフセット逆アセンブラの種類と解析するファイルの種類によってELFをIDAで解析したときに比べてアドレスがズレるのでその値を覚えて置かなければいけません。—これを見るとELFをGHIDRAで逆アセンブルしたときはきれいにアドレスがズレるのですが、NSOを直接解析するとオフセットがおかしな値になってしまうことがわかります。ここで上手い解決法が見つからなかったので、アドレスのズレを上手く固定できる設定を見つけた方は教えてください。ProでELFを解析したときのアドレス(IPSwitchで直接指定できるアドレス)に変換したものを記述します。自身の環境で同じサブルーチンを参照したい場合は、ここのオフセット値を加えたものを使用してください。sub_19A32ACこの五行がスペシャル必要量を設定しているサブルーチンになります。そのサブルーチンを実行したときのレジスタの動きはだいたいこんな感じ(自信がないので間違ってたら指摘ください)で、細かいことはさておいて最終的にはX1レジスタに入っているアドレスが指し示すメモリの値がSpecialCostとして使われます。サブルーチン19A32ACレジスタはこのあとも何度も更新されてしまうので、ここの値を変えることに意味はありません。メモリのアドレスXXXのデータが持つ値を変更するにはどのようなアセンブラを書けば良いでしょうか?もちろん、直接メモリに値を代入するアセンブラが書ければよいのですが、それはできません。メモリに値を代入するためには必ずレジスタからコピーしなければいけないからです。データのコピー先としてメモリのアドレスを直接指定することは不可能です。すればいいのかというと、メモリのアドレスを保持しているレジスタを利用するのです。上の例の場合は、X1レジスタが参照先のメモリのアドレスを保持しているのでこれが利用できます。[X1]例えばこのように書けばアドレスXXXに保存されているデータの値を0に上書きすることができます。X1と書いてしまうと、参照したいメモリのアドレス自体が0に更新されてしまって、データを正しく読み込むことができなくなってしまいます。これでは二行も使ってしまうのでできれば一行で済ませたいところです。そこで、読み込むと必ず0を返すゼロレジスタを利用します。[X1]こう書けばX1の値を0にするコードが一行で書けてしまいます。書くことができました。本来こういった動作はサブルーチン19A32ACで行われます。サブルーチンに入らずに単にX1レジスタの値を変更してしまえば期待通りの動作をするはずです。自体を書き換えてしまいましょう。いう命令で上書きします。これはこのままではアセンブラですので、ARM64が解釈できる機械語に治す必要があります。以下のサイトで簡単に変換できるので試してみましょう。HEXの値をコピーします。340000F9最終的に、このようなコードが得られたら正解です。実は今のサブルーチンは各ブキのパラメータが載っているbprmファイルを読み込んでその値を読み取るという関数でした。ブキのパラメータはアップデータでコロコロと変わるので、実行ファイルに書くよりもパラメータ名だけ定義しておいて外部ファイルから読み込んだほうが合理的というわけです。今回のサブルーチンと全く同じ構造を持ったサブルーチンは多数あります。sub_ABCDEFGつまり、こういうサブルーチンであるなら、BLの命令を上書きしてパラメータの値を0にすることは簡単だということです。基本的にはX1レジスタが指し示す値を変更すれば反映されるはずです。最後にIPSwitchのコード開発第一回は少々長くなりましたが、パラメータ名が実行ファイル内で定義されている値を0に変更するコードの書き方を学習しました。次回はある特定の値に変更する方法を学びたいと思います。自身を天才と信じて疑わないマッドサイエンティスト。十字架の疵は彼女につけられた。EdiZonでコードのフォーマットが違うようです。根本的な仕組みは同じだと思われるので何らかの変換法則があるのだと思います。みたいな表記があると思うので、そこのセミコロンを外して好きな値にしてください。一応、記事内に追記しておくのでそちらも参考にしてください。PMできると思いますが、3.1.0のNSPを持っていない(改造に手を出した頃には既に最新が4.0.0でした)ので動作確認できません。よって、特に移植する予定はありません。PM使い方はここに書いてあるのでご一読ください。https://tkgstrator.work/?p=16126読んでもなおわからないことがあればまたコメントください。AMモデルハックのようなコードをつくりたいのであれば、最初からモデルハックしたほうが楽だと思います。開発のメリットが薄いですし、なによりぼく自身がそのようなコードを知らないので解説できません。PM申し訳ないのですが、モデルハックについては詳しくないので解説できません。3Dモデルを編集するだけだと思うので、調べればやり方は見つかると思われます。コメントをキャンセルメールアドレスが公開されることはありません。