解密Cocos2dx-lua XXTEA加密后.luac文件
针对Cocos2dx-lua提供的轻量级加密方案的反编译。该博客参考自原文章
一般使用该轻量级加密方案的命令如下:
cocos luacompile -s 未加密源码目录 -d 加密后源码目录 -e -k 加密key -b 加密sign --disable-compile
要解密,那么需要知道的是加密key
和 加密sign
一、加密解密思路
我们将后缀为.lua的文件加密成.luac文件,然后放入apk中,那么在程序运行时,势必需要对.luac的文件进行解密,然后再加载运行文件。那程序是如何知道我们在加密key呢?有两个猜想:
1,加密key写入文件,程序在解密时先读取文件中的加密key,再解密。
2,加密key与程序内部约定某个值。
显然,第一种做法很不明智,key值直接存入文件很容易破解,那么就验证第二种做法,既然加密key是约定的,那么肯定可以在程序中找到该值。通过搜索发现验证了该想法。
在工程的frameworks\runtime-src\Classes\AppDelegate.cpp文件applicationDifFinishLauching方法中
能够看到设置了加密key和sign
二、反编译luac
要反编译.luac文件,需要知道加密key和sign。上面提供了一个思路,sign在.luac中寻找,key在打包后的libcocos2dlua.so中寻找。
1,寻找加密sign
用记事本打开某个.luc文件,文件开头的前几个字符即加密sign
2、寻找加密key
下载IDA(交互式反汇编器),将libcocos2dlua.so拖到该IDA快捷图标上,此时会弹出
选择 OK,等待加载function name,避免操作应用是卡住。等会后选择view/open subviews/strings
Ctrl + F 搜索 刚刚获取的sign(XXTEA),得到如下结果
点击该结果,在该结果的附近则能够发现加密key(2dxLua)
3、加密key,加密sign已经获取,如何反编译
cocos使用的XXTEA进行加密,其在external目录下,在xxtea.h可以看到,提供了加密解密方法
#ifndef XXTEA_H
#define XXTEA_H
#include <stddef.h> /* for size_t & NULL declarations */
#if defined(_MSC_VER)
typedef unsigned __int32 xxtea_long;
#else
#if defined(__FreeBSD__) && __FreeBSD__ < 5
/* FreeBSD 4 doesn't have stdint.h file */
#include <inttypes.h>
#else
#include <stdint.h>
#endif
typedef uint32_t xxtea_long