提供された Astolfo.jar を解析し、IntelliJ IDEA で参照・検索でき、Gradle の runClient から実行できる形に復元したプロジェクトです。
最終ソースは src/main/java のみです。旧 src/readable と src/decompiled はソースルートから外し、比較用に work/archive へ退避しています。
- 可読化ソース: 4,368 Java ファイル
- 元クライアントのクラス: 4,367
- 実行時名前変換ブリッジ: 1 クラス
- クラスマッピング: 4,367
- フィールドマッピング: 27,183
- メソッドマッピング: 37,221
- 型・用途から復元した引数/ローカル名: 343,712
- 継承・インターフェース契約を修復したメソッド: 323
- 修復した LambdaMetafactory の SAM 名: 26
- 起動クラス:
net.minecraft.client.main.Main
元のデバッグシンボルはZelix KlassMasterによって削除されています。そのため、消失した歴史的な変数名を文字どおり取り戻したものではなく、型、使用箇所、戻り値、例外ハンドラ、ループ、メソッドの役割から一貫した意味名を再構築しています。CFRが制御フロー用に生成した一時値も recoveredStackValue... など、由来が分かる名前へ置換済みです。
- IntelliJ IDEA でこのディレクトリの
settings.gradleを開きます。 - Gradle JVM には Gradle 9.6.1 を実行できるJDKを指定します。検証環境ではJDK 25を使用しました。
- Gradle同期後、
src/main/javaが唯一のJavaソースルートになります。 - クライアント実行時のJVMはJava 8です。
.run/Astolfo Client.run.xml には runClient 用のGradle実行構成があります。
.\gradlew.bat verifyRecoveredProject --no-daemon
.\gradlew.bat clean build --no-daemon
.\gradlew.bat idea --no-daemonクライアントを起動する場合:
.\gradlew.bat runClientJava 8を自動検出できない場合:
.\gradlew.bat runClient `
-Pjava8Executable="C:\path\to\jdk8\bin\java.exe"起動設定はGradleプロパティで変更できます。
.\gradlew.bat runClient `
-PminecraftUsername=Free `
-PminecraftGameDir="E:\MinecraftRuns\Astolfo" `
-PminecraftAssetsDir="C:\Users\name\AppData\Roaming\.minecraft\assets" `
-PminecraftUuid=887341c45ea94dd3bae9bb00502124f1 `
-PminecraftAccessToken=changeme既定のゲームディレクトリはプロジェクト内の run、アセットは %APPDATA%\.minecraft\assets です。
src/main/java は完全な閲覧・解析用ソースです。残存するZKM例外フローの一部はJava構文へ完全に構造化できないため、Gradleの compileJava は意図的に無効化しています。
実行時には元の難読化名を使いません。analysis/Astolfo-readable-runtime.jar に対して以下を適用した可読名バイトコードを使用します。
- 全クラス・フィールド・メソッドのSRGリマップ
- 継承フィールド/メソッド参照を元JARの宣言クラスへ正規化(可読名化後の隠蔽衝突を防止)
- 継承階層と外部インターフェースのメソッド契約修復
- LambdaMetafactoryのSAM名リマップ
- パッケージ移動に伴う可視性修復
- ZKMが暗号文字列として保持するクラス/メンバー名の実行時変換
- 復元した
MethodParametersとLocalVariableTable
したがって runClient は元の original/Astolfo.jar ではなく、可読名の実行JAR build/libs/Astolfo-readable-client.jar を起動します。
| パス | 内容 |
|---|---|
src/main/java |
唯一の最終可読化ソース、4,368ファイル |
src/main/resources |
抽出済みクライアントリソース、4,027ファイル |
analysis/Astolfo-readable.jar |
最終デコンパイル用の可読化・正規化JAR |
analysis/Astolfo-readable-runtime.jar |
Java 8で実行できる可読名ランタイムJAR |
analysis/Astolfo-readable.srg |
完全なクラス/フィールド/メソッドマッピング |
analysis/method-hierarchy-repairs-final.tsv |
継承・外部契約の修復レポート |
analysis/accidental-override-repairs.tsv |
可読名化で生じる偽オーバーライド44件の修復レポート |
analysis/class-name-report.tsv |
クラス名の根拠と復号文字列 |
analysis/decrypted-strings.tsv |
復号できた文字列一覧 |
build/libs/Astolfo-readable-client.jar |
runClient が起動する実行JAR |
build/libs/Astolfo-readable-sources.jar |
IntelliJへ添付可能なソースJAR |
work/archive |
旧ソースツリーの比較用退避先。IDEから除外 |
clean verifyRecoveredProject build idea: 成功- Java 8
-Xverify:allと全宣言メンバー解決: 4,368 / 4,368成功、失敗0 - 実行JARをJava 8で起動し、20秒後にAstolfoメインメニュー
RecoveredGuiScreen004へ到達 - 起動確認時:
running=true、hasCrashed=false、crashReporter=null、クラッシュレポート0件 runClient経由でクライアントスレッドがMinecraft.runGameLoopへ到達、新規クラッシュ0件- 169,377フィールド参照・523,420メソッド参照のリンク種別検証: 不整合0件
NetworkManager.sendPacketのイベント経路回帰テスト: 以前のIncompatibleClassChangeErrorを通過- 偽オーバーライド監査: 修復後の衝突0件、再監査で追加修復0件
- 完全初期化したクライアントへチャットキーイベントを投入:
RecoveredGuiScreen004が開き、クラッシュ0件 src/readable/src/decompiled: 不在src/main/java配下の旧bypassパッケージ: 0ファイル- マッピング後の重複メソッドシグネチャ: 0
元JARと依存JARの整合性:
Astolfo.jar SHA-256 816975C54DBD097194F8C373A23EA383639C779A35C12EDB94AF16A30F6D7AA8
dependencies.jar SHA-256 23DC70FE6109878232A327427256B2A642DB9FEC92793BD3818B86B39C880852
4,368ファイル中1,623ファイルには、少なくとも1つCFRが完全構造化できなかったメソッドがあります。空のスタブへ置き換えて挙動を失わせるのではなく、解析可能な擬似Javaを残し、実行には同じ名前へマップした検証済みバイトコードを使用しています。