准备工作
安装
1 | pip install frida |
编译器*
编写frida用webstorm,下载一下,然后想要运行Js脚本的话还得下载一个nodejs
在对应项目目录下cmd然后输入
npm i @types/frida-gum
作用就是可以提示代码
firda server
想要将写好的frida脚本注入到进程中,就得用
frida server通过电脑链接手机,意味着电脑得开着
frida injectroot权限下,手机自己就直接注入了
frida gadget非root权限下手机自己注入
以上三个文件在frida github上下载
下载版本要与frida对应,下载之后解压出来的文件推送到手机的data/local/tmp目录下,然后赋予权限即可使用
1 | C:\Users\13621>adb push C:\Users\13621\Desktop\frida-server-16.6.6-android-arm64 /data/local/tmp/fsarm64 |
ps:后台别关
运行命令
在ws终端中运行文件
附加
frida -UF -l example.js
打开
frida -U -f 包名 -l example.js
包名位置
有对应输出就是ok了
代码
打印函数
输出函数一般都用的是
console.log(“hello world”);
框架
1 | Java.perform(function() { |
java.use(a)
a是要寻找的类名,该函数用于寻找类名
var a=java.use(a);
imlepmentation
在上一步得到类名之后,类名.方法名.imlepmentation = function(){ }
imlepmantation的作用是修改函数,也就是要hook了,function里面就是要修改的
ps:因为此代码是hook钩取所以咱们知道运行时候环境会处于原先的位置,所以
this.方法名,就是原来方法的意思
1 | java.perform(function(){ |
frida版本问题
frida版本过高可能会导致一些软件不兼容,hook不进去
这边最推荐frida 16.0.19
pip install frida==16.0.19
记得把frida server也替换了
java.cast(a,b)
a是要转换的,b是转换变成什么类型,返回值是转换成功返回的类型值
神器,基本用法在课里学了,这里记实例和技巧
学到这里有点浮躁,听一首纯音乐慢慢来
找了三个题来进行frida的强化训练,训练最终目标学会反root检测和frida.so层和.so的调试
三个题分别是 RCTF2022-CheckYourKey VNCTF2025-ezCompose SWPUCTF2025-test
Root权限检测
基本frida框架
1 | Java.perform(function() { |
这三个题无论哪个用这个代码frida最后都会程序闪退,提示”Root Detected”
1 | //test |
三段截取onCreate开头最后我还找了一个正常可以frida的onCreate
1 | public void onCreate(Bundle bundle) { |
SWPU Android03-截获onclick函数
一开始用的frdia
失败
1 | Java.perform(function() { |
gpt改良1版
获取所有类名
1 | Java.perform(function () { |
获取MainActivity的所有方法名,gpt给定最终版
hook进onClick代码
1 | Java.perform(function () { |
点击事件是用 Lambda 表达式(匿名内部类) 或 setOnClickListener 注册的。 这类点击事件最终会生成匿名内部类(比如 MainActivity$1、MainActivity$$ExternalSyntheticLambda0), 这些类里才有 onClick(android.view.View)。
hook到main getid
1 | Java.perform(function () { |
SWPU Android02-frida
1 | Java.perform(function() { |
这个失败了
主动调用frida
1 | Java.perform(function () { |
frida -U -F com.example.wlllm01 -l .\ctf2.js
启动指令换一个