映射表:用编辑器自带的 JSON 导出器(sB)反查字段含义(权威对照)
依据:导出 JSON 时每个 key 后面紧跟被读的字段,所以 key 名就是字段语义。 - 可读载荷 spine398.jar(DecAll 产出)javap -c sB 能直接看到 key 紧跟 getfield; - 未解密载荷用 strings.tsv(class sB, method D) 的密文顺序核对,281 条顺序逐条一致(三段解密器各自成组)。 新增:Gp(骨骼) length/transform/skin;GU(插槽) color/dark/attachment/blend(注意是 B 不是 D); 各附件 GO/GE/Gx/Gr/Gs 与附件基类 Gn;约束 Gw/GX/GD。 修正:删掉被导出器证伪的 Gp.Class=length 与'静姿态 setup 组'推断(C:F 就是 length)。 同步:names.tsv 合并成 297 条,payload-named.zip 重新产出。
This commit is contained in:
1 parent
7f519edc67
commit
bb817b85e5
3 files changed
+274
-25
No files matched your search
@@ -383,3 +383,80 @@ macOS 文件系统大小写不敏感,解到目录里会互相覆盖 —— 所
|
||||
- 20 个新建插槽的图片附件:`x/y/rotation` 从 `-99.49988 / -302.0 / 40.00014`、`scaleX/scaleY` 从 `1.997 / 1.532` → 全部重置为 `0/0/0` 与 `1/1`(宽度高度 157x154 保持不变)。
|
||||
- 20 个 `Hi` 占位附件全部删除;骨架附件表 `43 → 23`(正好 23 个插槽各 1 个图片附件)。
|
||||
- 删除占位附件**不会**连带删掉图片附件:日志里逐个核对了"删除后该插槽当前附件=GO"。
|
||||
|
||||
---
|
||||
|
||||
## 九、权威对照:编辑器自带的 JSON 导出器(2026-10-16)
|
||||
|
||||
**思路**:编辑器导出 Spine JSON 时,写 key 的那段代码里,key 后面紧跟的就是它读的那个字段。
|
||||
所以"JSON key ↔ 混淆字段"的对照不用猜,直接读导出器即可。这一节就是那份对照,**已确认**。
|
||||
|
||||
**导出器是谁**:载荷类 `sB`(构造骨架 JSON 的执行者),两个关键方法
|
||||
|
||||
| 方法 | 干什么 |
|
||||
| --- | --- |
|
||||
| `sB.D(GP, boolean, boolean, gy, StringBuilder)` | 写骨架 JSON:`bones` / `slots` / `ik` / `transform` / `path` / `skins` / `events` / `animations` |
|
||||
| `sB.D(gy, String, Gn, boolean)` | 写一个附件(region / point / mesh / boundingbox / clipping) |
|
||||
|
||||
**怎么拿到明文**(两条独立证据,顺序逐条一致):
|
||||
|
||||
1. `~/Desktop/spine398/spine398.jar` 是可读载荷(`DecAll` 产出:`ldc 密文` 已换成明文、解密调用已换成 `nop`)。
|
||||
`javap -p -c -cp spine398.jar sB` 就能看到 `ldc "rotation"` 紧跟 `getfield Gp.F:F`。
|
||||
2. 未解密的载荷走 `strings.tsv`(`class sB, method D`,281 条):同一 (类, 方法) 内**密文顺序 = 字节码顺序**,
|
||||
与可读副本里的 key 顺序**逐条对得上**(该类的三段解密器 `za$Zr.J` / `aeB$Cp.I` / `aaQ$Wm.x` 各自成组、组内按方法顺序)。
|
||||
|
||||
### 骨骼 `Gp`
|
||||
|
||||
| 字段(带描述符) | JSON key | 备注 |
|
||||
| --- | --- | --- |
|
||||
| `D:Ljava/lang/String;` | name | |
|
||||
| `D:LGp;` | parent | 父骨骼 |
|
||||
| `C:F` | **length** | ⚠️ 之前写的 `Class:F=length` 作废 |
|
||||
| `F:F` | rotation | |
|
||||
| `Z:F` / `V:F` | x / y | |
|
||||
| `Code:F` / `SourceFile:F` | scaleX / scaleY | |
|
||||
| `StackMapTable:F` / `LineNumberTable:F` | shearX / shearY | |
|
||||
| `D:LiC;` | transform | `iC` = 继承模式枚举 |
|
||||
| `String:Z` | skin | 布尔:该骨骼是否覆盖当前 skin |
|
||||
| `B:Lcom/badlogic/gdx/graphics/Color;` | color | |
|
||||
|
||||
> 同时**作废**了原先"静姿态那一组 `D/B/L/I/S/C` = setupX…"的推断:`C:F` 被导出器证明是 `length`,
|
||||
> 那一组整体不成立,现在这些 float 的语义**未定**(宁可显示混淆名,也不写错名)。
|
||||
|
||||
### 插槽 `GU`
|
||||
|
||||
| 字段(带描述符) | JSON key | 备注 |
|
||||
| --- | --- | --- |
|
||||
| `D:Ljava/lang/String;` | name | |
|
||||
| `D:LGp;` | bone | 所属骨骼 |
|
||||
| `B:Lcom/badlogic/gdx/graphics/Color;` | **color** | ⚠️ 是 `B`,不是 `D`(之前写错了) |
|
||||
| `I:Lcom/badlogic/gdx/graphics/Color;` | dark | 二色染色的暗色 |
|
||||
| `I:Z` | —("dark" 的开关) | 写 `dark` 之前先看它 |
|
||||
| `B:LGn;` | **attachment** | ⚠️ 是 `B`,不是 `D`(之前写错了) |
|
||||
| `D:Liz;` | blend | `iz` = 混合模式枚举 |
|
||||
|
||||
### 附件(基类 `Gn` + 各子类)
|
||||
|
||||
| 类 | 字段(带描述符) | JSON key |
|
||||
| --- | --- | --- |
|
||||
| `Gn` | `D:Ljava/lang/String;` | name(附件名) |
|
||||
| `GO`(图片) | `D:Color` / `D:F` / `B:F` / `L:F` / `I:F` / `S:F` / `C:F` / `Z:F` / `B:Ljava/lang/String;` | color / x / y / scaleX / scaleY / rotation / width / height / path |
|
||||
| `GE`(点) | `B:Color` / `D:F` / `B:F` / `L:F` | color / x / y / rotation |
|
||||
| `Gx`(网格) | `B:Color` / `B:Ljava/lang/String;` / `D:Lga;` / `D:Lhp;` / `B:LHl;` / `L:I` / `D:Lgf;` / `StackMapTable:Z` / `D:F` / `B:F` | color / path / uvs / triangles / vertices / hull(=L/2) / edges / deform / width / height |
|
||||
| `Gx`(linkedmesh 分支) | `D:LGx;` / `D:LGT;` / `D:LHi;` / `D:Ljava/lang/String;` | parentMesh / skin / parentPlaceholder / parentName |
|
||||
| `Gr`(包围盒) | `I:Lga;` / `B:LHl;` / `B:Color` | vertexCount / vertices / color |
|
||||
| `Gs`(裁剪) | `I:Lga;` / `B:LHl;` / `B:Color` / `B:LGU;` | vertexCount / vertices / color / end(结束插槽) |
|
||||
|
||||
### 约束(顺带一起确认)
|
||||
|
||||
| 类 | 字段 → key |
|
||||
| --- | --- |
|
||||
| `Gw`(IK) | `D:String`=name、`D:LGp;`=target、`D:F`=mix、`L:F`=softness、`F:Z`=uniform、`S:Z`=stretch、`Z:Z`=compress |
|
||||
| `GX`(变换) | name、target(`B:LGp;`)、rotation(`SourceFile:F`)、local(`S:Z`)、relative(`C:Z`)、x(`L:F`)、y(`I:F`)、scaleX(`StackMapTable:F`)、scaleY(`init:F`)、shearY(`LineNumberTable:F`)、rotateMix(`S:F`)、translateMix(`D:F`)、scaleMix(`Z:F`)、shearMix(`F:F`) |
|
||||
| `GD`(路径) | name、target(`D:LGU;` 是**插槽**)、positionMode(`D:Ljm;`)、spacingMode(`D:Ljo;`)、rotateMode(`D:Ljn;`)、rotation(`Z:F`)、position(`D:F`)、spacing(`V:F`)、rotateMix(`S:F`)、translateMix(`L:F`) |
|
||||
|
||||
### 落表位置
|
||||
|
||||
以上全部写进了 `tools/deobf/anchors.tsv`(末尾"【权威来源】JSON 导出器"一节),再合并进
|
||||
`tools/deobf/names.tsv`(297 条),面板 Inspector 会按"真名(混淆名)"显示。
|
||||
重命名载荷也已同步产出:`/tmp/spinework/payload-named.zip`(4176 个类,5247 处成员引用)。
|
||||
Reference in new issue
Block a user