0%

对某视频解析软件的逆向分析

该app使用了Lua脚本并进行了加密,借此机会实践一下Lua脚本解密

前言

最近偶然发现一款全网视频解析的软件,安装后发现首页有影响使用体验的广告存在(现在作者已取消广告),同时其附加功能需要加群获取密码才能使用。借这个机会尝试通过逆向工程分析其逻辑,同时这个App使用了Lua脚本并进行了加密,也借此机会实践一下Lua脚本的解密

首页VIP功能VIP功能
首页vip功能vip功能

工具

  • apktool—可以将apk资源解码,并在修改后可以重新构建它们,它还可以执行一些自动化任务,例如构建apk

  • unluac.jar—是一个lua脚本反编译工具,适用于反编译lua开发的程序源码

分析过程

  • 使用Apktool对其进行解包,解包到App目录下

    1
    apktool.bat d VIP终结者_5.2.2.apk -o App

    执行完毕后进入App目录下

    app_dir

    其中:

    • assets:存放资源文件,包含Lua脚本

    • lib:本地库(Native Library)文件夹,包含编译后的本地代码(Native Code)的so文件

    • smail:存放smail文件,包含Dalvik字节码,是对App的Java代码反编译成字节码的结果

    • AndroidManifest.xml:包含App的信息

  • 分析smail

    进入smail文件夹可以看到Java代码的结构:

    samil_com

    发现存在com.androluacom.luajava等包名,经搜索相关项目,判断App的大部分代码均来自AndroLua_pro。而AndroLua_pro是一个使用Lua语言编写的Android应用的项目,所以,Java代码极有可能并不是应用的主体部分,重要操作很有可能会写在Lua中,所以下面重点分析Lua脚本部分。

  • 初步分析Lua

    进入assets可以看到里面存放了所有的Lua脚本及App的图片资源:

    assets

    用winhex打开lua脚本:

    lua_encrypt

    发现并不是Lua明文代码,也不是编译后的luac文件。由此得知Lua脚本被加密了,需要对其进行解密

  • 解密Lua

    AndroLua_Pro所使用的Lua工具LuaJava会加载依赖库libluajava.soLuaJava会使用luaL_loadbuffer或者luaL_loadbufferx函数对Lua脚本进行加载,这个函数也是加入Lua脚本解密代码的常见位置,所以找到lib/armeabi/libluajava.so,用IDA打开并找到这个函数,按F5进行进一步分析:

    so_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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    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

    cmd_decrypt

解密后的文件为config.luac,使用文本编辑器观察可以发现其仍然不是Lua代码,而是编译后的luac文件,我们还需要使用unluac.jar对其进行反编译。

1
java -jar unluac.jar --rawstring config.luac > config_new.lua

cmd_luac2lua

(如果原始的源码中含有中文,需使用--rawstring参数进行解码)

反编译后的config.lua脚本内容如下:

config

对Lua脚本的修改不是本文探讨的重点,故不做分析。

使用如下命令进行打包:

1
apktool b App –o out/newApp.apk

打包后的apk文件没有签名是不能安装到手机上的,需要使用其他的签名工具来对apk签名如signapk.jarauto-sign

结语

本文分析了在Android中Lua脚本的解密过程,可以看到,软件的开发和逆向分析虽然看似处于对立的层面,但是双方的博弈过程却又促进着各自的发展,这使得开发人员更加重视软件的安全性,逆向工程师们也与时俱进的学习新的知识来面对越来越复杂的安全工作。随着国家现在越来越重视互联网安全问题,很多法律法规的出台来约束互联网规范,我们更应该重视安全对于各行各业的影响和机遇。

您的支持将鼓励我的创作!

欢迎关注我的其它发布渠道