这篇文章上次修改于 556 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
前言
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
- Build Gum devkit
- Build GumJS devkit
.github/actions/package-artifact-files-as-tarball/action.yml
- 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真是太好用了):
其他补充:
- 上面涉及的演示都是编译的
android-arm64
版本的,如果你需要使用32位的,那么得对应修改相关参数为android-arm
- 最终产物位于
./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
- demo
已有 7 条评论
兄弟们,我也试了一下xcubebase,确实gumjs大了点,还有一个问题是要在清单文件中设置extractNativeLibs=false,不压缩so库,不然加载不了so库,不知道你有没有遇到这个问题
我也编译成功了!感谢!
编译失败,有大佬提供下 32位的吗
@布布 多试几次
@智取棋 我也想等一个32的.a 0.0.....
感谢!非常好用
这种方法只能hook本app吧(自己写的app),也就是不能hook其它的app。