原以为用AssetStudio就能解出来,但发现不行。上网查询后也没发现相关的解包方法,但在 请问有机动战队(Iron Saga)的live2d提取方法么? · Issue #9 · Eikanya/Live2d-model · GitHub 处查询到是用 adobe air 做的游戏(大概?求解包过或会解包机动战队的大佬传授一下解包的方法,下面附上游戏官网链接和相关的游戏图片: 「機動戦隊アイアンサーガ」
机动战队是自研引擎好像,不过骨骼文件和纹理文件是没加密的,你可以直接去数据里面找出来,图片文件的话是加密了,你可以用提取显存图片的方式提取人物尸块,然后去对应相应的骨骼文件和纹理文件
它用的flash, 解密代码在apk里的ENCRYPTTank2014xMobileContent.swf文件, 不过它经过混淆
大佬有没有教学啊显示图片用忍者那个软件提取只是一张人体立绘不是切片那样的纹理图
推一個,這遊戲的靜態圖也滿好看的
就是 enc 這個格式沒看過
而且看了一下 聯動過雷索那斯 女神樂園
居然還能有直接聯動角色皮膚的遊戲
驚呆我了
ENCRYPTTank2014xMobileContent.rar (2.4 MB)
只有不完美的处理,但是没找到问题在哪就放弃了,反正就是解密处理完了还有spine的图片和数据不在一起的问题,且文件名是对不上的,得特么自己想办法处理,还不算有坑爹的atlas里面一个名字外面另一个名字。
請問大佬,您是如何解密的
我想收集一下靜態圖片
大佬不完美也分享一下出来呗大家一起研究
放弃了,你问我不如翻翻上面说的ENCRYPTTank2014xMobileContent.swf,能处理出来就行
推一個,雖然有大佬指路,用的是flash, 解密代码在apk里的ENCRYPTTank2014xMobileContent.swf
但是看了一下午只知道可能是 zlib 壓縮
但是關鍵的decryptFunc 毫無頭緒
它进游戏额外下载的资源套了一层加密
这是处理普通贴图的, decryptFunc被混淆了, 我对flash不熟, 就懒得研究了
package starling.textures
{
import flash.utils.ByteArray;
public class EncAtfData extends AtfData
{
public static var decryptFunc:Function;
public function EncAtfData(param1:ByteArray, param2:int = -1, param3:int = -1, param4:String = "noName")
{
super(param1,param2,param3,param4);
}
override public function setData(param1:ByteArray) : void
{
if(param1[0] == 254)
{
param1[32] = 65;
param1[33] = 84;
param1[34] = 70;
decryptFunc(this,param1);
if(param1[38] == 255)
{
param1.position = 44;
}
else
{
param1.position = 38;
}
param1[0] = 0;
}
else
{
param1[32] = 65;
param1[33] = 84;
param1[34] = 70;
if(param1[38] == 255)
{
param1.position = 44;
}
else
{
param1.position = 38;
}
}
var _loc2_:int = int(param1.readUnsignedByte());
switch(_loc2_)
{
case 0:
case 1:
mFormat = "bgra";
break;
case 2:
case 3:
case 12:
mFormat = "compressed";
break;
case 4:
case 5:
case 13:
mFormat = "compressedAlpha";
break;
default:
throw new Error("TextureError:" + _loc2_ + "/" + name,9999);
}
mWidth = Math.pow(2,param1.readUnsignedByte());
mHeight = Math.pow(2,param1.readUnsignedByte());
mNumTextures = param1.readUnsignedByte();
mData = param1;
}
}
}
其实我也不太懂,完全就是把需要的enc原始文件,ENCRYPTTank2014xMobileContent.swf的导出字节码文件和desc.txt这个索引表丢给cursor让cursor来生成解密脚本和文件的,这是解密出
用到的重要ActionScript函数功能说明
本文档详细说明了在SWF反编译过程中发现的重要函数及其作用。
- 反序列化相关函数
==================================================
v02958809 - 主要反序列化函数
文件: enc/swf导出/scripts/v0263546/v0319019/v02958711/v02958718.as
作用: 这是核心的反序列化函数,用于从ByteArray中读取各种类型的数据
功能:
- 读取类型ID并递归解析数据
- 支持基本类型: Boolean, int, uint, double, String
- 支持复杂类型: Array, Object, ByteArray, Vector
- 处理自定义类型: 通过v0541403字典查找对应的反序列化器
- 错误处理: 遇到未知类型时抛出详细错误信息
v02958795 - 序列化函数
文件: enc/swf导出/scripts/v0263546/v0319019/v02958711/v02958718.as
作用: 与v02958809对应的序列化函数,将各种数据类型写入ByteArray
功能:
- 将对象转换为二进制数据
- 支持所有基本类型和复杂类型的序列化
- 处理字符串长度超过65535的情况
- 递归处理嵌套数据结构
v02992015 - 备用反序列化函数
文件: enc/swf导出/scripts/v0263546/v0319019/v02958711/v02958718.as
作用: 另一个反序列化实现,使用IDataInput接口
功能:
- 与v02958809类似,但使用不同的输入接口
- 可能用于不同的数据源或场景
- 自定义类型管理函数
==================================================
v0541403 - 自定义类型字典
文件: enc/swf导出/scripts/v0263546/v0319019/v02958711/v02958718.as
作用: 存储自定义类型的序列化和反序列化器
结构: Dictionary,键为类型ID或类,值为[typeId, serializer, deserializer]数组
用途: 当遇到未知类型ID时,从这个字典中查找对应的处理函数
v02997539 - 注册自定义类型
文件: enc/swf导出/scripts/v0263546/v0319019/v02958711/v02958718.as
作用: 向v0541403字典中注册新的自定义类型
参数:
- param1: 类型ID
- param2: 类对象
- param3: 序列化函数
- param4: 反序列化函数
- 数据解密相关函数
==================================================
v0409793 - 数据解密函数
文件: enc/swf导出/scripts/v0263546/v0263669/v0299216/v0299339.as
作用: 用于解密ByteArray数据
参数:
- param1: ByteArray - 要解密的数据
- param2: int = -1 - 解密参数
- param3: uint = 0 - 解密参数
注意: 此函数的实现被反编译工具标记为错误,可能被混淆或加密
- 工具函数
==================================================
v0297002 - 单例获取函数
文件: enc/swf导出/scripts/v0263546/v0319019/v02958711/v02958718.as
作用: 获取v02958718类的单例实例
功能: 确保全局只有一个反序列化器实例
v02653287 - 字符串ID映射函数
文件: enc/swf导出/scripts/v0263546/v0263669/v0299216/v0299339.as
作用: 将字符串映射为数字ID
功能: 用于优化字符串存储和比较
v02707276 - 初始化函数
文件: enc/swf导出/scripts/v0263546/v0263669/v0299216/v0299339.as
作用: 初始化各种映射表和配置
功能: 设置默认值和初始化状态
- 数据处理函数
==================================================
v0410654 - 复杂数据处理函数
文件: enc/swf导出/scripts/v0263546/v0263669/v0299216/v0299339.as
作用: 处理复杂的数据结构和格式
功能: 解析特定格式的数据并转换为内部表示
v02653301 - 向量处理函数
文件: enc/swf导出/scripts/v0263546/v0263669/v0299216/v0299339.as
作用: 处理Vector类型的数据
功能: 序列化和反序列化Vector对象
v0410777 - 向量清理函数
文件: enc/swf导出/scripts/v0263546/v0263669/v0299216/v0299339.as
作用: 清理和重置Vector对象
功能: 释放内存和重置状态
- 错误处理函数
==================================================
v02728729 - 错误处理函数
文件: enc/swf导出/scripts/v0263546/v0263669/v0299216/v0299339.as
作用: 处理序列化过程中的错误
功能: 设置错误状态和错误信息
- 常量定义
==================================================
类型ID常量 (在v02958718类中):
- v02958725 = 0 (null)
- v02958732 = 1 (Boolean)
- v02958739 = 2 (int)
- v02958746 = 3 (uint)
- v02958753 = 4 (double)
- v02958760 = 5 (String)
- v02958767 = 6 (Array)
- v02958774 = 7 (Object)
- v02958781 = 8 (null)
- v02971014 = 10 (ByteArray)
- v02997560 = 11 (Vector.<*>)
- v02997567 = 12 (Vector.)
- 使用场景分析
==================================================
这些函数主要用于:
-
SWF文件中的数据反序列化
-
网络通信中的数据编解码
-
游戏存档的读写
-
配置文件的解析
-
加密数据的解密
-
注意事项
================================================== -
部分函数被反编译工具标记为错误,可能被混淆
-
v0541403字典是关键,包含了自定义类型的处理逻辑
-
类型ID需要减1来匹配switch语句
-
递归调用需要注意栈溢出问题
-
错误处理提供了详细的调试信息
-
扩展建议
================================================== -
需要找到v0541403字典的初始化代码
-
分析被混淆的函数实现
-
理解自定义类型的定义
-
完善错误处理机制
-
优化性能关键路径
==================================================
文档结束
swf导出pcode.zip (5.1 MB)
这是导出的 ENCRYPTTank2014xMobileContent.swf全部内容(用pcode),ai可以直接从字节码反推as(被混淆后),大佬试试看呢
你这转的文件都只有method
和body
, code
全是空的, 看不了一点啊
好痛苦的代码, 这个游戏呢加密代码在v0939677.v0311270("firstRun.gs","enc",param1,param2);
apk里的这个 firstrun, 解密函数就是从这个gs里返回的