0x00 事由
最近一些群里出现了会以最大音量外放音频且无法退出的恶搞Android App,造成了一些不好的影响。恰好借这个机会尝试通过逆向工程分析其原理,同时这个App也使用了Lua脚本并进行了加密,也借此机会实践一下Lua脚本解密。
0x01 工具
- Java 运行时环境
- Apktool
- unluac
- IDA
- C/C++ 编译器
下文中会给出Lua脚本的解密代码,需要使用 GCC/Clang 等C/C++ 编译器进行编译后执行。
0x02 基本结构
我们首先使用Apktool对其进行解包,假设App的文件名为App.apk
java -jar apktool.jar d App.apk
等待执行完后,打开解包生成的App
文件夹
我们需要关注其中几个文件(夹)
assets
,存放资源文件,包含Lua脚本lua
和音频文件mp3
lib
,本地库(Native Library)文件夹,包含编译后的本地代码(Native Code)的so
文件smail
,存放smail
文件,包含Dalvik字节码,是对App的Java代码反向成中立字节码的结果AndroidManifest.xml
,包含App的信息
查看AndroidManifest.xml
的内容,可以发现以下样本App信息
- App名为
送给最好的TA
- 包名为
com.sgzh.dt
0x03 分析Java部分
进入smail
,我们可以看到Java部分的代码结构,可以看出存在com.androlua
、com.nirenr
、com.luajava
等包名,搜索相关项目可以发现App的大部分代码均来自于AndroLua_pro。
AndroLua_pro是一个使用Lua编写Android应用的项目,换而言之,Java部分极有可能并不是应用的主体部分,重要操作很有可能会写在Lua中。
除了AndroLua_pro的代码外,我们还发现了com.b.a.a
com.b.a.b
这两个经过混淆的包名,经过查证得知里面的代码来源于TextWarrior。
我们得知其Java代码基本都是来源于现有项目,无太大分析价值,我们将分析重点放于Lua脚本上。
0x04 分析C部分
在进入Lua部分前,我们使用文本编辑器查看assets
文件中的init.lua
和main.lua
,会发现他们并不是Lua代码,也不是编译后的luac,可以得知Lua脚本被加密了,我们需要先对其进行解密。
AndroLua_Pro所使用的Lua工具LuaJava
会加载依赖库libluajava.so
,我们使用IDA打开这个文件。LuaJava会使用luaL_loadbuffer
或者luaL_loadbufferx
函数对Lua脚本进行加载,这个函数也是一个加入Lua脚本解密代码的常见位置,我们在IDA中找到这一函数,并使用自带插件对其进行反编译,可以看到如下内容
(上图为方便阅读,已反混淆变量名)
与AndroLua_pro的原始代码比较,可以发现加入了Lua脚本解密的代码,我们可以参考这一代码,使用C语言编写一个简单的解密工具
#include