整蛊软件「送给最好的TA」解包分析
送给最好的 TA.apk,724.32KB。这一个应用安装包 9 月 27 日在国内数量相当多的高校中疯狂传播,高校内部的不少 QQ 群内有群员转发了这一应用安装包,除此之外在以学生为主体的各类交流群中笔者也能看到这一应用安装包的身影。
有的学生误在上课期间安装打开,场面一度十分尴尬,网传更是有学生在集会的时候安装打开这一应用,影响恶劣,最终惨遭退学。顿时笔者就对这款在网络上大肆传播的恶意应用产生了好奇,到底是什么使其能给现实中的人产生如此大杀伤力?
由于这一应用造成的社会影响过于广泛、过于恶劣,原包的 md5 已经被列入了黑名单,基本上是下载不到了。笔者下载的是由他人处理后再打包的一个 648KB 的样本,虽然并非是原包,但是它的核心程序等和原包没有差异,我们仍然可以用它来进行分析。
既然是 APK 文件,第一步当然是解包。虽然 APK 本身只是一个压缩包,可以直接使用压缩工具解开,但是为了一探其代码到底写了什么,笔者这里使用 apktool 进行解包。
解包之后,assets 文件夹内赫然放着三个文件:
0.mp3、init.lua、main.lua,看来这是一个主要使用 Lua 编写的 Android 程序,这个 0.mp3 就是这个程序的万恶之源了。
笔者下载的这个版本中 0.mp3 已经经过了消音,而原包中的 0.mp3 之前经过笔者朋友的实测确实和网传的一样,它是一段不可描述的声音,当时朋友测试的时候使用的还是扬声器,场面一度有些尴尬。
这个程序的大致逻辑到这里已经基本可以猜出来了,即程序运行之后它加载 lua 脚本,脚本中的逻辑会将系统音量锁死在最大,同时循环播放这个极度不良的 0.mp3,同时锁死系统的按键使得应用无法关闭。
观察 AndroidManifest.xml,就权限项来说这个程序申请的权限不是特别敏感,但是由于这款软件本身是恶意的,所以其申请的 SD 卡写入权限还是值得关注一下的,因为它可能会释放一些恶意的东西到手机里。
观察项目目录结构,发现项目包含了 com.androlua 这个包,顺藤摸瓜,笔者找到了 AndroLua+ 这个 IDE。
AndroLua+ 是泥人编写的一个可以直接在 Android 手机上运行的 lua 脚本编辑器,它可以直接在 Android 上建立一个基于 Lua 的 App 工程,用户可以直接在这个 IDE 内编写应用的界面与逻辑。
用户在编写完自己的工程之后可以直接在实机上进行测试,在做好相关的配置之后,用户可以直接使用 AndroLua+ 对工程进行编译、打包,这个「送给最好的 Ta」就是一个完全在手机上使用 AndroLua+ 编写、打包得到的应用。
之前有分析文章说这个应用还涉及到对手机进行截屏并且上传截图图片,这个实际上是不实的。确实,在项目解包后我们可以看到 com.nirenr.screencapture 这个包,这个包提供了一个截屏的方法,但是这并不能证明这一段代码在实际的运行中执行了。
笔者在 GitHub 上找到了 AndroLua+ 对应的开源项目 AndroLua_pro,通过 AndroLua_pro 这个开源项目我们可以找到和「送给最好的 Ta」中一模一样的 com.nirenr.screencapture。
这一部分代码是属于 AndroLua+ 这个 IDE 的,通过阅读 AndroLua_pro 的这一部分源代码,它并不会涉及到自动启动截屏并且上传到某一远端服务器这样的操作,这一部分代码只是给 Lua 环境提供一个截图的服务,让使用 AndroLua+ 这个 IDE 编写出来的程序能够调用到系统的截图功能,仅此而已。
我们之所以能在解包的项目中看到这一部分内容,是因为 IDE 打包 APK 的过程中是直接把整个框架给打包进去了,不论 Lua 有没有用到相关的功能,只要是使用 AndroLua 这一套框架编写出来的 App,它必然会带有这个框架的所有内容,包括这一部分提供截图服务的代码。
因为是使用这一套框架编写的应用,所以我们可以完全确定应用的逻辑只有那两个 Lua 文件,而 Java 部分的内容和应用本身没有任何的关联,它只是一个框架。AndroLua 这个 IDE 只能用 Lua 实现应用逻辑,如果要引入其他高级的逻辑需要引入 so 库,但是「送给最好的 Ta」中除了应用必备的 libluajava.so 外没有任何其他的 so 库,所以 Java 部分就没有必要进行分析了。
对于 main.lua,我们并不能直接看到 main.lua 的内容,很明显这是被加密过的,这意味着我们还需要将这个 Lua 文件 dump 出来才能够看到这个程序到底写了一些什么。
还是回到 AndroLua_pro 这个开源项目,我们可以直接看到 libluajava.so 这个库对应的源文件。在文件中通过分析追溯可以找到加载 Lua 文件的代码。
通过源代码实际上可以还原整个加载的过程,但是我们可以看到这一段函数引用的东西不少,通过翻源码拼出整个加载的代码有些太过于麻烦,所以这里使用 IDA 逆向 so 库反而会更简单一些。
找到我们在源码中看到的对应函数,用 IDA 得到一个 C 代码。通过 IDA 提取我们需要的 Lua 有两个思路,第一个是直接动态调试,然后取内存中 Lua 脚本加载之后的结果,第二个是直接用 C 模拟一遍这个 so 库中加载方法,得到加载后的结果存到文件里,笔者推荐用第二个方法,动态调试然后在这个函数的末尾(41 行)下断点提取结果就行了,当然把这一大段提取出来自己实现一个解密函数也是可以的,其他的分析文有的已经这么做过了,这里笔者就不谈了。
需要注意的是 IDA 提取出来的文件是 luac,也就是 Lua 脚本编译之后的字节码,这个时候还需要通过 unluac 反编译成 Lua 文件。
得到最终的 Lua 文件之后,其实整个程序没有什么特别奇葩的地方,首先是循环播放 0.mp3,然后运行过程中它会以一个非常高的频率自动把音量调到满格,隐藏掉系统的状态栏。
至于程序没有办法自动关闭,是因为它监听了按键事件,屏蔽掉了返回键,把返回键触发的动作改成了加大音量。
网传什么占用音量键关机键都是毫无根据的说法,就摆在这里的代码来说,它只占用了返回一个按键,音量使用一个高频的 Timer 来不断进行修改以保持一个最大水平的,音量键本身没有被程序占用掉。
所以实际上,如果你真的不慎安装打开了,直接用任务管理器杀了他就好了,不存在需要按电源键强制关机甚至是砸手机。当然,格盘之类的也并不需要,因为代码本身没有释放任何恶意的东西,只是一个整蛊。
虽然这只是一个很简单的整蛊软件,但是它的作者忽略了现在网络强大的传播能力,一时间这一个可能只是小范围内娱乐一下的东西瞬间在全国疯传,造成了意外的巨大不良影响。当然,这仅限于原包,后续在网络传播的其他重打包版本是否有被添油加醋就很难说了。
从相关的信息来看,很多高校都有学生陆续中招,有的还是国内非常知名的高校。事实证明再好的高校内也有会无视安全直接安装不明来源 APK 的学生,网络安全方面的教育在笔者看来真的要好好抓一抓。
Android 手机用户需要恪守的一个规则是千万不要安装任何来历不明的 APK,这真的会给你或你的手机带来非常惨痛的后果,哪怕这个 APK 的 Logo 和名称看起来人畜无害,这就和 Windows 上不要随便点开来路不明的 exe 文件是一个道理。