Wdream

Personal Website

The Sky's The Limit.


Live2D Spine资源解包

目录

自用处理脚本:

violet-wdream/.Scripts: Personal AssetUnpack Script

游戏包名-版本:

包名:Qoo获取/最近下载的目录。版本:模拟器右键查看信息。

或者用Blocker查看Release v2.0.5839 · lihenggui/blocker

参考过的攻略:

基础的解包教学 - 教学 - Live2DHub

二油资源下载器:

https://live2dhub.com/uploads/short-url/4CePVk4JsJ8tWfEZK6uBtfXGxZI.zip 资源少来,自蝙蝠侠《放置少女》立绘分享 - 资源 - Live2DHub

resdownloader - Software Download 资源多,要手动设置代理,跟模拟器代理一个操作。代理软件开局域网连接,ipconfig查一下局域网的IPv4拼接一下代理端口。EroLab基本上就那几个头牌能看,其他的都是3A大作啊我看,看一眼封面都懒得下载了。

image-20251116141643552

如何给模拟器设置代理:

  1. 代理软件打开局域网连接。
  2. 模拟器内设置WLAN信息,主机名为物理机IPv4地址,端口为代理软件端口,保存。
  3. image-20251113144509044

一个重要的结论,如果你能提取一部分的资源,但是不能提取另一部分(出错),大概率是需要APK静态资源和热更新资源合并。这个结论适用于所有加密方式。因为APK里面已经有的资源肯定不会再让你下载一遍,所以这两个部分必须要合并。在某些资源缺失/解密错误时候可以尝试。

后续如果还需要获取新角色模型可以记住文件路径,然后更新后按照时间排序。

比如碧蓝航线的的就很简单

AS合集

  1. Mod版本Release AssetStudioMod v0.19.0 · aelurum/AssetStudio: 可以一键导出Live2D,可识别FakeHeader,不能解UniyCN
  2. Raz版本RazTools/Studio: Modded AssetStudio with new features:可以解各种游戏的加密,包括FakeHeader, UnityCN在内的加密
  3. AXIX版本AXiX-official/Studio: Modded AssetStudio with new features:在Raz版本的基础上新增了一些游戏的Key
  4. PtN版本无期迷途 - Google Drive:无期迷途特供版,来自Live2DHub网友Yjzy,解了FakeHeader和UnityCN同时破解了hash参数。百度网盘链接: https://pan.baidu.com/s/18dJhlonBf2YPKjLIqDGMbw 提取码: njrj
  5. Plugin版本https://github.com/Ahykal/StudioPluginVer:能解密同时还能导出L2D,但是在导出少前L2D时候发生了异常没处理,然后直接GUI崩了。一坨。

一般就是如果Live2D模型有加密很麻烦,因为L2D的文件在Unity会被处理过,比如moc3文件会被拆分成bytes然后需要你拼接,motions文件会变成fade文件需要转换成标准形式。现在基本上能解密的都不支持一键导出Live2D,能导出的都不会解密。

我猜测是这些AS直接集成了UnityExtractor。如果用能解密的版本先处理成未加密状态然后再把数据传给提取器应该就行了。

目前只有个Plugin版本可行,但是行的不是很多。。

有个Linq选择异常,没有处理。

************** 异常文本 **************
System.InvalidOperationException: Sequence contains no matching element
   at System.Linq.ThrowHelper.ThrowNoMatchException()
   at UnityLive2DExtractor.Live2DExtractor.Extract(AssetsManager assetsManager, String folderPath) in E:\Project\Ahykal\StudioPluginVer\Plugins\Live2d\Live2DExtractor.cs:line 456
   at Plugins.Ahykal.L2DPlugin.<>c__DisplayClass6_1.<Run>b__7() in E:\Project\Ahykal\StudioPluginVer\Plugins\Live2d\L2DPlugin.cs:line 24
   at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
   at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location ---
   at Plugins.Ahykal.L2DPlugin.<>c__DisplayClass6_0.<<Run>b__6>d.MoveNext() in E:\Project\Ahykal\StudioPluginVer\Plugins\Live2d\L2DPlugin.cs:line 24
--- End of stack trace from previous location ---
   at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__128_0(Object state)
   at InvokeStub_SendOrPostCallback.Invoke(Object, Object, IntPtr*)
   at System.Reflection.MethodInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr)

Spine添加皮肤(插槽变化)的一种办法:新建config,然后控制器里添加需要变更的插槽id,保存,然后就会记录这几个插槽的当前value,如果需要有的是半透明的可以单独放在另一个id组里面,然后value改一下。

image-20260117005706738

碧蓝航线(Azurlane) Spine/Live2D - 无加密 - 可更新 简单

这么多游戏看下来还是碧蓝航线nb,角色一个比一个扫,文件放的位置清晰明了,角色文件命名简单,还是独立文件,没有加密。

味大,无需多言,二油Goat!

b服版本最高,模拟器搜索b服下载,和谐的皮肤后缀是hx,有单独的文件。所以不需要进行反和谐操作。

参考AL 逆向解包:live2d, spine 动态立绘,背景图_live2dhub-CSDN博客

Spine路径

立绘复原

好麻烦wc,拉倒吧。。。

模型被分尸了,分散在了四个文件夹里面,需要获取这四个文件夹的内容

/Android/data/com.bilibili.azurlane/files/AssetBundles
  - char/
  - painting/
  - paintingface/
  - dependencies

1.石块拼接

azurlane-doujin/AzurLanePaintingExtract-v1.0: 一个简单的碧蓝航线立绘还原的工具

2.然后使用下面这个工具接着处理。

Deficuet/AzurLanePaintingAnalysis-Kt: 通过分析AssetBundle自动计算并将多张立绘和差分表情组合成一个完整的立绘图片

Spine

/Android/data/com.bilibili.azurlane/files/AssetBundles
  - spinepainting/

按名字排序,不难发现应该是不带后缀的文件是unity相关的文件,带后缀res的是spine模型的相关文件。

image-20251031213058640

这个1000kB以下的文件都可以删除,都是跟角色无关的spine或者其他配置文件。

spine的版本是3.8.99

image-20251031213359568

导出来的文本文件都带.asset,可以用批处理脚本删除这个后缀。

.Scripts/DelFileSuf(.asset).bat at main · violet-wdream/.Scripts

Live2D路径

模拟器文件夹路径

image-20251029164709609

将文件放入AssetBundler处理,选择导出Live2D model即可。

自用处理(非必要)

模型json处理脚本(格式化model3.json文件,可以使用web-OML2D预览)

.Scripts/Live2DFileConvert/ProcessModel3(ForAzurLane).py at main · violet-wdream/.Scripts

URL获取

参考AXiX-official/AzurLaneAssetBundlesDownloader: AzurLaneAssetBundlesDownloader,手游碧蓝航线的AssetBundles资源下载器

本地清单

image-20260113195915166

远程清单,用脚本获取

.Scripts/Azurlane/GetHashCSV.py at main · violet-wdream/.Scripts

APK URL: https://pkg.biligame.com/games/blhx_9.6.11_0814_1_20250819_110937_2a0c3.apk
Hash files: {'az': '$azhash$9$6$431$9039afcdda91dba8', 
             'cv': '$cvhash$1272$173461a2427c8613', 
             'l2d': '$l2dhash$1337$3897396067834295', 
             'pic': '$pichash$1201$b2fa6e317482e25f', 
             'bgm': '$bgmhash$1201$b2fa6e317482e25f', 
             'painting': '$paintinghash$1428$84e19a0b1737a37e', 
             'manga': '$mangahash$1215$7a60f90b9ca6d501', 
             'cipher': '$cipherhash$1206$5df397233956c99e', 
             'dorm': '$dormhash$1379$eee1654fd047dcd6', 
             'map': '$maphash$154$002e8f60d0f0cc69'}

拼接URL得到要用的这两个清单,其他的同理

https://line3-patch-blhx.bilibiligame.net/android/hash/$l2dhash$1337$3897396067834295
https://line3-patch-blhx.bilibiligame.net/android/hash/$paintinghash$1428$84e19a0b1737a37e

下载完后对清单进行排序,排序规则是文件名的字典序

.Scripts/Azurlane/ProcessHashCSV.py at main · violet-wdream/.Scripts

清单每一行内容是filename,size,MD5hash

拼接URL得到完整的下载地址。

https://line3-patch-blhx.bilibiligame.net/android/resource/{MD5hash}

比如表里的一个条目live2d/aidang_2,3187125,abc6fc849aee90ce0e40bee3edbf6536

拼接为以下URL,就是模型aidang_2的资源文件了。

https://line3-patch-blhx.bilibiligame.net/android/resource/abc6fc849aee90ce0e40bee3edbf6536

然后每次更新了就找对应的角色就行,不好看的就懒得下了。

奇点时代(CrazyOnes) Spine/Live2D - 无加密 - 可更新 简单

所有的模型绑定在了一个文件,还好这个文件比较小,每次更新按修改日期排序一下就知道哪个是新角色了。

国服,没外服,模拟器商店搜索下载

他这个更新不是碧蓝航线那个,按时间排序一下就知道哪个是新的了,所有的模型都绑定在了同一个模型。。。

路径

image-20251029165540322

导出

直接搜spine或者按照文件大小排序(在模拟器里面排序也可以,不用全部下载)

image-20251029172007601

筛选文件类型然后导出筛选的文件(根据后来的更新导出,我建议这里导出分类设置选择容器路径)

image-20251029172448469

导出后会在两个文件夹中TextAssetTexure2D,合并到一个文件夹

然后按名称排序即可

image-20251029172700802

有的模型被分尸了,由好几个spine模型共同组成,需要合并起来,暂时没有找到合适的合并方法。

目前只能取Live2DViewerEX市场找处理好的模型,解包Lpk文件。

还有比较nc的部分就是有的skel对应的atlas文件不对,需要查看skel的内容看一下里面的部件和atlas是不是一样的。

处理脚本

模型文件分类sh脚本,可以把一个模型的文件放到一个文件夹,但是有些模型背景图的命名不规则,不能分类,只能自行分辨。

.Scripts/Sort/SortAtlas&Skel&png(Any).py at main · violet-wdream/.Scripts

打开模型需要选择以上着色器(alpha预乘相关)

绯色回响(Echocalypse/绯红神约) Spine - PVR图片(UF) - 有明确路径

产品展示。可以给到一个顶级。

image-20251204151346340

image-20251204151641249

image-20251204151538984

b服,直接b站搜就有apk下载,国服是和谐版的不过版本更领先,外服没有和谐,但是落后好几个版本。

外服Download Echocalypse 2.0.70 Android APK File

路径

把后缀改为rar直接打开,这两个目录就是Spine模型,

image-20251029180558820

很遗憾这两个文件夹里只有一小部分的Spine,原因很简单,因为剩余的资源应该是需要你热更新下载的

所以还需要安装。。。然后更新

开启模拟器root权限

image-20251030004547037

使用自带的root explorer访问data文件夹

image-20251030004701930

找到以下路径,长按knight_spine选中,点击选择复制。

image-20251030004516882

复制到/storage/emulated/0这个就是mumu共享文件夹

image-20251204143107544

处理脚本

这个游戏的spine模型纹理图都被加密了,无法直接打开,尝试解密。

解密方法来自https://live2dhub.com/t/topic/2984/17

这里还需要使用TexturePacker

texturepacker汉化版下载 texturepacker(图片资源打包器) v7.0.3 汉化安装版(附使用教程) 64位 下载-脚本之家

但是呢这个激活版本有点问题,有的时候会解密失败提示需要购买许可证。。。但是我对这个失败的模型单独尝试了一次,发现又解密成功了,不知道是不是他这个py脚本有点问题。

另外一个激活方式,有点麻烦,需要编译dll

TexturePackerGUI pro学习版 - tieyan - 博客园

正常下载完TexturePacker

然后把bin加入Path环境变量,因为这个py脚本会调用CLI

image-20251029195806429

目录结构:

image-20251030152653148

如果解密失败了就会只有纹理图的形状,然后会贴上水印,这个情况经常有出现。

目前的处理方式就是找到源文件重新用脚本单独处理一次。

image-20251030103420692

图像解密

.Scripts/Decrypt/DecryptPng(DAT_0180ac00-UF-Echocalypse).py at main · violet-wdream/.Scripts

删除备份文件/中间文件,如果确定所有的png都解密成功就可以执行这个脚本把多余的文件删了。

.Scripts/DelSufFiles(.pvr.ccz+…).py at main · violet-wdream/.Scripts

这个resize操作好像不是必要的,大部分图片尺寸只是多了2个像素点,按照spine的纹理集的算法,只要png的尺寸(如2050 x 2050)不小于atlas中的参数(如2048 x 2048)即可

.Scripts/Png/AtlasPngResize.py at main · violet-wdream/.Scripts

无TexturePacker版本

.Scripts/Decrypt/DecryptUF.py at main · violet-wdream/.Scripts

银与绯(Silver and Blood) Spine - FakeHeader - 可更新 简单

官服下载,最好下PC版本的(模拟器改文件有点麻烦),20G大小。。。

银与绯-暗黑哥特幻想RPG

image-20251030182434429

3D模型路径

先修改和谐文件配置:local -> global 找到如下文件

image-20251030214022273

把内容修改为以下代码,也就是把local 更改为 global不需要加任何其他东西,注意等号后面有个空格

resourceVersion = global

下载完之后打开游戏目录,按照文件夹大小一路找最大的找到如下路径

image-20251030212057487

模型大概率就在ABResource里面,但是这里的资源文件并不是常规的bundle文件,只有unity3d文件而且非常多

image-20251030212244185

看了下立绘的风格,应该是spine,搜索一下关键词,找到了画布,可以确定这里的立绘大部分是spine的。

开始筛选文件,根据以往的经验,这些立绘肯定不会放在一个文件里,大概的大小是5M~20M左右,命名应该是相对统一的。

按照名称排序,可以找到这些C开头的文件:

可以猜测Base应该是指的角色初级形态,final是最终形态。

image-20251030213758891

中间的应该是人名,打开silver and blood wiki找一下角色人名

Category:Characters - Silver and Blood Wiki

可以发现Ami Aiona等人名能够对应上,所以可以确定C表示Character,这些文件很有可能就是Spine模型的打包,事情真的会有这么顺利吗?

image-20251030214255817

解密

尝试解包unity3d文件,用常规的AssetStudio都不行,应该是加密过了。

绷不住了,用Raz版AssetStudio指定加密游戏类型试出来了。。。笑了:smile:

Options > Specify Game > Anchor Panic指定游戏是Anchor Panic(锚点降临)

Ok下一个游戏就干这个

不过打开一看发现这个贴图应该是游戏内3D建模贴图。。。走错路了。

image-20251031000428346

image-20251031000320941

Spine模型路径

去根目录下搜一下人名Hati,根据这个大小和命名方式啊,不难判断应该是这个文件。

image-20251031001104827

.\SilverAndBlood\SilverAndBlood_Data\dragon2019\assets\Global_Res\HQ\UI

