CoreMod(Modding)

バージョン: forge-1.7.10-10.13.3.1403-1.7.10

概要

 
 

CoreModはclassファイルに記述されているASMを直接いじることでかなり自由なModdingを行うことが出来るシステムである。

基本的な解説は、外部サイトに任せる。

 

MANIFEST.MFを書き換える

build.gradleの設定で自動的にMANIFEST.MFを書き換えできる

何をしているわけでもないのにコンストラクタ呼び出しでClassCircularityErrorで怒られる

一般的にはクラスロード中に同じクラスをロードしようとすると発生する。

例えばクラスTのコンストラクタ呼び出しでこの例外が発生しているとき、Tを読み込むためにTのCoremodを適用中である。Tを読み込むためのCoremodからTを読み込もうとしたら循環して例外となる。

解決策

エントリーポイントとなっている、IFMLLoadingPluginを実装しているクラスに次のアノテーションを付与すれば、そのパッケージ以下はCoremodの適用外となる。

@TransformerExclusions("~パッケージ名~")

ソースコードから対応するバイトコードを生成するソースコードを得る

あるクラスAのソースコードA.javaがあり、これをコンパイルしてA.classを得る。そして、あるクラスBを実行すると出力ファイルとしてA.classと同一のものが得られるとき、このクラスBをAのバイトコードダンパーと言うことにする。

バイトコードダンパーは、EclipseにCoreASM Eclipse Pluginを入れ、バイトコードなるビューを表示することで得られる。

以下にバイトコードのビューの使い方を載せる。

  • エディターにリンク
    • エディターでカーソルを動かすと反応する。
    • 適宜切り替える。
  • 現在のフィールド/メソッドのみのバイトコードを表示
    • カーソルのある部分だけ出てくる。
    • 用途に応じて切り替える。
  • 内部型の表示
    • なんか筆者の環境では灰色になっていてクリックできない。
      • 表示しているバイトコードのコンパイル設定に依存?
      • Java8のバイトコードでも灰色だった。
    • OFFで問題ない。
  • ASMified コードの表示
    • ONにすると、Java言語であるコードが出てくる。
      • asmのライブラリを入れると実際に実行できる。
    • Coremodに関してはOFF状態のコードに用はないので、常時ONにする。
  • 実行スタック・フレームの状態を表示
    • OFFにする。
  • 行情報の表示
    • visitLineNumberが見えるようになる。
    • どっちでもいいが、ONにしとくとデバッグが楽になる。
      • ただしCoremodで使うなら行情報はカオスになるから、余計な騒動を生む危険も。
  • 読み取り可能なバイトコードの表示
    • こちらも筆者の環境では灰色になっている。
    • よくわからないが灰色で問題ないんだから多分OFFで問題なさそう。
  • ローカル変数の表示
    • 一番下にvisitLocalVariableが生成される。
    • ONで良いだろう。
  • Show values in hex format
    • 変数が0xff9900みたいに16進数で表示される。
    • どちらでも行けるが、恐らくOFFの方が一般的だろう。
  • スタックマップの表示
    • 問題のプロパティ
  • スタックマップの展開
    • 問題のプロパティ★。
    • ​両方をOFFにしてスタックマップの生成をやめるか、両方をONにしてスタックマップを展開しなければならないようだ。
    • visitFrameの第一引数にOpcodes.F_NEW以外の物が来ると、LocalVariablesSorter#visitFrameで落ちる。RemappingMethodAdapterはこいつを継承しているので、結果としてリマップが出来なくなる。
  • バイトコード・アナライザー・ペインを表示
    • 実行スタック・フレームの状態を表示と同じ?

現在のフィールド/メソッドのみのバイトコードを表示は、OFFにするとそのまんまバイトコードダンパーのソースコードになっている。これは実行するとバイトコードが得られるメソッドになっているので、mainやFileOutputStreamで実行と保存の機能を追加してやればclassファイルが得られる。

難読化・解難読化

FMLDeobfuscatingRemapperを見るとクラス・メソッド・フィールドのマップが乗っており、クラス用のもの見るとmapとunmapがあって、このクラスを使えばメソッドとフィールドも難読化出来そうである。

・・・と思いきやunmapFieldNameやunmapMethodNameはない

そしたら難読化設定ファイルから勝手に読み取ってやろうと思うと、GenDiffSet#mainを見るとPath to FML's deobfusication_data.lzmaがargs[2]で与えられており、この変数が門外不出になっている。

仕方がないのでFMLDeobfuscatingRemapperのフィールドのアクセサをCoremodで挿入する究極のゴリ押しで何とかする。

最終更新:2015年06月04日 12:29