【手游】魔灵幻想 美术资源加密分析
来源:互联网 发布:windows squid 速度慢 编辑:程序博客网 时间:2024/05/02 02:12
这个游戏是用Unity3D引擎开发的,加密方式是先对AssetBundle加密,然后在libmono.so中对Assembly-CSharp.dll进行加密
0x00 在ida中先找到加密dll的地方
从上面的伪代码可以看出只是进行了简单的异或处理,在看看反汇编代码
这个int EncryptNum[61]里面存放的就是加解密的key
0x01 分析完可以先对Assembly-CSharp.dll进行解密了
//Assembly-CSharp.dll解密算法private byte[] DecryptDll (byte[] bytes){ byte[] encryptNum = new byte[] { 0xA8, 0xBB, 0xCD, 0xDF, 0xE2, 0xF4, 0x86, 0x98, 0xB7, 0xCA, 0xDC, 0xEE, 0xF1, 0x83, 0x95, 0xA7, 0xC6, 0xD9, 0xEB, 0xFD, 0x8F, 0x92, 0xA4, 0xB6, 0xD5, 0xE8, 0xFA, 0x8C, 0x9E, 0xA1, 0xB3, 0xC5, 0xE4, 0xF7, 0x89, 0x9B, 0xAD, 0xBF, 0xC2, 0xD4, 0xF3, 0x86, 0x98, 0xAA, 0xBC, 0xCE, 0xD1, 0xE3, 0x82, 0x95, 0xA7, 0xB9, 0xCB, 0xDD, 0xEF, 0xF2, 0x91, 0xA4, 0xB6, 0xC8, 0xDA}; for (int i = 0; i < bytes.Length; i++) { bytes[i] ^= encryptNum[i % encryptNum.Length]; } return bytes;}
0x02 用.NET Reflector反编译Assembly-CSharp.dll找到对AssetBundle加密的地方(搜索WWW和AssetBundle等相关API去定位)
加密方式和对dll一样也是异或加密,密钥在GameConfig.EncryptNum里
0x03 对AssetBundle进行解密
//AssetBundle解密算法private byte[] DecryptAssetBundle(byte[] array){ byte[] encryptNum = new byte[] { 0xA8, 0xBB, 0xCD, 0xDF, 0xE2, 0xF4, 0x86, 0x98, 0xB7, 0xCA, 220, 0xEE, 0xF1, 0x83, 0x95, 0xA7, 0xC6, 0xD9, 0xEB, 0xFD, 0x8F, 0x92, 0xA4, 0xB6, 0xD5, 0xE8, 250, 140, 0x9E, 0xA1, 0xB3, 0xC5, 0xE4, 0xF7, 0x89, 0x9B, 0xAD, 0xBF, 0xC2, 0xD4, 0xF3, 0x86, 0x98, 170, 0xBC, 0xCE, 0xD1, 0xE3, 130, 0x95, 0xA7, 0xB9, 0xCB, 0xDD, 0xEF, 0xF2, 0x91, 0xA4, 0xB6, 200, 0xDA, 0, 0, 0}; for (int i = 0; (i < array.Length) && (i < encryptNum.Length); i++) { array[i] ^= encryptNum[i % encryptNum.Length]; } return array;}
0x04 解密完后,用提取工具进行提取会发现一直在报错用WinHex看了一下,这些AssetBundle还被压缩了
压缩算法使用的是LZMA,这里我用了开源的LZMA库(支持C/C++,C#,Java) http://www.7-zip.org/sdk.html
//解压LZMA文件private void DecompressFileLZMA(byte[] bytes, string outFile){ Decoder coder = new Decoder(); MemoryStream input = new MemoryStream(bytes); FileStream output = new FileStream(outFile, FileMode.OpenOrCreate, FileAccess.ReadWrite); // Read the decoder properties byte[] properties = new byte[5]; input.Read(properties, 0, 5); // Read in the decompress file size. byte[] fileLengthBytes = new byte[8]; input.Read(fileLengthBytes, 0, 8); long fileLength = BitConverter.ToInt64(fileLengthBytes, 0); // Decompress the file. coder.SetDecoderProperties(properties); coder.Code(input, output, input.Length, fileLength, null); output.Flush(); output.Close(); input.Close();}
资源提取源码
链接:http://pan.baidu.com/s/1mipYkOC 密码:cyo3
0 0
- 【手游】魔灵幻想 美术资源加密分析
- 【手游】梦幻西游手游 美术资源加密分析
- 【手游】梦幻西游手游 美术资源加密分析
- 【手游】有杀气童话 美术资源加密分析
- 【手游】皇室战争 Clash Royale 美术资源加密分析
- 【手游】童话大冒险 美术资源加密分析
- 【手游】封神大主宰 美术资源加密分析
- 【手游】少年西游记 美术资源加密分析
- 【页游】侠物语 美术资源加密分析
- 基于cocos2dx的2D手游美术资源制作技术选型(1)(2)
- Cocos2d-x手游《群侠转》源代码和美术资源免费下载
- 腾讯Unity3D手游 dll加密分析
- 腾讯Unity3D手游加密分析
- 基于cocos2dx的2D手游美术资源制作技术选型(1)--UI、纹理格式、动画制作 - 宏波.王
- 【Cocos2d-x 手游研发小技巧】图片资源加密,Lua文件加密
- 【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】
- 【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】
- 手游《火影忍者》产品分析:基本框架与资源系统
- 批处理文件_去除C源代码中指示行号的前导数字
- Android开发教程05:Android项目的目录结构
- 认识PHP代码标识 想在页面中编写PHP代码非常容易,如下面代码: <?php echo "想学习php吗?来慕课网吧"; ?> 就像你可以编写JavaScript脚本语言需要写在<scri
- 地统计分析笔记——探索数据
- Android中探讨自定义控件View
- 【手游】魔灵幻想 美术资源加密分析
- JSONP跨域访问在线代理API
- js md5加密和 java后台md5加密
- dom事件
- What does ENABLE_BITCODE do in xcode 7?
- 弱小者索取,强大者奉献
- LeetCode OJ: Remove Linked List Elements
- Android APK的数字签名的作用和意义
- 润乾中填写生僻字后显示乱码