Skip to content

Repository files navigation

Astolfo 可読化 Gradle プロジェクト

提供された Astolfo.jar を解析し、IntelliJ IDEA で参照・検索でき、Gradle の runClient から実行できる形に復元したプロジェクトです。

最終ソースは src/main/java のみです。旧 src/readablesrc/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 で開く

  1. IntelliJ IDEA でこのディレクトリの settings.gradle を開きます。
  2. Gradle JVM には Gradle 9.6.1 を実行できるJDKを指定します。検証環境ではJDK 25を使用しました。
  3. Gradle同期後、src/main/java が唯一のJavaソースルートになります。
  4. クライアント実行時のJVMはJava 8です。

.run/Astolfo Client.run.xml には runClient 用のGradle実行構成があります。

Gradle タスク

.\gradlew.bat verifyRecoveredProject --no-daemon
.\gradlew.bat clean build --no-daemon
.\gradlew.bat idea --no-daemon

クライアントを起動する場合:

.\gradlew.bat runClient

Java 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が暗号文字列として保持するクラス/メンバー名の実行時変換
  • 復元した MethodParametersLocalVariableTable

したがって 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=truehasCrashed=falsecrashReporter=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を残し、実行には同じ名前へマップした検証済みバイトコードを使用しています。

About

Astolfo Client latest

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages