两种.luac的反编译过程

解密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方法中
AppDelegate.cpp

能够看到设置了加密key和sign

二、反编译luac

​ 要反编译.luac文件,需要知道加密key和sign。上面提供了一个思路,sign在.luac中寻找,key在打包后的libcocos2dlua.so中寻找。

1,寻找加密sign

​ 用记事本打开某个.luc文件,文件开头的前几个字符即加密sign
记事本打开.luac文件

2、寻找加密key

​ 下载IDA(交互式反汇编器),将libcocos2dlua.so拖到该IDA快捷图标上,此时会弹出
so打开选择框

选择 OK,等待加载function name,避免操作应用是卡住。等会后选择view/open subviews/strings
strings窗口

Ctrl + F 搜索 刚刚获取的sign(XXTEA),得到如下结果
搜索sign

点击该结果,在该结果的附近则能够发现加密key(2dxLua)
加密key

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
luac是Lua的官方编译器,用于将Lua代码编译成字节码。反编译则是将字节码反向转换回可读的Lua源代码的过程。以下是luac反编译使用的简要教程。 首先,确保您已经安装了Lualuac工具。打开命令行界面,并导航到您的Lua脚本所在的目录。 使用以下命令将Lua脚本编译为字节码文件: ``` luac -o output.luac input.lua ``` 其中,`input.lua`是您要编译的Lua源代码文件的路径,`output.luac`是生成的字节码文件路径。执行命令后,将生成一个字节码文件,通常是以`.luac`为扩展名。 接下来,我们可以使用反编译器来将字节码文件转换为Lua源码。有许多反编译工具可供选择,其中`unluac`是一个受欢迎的选择。 首先,确保您已经安装了Java Runtime Environment(JRE)。然后,下载unluac的jar文件,并在命令行中使用以下命令运行反编译器: ``` java -jar unluac.jar input.luac > output.lua ``` 其中,`input.luac`是您要反编译的字节码文件的路径,`output.lua`是生成的Lua源代码文件路径。执行命令后,将生成一个可读的Lua源代码文件。 请注意,由于字节码是通过编译器生成的,反编译后的源代码可能与原始代码有所不同。一些变量名和注释可能会丢失,但程序逻辑应该保持不变。 总之,使用luac和反编译器可以让我们查看和理解字节码文件,但请记住,这只是源代码的一个近似还原,不可避免地会有一些信息丢失。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值