该app使用了Lua脚本并进行了加密,借此机会实践一下Lua脚本解密
前言
最近偶然发现一款全网视频解析的软件,安装后发现首页有影响使用体验的广告存在(现在作者已取消广告),同时其附加功能需要加群获取密码才能使用。借这个机会尝试通过逆向工程分析其逻辑,同时这个App使用了Lua脚本并进行了加密,也借此机会实践一下Lua脚本的解密
软件的原始版本下载:原始版本
软件截图
首页 | VIP功能 | VIP功能 |
---|---|---|
工具
apktool—可以将apk资源解码,并在修改后可以重新构建它们,它还可以执行一些自动化任务,例如构建apk
unluac.jar—是一个lua脚本反编译工具,适用于反编译lua开发的程序源码
分析过程
使用Apktool对其进行解包,解包到App目录下
1
apktool.bat d VIP终结者_5.2.2.apk -o App
执行完毕后进入App目录下
其中:
assets:存放资源文件,包含Lua脚本
lib:本地库(Native Library)文件夹,包含编译后的本地代码(Native Code)的so文件
smail:存放
smail
文件,包含Dalvik
字节码,是对App的Java代码反编译成字节码的结果AndroidManifest.xml:包含App的信息
分析smail
进入smail文件夹可以看到Java代码的结构:
发现存在
com.androlua
、com.luajava
等包名,经搜索相关项目,判断App的大部分代码均来自AndroLua_pro。而AndroLua_pro是一个使用Lua语言编写的Android应用的项目,所以,Java代码极有可能并不是应用的主体部分,重要操作很有可能会写在Lua中,所以下面重点分析Lua脚本部分。
初步分析Lua
进入assets可以看到里面存放了所有的Lua脚本及App的图片资源:
用winhex打开lua脚本:
发现并不是Lua明文代码,也不是编译后的
luac
文件。由此得知Lua脚本被加密了,需要对其进行解密
解密Lua
AndroLua_Pro所使用的Lua工具
LuaJava
会加载依赖库libluajava.so
,LuaJava
会使用luaL_loadbuffer
或者luaL_loadbufferx
函数对Lua脚本进行加载,这个函数也是加入Lua脚本解密代码的常见位置,所以找到lib/armeabi/libluajava.so
,用IDA打开并找到这个函数,按F5
进行进一步分析:(上图为方便阅读,已反混淆变量名)
与AndroLua_Pro的原始代码比较,可以发现加入了Lua脚本解密的代码,分析该代码发现有一个IDA无法识别的函数
sub_265E0(t, 255)
,由于对IDA工具还有很多不懂的地方,故没有深入研究,初步猜测是t对255的取余运算(后面验证确实如此)。我们可以参考这一代码,使用C语言编写一个简单的解密工具:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
unsigned char *decrypt(const unsigned char *buff, size_t size) {
unsigned char *buff1 = (unsigned char *) malloc(size);
buff1[0] = 27;
int t = 0;
for (int i = 1; i < size; i++) {
t += size;
buff1[i] = buff[i] ^ (t % 255);
}
return buff1;
}
unsigned char buff[204800];
int main(int argc, char *argv[]) {
char filename[20] = "main.lua";
if (argc == 2)
strcpy(filename,argv[1]);
printf("File name: %s \n", filename);
FILE *fp = fopen(filename, "rb");
size_t size = 0;
size = fread(buff, sizeof(unsigned char), 204800, fp);
printf("File size: %ld \n", size);
unsigned char *res = decrypt(buff, size);
strcat(filename, "c");
FILE *fp1 = fopen(filename, "wb");
fwrite(res, sizeof(unsigned char), size, fp1);
printf("Output: %s", filename);
return 0;
}编译这一代码为
decrypt.exe
,并拷贝到assets
文件夹下,执行以下命令来解密config.lua
脚本:1
decrypt.exe config.lua
解密后的文件为config.luac
,使用文本编辑器观察可以发现其仍然不是Lua代码,而是编译后的luac文件,我们还需要使用unluac.jar
对其进行反编译。
1 | java -jar unluac.jar --rawstring config.luac > config_new.lua |
(如果原始的源码中含有中文,需使用--rawstring
参数进行解码)
反编译后的config.lua
脚本内容如下:
对Lua脚本的修改不是本文探讨的重点,故不做分析。
使用如下命令进行打包:
1 | apktool b App –o out/newApp.apk |
打包后的apk文件没有签名是不能安装到手机上的,需要使用其他的签名工具来对apk签名如signapk.jar
、auto-sign
等
结语
本文分析了在Android中Lua脚本的解密过程,可以看到,软件的开发和逆向分析虽然看似处于对立的层面,但是双方的博弈过程却又促进着各自的发展,这使得开发人员更加重视软件的安全性,逆向工程师们也与时俱进的学习新的知识来面对越来越复杂的安全工作。随着国家现在越来越重视互联网安全问题,很多法律法规的出台来约束互联网规范,我们更应该重视安全对于各行各业的影响和机遇。