注意这里是Global_Res

这里的dragon2019就是之前修改和谐文件配置的时候的目录。

与之前文件命名风格一致,后面的3kb的hero_place前缀文件并不需要,按需提取。

image-20251031105110007

使用AS导出,同样选择过滤TextAsset Texture2D

藏的确实有点深,可以看到用的spine版本是4.1.24

这里的Spine没有自带背景图片,应该是放在了别的地方。

image-20251031001413056

导出处理

选择导出分类为按照源文件名字分类

image-20251031112221899

这样导出来的目录结构就是

D:\Assets\
 ├─ acappella_base.unity3d_export\
    └─ CAB-15287f506ab9b838a573d4862420933f\
        ├─ a.skel
        ├─ a.atlas
        └─ a.png
 ├─ other_model.unity3d_export\
    └─ CAB-xxxxxx\
        └─ c.png

然后我们只要把根目录的.unity3d_export删除,然后把CAB目录的文件移动到根目录即可

处理前目录结构:

image-20251031114010533

处理后:

image-20251031115052186

image-20251031115116416

ProcessDir.bat 根目录的.unity3d_export删除,然后把CAB目录的文件移动到根目录

.Scripts/DelDirSuf(.unity3d_export)&MvCAB.bat at main · violet-wdream/.Scripts

导出发现skel atlas文件后面带了一个prefab后缀,需要删除。

.Scripts/DelFileSuf(.prefab).bat at main · violet-wdream/.Scripts

image-20251031120152516

锚点降临(Anchor Panic) Spine - FakeHeader - 可更新 简单

草台班子,PC版下不了。

下载官服,没有和谐。模拟器上直接搜就行,反正注意不要下到渠道服。

mumu模拟器下载的是过时的版本,然后会跳转到TapTap下载。。。服了,这里用Qoo下载的。

热更新资源只有5G,比我料想的少得多,还不错。

有一部分的立绘还是挺可以的,比较符合审美。另一部分就比较潦草了。

image-20251107184257398

image-20251107172909000

Spine路径

静态资源(只需要下一次)

可能是某些基础角色的展示,这个部分基本不会再更新了。

打开apk安装包(后缀改成rar)

在这个路径,排序一下找到spine关键字就能找到目标文件。

image-20251101120204610

热更新资源(后续可能会更新)

后续游戏的新角色应该会放在这里。

image-20251101110306391

这个路径下的文件就是资源文件。

安装游戏然后开始下载,看下这个路径有没有spine关键字文件

搜索spine得到目标文件

image-20251101110330618

合并资源

把这两个部分放一起

2025.11.1 有115个文件k文件资源

解密-FakeHeader

Raz版AS选择Options > Specify Game > FakeHeader

批量处理

过滤选择TextAsset Texture2D导出

把所有文件的.asset .prefab后缀都删除

.Scripts/DelFileSuf(.prefab).bat at main · violet-wdream/.Scripts

.Scripts/DelFileSuf(.asset).bat at main · violet-wdream/.Scripts

后无后缀的文件就是骨骼文件,不过是json格式的,所以需要添加.json后缀

.Scripts/AddFileSuf(.json).py at main · violet-wdream/.Scripts

image-20251101111157476

image-20251101112701301

无期迷途(PathToNowhere) Live2D XOR-FakeHeader - 可更新 麻烦

获取新模型有点麻烦,但是这个立绘的质量太值了。

下载资源13G,模拟器国服,反和谐。

2025.11.4-19:51

展示成果先,目前已经更新的L2D都找到了。

image-20251104193804247

论坛里有人求的浪里白条

image-20251104195117869

禁闭者 - 无期迷途WIKI_BWIKI_哔哩哔哩可以搜角色,然后看英文名

比较傻鸟的几个名字对照,但是它游戏文件里有的就用拼音。。。

  1. 安-Anne / tuoqier (可能是真名吧)
  2. 观星者-Anarkia(可能是真名吧)
  3. 白逸-Bai Yi/linglan (可能是真名吧)
  4. 卡门奈特-Cab/Cabernet 省略了一半
  5. 卡米利安-Chameleon 为什么不是卡密利涅
  6. 科希-Crache 英文是痰的意思。。
  7. 切尔西伯爵-Countess Chelsea/fupo 夹带私货了(富婆)
  8. 伊琳娜-Eirene/heli (可能是真名吧)
  9. 雷温-Eleven (内涵怪奇物语11?)
  10. 加洛法诺-Garofano(意大利语-康乃馨)
  11. 伊帕希娅-Hypatia (世界上第一位女数学家)
  12. 伊格尼-Ignis/eagle
  13. 伊蕾娅-Irrheia
  14. 茉莉-Jasmine (直译)
  15. 雷比尼斯-Labyrinth/renou (可能是真名吧)
  16. 拉弥亚- Lamia/拉弥业
  17. 露薇娅·蕾 - Luvia Ray/luweiyalei
  18. L.L-小写的ii,看着像II
  19. 丽莎-Monalisa (蒙娜丽莎)
  20. 麦昆-Mcqueen
  21. 赫罗-Mojila
  22. 佩姬-Peggy/qiao (可能是真名吧)
  23. 普希拉-Peggi (竟然不是佩姬)
  24. 派尔琪雅-Pylgia
  25. 芭·菲-Parfait (巴菲特)
  26. 罗睺-Rahu
  27. 露莉艾卡-Roulecca / kuangdu (狂赌)
  28. 渡鸦-Raven (谐音雷温。。)
  29. 瑞思-Rise (算音译么。。)
  30. 娜恰-Snake (本体是蛇)
  31. 瑟琳-Shalom
  32. 源津-Shin
  33. 蓟-Thistle (直译)
  34. 维多利亚-Victoria/bai (可能是真名吧)
  35. 蓝鹫 - Vautour Bleu (法语)
  36. 曜-Yao (卧槽,农)
  37. 萦萦-yingying (gxyy)

目前解的槽点最多的游戏。。。

国服真是b事多,导出来缺这缺那。。。建议下载外服。

内存24G以上,16G内存不建议尝试,电脑容易卡死,24G内存解包完都卡的批爆。

夸克网盘分享 Liv2D资源 2025-2更新,来自网友无期迷途解包 - 讨论 - Live2DHub

无期迷途即将下架皮肤一览_哔哩哔哩_bilibili

目前下架皮肤全在。

参考教程:

无期迷途解包教程 - 哔哩哔哩

无期迷途解包问题 - 讨论 - Live2DHub

反和谐

国际服比国服晚3个月,没有和谐。

目标文件localize_settings.json路径

image-20251101225959285

修改为以下内容(true改为false),如果模拟器内不能修改就复制一份到PC然后改好替换文件。

{
  "IsLocalize": false
}

然后打开游戏,就会发现自动更新了一个fs_anti文件夹

image-20251101230318625

说明修改成功了,打开这个文件夹也可以看到有anti_harmony字样的文件。

image-20251101230916420

Live2D路径(重点)

真想吐槽一下他这个游戏的资源修复功能,竟然是把文件全删了重下。我还想着反和谐了要不要修复下资源,byd重新下载13G文件:angry:

==重点来了==

如果你单独提取了下面的三个部分的哪个部分,你都无法得到一个完整、正常的模型。

找到这个目录,这个是常规资源Part1,应该说这个是热更新资源,最近的修改是10.24

Android > data > com.zy.wgmt.cn > files > fs > asset

这个是常规资源Part2,这个应该是静态资源,上一次修改是在4.16

Android > data > com.zy.wgmt.cn > files > fstier1 > asset

先把Part1和Part2合并,选择替换重复文件(如果有),把这个合并的文件放到同一个文件夹fs里面。

image-20251103200829492

这个是反和谐资源,就6个模型,这是Part3

Android > data > com.zy.wgmt.cn > files > fs_anti

这个不要合并,单独提取,会提取出来没加布料的贴图,替换和谐过的贴图即可,其他文件不要替换!

因为这里我用国际服合并的Part1 Part2导出的模型是完整的,只是国际服版本落后3个月,所以少了几个模型,国服我合并了三个Part然后导出来的模型是全的,但是很多模型少了动作!!!所以我猜测第三个部分是特殊和谐资源,不能和主体合并。

到这里合并完成后就可以使用特供版AS一键导出了。

Raz版本的AS没有一键导出Live2D模型,能导出模型的就不能解密。。。

去找一个能解密还能导出Live2D模型的版本

欸,还真有AssetStudioModGUI_PtN_net6_win64

这个版本的AS是无期迷途特供版本PtN,会自动解密,识别了FakeHeader,然后还会自动处理motion的hash参数,也就是说如果你用这个版本,下面的解密都不需要了,太吊了。

比较脑残的是他的GUI和后台不会一起关闭(只显示GUI,CLI不显示),也就是说你把GUI关了没用,后台还会运行。要去任务管理器把它关掉。

下面是特供版AS

谷歌无期迷途 - Google Drive

百度网盘链接: https://pan.baidu.com/s/18dJhlonBf2YPKjLIqDGMbw 提取码: njrj

不看解密可以跳到 直接导出

解密 XOR - FakeHeader (选看)

开始正题,最后的哈希我也没找到合适的处理方法,所以有点烂尾。。

加密方式为XOR加密然后再用FakeHeader处理。有一部分是FakeHeader,另一部分不清楚是什么。

先用XOR处理加密

.Scripts/Decrypt/DecryptXORTest.py at main · violet-wdream/.Scripts

image-20251101234454758

打开解密后,有些文件可以看到是FakeHeader,有一些是乱码

image-20251101234756302

乱码。

image-20251121204441792

所以再用AS选择FakeHeader打开文件。

解密后导出(hash没解出来)

在导入Unity时,model3.json和moc3都会被转换成MonoBehaviour,但是容器路径被处理了

并不是原生L2D的文件,所以没法直接导出。

建议导出目录选择为容器路径

image-20251102120848438

选择导出这几个部分导出。

  1. Monobehaviour (需要的motions/moc3)
  2. Texture2D

image-20251102121031062

按大小排序,这个最大的json文件就是moc3文件。

image-20251102120950724

json转moc3

然后使用脚本提取moc3文件(把json文件的_bytes数组合并合成完整的二进制文件)。

.Scripts/Live2DFileConvert/Json2Moc3.py at main · violet-wdream/.Scripts

现在得到了moc3文件就可以让模型呈现静态场景了,但是还需要动作。

image-20251102114948690

AnimationClip转motion3.json (不会)

fade.json应该只是淡入淡出动画,跟motion没什么关系,理论上来说AnimationClip才是动画。

后文都是关于fade转motion3,而且没搞定。暂时止步于此


这个是js脚本,用以下命令执行(需要nodejs环境)

node Fade2Json.js

原先的版本里写的是ParameterIds但是实际上fade文件hash了这个字段,所以需要更改为ParameterIdHashes

.Scripts/Live2DFileConvert/Fade2Motion3(Hash).js at main · violet-wdream/.Scripts

使用脚本将.fade.json 转换为.motion3.json,但是这里的motion还是无法直接使用因为ParameterIdHashes,不是标准形式。

需要用原始的参数名还原,但是这些参数非常多而且不标准,所以没有确切的算法是不可能全部完美处理的。

这里有304个参数。

image-20251103001829687

之前尝试导出的Animator提取二进制中可见的Param关键字词语,是不一定完全准确的,有的参数没有Param这个子串所以并不严谨。

生成model3.json

这个比较简单,根据motions目录下的文件填充即可。

可以用L2DViewer生成配置文件model3.json,或者参考下面的标准游戏文件。

{
  "Version": 3,
  "Name": "char2d_ll_3",
  "FileReferences": {
    "Moc": "char2d_ll_3.moc3",
    "Textures": [
      "textures/texture_00.png"
    ],
    "Physics": null,
    "Motions": {
      "clip_ll_background": [
        {
          "File": "motions/clip_ll_background.motion3.json"
        }
      ],
      "clip_ll_boring": [
        {
          "File": "motions/clip_ll_boring.motion3.json"
        }
      ],
      "clip_ll_click_body1": [
        {
          "File": "motions/clip_ll_click_body1.motion3.json"
        }
      ],
      "clip_ll_click_body2": [
        {
          "File": "motions/clip_ll_click_body2.motion3.json"
        }
      ],
      "clip_ll_click_ear": [
        {
          "File": "motions/clip_ll_click_ear.motion3.json"
        }
      ],
      "clip_ll_click_head": [
        {
          "File": "motions/clip_ll_click_head.motion3.json"
        }
      ],
      "clip_ll_click_interactivearea": [
        {
          "File": "motions/clip_ll_click_interactivearea.motion3.json"
        }
      ],
      "clip_ll_greet": [
        {
          "File": "motions/clip_ll_greet.motion3.json"
        }
      ],
      "clip_ll_idle": [
        {
          "File": "motions/clip_ll_idle.motion3.json"
        }
      ],
      "clip_ll_level": [
        {
          "File": "motions/clip_ll_level.motion3.json"
        }
      ]
    },
    "Expressions": []
  },
  "Groups": [
    {
      "Target": "Parameter",
      "Name": "EyeBlink",
      "Ids": [
        "ParamEyeROpen",
        "ParamEyeLOpen"
      ]
    },
    {
      "Target": "Parameter",
      "Name": "LipSync",
      "Ids": [
        "ParamMouthOpenY0"
      ]
    }
  ]
}

直接导出

export > Live2D Cubsim Model

合并了fsfstier1后用PtN特供版AS直接导出。

2025.11.4 导出233个L2D模型(仅包括角色)。

最新方法

2025.11.10更新了蓝鹫的皮肤。实际上皮肤文件是11.6更新的这三个。

image-20251118200801886

但是如果你用AS单独提取是无法识别L2D模型的,需要再和c45e2dbc0ac4e142.bundle一起提取,这个文件应该在fs或者fstier1目录下面,可以搜一下。

可以理解c45e2dbc0ac4e142是一个辅助文件,PtN版AS需要读这个文件来识别模型,具体原因还不清楚。

这就是为什么之前两个Part的文件单独提取无法识别L2D模型。

image-20251118201417665

等11.20大更新,再次验证。

11.20更新是包体更新,需要重下游戏,文件在fs目录下,证实了c45e2dbc0ac4e142是辅助文件,解出了这次更新的几个皮肤,卓娅的红颜色的皮肤打开有点问题,需要用PS把纹理图的黑色色块擦掉,不然全挡住了。

image-20251121123056618

同时得出结论:后续更新的皮肤都会在fs路径下。

image-20251121122506093

抓包

使用Reqable进行后续操作。

Manifest(没什么用)

如果你需要精细到每个文件的话可能还有点用,只是获取部分文件的话就可以略过了。

fs路径下有一个res_manifest二进制文件,有很多可读文本且都是bundles文件,不难猜测应该是清单文件。

这个文件来自APK,并不是通过热更新下载的,所以没有直接获取的方式,只能通过下载APK再找到这个文件。

