Save 37% off PRO during our Black Friday Sale! »

MODいろいろ / tokaidolug-nagoya-201812

7a45319e68efabaecb9ab6656dd44cae?s=47 unarist
December 23, 2018

MODいろいろ / tokaidolug-nagoya-201812

初出: 東海道らぐ 2018年12月オフな集まり in 名古屋

スライド中に名前が登場しているゲームは18禁ゲームだったりします。よい子はググらないように。

## 関連リンク

BepInEx https://github.com/BepInEx/BepInEx
茜ちゃんの薄い本 https://akaneblue.booth.pm/
茜ちゃん情報 https://akane.blue/

7a45319e68efabaecb9ab6656dd44cae?s=128

unarist

December 23, 2018
Tweet

Transcript

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

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

    https://akaneblue.booth.pm
  3. • 表紙・裏表紙 by ぴけぴけ&8号 • 書ける!local_manifests by ほた • Hexoで簡単にブログを作って公開する話

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

    by するすす • フックとパッチ 〜MODを支える技術 〜 by おばけ • ひらくPCバッグ3種類の考察 by はちみつ • 自宅にサーバーを置くということ by motorailgun • SKKをおすすめしたい! by かるばぶ • Photoshopで縁が綺麗な文字 を作る by8号 • イラスト by ゆいのあ • 完全図解!藍川茜 by ほた&ぴけぴけ 今日はこれのこぼれ話
  5. 対象とするゲーム • 叔父から借金付きで押し付けられたエンパイアクラブや メイド達の面倒みるやつ • 学園中の生徒達をキャラメイクして恋愛シミュレーショ ンするやつ • およびその他Unityゲーム

  6. MODいろいろ • ネイティブ • ネイティブパッチ • .NET • アセンブリに対する事前パッチ(Sybaris, BepInEx)

    • メモリ上で関数を書き換える(BepInEx) • Unity • UnityInjector • 個々のゲーム • .obj .ks 等のゲーム固有ファイル
  7. Sybaris/BepInEx • しばりす・Sybaris • カスタムメイド3D2向けのMODローダー • しばりす自身のインストール含め、事前にパッチプログラムの 実行が不要(ファイルを置くだけで動く) • 現在ではUnityゲーム向けの汎用MODローダーの方向に

    • BepInEx • MIT License で公開されているしばりす的なやつ • 元々はコイカツ等イリュージョン系ゲーム向け • ロード済みアセンブリへのパッチができる(しかも簡単)
  8. ネイティブコードに対するパッチ • Unityゲーの改造でネイティブコードいじることもそう そうないと思うので省略 • ネイティブコードで書かれたUnityプラグインいじる時 • OpenGLとかフックしたい時…?

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

    いじれる • データベースを開いていじって保存するイメージ
  10. アセンブリに対する事前パッチ • しばりすやBepInExは対象ゲームの起動時にスッと割り込 んで、ゲーム本体が各種アセンブリを読み込むより先に メモリ上でパッチを適用する • 仕組みは茜ちゃんの薄い本に書いちゃったので省略 • https://akaneblue.booth.pm/ •

    ワンコインだよ • この分野には詳しくないけど多分よくあるやつ
  11. メモリ上で関数を書き換える • メモリ上にロードされた関数を書き換える • BepInExが前からサポートしてたのはこっちらしい

  12. 書き換える… パッチ済みメソッドの作成 1. リフレクションAPIでILを読み出して、IL書き出しに使える形 に変換しながらコピー 2. 指定されたフックをコピーしたIL群の前後等に差し込み メソッドの差し替え 3. 対象のメソッドとパッチ済みメソッドそれぞれのJITコンパイ

    ル済み関数ポインタを取得 4. VirtualProtectAPIでメモリ空間の保護を解除 5. 元のメソッドの先頭部分に、パッチ済みメソッドにジャンプす る命令(普通にx86/amd64の機械語)を書き込む
  13. 簡単でしょ?

  14. メモリ上で関数を書き換える • 仕組みは高度だがBepInEx(Harmony)を使えば 「FooMethodの先頭でFooModMethodを実行する」とか定 義を書くだけ • 結果的にMono.Cecilで自分でアセンブリやILいじるより楽 • 事前パッチの方が自由度は高い •

    インライン化されるコードの書き換え • クラスやメソッドの追加 • アセンブリ丸ごと差し替え • BepInEx「こういうことしたい時だけ使うといいよ」
  15. UnityInjector • Unity世界のオブジェクトとして自分自身を登録し、そ のコンポーネントとしてプラグインを読み込む • 各コンポーネント(MonoBehaviour)は毎フレーム通知される • ここからグローバル空間や他オブジェクトにアクセスできる • UnityInjector自身は直接パッチ適用したりしばりす等で

    ランタイムに適用されて起動する
  16. .obj .ks 等のゲーム固有ファイル • アセット読み込み処理をフックして、 • 読み込み元ディレクトリを追加したり • 優先順位を制御したり •

    別形式から読み込めるようにしたり • というローダーを別途組み込んでおく
  17. まとめ ☑ 色んなMODの種類がある ☑ MODの裏側ではなんかすごいことしてる ☑ それを知るとちょっと賢くなった気がする 茜ちゃんの薄い本もよろしくね。