使用frida-dexdump脱壳apk

Android apk是Android应用程序的安装包,它包含了应用程序的代码、资源、签名等信息。为了保护应用程序的版权和安全,很多开发者会对apk进行加壳处理,即在原始的apk中嵌入一个壳程序,使得反编译工具无法直接获取到原始的代码和资源。特别是在小米市场中下载的国内top应用,加壳率高达60%,这为我们静态分析工具正常解析apk带来了很大的困难,因此在参考了相关资料后,尝试使用Frida框架动态地对apk进行了脱壳处理,即去除壳程序,还原原始的apk。

Frida框架是一个跨平台的动态代码注入工具,它可以在运行时动态注入代码到目标进程中,从而实现Hook和调试的功能。利用Frida框架,我们可以Hook libart.so中的OpenMemory方法,拦截加载的Dex文件,并将其从内存中导出到指定目录。这种方法可以适用于大部分基于Dex加密或隐藏的加壳工具。

此处借助了Github上大佬编写的脚本frida-dexdump,它是一款基于Frida框架开发的脱壳工具,可以在运行时动态注入代码到目标进程中,从而拦截加载的Dex文件,并将其从内存中导出到指定目录。这种方法可以适用于大部分基于Dex加密或隐藏的加壳工具。

环境准备

  • 一台已经Root的Android手机或模拟器
  • 一台安装了Python和Frida-tools的电脑
  • frida-dexdump脚本

使用步骤

  1. 在电脑上安装frida环境,包括frida-tools和frida-dexdump,可以使用pip命令进行安装。此处一定要注意frida与frida-tools版本的对应关系.

    1
    2
    3
    pip install frida-dexdump
    pip install frida==15.1.17
    pip install frida-tools==10.5.4
  2. 在电脑上通过adb命令在/data/local/tmp目录下放置frida-server-15.1.17-android-x86文件(根据自己的架构选择,我用的是frida 15),并给予可执行权限。之后启动frida-server,并查看是否连接成功。

    1
    2
    3
    4
    5
    6
    7
    8
    adb shell
    su
    cd /data/local/tmp
    chmod +x frida-server-15.1.17-android-x86
    ./frida-server-15.1.17-android-x86 &
    exit

    frida-ps -U
  3. 在电脑上运行frida-dexdump脚本,选择要脱壳的apk进程,等待脱壳完成。我这里用的脚本是从服务器上批量下载apk进行脱壳,并自动重打包。由于是同组其他同学写的,这里只放一部分关键代码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    os.system("adb install " + localpath)     # 安装apk
    try:
    print('[*] Start to unpack ' + packagename)
    # 这是之前版本的老命令,参考frida-dexdump更新日志后,替换成了新版本的命令
    # fridacmd = "frida-dexdump -n " + packagename + " -f -s 4"
    fridacmd = "frida-dexdump --debug -U -d -f " + packagename
    print(fridacmd)
    # os.system(fridacmd)
    # frida-dexdump在碰到某些应用时仍可能出现运行错误,为防止脚本卡死,设置了3分钟的脱壳用时上限
    subprocess.run(args=fridacmd,timeout=180,shell=True)
    except Exception as e:
    print(str(e))
    fail_wf.write(apkpath)
    fail_wf.write('\n')
    os.system("adb uninstall " + packagename)
    continue
  4. 在手机或模拟器上查看/data/data/包名目录下的dex文件,如果有多个dex文件,可以使用dex2jar工具将其转换为jar文件,并使用jd-gui等工具查看源码。此处注意重打包后,查看源码时,需要关闭加载dex文件的checksum检查,否则会导致加载失败。

注意事项

  • 这种方法需要Root权限和Frida框架支持,可能会影响系统稳定性和安全性。
  • 这种方法可能不适用于一些复杂或特殊的加壳工具,例如动态加载或解密dex的加壳工具。
  • 这种方法可能会触发一些应用程序的反调试或反Hook机制,导致应用程序崩溃或无法正常运行。

部分参考资料:

frida-dexdump地址:https://github.com/hluwa/frida-dexdump

作者写的使用说明:https://mp.weixin.qq.com/s/x8_aa762wpsvA4nhSLoppQ

一些其他的博客:

https://www.jianshu.com/p/82775b65f4c5

https://www.cnblogs.com/gezifeiyang/p/16207042.html

https://zhuanlan.zhihu.com/p/413642920