但是目前没有具体的解析办法,但是值得一提的是:可读的部分明显都是资产文件,所以只要把可读的部分提取出来即可(不确定是否会缺失内容)。

可以比较下载前(old)后(new)的清单得到更新条目,显然new独占的条目就是更新项,但是你会发现有的条目是old独占的,但是new没有,目前我也只能给出猜测:这些old独占条目文件被修改了,导致MD5变更,作为“更新”内容了。反正结论是不需要管old独占的条目,只需要注意new独占条目即可。

目前的情况是:并不能下载具体的某一个文件,因为更新的文件都是打包分包下载的,也就是说你只能先下载更新的patch包,然后再把包解压得到具体资产文件。

patchlist(获取APK Version CDN)

观察到一个请求,获取patchlist

import requests
url = "https://api.shziyi.com:12101/v1/gameconfig/patchlist"
headers = {
    "User-Agent": "UnityPlayer/2019.4.40f1 (UnityWebRequest/1.0, libcurl/7.80.0-DEV)",
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Content-Type": "application/x-www-form-urlencoded",
    "Cache-Control": "max-age=0, no-cache, no-store",
    "X-Unity-Version": "2019.4.40f1",
}
data = {
    "region": 3,
    "channel": 2,
    "role": 1,
    "env": 3,
    "timestamp": 1768314246,
    "clientid": 1030,
    "sig": "bc157a80d03aa0df0b82eb2a219e756f",
    "lang": "zh",
}
resp = requests.post(url, headers=headers, data=data, timeout=10)
print(resp.text)

返回了json格式的内容

{
    "game_config_apk": {
        "apk_version": "2.3.2",
        "apk_url": "https://xonecn-game-apk.shziyi.com/xonecn/apk/1030_shziyi_9001_21430_offcialweb_MbqEpU11bb_514b1ce0842ebae19ab2809798b62f5f.apk"
    },
    "game_config_audit": 0,
    "game_config_patch": {
        "id": 500043,
        "clientid": 1030,
        "region": 3,
        "channel": 0,
        "role": 1,
        "mode": 0,
        "extra": {
            "hotfix_version": "2.3.48",
            "scene_version": "1.0.0",
            "cdn_url": "https://xonecn-hotupdatecdn.shziyi.com,https://xonecn-hotupdatecdn-backup.shziyi.com"
        }
    },
    ...
}

得到了apk链接https://xonecn-game-apk.shziyi.com/xonecn/apk/1030_shziyi_9001_21430_offcialweb_MbqEpU11bb_514b1ce0842ebae19ab2809798b62f5f.apk

游戏版本号2.3.48

cdn链接https://xonecn-hotupdatecdn.shziyi.com

patch(获取补丁内容)

观测到一个res_releases.json,但是内容只有版本号。

https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/2.3/latest/res_releases.json
{
  "Releases": [
    {
      "Version": 0
    },
    #......
    {
      "Version": 48
    }
  ],
  "Merges": [
    {
      "Version": 48
    }
  ]
}

这里请求的URL里面2.3应该是大版本号,因为"apk_version": "2.3.2", "hotfix_version": "2.3.48"的大版本号都是2.3

image-20260113233508400

然后就开始获取patch了

#请求 32_35.patch.txt
https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/2.3/patches/32_35.patch.txt
#得到
{
  "FileCount": 211,
  "Version": 35,
  "Filename": "32_35.patch",
  "FileMd5": "cb12adea9e43cfb57d9339ab2639479b",
  "FileSize": 222914346
}
#35_40.txt
#40_45.txt
#45_48.txt

#开始下载 32_35.patch
https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/2.3/patches/32_35.patch
#35_40.patch
#40_45.patch
#45_48.patch

可以推测出是从32下载到48,每5个版本为一个分块(左开右闭区间)

image-20260113234035433

为什么是32开始?

fs路径下面有一个res_version.json,内容是

{"Version":32}

这个文件也不是通过热更新下载的,而是随着在APK里面。

可以断定,这个就是当前版本号,更新逻辑就是从当前版本号的一直下载到最终版本号48。

下载完之后不出所料res_version.json内容变更为

{"Version":48}

下载的是.patch文件,且所有patch都下载完后就会进行解压操作。实测确实直接用解压软件就可以打开

image-20260113234907307

然后发现这里还有一个res_manifest,并且比本地的大一点,猜测应该是下载完一个patch包之后就会把新增条目添加到这个清单里面。

实测情况是,分块大小为5应该只是上界大小,实际上可以分配1/2/3/4/5块

比如:

#https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/2.3/patches/0_1.patch.txt
#https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/2.3/patches/0_2.patch.txt
#https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/2.3/patches/0_3.patch.txt
#https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/2.3/patches/0_4.patch.txt
https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/2.3/patches/0_5.patch.txt

所以全patch链接为

https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/{VERSION}/patches/0_5.patch
https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/{VERSION}/patches/5_10.patch
https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/{VERSION}/patches/10_15.patch
https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/{VERSION}/patches/15_20.patch
https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/{VERSION}/patches/20_25.patch
https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/{VERSION}/patches/25_30.patch
https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/{VERSION}/patches/30_35.patch
https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/{VERSION}/patches/35_40.patch
https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/{VERSION}/patches/40_45.patch
https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/{VERSION}/patches/45_48.patch

需要注意的参数就是游戏本体VERSION以及最近资产版本号48

最后统计的得到所有Patch的大小仅有3G不到,实际游戏本体有12.5G的资产文件,也就是意味着还有其他基础资源并不是通过patch的形式下载的。

[TOTAL] FileCount = 5232
[TOTAL] FileSize  = 2886.83 MB

Base

使用游戏登录界面的资源检测功能,会自动重新下载所有资源。观察到下面这个请求:

https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/base/res_base_2fa6c34b69685932f51dc1830f53f770

这里下载的res_base_2fa6c34b69685932f51dc1830f53f770后缀是32位hash,与Manifest中的16位不同。

下载完发现是一个压缩文件,可以用解压软件直接打开,里面有assets目录以及wwise目录。而assets目录下的正是Manifest中记载的文件,都可以搜索到对应的hash。

image-20260114115528959

经过计算验证,可以确定这个32位的hash就是该文件的MD5。

在APK里面,找到了一些base相关的json文件。但是都是二进制的,应该是加密了,需要逆向处理逻辑。

image-20260114155653178

lite这里应该是轻量下载模式的资源,会少很多内容,具体是哪些我也不清楚。

res_audio_package.json是音频(BNK)资源

res_media.json是视频(MP4)资源

audio (获取音频资源)

所有条目都在APK内的res_audio_package.json,没加密,拼接方式:

https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/2.3/audio/0/wwise/Chinese/skill_aimiliya.bnk

每个角色有skillvo两种,对应技能和语音。

四种语言

Chinese
Japanese
English
Korean

下载完是BNK文件,需要转换

Yuxiao0815/bnk-wem2ogg: 一个批量把bnk(或wem)文件转为ogg的工具

逆向 (解密json)

找文件读写相关部分,搜索相关的函数名称

ReadAllBytes
ReadAllText
Files

一路找到

Framework.Files.Filesystemextensions

可以看到这里写明了secret,说明大概率与key有关。

image-20260114231127913

这里侧重考虑读取,因为读取时候肯定需要先解密为明文。

选择Framework.Files.FileSystemExtensions$$ReadSecretBytes

image-20260115010259199

可以看到输入参数里面有key,以及最后返回了另一个object方法(最后一个参数是一个加密算法twofish)记住这里,后面还会再回来。

选择Framework.Files.FileSystemExtensions$$ReadSecretBytes_object_查看这个object方法,注意判断key的部分,如果key是空的会重新赋值static_fields

image-20260115010653064

注意这里的操作符优先级,强转最后执行,不过宏观上来看这个强转应该不会改变数据本身,只是改了下存放形式。

key = (System_Nullable_ArraySegment_byte___o *)v21->static_fields;

所以这里只需要考虑v21->static_fields

跳转到static_fields定义,发现是另一个structFramework_KernelConst_StaticFields

image-20260114231449812

而这里恰好有个DefaultKey,所以只需要找到这个DefaultKey即可。

const和staticFields明示是常量,函数搜索Framework.KernelConst可以轻松找到对应的cctor (静态构造函数)

Framework_KernelConst___cctor

image-20260114232147203

这里在生成defaultKey,就是对常量StringLiteral_11820进行了UTF8编码

UTF8 = Encoding.UTF8;
bytes = UTF8.GetBytes(StringLiteral_11820);
DefaultKey = ToArraySegment(bytes);

所以只需要找这一段的常量数据即可,直接查看文本视图,找到对应的汇编代码,可以看到这里明显有个不对劲的字符串。

image-20260114230954067

