首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Quartett! 二進制腳本格式深度分析與反編譯實作

     編輯:Java 相關知識

背景與發現

接手《Quartett!》漢化專案,從 Script.dat 提取的腳本檔案命名為 MD5 雜湊值(如 0a69b4afebd6d64527a21e3f1aa993f9.tkn),內容為二進制格式。初步觀察發現:

  • 檔案開頭為 TOKENSETd 特徵碼
  • 可見 ASCII 字串:base_path、include、Script/BaseInstruction.txt、motion、Main
  • 字串以 0x00 結尾(C 風格),前導有一個高位元組(0x81、0x83、0x85 等)
  • 高位元組前有三個 0x00,再前一個非零位元組

格式逆向工程過程

第一版掃描:固定模式匹配

尋找「三個 0x00 + 高位元組 (0x80-0x88) + C 字串」模式,提取:

0x1C 0x0C 0x81 base_path
0x2B 0x0C 0x83 ..
0x3B 0x16 0x81 include
0x48 0x16 0x83 Script/BaseInstruction.txt
0x68 0x20 0x81 motion
0x74 0x20 0x81 Main

發現「奇怪數字」(0x0C、0x16、0x20)遞增,推測為行號或 Token 索引。

第二版:擴展高位元組範圍

加入 0x85(單字符運算子如 #),確認高位元組為 Token 類型標記:

值類型範例
0x80十進制數字123
0x81識別符base_path, motion
0x82十六進制數字0xFF
0x83字串字面值"../"
0x85運算子/符號#, {, }, (, )

關鍵突破:檔案頭部 Token 總數

特徵碼後 4 位元組(0x08 0x00 0x00 0x00 = 2048 = 0x800)非版本號,實為 Token 總數。修正掃描邏輯:依序讀取「行號 (int32) + 類型 (byte) + C 字串」重複 Token 總次數。

結構確認:僅詞法分析結果

此「二進制腳本」實為 Scanner (Lexer) 輸出,保留完整 Token 序列(含行號、類型、原文),未經 Parser 語法分析。註解已被移除,空白行保留為行號間隔。

反編譯器實作 (C#)

核心邏輯

// 讀取 Token 總數
int tokenCount = reader.ReadInt32();

for (int i = 0; i < tokenCount; i++) {
  int lineNum = reader.ReadInt32();      // 行號
  TokenType type = (TokenType)reader.ReadByte(); // 類型
  string text = ReadCString(reader);     // 原文
  
  // 處理換行與縮排
  if (lastLineNum < lineNum) {
    WriteEmptyLines(lastLineNum, lineNum);
    WriteIndent(tabCount);
  }
  
  // 依類型格式化輸出
  switch (type) {
    case TokenType.String:
      Write("\"" + text + "\"");
      break;
    case TokenType.Operator:
      FormatOperator(text);  // { 增加縮排、} 減少縮排、; 換行等
      break;
    default:
      Write(text + (NeedSpaceBeforeNext(type) ? " " : ""));
  }
  
  lastLineNum = lineNum;
  lastType = type;
}

運算子格式化規則

  • {:輸出後增加縮排層級
  • }:減少縮排、刪除前一個縮排、輸出
  • ; , ( =:後加空格
  • ):前加空格
  • # % - @:直接輸出

反編譯結果範例

1.
2.
...
11. #base_path "../"
12.
...
21. #include "Script/BaseInstruction.txt"
22.
...
31. motion Main ( )

還原出近似原始碼結構,包含指令、引入、函式定義。空白行對應原始碼註解或空行位置。

後續擴充方向

  • 實作 Parser:依語法規則建構 AST,進一步還原控制流程、運算式結構
  • 整合至漢化工具鏈:自動提取字串 → 翻譯 → 重建腳本 → 打包資源
  • 支援修改腳本邏輯:修正 Bug、調整遊戲流程

原始碼授權

分析工具原始碼以 BSD License 釋出,歡迎遵循授權條款自由使用、修改、散布。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved