这篇文章上次修改于 339 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

前言

frida不断更新之余,其本体也越来越大,server/inject/gadget都是如此,leader说要想个办法,太大,不好...

于是看了一圈,选中了LSPlant来做,但苦于渣渣电脑与渣渣网络,最后差不多搞定了但总是有那么点不尽人意

于是请教了下神通广大的群友,花总说gumjs改造改造即可

frida-gadget其实还是比较稳定的,我们自己稍微封装调用gumjs本质上也类似于frida-gadget了

于是找到了下面的文章,发现原来早已有人做过了:

简言之,就是自己写代码调用gumjs直接加载frida hook的js脚本即可

代码倒是很简单,直接参考xcubebase的代码就行了,核心步骤就是图中的几步

不过这样编译出来的so还是巨大无比,android arm64的libfrida-gumjs.a大小是158M,编译后得到的so也有30M左右

不行,还是太大,不好...

于是本文就新瓶装旧酒,再加一点东西吧(

环境

本文章基于frida 16.0.11源码编译,如果要使用frida 15等旧版本的libfrida-gumjs.a,请参考xcubebase的代码做修改。

libfrida-gumjs.a裁剪

虫神说可以把js引擎去掉,因为啥都整合了,所以大

是的,早期frida的runtime支持duk和v8,现在是v8和qjs,默认是qjs

通常qjs就足够了,那么我们自己编译,只保留qjs好了

在linux下编译frida基本上没多少坑,直接按官方指南操作即可,参考:

指南有一点点问题,那就是有的发行版中,可能没有lib32stdc++-9-dev,请换成lib32stdc++-10-dev

也可以通过apt search lib32stdc++看看你的发行版支持的是什么版本

一些杂七杂八的步骤,也可以参考我之前的记录:frida编译(server && inject)

还有就是,最新版的编译使用的ndk是android-ndk-r25b,记得给NDK设置环境变量,特别是ANDROID_NDK_ROOT不能少


下面进入正题,我们需要的是libfrida-gumjs.a,并不需要编译frida-server,那么该怎么编译呢?

通过阅读workflows相关文件,可以得知具体操作是什么

  • .github/workflows/ci.yml

      1. Build Gum devkit
      1. Build GumJS devkit
  • .github/actions/package-artifact-files-as-tarball/action.yml

      1. Compress

即编译gum相关代码,通过devkit.py脚本处理生成libfrida-gumjs.a,最后打包上传

这里提取出命令如下,其实就两步(在已经准备好编译需要的环境之后):

make build/frida-android-arm64/lib/pkgconfig/frida-gum-1.0.pc
python3 releng/devkit.py frida-gumjs android-arm64 build/devkits/gumjs

第二步得到的文件位于./build/devkits/gumjs/libfrida-gumjs.a

然而这样编译打包得到的libfrida-gumjs.a当然还是完全体,怎么裁剪呢?

请看编译时出现的配置定义项:

没错,我们可以关闭掉其中的一些选项,只保留需要的,经过分析,相关选项控制位于config.mk

于是我们make clean后,设置好环境变量(主要是去掉v8只保留qjs),重新编译打包即可~

FRIDA_OBJC_BRIDGE=disabled FRIDA_SWIFT_BRIDGE=disabled FRIDA_JAILBREAK=disabled FRIDA_V8=disabled make build/frida-android-arm64/lib/pkgconfig/frida-gum-1.0.pc
python3 releng/devkit.py frida-gumjs android-arm64 build/devkits/gumjs

现在libfrida-gumjs.a直接来到68M了,远小于最初的158M

然后按照看雪的帖子编译自己的so,最终不到8M,再压缩下不到2.5M

效果(frida真是太好用了):


其他补充:

  1. 上面涉及的演示都是编译的android-arm64版本的,如果你需要使用32位的,那么得对应修改相关参数为android-arm
  2. 最终产物位于./build/devkits/gumjs
└─$ ls -alh ./build/devkits/gumjs
total 72M
drwxr-xr-x 2 kali kali 4.0K Apr  1 06:24 .
drwxr-xr-x 3 kali kali 4.0K Apr  1 05:58 ..
-rw-r--r-- 1 kali kali 2.3K Apr  1 06:24 frida-gumjs-example.c
-rw-r--r-- 1 kali kali 3.2M Apr  1 06:24 frida-gumjs.h
-rw-r--r-- 1 kali kali  68M Apr  1 06:24 libfrida-gumjs.a
  1. demo