基本的FrIDA的api函数,Frida版本的helloworld
[JavaScript] 纯文本查看 复制代码setTimeout(
//将function这个匿名函数作为参数传递给setTimeout()函数
//注册到js的运行库
function(){
//匿名函数function
Java.perform(function(){
//Java.perform()方法将函数注册到APPJava运行库中 执行函数打印log
console.log("hello world!")
})
}
)
1.2MainActivity.java
image.png (148.85 KB, 下载次数: 1)
下载附件
main1
2024-7-31 10:51 上传
[JavaScript] 纯文本查看 复制代码//1.js
function main(){
//存放hook脚本
console.log("Script loaded successfully")
Java.perform(function(){
//Java.perform()API函数,注入脚本内容
//参数是匿名函数
console.log("Inside java perform function")
var MainActivity = Java.use('com.roysue.demo02.MainActivity')
//调用API函数的Java.use()函数
//参数是hook函数所在的类的全名
console.log("Java.Use.Successfully!")//类定位成功
MainActivity.fun.implementation=function(x,y){
//implementation实现MainActivity对象中的fun函数
//定义到function这个匿名函数 来作为Java.perform()的参数
console.log("x=>",x,"y=>",y)
var ret_value=this.fun(x,y)
return ret_value
}
})
}
setImmediate(main)
//被执行函数 main参数传递 类似setTimeout()函数--延时注入
//针对于MainActivity对象的fun函数
//Frida注入app之后立即执行main函数
[JavaScript] 纯文本查看 复制代码//修改参数的change_args()函数
function change_args(){
console.log("Scripts loaded successfully")
Java.perform(function(){
console.log("Inside java perform function")
var MainActivity = Java.use('com.roysue.demo02.MainActivity')
console.log("Java.Use.Successfully!")
MainActivity.fun.implementation=function(x,y){
console.log("orignal args:x=>",x,",y=>",y)
var ret_value=this.fun(2,5);
//函数参数修改为(2,5)
return ret_value
}
})
}
使用attach模式注入App
[Shell] 纯文本查看 复制代码frida -U -l 1.js com.roysue.demo02
# -U USB设备
# -l 指定注入脚本所在的路径 后面是要注入的脚本
Tips:
1.3MainActivity2.java
image.png (180.81 KB, 下载次数: 1)
下载附件
main2
2024-7-31 10:53 上传
加入了fun()函数的重载
[JavaScript] 纯文本查看 复制代码//void fun(int x,int y)
function main(){
console.log("Script loaded successfully")
Java.perform(function(){
console.log("Inside java perform function")
var MainActivity=Java.use("com.roysue.demo02.MainActivity")
console.log("Java.Use.Successfully")//定位类成功
//hook重载函数
MainActivity.fun.overload('int','int').implementation=
function(x,y){
console.log("x=>",x,"y=>",y)
var ret_value=this.fun(2,5);
return ret_value
}
})
}
setImmediate(main)
[JavaScript] 纯文本查看 复制代码//String fun(String x)
function main(){
console.log("Script loaded successfully")
Java.perform(function(){
console.log("Inside java perform function")
var MainActivity=Java.use("com.roysue.demo02.MainActivity")
console.log("Java.Use.Successfully")
MainActivity.fun.overload('java.lang.String').implementation=function(x){
console.log("x=>",x)
var ret_value=this.fun("I")
return ret_value
}
})
}
setImmediate(main)
1.4Java层主动调用
image.png (211.93 KB, 下载次数: 1)
下载附件
main3
2024-7-31 10:54 上传
[JavaScript] 纯文本查看 复制代码//3.2.3 Java层主动调用
function main(){
console.log("script loaded successfully")
Java.perform(function(){
console.log("inside java perform function")
//静态函数
//API Java.use()获取类
var MainActivity = Java.use('com.roysue.demo02.MainActivity')
MainActivity.staticSecret()
//动态函数
//API Java.choose()从内存中获取类的实例对象
Java.choose('com.roysue.demo02.MainActivity',{
//?API回调onMatch
onMatch:function(instance){
console.log('instance found',instance)
instance.secret()
},
onComplete:function(){
console.log('search complete')
}
})
})
}
setImmediate(main)
使用Java.choose()函数
做区分:Objection是基于Frida的注入工具 开个坑!
Objection命令
[Shell] 纯文本查看 复制代码objection
pip install -U objection
android hooking list classes
android hooking search classes XXX
android hooking search methods XXX
android hooking list class_methods
android hooking list activities
android hooking list services
android hooking watch class_method XXX
android hooking watch class_method XXX.File.$init --dump-args --dump-backtrace --dump-return
jobs list
jobs kill job_ID
android hooking watch class
android heap search instances
android heap execute
android heap execute 0x3606 setExecutable True
android heap evaluate
参考资料: 陈佳林《安卓逆向与抓包实战》