Slide 1

Slide 1 text

MODいろいろ unarist 東海道らぐ2018年12月 in 名古屋 (Web公開版)

Slide 2

Slide 2 text

宣伝: 茜ちゃんの薄い本 • 有志によるIT系合同誌 • 紙の書籍版と電子書籍(PDF)版 • C95 3日目に頒布 • https://akaneblue.booth.pm

Slide 3

Slide 3 text

• 表紙・裏表紙 by ぴけぴけ&8号 • 書ける!local_manifests by ほた • Hexoで簡単にブログを作って公開する話 by するすす • フックとパッチ 〜MODを支える技術 〜 by おばけ • ひらくPCバッグ3種類の考察 by はちみつ • 自宅にサーバーを置くということ by motorailgun • SKKをおすすめしたい! by かるばぶ • Photoshopで縁が綺麗な文字 を作る by8号 • イラスト by ゆいのあ • 完全図解!藍川茜 by ほた&ぴけぴけ

Slide 4

Slide 4 text

• 表紙・裏表紙 by ぴけぴけ&8号 • 書ける!local_manifests by ほた • Hexoで簡単にブログを作って公開する話 by するすす • フックとパッチ 〜MODを支える技術 〜 by おばけ • ひらくPCバッグ3種類の考察 by はちみつ • 自宅にサーバーを置くということ by motorailgun • SKKをおすすめしたい! by かるばぶ • Photoshopで縁が綺麗な文字 を作る by8号 • イラスト by ゆいのあ • 完全図解!藍川茜 by ほた&ぴけぴけ 今日はこれのこぼれ話

Slide 5

Slide 5 text

対象とするゲーム • 叔父から借金付きで押し付けられたエンパイアクラブや メイド達の面倒みるやつ • 学園中の生徒達をキャラメイクして恋愛シミュレーショ ンするやつ • およびその他Unityゲーム

Slide 6

Slide 6 text

MODいろいろ • ネイティブ • ネイティブパッチ • .NET • アセンブリに対する事前パッチ(Sybaris, BepInEx) • メモリ上で関数を書き換える(BepInEx) • Unity • UnityInjector • 個々のゲーム • .obj .ks 等のゲーム固有ファイル

Slide 7

Slide 7 text

Sybaris/BepInEx • しばりす・Sybaris • カスタムメイド3D2向けのMODローダー • しばりす自身のインストール含め、事前にパッチプログラムの 実行が不要(ファイルを置くだけで動く) • 現在ではUnityゲーム向けの汎用MODローダーの方向に • BepInEx • MIT License で公開されているしばりす的なやつ • 元々はコイカツ等イリュージョン系ゲーム向け • ロード済みアセンブリへのパッチができる(しかも簡単)

Slide 8

Slide 8 text

ネイティブコードに対するパッチ • Unityゲーの改造でネイティブコードいじることもそう そうないと思うので省略 • ネイティブコードで書かれたUnityプラグインいじる時 • OpenGLとかフックしたい時…?

Slide 9

Slide 9 text

アセンブリに対する事前パッチ • 基本。なんでもできる。 • .NETだと割と楽 • .NETはネイティブDLL等と違って結構な量のメタデータがきれ いに格納されている • Mono.Cecilというライブラリで簡単に(整合性を保ったまま) いじれる • データベースを開いていじって保存するイメージ

Slide 10

Slide 10 text

アセンブリに対する事前パッチ • しばりすやBepInExは対象ゲームの起動時にスッと割り込 んで、ゲーム本体が各種アセンブリを読み込むより先に メモリ上でパッチを適用する • 仕組みは茜ちゃんの薄い本に書いちゃったので省略 • https://akaneblue.booth.pm/ • ワンコインだよ • この分野には詳しくないけど多分よくあるやつ

Slide 11

Slide 11 text

メモリ上で関数を書き換える • メモリ上にロードされた関数を書き換える • BepInExが前からサポートしてたのはこっちらしい

Slide 12

Slide 12 text

書き換える… パッチ済みメソッドの作成 1. リフレクションAPIでILを読み出して、IL書き出しに使える形 に変換しながらコピー 2. 指定されたフックをコピーしたIL群の前後等に差し込み メソッドの差し替え 3. 対象のメソッドとパッチ済みメソッドそれぞれのJITコンパイ ル済み関数ポインタを取得 4. VirtualProtectAPIでメモリ空間の保護を解除 5. 元のメソッドの先頭部分に、パッチ済みメソッドにジャンプす る命令(普通にx86/amd64の機械語)を書き込む

Slide 13

Slide 13 text

簡単でしょ?

Slide 14

Slide 14 text

メモリ上で関数を書き換える • 仕組みは高度だがBepInEx(Harmony)を使えば 「FooMethodの先頭でFooModMethodを実行する」とか定 義を書くだけ • 結果的にMono.Cecilで自分でアセンブリやILいじるより楽 • 事前パッチの方が自由度は高い • インライン化されるコードの書き換え • クラスやメソッドの追加 • アセンブリ丸ごと差し替え • BepInEx「こういうことしたい時だけ使うといいよ」

Slide 15

Slide 15 text

UnityInjector • Unity世界のオブジェクトとして自分自身を登録し、そ のコンポーネントとしてプラグインを読み込む • 各コンポーネント(MonoBehaviour)は毎フレーム通知される • ここからグローバル空間や他オブジェクトにアクセスできる • UnityInjector自身は直接パッチ適用したりしばりす等で ランタイムに適用されて起動する

Slide 16

Slide 16 text

.obj .ks 等のゲーム固有ファイル • アセット読み込み処理をフックして、 • 読み込み元ディレクトリを追加したり • 優先順位を制御したり • 別形式から読み込めるようにしたり • というローダーを別途組み込んでおく

Slide 17

Slide 17 text

まとめ ☑ 色んなMODの種類がある ☑ MODの裏側ではなんかすごいことしてる ☑ それを知るとちょっと賢くなった気がする 茜ちゃんの薄い本もよろしくね。