得到key D(G+KbPeShVmYq3t

现在需要考虑如何使用key的,回到上次的位置

Framework.Files.Filesystemextensions

找到ReadSecretBytes函数

考虑twofish加密算法如何使用key

image-20260115004008615

尝试最简单的twofish加密算法解密发现块大小不对,应该是加密的时候填充了某些字节

查找相关资料后注意到

.NET 的 System.Security.Cryptography 默认使用 PKCS7 填充,所以解密需要去掉这些填充字节。

把这些prompt喂给gpt

.Scripts/PathToNoWhere/Decrypt.py at main · violet-wdream/.Scripts

进行解密后成功把json转换为明文

res_base.json

image-20260115015200218

可以拼接所有基础资产URL:

https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/base/res_base_2fa6c34b69685932f51dc1830f53f770
https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/base/res_base_266cea946e7edfeef18a1ae768c64101
//...

res_base_classify.json

image-20260115101801931

这里就是对bundles的分类映射表,但是所有bundles都在分块里面,要用来分类的话就需要先把所有块下载完然后解压出来,再通过这个表分类。

res_base_classify_chunk.json

image-20260115104423629

这里的BaseChunks和ExtraChunks记载的res是另一种base资产,拼接方式为:

https://xonecn-hotupdatecdn.shziyi.com/release-cn/android/tags/major/2.3/classify/2/classify/res_base_a29d690d198526b102af6fbbaacfc16b

总结

  1. 构造请求获取patchlist,得到APK链接,游戏本体Version(2.3.48,取前两位2.3)
  2. 解压APK得到一部分静态资源,以及res_base.json(无法单独获取),解密res_base.json得到明文,依次拼接baseURL得到所有基础资产。
  3. 构造URL获取res_releases.json,得到最新的资产版本AssetVersion (48),最大分块为5,依次拼凑出所有的patch链接

ALL = APK静态资产 + Base(base + classify)+ Audio + Patch

小版本更新 Patch

大版本更新 APK静态资产 + Base

2026.1.15

游戏提示下载15.9G,根据计算大致统计Base-(base5.5G+ classify4G) + Audio-4.8G + Patch-2.8G = 17.1G

还有一点是MP4文件,没什么可看的,然后就没什么东西了。

星落(Elpis) Spine - FakeHeader-UnityCN加密 - 懒得更

可能缺了,因为我没有合并APK的静态资源。。

模拟器搜索下载就行,也没和谐。

很多立绘AI味有点重,一般般。下面这个还挺好看的。

image-20251105105934862

image-20251204114040291

image-20251204114141992

星落解包方法 - 讨论 - Live2DHub

有高人搞定了,基本就是抄作业时间了。当然其实也就是FH和CN加密。

又下了一个新版的AS

Release v1.38.10 Release · AXiX-official/Studio

路径

image-20251104234400088

解密&导出

无和谐,不需要预处理。

Options > Specify Game > UnityCNwithFakeHeader

Options > Specify UnityCN key > Elpis双击左侧箭头区域选中Key(表格会自动关闭),再次打开这个表格应该显示选中了星落的key。

image-20251104233950455

选择TextAsset Texture2D 导出。

模型命名规则cardspine_name_level_number,这里的name表示角色代号,level是阶段,一般有2/3个阶段,number如果是1则为角色本体,2为背景。

用脚本分类Spine(有时候会产生空目录,有的文件由于命名不规则需要删除或者手动分类)

.Scripts/Sort/SortAtlas&Skel&png(Any).py at main · violet-wdream/.Scripts

删除空目录

.Scripts/DelEmptyDirs.py at main · violet-wdream/.Scripts

未完待续==归龙潮(Deep/Return of the Dragon) Spine - UnityCN特殊加密 - 缺了

质量也就是一般般吧,有几个角色还是挺好看的。

需要用到AXIX版本AS,在星落解包攻略里面有链接。

停服了,似了。。

移动端已经不支持注册用户了,所以如果你没有号,就不能用移动端解包。

PC端可以B服直接下载。

牛大了,40G,好消息是只需要下载20G。是先把分卷下载完再解压,所以必须全额下载。

image-20251105111400963

路径

静态资源

APK下载官方的apk包,打开assets > AssetBundle这里有一部分的资源包。

解压出来0.98G左右。

image-20251111130929734

热更新资源

.\GuiLongchaoBili\game\GuiLongchao_Data\StreamingAssets\Assetbundle

文件很多,有15G左右。

image-20251111152239927

合并静态资源和热更新资源(静态的移动到热更资源里面去)。有两个重复资源,保留热更包资源。合并后大约16G。

解密(有点问题)

使用AXIX版本ASSpecify Game > 归龙潮 即可。

然后筛选TextAsset Texture2D 同时搜索spine即可,点击Name 两次就是按照名字排序(倒序),一路下滑找到spine_role开头的文件。

或者你搜索这个路径ui/vfxs/spine/然后全部导出来也可以。

image-20251105160955950

导出选择“selected assets”导出

再往下面划,找到spine_chishihong_character为起点,

image-20251105162528831

spine_animal_maomi_01为终点,全部选中后导出。

image-20251105162618479

在往下划node_spine开头的这一段有两个模型。导出步骤同理。

image-20251105163112205

再往下划,找到最后一部分模型,含有gacha关键词(是抽卡的意思,应该是卡池的动画),一路选中到最后一个资源。导出步骤同理。

image-20251105163332368

导出来主要就是四个部分,

image-20251105163705372

目前导出有点问题,有几个角色模型没找到。。疑似是更新包体原因关于包体内存优化与后续整包更新说明 - 归龙潮官方资讯 - TapTap 归龙潮论坛

  1. 无常
  2. 寒衣
  3. 珠砂
  4. 青龙元君

解包遇到了问题,然后这几个模型没解出来。

System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
   at AssetStudio.LZ4.Decompress(ReadOnlySpan`1 cmp, Span`1 dec) in F:\Rider\Studio\AssetStudio\LZ4\LZ4.cs:line 38
   at AssetStudio.BundleFile.ReadBlocks(FileReader reader, Stream blocksStream) in F:\Rider\Studio\AssetStudio\BundleFile.cs:line 618
   at AssetStudio.BundleFile..ctor(FileReader reader, Game game) in F:\Rider\Studio\AssetStudio\BundleFile.cs:line 149
   at AssetStudio.AssetsManager.LoadBundleFile(FileReader reader, String originalPath, Int64 originalOffset, Boolean log) in F:\Rider\Studio\AssetStudio\AssetsManager.cs:line 268

目前收集到的信息就是,这个dab被单独解包了,需要把其他部分和它拼接起来成为一个完整的bundle包再解包。

但其他部分很顺利地通过AS解包了,不知道为什么。

目前正在尝试Fork一个版本的AS。。。2025.11.5未完待续。。

有点乱==苍雾残响(Haze Reverb/苍雾世界)Spine - 无加密 路径不明确

展示成果环节,萝莉世界,动作有点少但是分辨率相当优秀,线条很清晰。可以给到 8.0

image-20260116001841378

image-20251203220318861

image-20251203221718797

image-20251203220619950

image-20251203220945633

image-20251203221414541

image-20251203221907231

资源

官网的PC是模拟器版本,自动下载mumu模拟器,太神人了。

现在二油体积越来越大了,随便下一个都10G起步。。。

APK-Link或者你去QOO搜一下,油管也有官方频道。这个APK里面啥都没有,不用拆了,需要热更新资源。

路径

路径如图

image-20251107130221788

yooasset框架,文件名是无规则的,而且很散,没法寻找特定部分。

只能全部导出。

解密&导出

无加密,直接导出即可。

目录都分为datainfo 两个部分,info不用管。

筛选TextAsset Texture2D 搜索assets/aboriginal/role,按名称顺序排序。

image-20251107153458184

heiyu_bg开始,之前的部分是Q版小人,后面的是立绘,shitf一路选中到最后一项然后导出选择的部分。

批量去除prefab后缀后就是完整spine结构。

.Scripts/DelFileSuf(.prefab).bat at main · violet-wdream/.Scripts

导出路径选择容器路径,中间有很多目录是只有图标没有模型的。

麻雀一番街 (Riichi City) Spine - FakeHeader加密 - 可更新 简单

还行,放上战果。

image-20251108001014115

image-20251107235615598

模拟器Qoo搜索下载,总共5G左右。

路径

image-20251107215822594

解密

Raz版AS或者其他版本,选择FakeHeader。

筛选出TextAsset和Texture2D。

image-20251107220412991

注意到这里的skel文件是json格式的,所以导出后需要添加json后缀。

去除后缀.asset,然后给无后缀文件添加.json后缀即可得到完整spine结构。

如果显示没脸,说明你没有切换表情,默认表情是没有脸的。这默认参数设计的挺脑残…

image-20251107235014284

钢岚 (Mecharashi) Spine - UnityCN加密- 可更新 简单

所有立绘都在APK里面,要更新就重新下载一个APK即可。

2025.11.8

成品展示环节

image-20251108125332856

image-20251108122232884

不用下载完整游戏,下载apk打开即可,属于后续好更新的游戏了。

路径

image-20251108113938804

解密

Options > Specify Game > UnityCN

Options > Specify UnityCN key > Mecharashi如果没有,手动添加密钥31433743463543423144313841304630

筛选TextAsset Texture2D 搜索Pilot_,按名正序排序

直接搜索路径assets/gameproject/runtimeassets/pilot/

或者找到AdaDiazB

image-20251108114612815

一直到Zoey都是需要导出资源。全部选中然后导出。

image-20251108114734023

漏了一个

image-20251108123850069

还有一个Pilot拼错成了Pliot,草台班子。。。也就是站里有人在找的角色卡夏Cassha。assets/gameproject/runtimeassets/pilot/pilotb39_abs/10103126b/pliot_cassha_skeletondata.asset

image-20251108125011456

或者你按照容器名字排序找一下这个路径也行。

导出后需要删除.asset后缀,然后就是正常Spine结构了。

这些目录是按照时间排序存放模型的,最新的角色郑乐萱在44目录里面。

image-20251108115135837

不选动作默认是空白的。

image-20251108121733919

棕色尘埃2 (BrownDust II) Spine - 2022.2.17f1 - 更新器

[棕色尘埃2wiki官网_棕色尘埃2图鉴 GameKee](https://www.gamekee.com/zsca2/)

质量这一块能跟碧蓝航线难分伯仲了,

成果展示

这个皮肤真有意思。

image-20251108200031914

image-20251108200602631

下载

PC版下载链接:https://wwhu.lanzoub.com/igPFS33th1sh 密码:g3xp

mod[棕色尘埃2wiki官网_棕色尘埃2图鉴 GameKee](https://www.gamekee.com/zsca2/640938.html)
  1. BD2 - Google Drive
  2. MEGA
  3. https://drive.google.com/drive/folders/126YU2mEPsrPe3kJqC4Adyzcik0iUuqv7
  4. https://gofile.io/d/pewjqd

这个游戏只能安装在根目录,有点脑残

基础资源里没有spine模型,所以只能全额下载热更新资源。

也就10G,不是很大。登录要梯子,下载不用梯子。

image-20251108153919869

路径

D:\Neowiz\Browndust2\Browndust2_10000001\BrownDust II_Data\Addressable

文件是散的,然后内容是经典的datainfo,所以什么都看不出来。

解密

现在的版本号被隐藏了。

image-20251108183849838

需要用AS指定版本号2022.2.17f1,然后选择普通模式即可,没有特别的加密。

Options > Specify Unity Version > 2022.2.17f1

导入资源后筛选TextAsset Texture2D 然后搜索cutscene 按名称排序,找到第一个小写的

image-20251108192547608

然后一直往下找到最后一个,把这一段全部导出(导出分组直接不分类,因为按照文件名称,容器名称分类会导致一个容器下放了好几个不同角色的模型)

image-20251108192621825

最后导出是散的,然后我们用脚本分类,先批量删除.asset后缀。

.Scripts/DelFileSuf(.asset).bat at main · violet-wdream/.Scripts

根据atlas文件的名称(因为有的skel是json形式的,所以不用skel来命名)来命名目录,然后同前缀的文件放到这个名称目录下

.Scripts/Sort/SortAtlas&Skel&png(Any).py at main · violet-wdream/.Scripts

2025.11.8 最后分类成了127个模型。

image-20251108194923782

新增更新器

本地资产清单,无hash只有纯资产名称。

D:\Neowiz\Browndust2\Browndust2_10000001\BrownDust II_Data\StreamingAssets\aa\catalog.json

解出来的spine文件名称为cutscene_char为前缀,数字串结尾。但是资产文件并不是直接这样命名的。

看到这里的cdn和宏可以推测把宏转换为具体信息后,就是确切的URL

` “{BDNetwork.CdnInfo.Info}\StandaloneWindows64\{BDNetwork.CdnInfo.Resolution}\{BDNetwork.CdnInfo.Version}\common-bgmalbum_1_assets_all.bundle”,`

获取最新的catalog

估计要request一个服务器地址,然后会返回一个包含这些信息的字段。

论坛上的实例地址

https://cdn.bd2.pmang.cloud/ServerData/iOS/HD/20240813174906/catalog_alpha.json

https://cdn.bd2.pmang.cloud/ServerData/iOS/HD/20240813174906/

https://cdn.bd2.pmang.cloud/ServerData/Android/HD/20240813170548/

可以得知

  1. {BDNetwork.CdnInfo.Info} - cdn.bd2.pmang.cloud/ServerData
  2. StandaloneWindows64对应平台win,可以替换为iOS/Android
  3. {BDNetwork.CdnInfo.Resolution} - HD ,默认都是高清
  4. {BDNetwork.CdnInfo.Version} - 版本号,这个会不停变化,所以还是需要获取服务器地址。

所以win平台的catalog为https://cdn.bd2.pmang.cloud/ServerData/StandaloneWindows64/HD/{BDNetwork.CdnInfo.Version}/catalog_alpha.json

2025-12-16版本号获取20251215155852

拼接资产URL

只需要读取catalog里{BDNetwork.CdnInfo.Info}开头的值,然后取出末尾文件名,拼接BaseURLhttps://cdn.bd2.pmang.cloud/ServerData/StandaloneWindows64/HD/20251215155852/

比如 “{BDNetwork.CdnInfo.Info}\StandaloneWindows64\{BDNetwork.CdnInfo.Resolution}\{BDNetwork.CdnInfo.Version}\common-char-cutsceneillust-group1_assets_all_c7854fd177817217aeebc09818bd2ead.bundle”,

对应URLhttps://cdn.bd2.pmang.cloud/ServerData/StandaloneWindows64/HD/20251215155852/common-char-cutsceneillust-group1_assets_all_c7854fd177817217aeebc09818bd2ead.bundle

接下来就是批量执行这样的操作了,输出到一个txt里面然后用下载器执行下载。

过滤出关键词skeleton对应Spine文件,文件被打包在了一起。

过滤出关键词idcardbgcutscene对应预览图。

少女前线1 (Girl’s Frontline) Live2D - FakeHeader加密 - 完结了

也算是老牌二油了,立绘质量这块不必多说。

最新资讯少女前線資料庫 私人游戏B站上搜的乱七八糟,官号也是一坨。

Steam上中文搜索下载 10G

参考教程关于2024年少女前线live2d立绘提取 - 讨论 - Live2DHub

大概是世界上第一个完结的二油,打赢复活赛了但是不多。

成果展示,画风我还是挺喜欢的,可以给到一个神。

烧钱这个皮肤精髓就在姿态、神情和色彩层次的把握,不需要太多复杂的线条抑或是浓重的色彩,只是谈谈几笔之间,景与角相映成趣。最大的失败也就是角色的名字是枪械,根本记不住…

image-20251110012158498

image-20251130121233630

image-20251110011752359

路径

Steam路径

D:\SteamLibrary\steamapps\common\GIRLS'FRONTLINE\GrilsFrontLine_Data\StreamingAssets\Res\Pc

解密

一眼丁真,一看就是假头啊

image-20251108222223546

这里下选择Release AssetStudioMod v0.19.0 · aelurum/AssetStudio

能解FakeHeader同时一键导出Live2D模型,不能解UnityCN,只会提示有加密。

如果你想把文件单独导出,可以参考无期迷途的解包攻略,这里没有hash加密参数,应该可以很顺利地把动作导出。

这里导出直接选择L2D模型全部导出即可。

目前能确认的最新的模型是2025.7左右更新的模型。

缺了最新的一期几个模型。不知道为什么,我用的是Steam刚下载的资源,没有这个 刘式步枪-瓶中的天空。

在原始资源包里头也没有搜到相关贴图,难道是原资源有问题?

这个是Live2D 皮肤

img

少女前线:云图计划 (Project Neural Cloud) Live2D - FakeHeader加密 - 停更了

皮肤质量还是挺顶级的,就是游戏死的有点早。羽中太会了

成果展示,可惜了这么好皮肤啊,可以给到一个夯

image-20251110152426077

image-20251110115529578

《云图计划》-少前系列Roguelike策略手游

官网搜下载APK。安装包里啥都没有,需要热更新下载。

模拟器安装然后启动,更新资源。

byd 有 22 个包要下载,10G。

路径

找到这个路径,然后一直往下面翻,当你能看到z开头的目录时,说明Live2D的资源已经下齐了,剩下的资源不用下了。因为我之前之下了一个包,然后只有n开头的目录,我猜测是顺序下载的。

image-20251110105312996

解密

直接用Mod版AS导出所有的L2D模型即可,之前是UnityCN加密需要密钥的,现在就是直接FakeHeader了(Mod版本AS可以直接识别FakeHeader,所以不用处理)。

导出后有180个模型。更新截止到3周年的后的 桑格玛皮肤,也就是B站官号最后更新的皮肤。

少女战争(Girl’s Wars) Spine/Live2D - FakeHeader加密 下载器更新

少女ウォーズ: 幻想天下統一戦【公式】@絶賛配信中 (@shoujowars) / X

包名com.y2sgames.girlwarsjp

产品展示。质量顶中顶,动作很有创意,就是这个画风有点一般,可以给到一个顶级。

image-20251121165642111

image-20251121170953709

image-20251122204430003

image-20251122205349719

资源

用二油资源下载器下载的,路径就是live2d。

FakeHeader加密,用下载器处理,或者

.Scripts/DelFakeHeader.py at main · violet-wdream/.Scripts

Live2D

直接用Mod版AS一键导出Live2D模型即可。

模拟器路径如下,游戏资源需要登录游玩下载,并不是预下载,所以Live2D不通过下载器下载就会缺。

image-20251121192051417

Spine

也是下载器下载的资源,Spine应该是全的,APK里面的资源和这些一致。

image-20251122202627646

少女回战(Shoujokaisen) Spine/Live2D - FakeHeader加密 路径明确

【公式】少女廻戦 (@shoujokaisen) / X

成果展示。无需多言,神

image-20251110224356460

image-20251110224609852

这张神中神,浙大毕无需多言

image-20251129193412498

这张挺有创意的

image-20251129193635069

image-20251129193841688

image-20251205155012751

image-20251205155154536

image-20251205155256713

下载日服Download 少女廻戦 4周年限定夏日水着パーティー開催 Latest Version 1.0.136 Android APK File

日服就是官服,不用考虑和谐之类的东西。

从这个文件来看,这个好像是国产日本游戏。

APK里面有一部分资源,但是不全,还是得安装游戏然后热更新。总共就2G的样子,还是挺友好的。

静态资源

image-20251110221617440

本体包里面有一个unityAssets.apk,解压后再次解压,找到assets目录下的model目录,这里就是静态资源

image-20251110221638504

热更新资源路径

模拟器下载后的路径。

image-20251110190052987

把静态资源的model和这个热更资源的model合并一下,有三个重复的文件,选择保留热更资源的文件(应该体积会更大一点)。

解密

一眼FakeHeader

image-20251110182918419

这里选择的是Mod版本AS。

导出Spine

随便找个能解FakeHeader的AS就行,因为是Spine资源,筛选TextAssetTexture2D即可

然后搜索一下官服最新推文的角色貂蝉的新皮肤-晓月白露。可以确定没什么问题了,直接导出筛选项即可。

image-20251110190838495

发现这里有texture_01命名的纹理图,说明肯定有Live2D模型。

导出后整理一下,就这几个是关键的,其他的什么家具和npc我懒得看就删了,还有几个目录是Live2D的,这里也删除了。

image-20251110223745163

他这个导出后骨骼和纹理集在单独的一个目录,而不是根目录。

可以只保留一级目录,然后把二级目录的内容递归提取到一级目录。

.Scripts/ExtractSecondaryFiles.py at main · violet-wdream/.Scripts

导出Live2D

本来以为只有Spine,仔细一看发现还有Live2D的资源,就是这个游戏的婚皮。导出路径是spine,但是确实就是Live2D模型。

image-20251110192406559

Mod版直接导出L2D模型的话花嫁模型的动作有点问题,显示没有动作,但是实际上搜索文件路径是可以查找到不少相应的动作。

image-20251110192527326

但是这个萝莉模型\models\spine\spine_bedroom\lolis都是完整有动作的模型

可能是因为他这个实际文件存放位置跟AS提取部分代码预设的不太一样吧。

但是暂时没有其他版本的AS能同时解密和导出Live2D了。

不过也就是按照以下步骤处理

  1. 先一键导出所有的Live2D模型,得到初始目录.\Live2DOutput\assets\assetspackage\models\spine\spine_huajia\...

  2. 导出分组设置为容器路径Container Path

  3. AS搜索并导出所有的motion3后缀文件,在.\Live2DOutput\assets路径下导出,以蔡文姬为例,动作导出后会在

    .\Live2DOutput\assets\assetspackage\models\spine\spine_huajia\huajia_caiwenji01\motions然后把这个motions文件夹放到

    .\Live2DOutput\assets\assetspackage\models\spine\spine_huajia\huajia_caiwenji01\huajia_caiwenji01里面去(没几个模型,所以这个部分手动解决),这样就形成了完整的L2D结构

  4. 脚本批量为所有motion3后缀文件添加json后缀

  5. 脚本批量修改model3配置文件,其实也就是动作没有导入,所以只需要补充motions键的值即可。

  6. 测试

image-20251110212939098

import os
import json
import glob
from pathlib import Path

def main():
    print("开始查找 Live2D 模型...")

    # 使用 Path 更简洁地遍历所有 .moc3 文件
    moc3_files = list(Path('.').rglob('*.moc3'))
    if not moc3_files:
        print("未找到任何 .moc3 文件")
        return

    print(f"找到 {len(moc3_files)} 个 Live2D 模型")
    processed = set()

    for moc3_path in moc3_files:
        model_dir = moc3_path.parent
        if model_dir in processed:
            continue

        print(f"\n处理模型: {model_dir}")

        # 1. 处理 motions 目录:自动添加 .json 后缀
        motions_dir = model_dir / 'motions'
        if not motions_dir.exists():
            print("  未找到 motions 目录,跳过")
            continue

        motion_files = []
        for motion_path in motions_dir.glob('*.motion3'):
            new_path = motion_path.with_suffix('.motion3.json')
            if not new_path.exists():
                try:
                    motion_path.rename(new_path)
                    print(f"  重命名: {motion_path.name}{new_path.name}")
                except Exception as e:
                    print(f"  重命名失败 {motion_path.name}: {e}")
            motion_files.append(new_path.name)

        # 包含已存在的 .motion3.json
        motion_files.extend([p.name for p in motions_dir.glob('*.motion3.json')])
        motion_files = sorted(set(motion_files))  # 去重排序

        if not motion_files:
            print("  未找到任何 .motion3.json 动作文件")
            continue

        print(f"  发现 {len(motion_files)} 个动作:")
        for f in motion_files[:10]:  # 只显示前10个,避免刷屏
            print(f"    - {f}")
        if len(motion_files) > 10:
            print(f"    ... 共 {len(motion_files)} 个")

        # 2. 获取模型名称
        model_name = moc3_path.stem

        # 3. 自动收集资源
        textures = [f"textures/{p.name}" for p in (model_dir / 'textures').glob('*.png')] if (model_dir / 'textures').exists() else []
        physics_path = model_dir / f"{model_name}.physics3.json"
        physics = f"{model_name}.physics3.json" if physics_path.exists() else None

        # 4. 构建 Motions 结构
        motions_data = {
            f.removesuffix('.motion3.json').removesuffix('.json'): [{"File": f"motions/{f}"}]
            for f in motion_files
        }

        # 5. 读取或创建 .model3.json
        model_json_path = model_dir / f"{model_name}.model3.json"
        if model_json_path.exists():
            with open(model_json_path, 'r', encoding='utf-8') as f:
                data = json.load(f)
            print(f"  更新现有 {model_json_path.name}")
        else:
            print(f"  创建新的 {model_json_path.name}")
            data = {
                "Version": 3,
                "Name": model_name,
                "FileReferences": {
                    "Moc": f"{model_name}.moc3",
                    "Textures": textures,
                    "Physics": physics,
                    "Pose": None,
                    "DisplayInfo": None,
                    "Motions": {},
                    "Expressions": []
                },
                "Groups": [
                    {"Target": "Parameter", "Name": "EyeBlink", "Ids": ["ParamEyeROpen", "ParamEyeLOpen"]},
                    {"Target": "Parameter", "Name": "LipSync", "Ids": ["ParamMouthForm", "ParamMouthOpenY"]}
                ]
            }

        # 强制更新 Motions(保留其他自定义内容)
        data.setdefault("FileReferences", {})["Motions"] = motions_data

        # 6. 写回文件(美化 JSON)
        try:
            with open(model_json_path, 'w', encoding='utf-8') as f:
                json.dump(data, f, indent=2, ensure_ascii=False)
            print(f"  已保存: {model_json_path.name}")
            print(f"  更新动作组: {', '.join(motions_data.keys())}")
        except Exception as e:
            print(f"  保存失败: {e}")

        processed.add(model_dir)

    print(f"\n完成!共处理 {len(processed)} 个模型")

if __name__ == "__main__":
    main()

放置少女(HouchiShoujo) Spine/Live2D - RC4加密(不会)

【公式】放置少女🌸百花繚乱の萌姫たち🌸 (@houchishoujo) / X

二油资源下载器下载日服未加密资源即可,然后直接导入AS。国际服版本落后一点,一个月左右。

Spine

导出分类选择容器路径,筛选TextAsset Texture2D,搜索assets/girlsgame/editor/resources/spine

按名称排序,按需导出

Mod版本AS一键导出Live2D即可。

成果展示。老牌二油了,质量这一块。卡面无敌,就是动作少了点。

image-20260112182042538

image-20251113225920160

image-20251113230328921

不建议自行解包,热更资源需要自行进入游戏后点击角色下载,而不是预先下载好,但是他这个并不是鉴权资源。

Download 放置少女 - 百花繚乱の萌姫たち Latest Version 2.3.153 Android APK File

静态资源

有两层APK,在第二层的base_assetAPK里面找到abs 目录。

热更新资源

如下路径。

image-20251112120456191

合并一下两个资源。

尝试解密(还没解出来)

image-20251111193203401

前77个字节是固定内容,标记的字节内容会变动,前45个字节完全一致。

now
38 4A 64 6E 01 00 01
UnityFS
55 6E 69 74 79 46 53

看不出什么规律,尝试IDA逆向,内容在另一篇文章里。

Frida抓不到libil2cpp.so 没辙了。

网上看了下好像也没人解出来。。。未完待续

新增更新器

使用脚本.Scripts/HouChiShouJo at main · violet-wdream/.Scripts

获取版本号

请求URLhttps://fx-plat-fzsnweb.c4games.com/common/script/clientVersion?deviceId=&gameId=15&platform=webdesk&branch=webgl-release会返回一个JSON

{"cs":278,"br":"webgl-release","ab":432,"serverVersion":1764986554,"force":0,"dp":false,"abm":"d2431abf8bc78065","noticeVersion":1764919682}

获取清单

BaseURL https://sf-snh5.bytedgame.com/obj/youai-c10-cdn-sg/gdl_app_302906/game/webgl/webgl-release/Desktop/ 拼接键brab的值

webgl-release/abfiles432,这里的ab值不是直接拼接而是添加在abfiles后面

最后结果为https://sf-snh5.bytedgame.com/obj/youai-c10-cdn-sg/gdl_app_302906/game/webgl/webgl-release/Desktop/webgl-release/abfiles432,请求后自动下载一个二进制文件abfiles432

实际上是一个LZ4压缩后的文件,需要用LZ4解压,或者使用解压软件解也行。

拼接下载URL

举例,解压后单行的内容,有4个item

act_firework_finish.mp4|9|4354e91a55a5bb49|5275292

把第3个item拼接到第1个item前面构成完整名称。

BaseURL拼接ArabicChineseSimplifiedcommon,我们要用的资产只需要用common即可。

https://sf-snh5.bytedgame.com/obj/youai-c10-cdn-sg/gdl_app_302906/game/webgl/webgl-release/Desktop/common/4354e91a55a5bb49act_firework_finish.mp4

使用比较器批量生成URL,下载器批量下载

星神少女(Aeon’s Echo) Spine - 鉴权

https://mega.nz/file/MkZUBALT#jgTBp_KAqVKzY7kPN7LuSuybv3P-RQgxFiqxRR8YEkI

别人传的资源。

因为有鉴权资源,不用自己下载游戏了,只能去网上搜集。

产品展示,3a大作有点多,质量一般,cg是好几个spine拆分组合的。

image-20251120151106903

image-20251120145841001

image-20251120150207841

resdownloader下载后会自动解密。

AS筛选TextAsset Texture2D导出即可

星欲少女(StarLusts) Spine - 无加密

产品展示。 质量有点顶,一众黄油里算比较有竞争力了。

image-20251120123316139

image-20251121192628644

资源

resdownloader下载

筛选Assets/_Main/Spine2D/CharacterAssets/_Main/Spine2D/CGCharacter导出

有的skel就是二进制的不用改,有的是json格式的但是后缀是.asset,需要改为.json

交错战线(CrossCore) Spine - FakeHeader 路径明确

成品展示。太极八荒了,可以给到夯。有几张图脸有点崩。

image-20251114203828381

202512031223719.png (1456×794)

白巧克力

image-20251203122438970

image-20251203120218283

黑巧克力

image-20251203120140592

image-20251203120052937

[下载交错战线 2.5.0针对于Android Uptodown.com](https://cross-core.cn.uptodown.com/android/dw)

反和谐:游戏包名 > files > internation_close.txt 删除 重新启动游戏后自动下载新的资源。

静态资源

APK里面找packs,最大的目录。

啥都没有,就一个kv的Spine模型。skel是json格式的。

热更资源

image-20251114194731607

直接选择带spine的资源导入AS

image-20251114195925155

或者把全部资产导入后搜索assets/res/prefabs/spine筛选贴图和文本资源

assets/res/textures/uis/icons/roleskinmall预览图

解密

Mod版本AS直接导入,自动解密FakeHeader

筛选textasset texture2D即可

导出后prefab后缀换成json

抓包

https://cdn.megagamelog.com/cross/release/android/curr_1/Custom/1673628590
https://cdn.megagamelog.com/cross/release/android/curr_1/ver.bytes

和谐版本资源是curr_1删除即可。

  1. 解析ver.bytes 得到资源清单。
  2. 拼接baseURLhttps://cdn.megagamelog.com/cross/release/android/curr_1/Custom/

bytes的内容大概就是一张表,每个条目就是 未知串A 32位MD5 未知串B 一个资源索引。

image-20260119102311051

其实24行就可以读到

image-20260119104136139

应该是这几项

name version size sizeB isEncypt path FileMD5 FileSize downloadPriority

星陨计划(ArkRecode) Spine - 无加密 下载器更新

产品展示。经典黄二油,质量不必多说,就是3a大作有点多,也算是erolab的经典了。如果人物是透明/缺失的,需要在左侧切换皮肤,因为默认皮肤的缺的。

image-20251202214521219

image-20251202214432539

image-20251202211910359

image-20251202211829207

image-20251202211558655

image-20251118203314680

资源获取

星隕計畫 Ark Re:Code

本体erolab找一下就有,头牌。

下载器(热更资源)

二油资源下载器(见文章开头)下载找到如下路径,就hero和cg两个包,这里下载的是热更资源。

image-20251116113445009

erolab的有些游戏都是不会一次把热更资源全部下载完,需要你浏览内容才会下载,所以用资源清单下载更直接。

不过这个游戏有点特殊,CG是完整的,路径为:

.\ArkRecode\Ark ReCode\ArkReCode_ER

APK路径(静态资源)

APK里有一部分静态资源,不过看起来像是缺的,其余部分有待考究

image-20251202181505478

PC版本类似

.\Ark ReCode\Ark ReCode_Data\StreamingAssets\aa\WindowsPlayer\firstbundlegroup_assets_assets\game

导出

没有加密,导入AS搜索Assets/Game/CG/筛选TextAsset Texture2D

但是人物只有初始的人物,需要浏览下载其他人物来下载对应资源,或者用下载器。

更新下载器

脚本

.Scripts/ArkRecode at main · violet-wdream/.Scripts

使用说明

violet-wdream/.Scripts: Personal AssetUnpack Script

樱境物语(Cherry Tale) Spine - 混淆/字节交换 PC更新

产品展示,夯

如果没有脸或者缺少了部位,需要在皮肤这一栏选择一个脸/部位。

image-20251130104421862

黑丝做的还是挺细节的,拉远了能看到摩尔纹。

image-20251130105027553

image-20251130105443633

image-20251130110929318

image-20251130111754652

image-20251130111914794

资源获取

櫻境物語

用二油下载器下载即可。下载器自带解密功能。

最后应该是这两个目录,不过都是散的文件,需要分类。

image-20251118204228362

具体解密

可参考CherryTale_AssetDecDL/CherryTale_AssetDecDL/Function/DecryptUnityAsset.cs at main · 28598519a/CherryTale_AssetDecDL

APK包版本是 2020.3.41f1,热更资源是2018.3.5f1伪装了真正的版本。然后还做了一些字节交换的处理。

CherryTaleDecrypt.py.Scripts/CherryTale/CherryTaleDecrypt.py at main · violet-wdream/.Scripts

需要把资源放在input目录,然后创建一个空的output目录

python CherryTaleDecrypt.py input output

新增更新器

2025.11.28更新了PC版

资源并不在常规的游戏目录下面,而是在appdata这里。

image-20251201121804937

一直往下翻可以找到下载清单index_save.txt是json格式的URL列表

根据考证,游戏的资源需要在游玩时下载,或者使用这个清单用专门的下载器下载。

下载器violet-wdream/CherryTale_AssetDecDL

双击下载器启动,点击下载选择一个index.txt来作为资源清单下载。

增量下载

  1. 当上一次存档的index_save.txt保存为index-time.txt(index-2024.6.3.txt 或者其他形式)

  2. 将当前版本的index_save.tx也保存下来(index-2025.12.1.txt)

  3. 使用CatalogJsonDiff.py获取更新条目

    python CatalogJsonDiff.py index-2024.6.3.txt index-2025.12.1.txt
    

    执行后会在当前目录下生成更新条目(index.update-20251202_155905.txt)。

  4. 使用下载器下载这个更新条目(自动下载到Asset目录下面)

  5. 下载失败的条目会存到404.log里面,使用TryDownLoadError.py重试下载,会输出到errorAsset目录下

    python TryDownLoadError.py 404.log #可以指定文件,默认使用404.log
    python TryDownLoadError.py
    
  6. 注意重试下载后的资源是未解密的,需要手动解密

    python CherryTaleDecrypt.py errorAsset output #参数对应输入目录和输出目录
    

image-20251202160124321

逆王传说(King of Kinks/放置传说/欲望之王) Spine - 鉴权

产品展示。少数质量有点顶,不过也有黄油的经典比例失调问题。

非鉴权资源很少,就个位数。。

image-20251119220940903

有几个还是挺优质的,这个我是真喜欢

image-20251122181822105

image-20251122192301015

放置傳說

需要先注册再下载资源。

鉴权资源

鉴权资源需要获得角色后才会下载资源,所以直接下载是不全的。只能靠网上收集了或者买一个满图鉴的号下载资源。

MEGA 预览视频

MEGA 预览图片

[逆王传说_免费高速下载 百度网盘-分享无限制](https://pan.baidu.com/s/1F7gzgZXgrxr17mMHy9h8DA?pwd=2233#list/path=%2F) 提取密码 2233

https://pan.baidu.com/s/1H_XMWEp2e30IkUjPxpgwEw 提取密码 hltv

WPK处理

这个下载的是WPK文件。可以直接解压出来LPK,使用bandizip:

WPK解压脚本.Scripts/Decrypt/WPKUnpacker.py at main · violet-wdream/.Scripts

然后用解包LPK就可以得到模型,这个LPK是Live2DViewerEX的自制文件,也可以直接用这个软件打开。

LPK解压脚本.Scripts/Decrypt/LPKUnpacker.py at main · violet-wdream/.Scripts

解包出来的东西命名不是很规则,但是有json配置文件,可以直接用L2DEX打开。

路径

image-20251119220047018

解密

用resdownloader输入路径后解密

image-20251119220225201

然后直接用AS提取。

红尘问仙(ChronicleofImmortals) Spine 无加密 下载器更新

产品展示。

image-20251120104651439

image-20251120105151186

resdownloader下载资源后用Mod版AS提取

无加密

搜索Assets/Bundles/HSceneAssets/Bundles/CharSpine导出

导出后的skel是json格式的,需要先删除.asset后缀然后替换为.json

千嬌百妹(girls love dance/妹妃色舞) Spine - 无加密YooAsset 可更新 麻烦

包名com.alluringgirl.qooapp

产品展示。夯中夯,全是精品

image-20251123160133054

image-20251123160516280

image-20251123160705746

资源获取

目前只有Qoo能下载[[下載] 千嬌百妹 台版 - QooApp 遊戲庫](https://apps.qoo-app.com/app/140987)

先将模拟器/手机的语言修改为繁体中文(台湾)

image-20251123105633449

需要额外下载内容

image-20251123161756983

点击右下角“职务”

image-20251123105902367

image-20251123105934669

下载完后点击R18版本重启游戏。

R18版本和R15版本略有不同。

路径

这个游戏用的是yooasset框架管理资源

Spine资源都在热更资源里面,APK里面没什么东西

image-20251123110300465

需要把这个yoo目录复制下来

处理YooAsset

实际上你不处理也可以,直接全部导入AS,省略以下步骤。。。

处理后会更好筛选一点。

使用脚本处理Script/YooAsset/Extract.py at master · PackageInstaller/Script

python Extract.py yoo

会自动提取文件,然后生成文件清单。

packageEx包里的文件可以直接用AS提取,这里是R18的资源。

处理完之后defaultPackage包里面的文件还不能直接用AS提取,前64个字节被处理过了,找到defaultPackage包里面的role目录,这里是R15的资源。

image-20251123135832385

还需要用一个XOR解密脚本处理一下

.Scripts/Decrypt/Decrypt64B-XOR(GirlsLoveDance).py at main · violet-wdream/.Scripts

结果会输出在output目录下。

导出

AS筛选一下导出即可。

Rags - 大破

Tryst - 约会

Spine - 造型/角色, 不规则

很多角色原皮没有,皮肤基本全了。

聞姬起舞(How To Raise A Harem) Spine/Live2D YooAsset

包名com.fknzj.qooapp

产品展示。顶级,比千娇百媚略逊一筹,动作有点少。

image-20251123194454348

image-20251123194619671

image-20251123194115509

image-20251123194219056

资源获取

游戏app

[[下載] 聞姬起舞 QooApp專享版 - QooApp 遊戲庫](https://apps.qoo-app.com/app/19618)

网传资源

【后缀改zip解压】链接:百度网盘 请输入提取码提取码:y5vx

路径

APK包里找到yoo目录,处理方式和千娇百媚一样。

如果你安装了游戏忘了保存APK可以在模拟器里面找

adb devices
adb root
adb shell
pm path com.fknzj.qooapp

image-20251124133007964

如果你下载了最新版本的APK,那么所有的资源都在APK里面,然后后续更新的资源就在 存储 - 包路径

image-20251124134308162

导出

处理后导出结构如下

image-20251123175323004

把这两个目录导入AS然后导出即可,Live2D可以用Mod版AS一键导出。Spine筛选文件类型然后导出。

主要就是3个部分M开头的部分(是R开头的部分的预览图),R开头的部分,R开头含有Bare的部分。

灵魂潮汐(SoulTide) Spine FakeHeader加密 路径明确

包名com.glkj.lhcx.yofun.mumu

产品展示。画风还是挺对胃口的,可以给到一个顶级。

image-20251124160940620

image-20251124161849558

image-20251124160603737

image-20251124155437613

image-20251124155632404

资源获取

mumu模拟器上只有渠道服,懒得去官网下了。

只有官服或者渠道服

路径

如下图

APK静态资源

image-20251124154346804

热更资源

image-20251124122226118

解密

就是FakeHeader

image-20251124122830999

用Mod版本打开可以直接识别FH

导出

Spine导出这两个部分即可。

image-20251124140404812

导出后不难发现这里的batch没有2-9,因为剩下的在APK里头。

image-20251124154613134

天命之子(DestinyChild) Live2D 已关服 有本体资源

产品展示。金享泰的油腻师姐画风,早期初具雏形,并不是一眼沉沦的美感,而是一种独特的精致感,是颇有几丝古朴气息的老片质感,也算是独一档的存在。

美中不足的是很多模型只有待机动作,其他几个mtn点了压根没反应,但是可以确定动作本身是没有问题的,因为如果你把待机动作替换为其他动作是可以运作的。

经过一番考证,应该是L2DEX软件不行,模型没什么问题。

image-20251125170907147

image-20251125164032117

image-20251125164307683

image-20251125201512929

image-20251125201547763

资源

github资源

github上只能找到2022.7的资产,游戏更新截止到了2023.7,所以中间的部分是缺失了,建议下载网盘资源。

网盘资源

网盘的资源角色只有动作,几乎没有保留表情差分,github上的那个资源都有。

我下载了PC离线版本L2D资源,可以看到这里使用的是旧版的Live2D格式 SDK2

对应SDK3就是:

  1. mtn是motions
  2. dat是moc3文件
  3. json是.model3.json文件

image-20251125154941977

路径

国际服有和谐,所以这里看官服也就是韩服的。

image-20251125155022932

目录名称可能的含义

c/sc/ig - character

m/sm - monster

v - 有的是角色,有的是不明物体。

xc/xm - doll character/doll monster

所以只需要导出c/sc/ig/v开头的目录即可

处理

以c000_01为例,以下称为name

image-20251125154941977

  1. character.dat 名称修改为 name.moc (c000_01.moc)
  2. MOC.name.json 名称修改为 name.model.json (c000_01.model.json)
  3. MOC.name.json 内容中model键的值修改为对应moc文件名称 ( “model”: “c000_01.moc”, )

批量处理脚本,需要放在模型目录下

image-20251125164548548

.Scripts/DestinyChild/ProcessDC.py at main · violet-wdream/.Scripts

疑点

处理完之后,发现还有几个模型是mmd文件。MikuMikuDance DOWNLOADS - Learn MikuMikuDance - MMD Tutorials - Free 3D Animation Software,但这个明显是2D的贴图。

在其他仓库里看到是med格式,但是从文件的内容来看,开头的签名是MMD。

c028_01 c028_02 c052_00

暂时不知道怎么用

image-20251125170024560

魔姬物語(Monster Girl) Spine FakeHeader加密 可更新,无明确路径

这游戏别名有点多,每个服务器名字差得很大:

  1. Maidens Fantasy: LUST SEA 女仆幻想
  2. Tales of Angels English 天使物语
  3. やばい!少女に囲まれた! 日本語版

包名com.mjwyplay.qooapp

产品展示。可以给到一个夯,没什么3a大作的迹象,各有特色,深得我心。

image-20251125222101085

image-20251125223409774

image-20251125222255266

image-20251125222457658

资源

[Download] Monster Girl - QooApp Game Store

路径

APK路径

APK里找assets > data

导入AS选择FakeHeader,搜索LH 开头是LH的就是立绘spine

APK这里的就是全部的资源了,而且是没和谐的资源。

热更资源路径

热更的资源下载的主要是国区特供的和谐版本。

就一个lh_baige05有用,因为APK里面这个标识错了,APK里面是一张静态图,就需要替换这个资产。

image-20251125220640757

绅士冒险(Lusty Odyssey) Spine 已关服,无本体资源

成品展示。可以给到一个顶级。

image-20251126120822046

image-20251126121746070

image-20251126121838320

image-20251126122055912

资源

来自论坛的成品模型资源:

【绅士冒险】spine文件分享 - 资源 - Live2DHub

角色CG:链接:https://pan.baidu.com/s/1a4vL9H_eUCW4_v1xieOK1g提取码: star

HCG:链接:百度网盘 请输入提取码提取码: star

解压密码bilibili@耀依永恒

游戏APK没什么内容,安装后启动已经不会热更新了。

https://resfile.lixincsb.com/apk/1697525935357.apk

目前还没有找到游戏本体的assets

未完待续==最后的起源(Last Origin) UnityAnim 无加密 路径明确

成品展示。毫无疑问夯,最大不足就是有些角色的雷子大的吓死人,恐怖谷效应看出来了,早期作品完全没人样啊,后面好很多了,线条什么的看的也舒服多了。

鬼图就不放了,放几张个人觉得还不错的,wiki上找的。

Kunoichi Zero Skin 1 Damaged.png

参考:

有没有大佬提取下last origin的 - 讨论 - Live2DHub

Last Origin アセット抽出メモ - mizle notes

资源

找韩服下载,韩服和台服是R18无和谐,日服和其他服有和谐。

Qoo上面的日韩版本均为和谐版本,台服是无和谐的,但游戏进度是落后的

  1. Wiki[Last Originwiki官网_Last Origin图鉴 GameKee](https://www.gamekee.com/lo/)
  2. 韩服Latest Korean Apk - Last Origin Wiki
  3. 台服[【公式】LASTORIGIN Pmang(G・O・P運營)](https://lastorigin.pmang.jp/tw/g)

路径

APK里什么都没有

热更资源:

image-20251126143748197

2dmodel_

  1. 3P
  2. BR
  3. DS
  4. LC
  5. PECS

是动态立绘,并不是Spine,而是用了Unity原生的animation组件,这就很难绷了。

Ags MP是怪 PROP是物品/道具

AssetRipper

需要用AssetRipper提取资源,因为AS会破坏结构?

勾史软件,难用的一 ,以后再说吧。。。

导入Unity

前面导不出来,后话了,修改着色器为Sprite

image

城市里的欧派/水花乱舞(Boobs in the city) Spine 无加密 已停服,有本体资源

成品展示。可以给到一个夯,可惜了已经停服了,这个色彩和人体真是老手艺人的作品了。

image-20251127154651133

image-20251127155242531

image-20251127155428888

image-20251127155711654

image-20251127160136377

资源

现成模型资源【城市里的欧派】spine文件分享 - 资源 - Live2DHub

APK和热更资源[com.io54647.moba.r18.zip_免费高速下载 百度网盘-分享无限制](https://pan.baidu.com/s/1KT4pABaU-tVvT0cTleg7og)

路径

image-20251127010732422

导出

搜索

assets/artresources/ui,cg

assets/assetbundleresources/icon/images03_hcg_act/interactive,hcg

assets/assetbundleresources/icon/images03_hcg/images, hcg预览图

assets/assetbundleresources/icon/icon03_character/images,立绘

assets/assetbundleresources/icon/images02_role/images,表情差分

分别筛选TextAssetTexture2D然后导出即可。

疑似缺少了以下HCG,可以找到对应的预览图,但是没有模型,好像也没看到对应的立绘图片

  1. E000_CG1
  2. E002_CG1
  3. E003_CG1

可能在APK包里面,但是APK包有加密,混淆了UnityFS,没看出来什么加密。

雀魂(MahjongSoul) Spine 隐藏版号 路径明确

成品展示。人物还是比较精美的,就是动作比较单调,幅度很小,这个服饰设计和清晰度又弥补了这一点,可以给到夯

image-20251127235743939

这张确实夯中夯,比较出圈的一张了

image-20251127235940450

image-20251128000126336

image-20251128000445747

image-20251128000756407

资源

Steam下载,模拟器都快塞爆了,只能下载PC端了。

路径

Steam里面右键点开浏览本地文件

D:\SteamLibrary\steamapps\common\MahjongSoul\Jantama_MahjongSoul_Data\StreamingAssets\StandaloneWindows

导出

没有加密,2020.3.48f1AS中指定版本号即可,AXIX版本导入有错误,用Mod版本

筛选文本资源和贴图,搜索myassets/spine后全部导出即可。

战姬收藏(Senki Collections) Spine 已跑路

神秘轶闻卷钱跑路的国产手游,还骗了一波日本人 - 知乎

成品展示,这个雷子我是真喜欢,可以给到一个夯,可惜这画师的深厚功力,无良公司。。

image-20251128124757168

这个垒丝我是真喜欢

image-20251128125211760

看板娘

image-20251128125512156

image-20251128125655294

资源

链接:https://pan.baidu.com/s/1uGpBi8PeKWnpD4BVuoAbZg提取码:5sc9

文件后缀修改为zip,实测只需要解压合集即可,多余一个模型已经在合集里面有了。

目前尚未找到游戏本体资源,只有韩服的APK(只有极少量资源)

解压LPK

你也可以把这个LPK用Live2DViewerEX打开。

跟LPK文件放一起执行即可,自动输出到output目录下

.Scripts/Decrypt/LPKUnpacker.py at main · violet-wdream/.Scripts

处理后每个模型都会多出很model.json实际上只需要保留和atlas匹配的即可,使用脚本删除多余model配置

.Scripts/DelOtherModelJson (LPKAssets).py at main · violet-wdream/.Scripts

未完待续==第七史诗(EpicSeven) Spine 特殊加密 Scsp无解

包名com.stove.epic7.google

资源

国服有和谐,自行反和谐第七史诗和谐方法_第七史诗

国际服[[Download] Epic Seven Global - QooApp Game Store](https://apps.qqaoop.com/en/app/6830)

APK很小,应该没什么资源

这私人游戏会检测root,检测敏感文件/软件,你就是关了root也不行。

用BlockerRelease v2.0.5839 · lihenggui/blocker屏蔽这个软件的服务

国服参考https://www.taptap.cn/moment/191523295995101515

国际服我也不清楚,我的magisk刚好坏了顺手卸载了,关闭root就可以了,需要用梯子登录然后才会下载资源。

解密

CeciliaBot/EpicSevenAssetRipper: Tool for extracting assets from the data.pack file for Epic Seven and Chaos Zero Nightmare

神了这b游戏,7G资源在一个包里面。

image-20251205194006174

导入提取器,选择portrait导出

image-20251205201358294

右下角两个按钮是插件,默认打开不用关。

导出所以只需要解决scsp文件转换为骨骼文件的问题。

角色全貌文件共享——混沌零噩梦频道 — 클뜯)캐릭터 풀샷용 파일 공유 - 카오스 제로 나이트메어 채널

这个鸟论坛看样子有人发了个Base64编码的URL,但是过期了,没辙

悠久之树(Eternal Tree) Spine 无加密 路径不明确

包名com.orlesh.yjzs.qooapp

成品展示。基本上都是立绘,spine都不是,而且分辨率也不是很高,令人失望

image-20251129174525788

image-20251129175516474

image-20251129175041832

资源

[[Download] 悠久之樹 QooApp繁中版 - QooApp Game Store](https://apps.qqaoop.com/en/app/130215)

路径

APK里面什么都没有

热更资源路径,文件数量很多,需要加载一会。

image-20251129154232808

导出

筛选一下贴图,然后自己找路径搜索,挺明显的。

天下布魔(Tenkafu MA) Spine FakeHeader 路径明确

包名com.pinkcore.tkfm.erolabs

产品展示。有点重口,包括但不限于南梁、仁寿、巨物等等。

有些模型的表情会默认全部开启,导致五官重叠了好几次,需要在插槽关闭Emo这一列;同时脸部缺失是没有启用皮肤

image-20251205123930519

image-20251205124044614

image-20251206103445663

资源

天下布魔

路径

image-20251205111720363

导出

资源导入Mod版AS自动处理FakeHeader

搜索Assets/ResourcesBuild/spinechar/cbAssets/ResourcesBuild/avgcg/cg

按照容器路径排序,筛选类型导出

合并alpha通道

所有的图片的alpha通道都被分离出来了,需要合并

.Scripts/Png/MergePngAlpha.py at main · violet-wdream/.Scripts

万源圣魔录(Orisries) Live2D/Spine 隐藏版号+AES-CBC 路径不明确

成品展示。还算可以吧。

image-20251206144003863

image-20251206144123694

路径

mumu模拟器路径

image-20251206134908811

解密

使用脚本处理

.Scripts/Decrypt/DecryptOrisries.py at main · violet-wdream/.Scripts

导入Mod版本AS指定版本2022.3.62f2

一键导出Live2D (路径Assets/ResourcesBuild/avgfg_R18/

搜索Assets/ResourcesBuild/spinechar/Assets/ResourcesBuild/avgcg导出后,使用脚本合并alpha通道图片。

.Scripts/Png/MergePngAlpha.py at main · violet-wdream/.Scripts

西游:笔绘西行 Spine FakeHeader skel拆分

成品展示。动作不多,但还是挺有一番风味,符合印象的国风色彩。可以给到一个夯

158003这张被和谐了,加了俩布料..直接盖在扔子part上面没法处理。

158003

扫完一 蜘蛛精

154002

154003

资源获取

包名com.cyou.xxygb

来自官网《西游:笔绘西行》官方网站

静态资源

打开APK,assets路径下找到bundles即可,文件均为.u2d格式。

热更资源

image-20260109181507112

注意 要手机号登录然后实名认证,然后下载剩余内容。否则后续有的角色缺失。

image-20260110003505692

下载完后把热更资源的bundles和APK里头的bundles合并一下。

路径

导入MOD版AS自动处理FakeHeader

Previewsassets/ui/i-icon/herochiji/texture

Spineassets/objects/spine/hero_live/筛选图片和文本资产导出贴图和纹理集。

注意这里的Spine路径里面只有贴图和纹理集,没有骨架,因为骨架经过处理作为了u2d文件,需要另做处理。

对任一模型路径进行查看,根据这三个动作不难判断下面这两个bytes文件就是骨架。处理后的MD5值就是名称。

image-20260109170128033

搜索一下哈希值果然发现了文件,可以判断其他模型也一样。

image-20260109170302087

image-20260109170616436

所以只需要搜索_aniinfo按照容器排序导出所有info文件即可。

image-20260109171039854

热更资源同理

获取skel文件

使用脚本直接处理即可,需要修改三个路径,分别是aniinfo文件路径,bundles文件路径,输出路径

小技巧:如果你之前输出的aniinfo文件是按照容器路径,这里的输出路径就可以直接填写这个路径,因为会给生成的skel文件添加父级目录,然后就自动和图片、纹理集自动放在一个目录下了。

.Scripts/XiYou/MergeSkel(XiYou).py at main · violet-wdream/.Scripts

有几个缺少了对应文件。手动排查了一下确实没有

跳过 155002: 缺少 .u2d 数据碎片 - 女的 有动作,只有一个u2d文件
跳过 15800302: 缺少 .u2d 数据碎片 - 女的 有动作,两个u2d文件都没有
跳过 159102: 缺少 .u2d 数据碎片 - 男的

有预览图的就一定有对应的spine,不知道为什么缺失了文件。

破案了,要手机号登录然后实名认证,然后让你下载剩余内容。

image-20260110003505692

模型命名的槽点也很多,1开头的基本都是角色(有两个敌人),2或者3开头的应该就是敌人。

158502和15850201是完全一样的内容。155402和15540201也是完全一样的内容就是多了个背景。

_1结尾的基本可以确定是前缀的动态背景,单独做了一个文件。

大致的规律就是4位数角色名+02/03/…(编号)+ 01

少年三国志2 (YoungThreeKingdoms) Spine PVR文件(UF)

成品展示。spine版本是3.5.15,有点旧了,有的软件都打不开。卡面第一眼看还是挺精致的,但是分辨率有点差以及动作几乎就没有。可以给7分。

1200090

210040

国服和谐了,俩大黑块。

1100070

略有瑕疵,有点缝,开了边缘填充也没用。

image-20260113180949185

资源获取

国服有和谐,反和谐方法未知。太赤石了,完全不建议下载国服,然后下完之后资源明显是不全的,只有新出的几个角色。

新马版:[Download] 少年三国志2新马版 - QooApp Game Store

新马版目前下载有问题,真机、模拟器都容易下载失败。

实测放着下载一直挂着,提示错误也别管,就一直下载,过一段时间就下好了。

静态资源

APK里面 assets > res > pic > knight_spine

预览图 assets > res > pic > knight_bust

APK里面的疑似都是清朝老片,完完全全的老头乐

200003

近现代,这个应该是上一次更新的角色,官号能找得到。

1200160

热更资源

新马版经常下载失败,进度34%时实测根本没有下载任何内容。社区也有相关反馈。

经过反复尝试得知,应该是需要加速器,虽然可以裸连但是如果一旦超时就会自动删除所有以及下载文件重新下载,cnm神人啊。最后还是下完了,太不容易了。

国服和新马服都是这个路径,比较不常见的经典位置。

前两个都是预览图,最后一个就是spine了。

image-20260112160347459

国服这里资源并不完全。应该少了很多很多,甚至没有澡堂子的皮肤,还有貂蝉什么的都没见到。

新马服也在这里,不过应该挺全的,文件数量多了好几倍。

这个路径下还有个skeleton全是Q版小人

-wing是翅膀
horse pet等等都是装饰物
-battle是小人
-b是澡堂子皮肤
-c是普通静态立绘
-d也是Q版小人

png解密

参考少年三国志2 - 讨论 - Live2DHub

所有的png图片都被处理过了。

虽然后缀是png但是本质都是加密过的pvr文件,需要先还原为正常的pvr文件再将pvr转换为png即可。

解密脚本,需要手动修改目标目录,自动递归搜索png并处理为pvr。

.Scripts/YoungThreeKingdoms/DecyptSS2.py at main · violet-wdream/.Scripts

需要手动修改目标目录,自动搜索pvr转换为png,需要pillow库和texture2ddecoder-库。

.Scripts/Png/Pvr2Png (NoTP).py at main · violet-wdream/.Scripts

如果你玩的是新马服,到这就是结束了,毕竟没有和谐。

国服和谐处理(无批量方法,仅为手动)

实测确实有和谐

image-20260112165339303

但是值得一提的是并没删除原来的素材,而是保留了,通过插槽也能看出。但是这个剩下的插槽开关并没有任何效果,猜测是atlas的问题。

image-20260112165756346

找到atlas中的相关信息。

aOp
  rotate: true
  xy: 1508, 1
  size: 154, 112
  orig: 154, 112
  offset: 0, 0
  index: -1
aOp2
  rotate: true
  xy: 1621, 1
  size: 154, 112
  orig: 154, 112
  offset: 0, 0
  index: -1

发现只有xy坐标(也就是在纹理图中的坐标)略有不同,其余一致。

把aop2的x y坐标替换为aop的即可

aOp
  rotate: true
  xy: 1508, 1
  size: 154, 112
  orig: 154, 112
  offset: 0, 0
  index: -1
aOp2
  rotate: true
  xy: 1508, 1
  size: 154, 112
  orig: 154, 112
  offset: 0, 0
  index: -1

成功搞定。

image-20260112171626752

但是其余模型的命名又不太一样,纯纯是海底捞针,太浪费力气了。

下面这个模型还少了第一张纹理图,私人游戏,不过说到底还是国服太脑残了。

image-20260112170836827

image-20260112170942117

虽然缺了张纹理图,但是从这里还是能看出确实是保留了原来的部件,但是没找到一致的处理方式来反和谐。

所以还是别玩国服了。

女神乐园 (Goddess Paradisec) Spine FakeHeader 资源混乱

女神楽園:ガーデス·パラダイス 公式サイト|好評配信中

(1) 【公式】女神楽園 ガーデス·パラダイス (@gadepara_jp) / X

夯9.5,量大且管饱,立绘质量顶级,还是自家人懂xp这一块。

好经典的国产日本游戏。

还有意外发现,BXP_FHJ这个模型的插槽82 83可以关掉,甚至还做了物理效果。

148是裙子,不过底下就没什么细节了,只有色块。

image-20260116214318832

J - cls

image-20260117001527552

J_SH - jiao_yy jiao_110 jiao_108 jiao_107 jiao_106 jiao_105 jiao_104 jiao_103 jiao_102

image-20260117003256627

Loki - dn_79 77 71 70 58

image-20260117011035435

NWUTR 151 150

image-20260117011816562

PSFNDC 108 107

image-20260117095402054

WED 24 22 21

image-20260117100228579

YXSUTR 贴图里明显是有预留设计的,但是纹理集里面没有插槽。可以复制一份贴图然后PS处理一下,注意这里需要再复制一份atlas同时把对应记载的png名字替换。

image-20260117111136963

ANBS 分辨率顶级,太戳我xp了,关键部位没有插槽,调不了。

image-20260116233853371

DTGUR 107 23 关键部位没画,狱卒含金量不必多说

image-20260117112206883

BSD 构图神了,咬着的系带更是点睛之笔,夯爆了。

image-20260117000600537

BH - BH68 有细节但是层级有点问题,建议半透明。

image-20260117001206353

还有好多,不再列举了。

下载

来自Qoo[Download] Goddess Paradise - QooApp Game Store

资源路径

都在APK里面,这APK里面有三个子APK,找到split_assets_module.apk,找到里面最大的文件夹就行,然后里面都是.ress这种文件,命名很乱。

后续更新应该在package里面。

Previews

导入MOD版AS,搜索hero_可以找到对应角色的预览图。但是这里每个角色有2~3个预览图(三种尺寸),如果不用MOD版AS,导出来会提示文件重复然后自动skip了,就只会导出一张图片。

image-20260116203553456

这里全部选中然后导出,然后再保留同名图片里面size最大的就可以了,最后再把保留的这个文件重命名为规范名称即可,通常size最大的是全身预览图。

这里是处理脚本

violet-wdream/.Scripts: Personal AssetUnpack Script

少了hero_128,应该是官方失误了。

Spine

对于spine而言几乎就没有简单的处理方式了,命名都是拼音首字母来的,没什么规律,而且容器路径也被混淆了。

筛选textAsset和Texture2D,然后自己慢慢筛吧。

有些spine是场景物品之类的,可以跳过,通常有一整段是spine模型混杂一些其他文件,把这一整段都导出来,然后最后再进行分类,这样轻松很多。

.Scripts/Sort/SortAtlas&Skel&png(Any) v1.py at main · violet-wdream/.Scripts

但是需要注意的是有很多模型有和谐版本(名称和原本一样),可以给出一些经验:先用肉眼排除一下和谐版png,atlas里面写了png的分辨率,同一套skel和atlas通常路径一样。

使用spine播放器打开:

  1. 如果有骨骼但是是贴图混乱的或者出现大片紫色块,说明skel和atlas是匹配的,贴图错了;
  2. 如果没有骨骼,说明skel和atlas不匹配;

2026.1.16 导出190个spine,去掉了小人/怪物/NPC等。

三国another (幻想名将录/三国志アナザー~星将の願い~) 停更了 Spine Cocos2D Astc-Beeplay

赏析环节。给个7.5分,还是挺好看的。第一次处理cocos引擎游戏,真是一路折腾🤯🤯🤯,感觉收获颇丰。

image-20260118215653483

image-20260118214756071

image-20260118213610034

image-20260118123247069

image-20260118122757462

image-20260118122911544

image-20260118123043984

image-20260118123152014

游戏资源

依旧来自Qoo[Download] 三国志アナザー 星将の願い - QooApp Game Store

【公式】三国志アナザー~星将の願い~(三国another) (@another3594) / X

官网半天找不到,大概也是半截入土了。

资产路径

APK

都在APK里面,这里忘记看了,所以安装了。应该也是APK里面有分块APK,找到下面这个。

image-20260117113506697

在以下这个路径里面

image-20260117170405787

这里的native就是所有的资源文件,import和 index.jsc 没什么用。

config.json很重要,是用来还原文件名的。这里先解压出来。

热更资源

还剩下很多热更资源是要你登录游戏后才会下载,而且是后台下载,不会提示你。你进游戏后随便点几下出去,你会发现游戏体积大了1.5G左右。

在下面这个位置。

image-20260118145852589

key (可以跳过)

这里得到的key并不重要,因为后续也用不到,只是用来反编译jsc使用。如果只需要获取spine,这里可以跳过

参考

关于Cocos2dx-js游戏的jsc文件解密(二) - 吾爱破解 - 52pojie.cn

群英风华录解密有教的吗 - 讨论 - Live2DHub

关于Cocos2dx打包游戏的jsc文件解密(一) - 知乎

cocos引擎,xxtea加密

libcocos2djs.so搜索Cocos Game 后面跟着的第一个串就是keywf-game-card

77 66 2D 67 61 6D 65 2D 63 61 72 64 00 00 00 00 #自动填充到16 bytes
wf-game-card

image-20260117172729244

或者IDA里面搜索xxtea相关的函数也能找到。

验证了论坛里的一个说法applicationDidFinishLaunching,大多都是在这里可以找到xxtea的key

AppDelegate::applicationDidFinishLaunching(void)

image-20260117173020279

还原astc为png

从散落的文件里看到了atlas文件,所以是spine无疑了。然后bin文件就是二进制skel骨骼,直接改为skel后缀就能用了。

绝大部分文件都是astc,压缩且加密,没法直接转换,解压astc发现文件头变成了beeplay,说明第一步是解压,然后再去掉beeplay进行XOR解密

逆向libcocos2djs.so搜索astc以及image相关函数

cocos2d::Image::initWithImageData

发现检测文件头7bytes,就是检测beeplay签名

if ( !memcmp(cocos2d::Image::initWithImageData(unsigned char const*,long)::ENCRYPT_SIGNATURE, p[0], 7u) )
{
    v8 = v4 - 7;
    v9 = (unsigned __int8 *)malloc(v4 - 7);
    memcpy(v9, v7 + 7, v4 - 7);
    if ( v4 - 7 >= 1 )
    {
        if ( v8 < 0x20 )
        {
            v10 = 0;
            do
                LABEL_15:
            v9[v10++] ^= 0x17u;
            while ( v8 != v10 );
            goto LABEL_16;
        }
        v11 = 0;
        v10 = v8 & 0xFFFFFFFFFFFFFFE0LL;
        v12.n128_u64[0] = 0x1717171717171717LL;
        v12.n128_u64[1] = 0x1717171717171717LL;
        do
        {
            v13 = (int8x16_t *)&v9[v11];
            v14 = *(int8x16_t *)&v9[v11];
            v15 = *(int8x16_t *)&v9[v11 + 16];
            v11 += 32;
            *v13 = veorq_s8(v14, v12);
            v13[1] = veorq_s8(v15, v12);
        }
        while ( v10 != v11 );
        if ( v8 != v10 )
            goto LABEL_15;
    }
}

这里大概就是说把beeplay文件头去掉后,直接对所有的字节XOR 0x17

astc文件  
  └─ GZIP解压
       └─ beeplay ASTC
             └─  7 字节头
                  └─ XOR 解密
                      └─ 标准 ASTC
                          └─ astcenc 解码 = 正常astc文件

astc处理为正常格式后,还需要分类,

image-20260117134749840

上面提到了很多种图片格式,这里统一处理为png格式的(spine的贴图是png的),这里只会处理astc

文件,skel 和 atlas不会处理,可以放心使用。后文会给出脚本。

资产分类/名称还原

所有文件的名称都是没什么规律的,没法进行分类,所以也没法通过名称找到同一个spine的三个文件。尽管可以尝试用atlas里面记载的图片名称和尺寸进行匹配,但是skel的匹配却别无他法。所以最优解法还是找到映射表。

根据上文找到的key,可以通过jsc反编译器jsc解加密工具-Orange.zip - 蓝奏云来查看源码index.jsc

image-20260117174828082

这里得到index.jsc,目前看来没什么用。推测是引擎自己使用的逻辑,有兴趣可以自行了解一下。

理论上来说通过config.json应该就可以搞定了,但是这里uuid里记载的都是22位的,实际文件基本都是36位,有少数是9位的。在config里面都是22位的根本找不到,应该还做了其他处理。

通过抓包发现,下载的本地manifest里面记载的也是22位数据,同时远程的manifest也是22位数据,所以说要处理的话只能在本地处理了。要去找到游戏内部的处理逻辑。

# 热更新
http://hotter-hxmjljp.wengames.com/japan/cardjapan-update/1.0.17.73/ios_bundle/assets/resources/import/51/5127c5e3-3e3e-4150-b8bf-904386ffe7fc.json?md5=b120aa6f54754ce2834e617c2ddc4e7f
# 本地manifest
http://hotter-hxmjljp.wengames.com/japan/cardjapan-update/1.0.17.73/ios_bundle/project.manifest

经过一天的瞎折腾,终于找到了答案:

不懂就问:UUID的压缩算法是怎么样的呢? - Creator 3.x - Cocos中文社区

有什么方法能从cocos creator构建的游戏里还原出live2d或spine动画资源? - 讨论 - Live2DHub

config.json里记载的uuid是22位的被压缩的uuid,而文件名称都是36位的uuid (不是hash)

处理顺序:读取config.json建表(path的key对应uuid的index)dictionary<uuid22, path>,遍历所有文件(uuid36 -> uuid22 -> path)找到对应path,重命名并移动。后文会给出处理脚本。


处理有点慢,要个5s吧。但是处理完发现还有大约900张图片是没有分类的,因为config里面根本没有对应的路径,只能找到uuid。

小人spines/panel/ 立绘spines/beauty 预览图icon/heroHead

到这里基本上就搞定了,接下来就是把spine相关文件的名称改为模型名称。

从马后炮的角度来看,其实path里面记载的路径比如"3": ["icon/heroHead/11068", 1],

最后一部分11068其实是文件名,icon/heroHead才是路径。这样可以理解为什么会有这样的"spines/panel/SG_SHU_OR_pangtong/SG_SHU_OR_pangtong"后面两段重复的路径了。

发现还缺了挺多东西的,不知道是不是鉴权,下面这几个角色有一大半没有。

image-20260118124502024

从头像数量来看,应该有211个的spine,config的路径里面spines/beauty/spine/开头的有168个,分类后实际42个。

我找了一个没有的角色头像,同时也是未被分类的,计算出来的path应该是8790,而这里刚好没有。这就产生了一个疑点。

image-20260118130301744

搜索武则天,在官网也能找到对应的立绘,但是本地只能找到小人,config里面也只有小人的相关文件,并没有立绘的。

图像

实测游戏内可以看到立绘,而且是动态的。

image-20260118143258827

在游戏里面切换立绘十分流畅,几乎可以肯定都是本地资源。

又经过了一番探索,发现了问题的端倪,APK里的只有500MB,而游戏体积占大头的一定是资产,所以这1.69G里面肯定有资产。

image-20260118145735093

/data/data/包名/这个路径下,remote目录

image-20260118145852589

这里还有个很重要的表cacheList.json,一并保存下来。

打开remote发现有两个特别大的json文件,果不其然是config。为什么会有两个?

猜测因为把native和import放一起了,所有既有atsc bin atlas 还有json文件。

但是这俩玩意里面很多重复的条目,这个也无从分辨,不知是怎么考虑的,当前的策略是第一个config为主体,如何没有查到,就查另一个config。不过从结果来看,用那个size更大的config好像就行了,因为这个查不到的话,另一个也还是查不到。

注意到文件的命名都不是36位的uuid,而是类似17686595069780的一串数字。这里cacheList.json就发挥作用了,这里又是一层映射关系,url -> uuid36

image-20260118153929977

然后接下来的处理方式跟之前一致。

总结

  1. APK资源:Qoo下载APK,解压找到split_install_time_assets.apk,再解压找到 assets > assets > resources 这个目录保存native文件夹和config.json (configAPK),native应该有400+MB。
  2. Cache资源:在上文提到路径,保存remote目录和cacheList.json。将文件按照大小排序,保存最大的那个json17686595437760.json (configCommon 4528 KB),然后按照文件类型排序,取出其中的atsc atlas bin文件,json以及其他类型的不要,保存到cache目录。
  3. native和cache目录统一放在Res目录下

形成以下工作目录结构

.
├─ ERRORRes
├─ Res
  └─ native
  └─ cache
├─ SortedRes
├─ cacheList.json
├─ configAPK.json
└─ configCommon.json

先分类,再处理。分别使用以下两个脚本来分类和还原。具体使用方法看注释或者问AI

  1. 分类:把脚本里面的输入目录改为工作目录,同时修改这三个json的路径

    .Scripts/SanGuoAnother/SortFiles.py at main · violet-wdream/.Scripts

  2. 还原:分类完毕后,把还原脚本里的输入路径改为你想要还原的部分(比如.\SortedRes\spines\beauty\spine),不建议全部还原,因为文件太多了,astcenc处理速度有点慢。

    .Scripts/SanGuoAnother/Astc2Png (SanGuoAnother).py at main · violet-wdream/.Scripts

部分文件无法分类放在了ERRORRes,需要手动处理。我看了下都是些乱七八糟的玩意,无伤大雅。

总共172个,有个模型缺了atals,应该是这个nvzhulihui_pifu2

nv_2

群英风华录

群英风华录解密有教的吗 - 讨论 - Live2DHub

和三国another一个公司做的,资源管理方式一模一样。

有和谐,不过在预览的时候可以切换皮肤。

需要先下载额外资源,再处理文件,登陆游戏后就会开始下载了,过了新手引导应该就下载完了。

image-20260119154755813

资源路径

image-20260119155235213

和三国another操作一样,找到Spine路径下size最大的json文件保存为configCommon.json 同时保存cacheList.json

image-20260119204300743

分类 - 解密(beeplay,XOR0x44 16~24个字节) - astc转换png

双生视界 (Girl Cafe Gun) 停服

谁能分享份关服时的数据包【双生视界吧】_百度贴吧

数据包

安装包

还得是贴吧,找遗产就看贴吧

Live2d-model/少女咖啡枪 girls cafe gun at master · Eikanya/Live2d-model

三国志幻想大陆

有和谐

三国志幻想大陆2 无加密

spine都在APK里面。

路径

image-20260119204035889

image-20260119191958558

灰烬战线

龙与少女的交响曲

失落之剑

魔竞革命

Angelica Aster R

异域战记

Zgirls3

铃兰之剑

三国杀

三国杀移动美化版解包资源【安装包】【SPINE】 - 资源 - Live2DHub

千年之旅

禁欲战姬

超次元女友: 神姫放置幻想乐园

https://apps.qoo-app.com/cn/app/11256

依露希尔

UnityCN AXIX版本AS自己找

《依露希爾》官方網站

spine都只有待机动作的,没什么可聊的。

assets/rawresource/ui/spineskeletons/

assets/loadableresources/ui/spineskeletons/char

assets/loadableresources/story/timelineprefabs/

有几个文件名一坨,png不带后缀,自行搜索单独处理。

Nikke

尘白禁区 UE

40G

AES: 0xC14735FB5A872D2AFA76A5C38521AB8B8E21072C08525B913307608BD1182FA7

鸣潮 UE

FakeHeader

FakeHeader(伪头)是Unity资源文件的一种保护机制,通过在文件头部添加虚假的数据结构来干扰解包工具。

  1. 前置填充: 文件开头有大量00或FF填充
  2. 多重签名: 包含多个UnityFS签名
  3. 大小错位: 实际文件大小与头中记录不符
  4. 加密数据: 文件头包含非标准加密数据
  5. 自定义结构: 游戏自定义的保护结构

image-20251031233624014

  1. 多个Unity版本字符串
    • 2021.3.8f1
    • 2021.3.29f1
    • 重复出现多次
  2. UnityFS签名位置异常
    • 真正的UnityFS签名不在文件开头
    • 前面有大量版本字符串和其他数据

AES加密

import os
import sys
import concurrent.futures
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import multiprocessing

def text_to_hex(text, length_bytes):
    """将文本转换为指定长度的十六进制字符串"""
    bytes_data = text.encode('utf-8')
    hex_data = bytes_data.hex()
    
    # 截断或填充到指定长度
    target_length = length_bytes * 2  # 每字节对应2个十六进制字符
    if len(hex_data) > target_length:
        hex_data = hex_data[:target_length]
    else:
        hex_data = hex_data.ljust(target_length, '0')
    
    return hex_data

def decrypt_file(file_path, key, iv):
    try:
        with open(file_path, 'rb') as f:
            ciphertext = f.read()
        
        cipher = AES.new(key, AES.MODE_CBC, iv)
        decrypted_data = unpad(cipher.decrypt(ciphertext), AES.block_size)
        
        output_path = os.path.splitext(file_path)[0]
        with open(output_path, 'wb') as f:
            f.write(decrypted_data)
        
        return f"已解密: {file_path} -> {output_path}"
    except Exception as e:
        return f"解密失败 {file_path}: {str(e)}"

def traverse_directory(directory, key, iv):
    files_to_process = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            files_to_process.append(os.path.join(root, file))
    
    # 获取CPU核心数,设置线程池大小
    cpu_count = multiprocessing.cpu_count()
    thread_count = max(1, cpu_count)  # 至少1个线程
    
    print(f"使用 {thread_count} 个线程进行解密")
    
    with concurrent.futures.ThreadPoolExecutor(max_workers=thread_count) as executor:
        # 提交所有文件解密任务
        future_to_file = {executor.submit(decrypt_file, file_path, key, iv): file_path for file_path in files_to_process}
        
        # 收集并打印结果
        for future in concurrent.futures.as_completed(future_to_file):
            result = future.result()
            print(result)

def main():
    while True:
        # 获取文件或目录路径
        path = input("请输入文件或文件夹路径(输入q退出): ").strip()
        if path.lower() == 'q':
            break
        if not os.path.exists(path):
            print("路径不存在,请检查后重试。")
            continue
        
        # 获取密钥和IV
        key_input = input("请输入16/24/32字节密钥(十六进制或普通文本): ").strip()
        iv_input = input("请输入16字节IV(十六进制或普通文本): ").strip()
        
        # 自动转换非十六进制输入
        try:
            key = bytes.fromhex(key_input)
        except ValueError:
            key_length = 32  # 默认16字节密钥
            if len(key_input) >= 24:
                key_length = 48  # 24字节密钥
            if len(key_input) >= 32:
                key_length = 64  # 32字节密钥
            key_hex = text_to_hex(key_input, key_length // 2)
            key = bytes.fromhex(key_hex)
            print(f"已将密钥转换为十六进制: {key_hex[:16]}...")
        
        try:
            iv = bytes.fromhex(iv_input)
        except ValueError:
            iv_hex = text_to_hex(iv_input, 16)
            iv = bytes.fromhex(iv_hex)
            print(f"已将IV转换为十六进制: {iv_hex}")
        
        # 验证密钥和IV长度
        if len(key) not in [16, 24, 32]:
            print("密钥长度必须是16、24或32字节。")
            continue
        if len(iv) != 16:
            print("IV长度必须是16字节。")
            continue
        
        # 处理文件或目录
        if os.path.isfile(path):
            print(decrypt_file(path, key, iv))
        else:
            traverse_directory(path, key, iv)
        
        # 询问是否继续
        while True:
            choice = input("是否继续? (y/n): ").strip().lower()
            if choice == 'y':
                break
            elif choice == 'n':
                return
            else:
                print("无效的选择,请输入y或n")

if __name__ == "__main__":
    try:
        from Crypto.Cipher import AES
    except ImportError:
        print("缺少pycryptodome库,请先安装: pip install pycryptodome")
        sys.exit(1)
    
    main()

还没用过。。

Spine合并

Spine文件怎么把文件和背景合二为一 - 讨论 - Live2DHub

image

AseetStudio Fork开发

环境设置

IDE为Rider

使用.NET8.0 开发

MSbuild 选择IDE自带的17.0版本。

image-20251106203527957

配置选择GUI,设置为.NET8.0 后启动。

image-20251106203928618

项目架构

Comments