首先搭框架+hook普通方法
import frida,sys
# 写js代码hook java代码
java.perform(function(){
var utils = Java.use('要hook的类名');
var class = Java.use('java.lang.Class')
# hook 普通方法
utils.类的方法名.implementation = funtion( 方法的参数a,b ){
console.log(a); # 输出信息 参数a 也可使用 arguments[0] 输出方法的参数
send(); # 也可输出信息
# this 表示当前类
return this.xxx方法; # 为hook的代码返回值,可以是当前方法,也可以是其他
}
}
hook构造方法
# hook 构造方法
utils.$init.implementation = funtion( 方法的参数a,b ){
console.log(a); # 输出信息 参数a 也可使用 arguments[0] 输出方法的参数
send(); # 也可输出信息
# this 表示当前类
return this.xxx方法; # 为hook的代码返回值,可以是当前方法,也可以是其他
}
hook 重载方法
# hook 重载方法
utils.类的方法名.overload(填写重载方法参数类型(若非常规类型,需填写该类型完整位置,如com.xx.xx.自定义类)如:"int","java.lang.String").implementation = funtion( 方法的参数a,b ){
console.log(a); # 输出信息 参数a 也可使用 arguments[0] 输出方法的参数
send(); # 也可输出信息
# this 表示当前类
return this.xxx方法; # 为hook的代码返回值,可以是当前方法,也可以是其他
}
hook 构造对象参数(即创建一个对象)
# hook 构造对象参数(即创建一个对象)
utils.$init.implementation = funtion( 方法的参数a,b ){
console.log(a); # 输出信息 参数a 也可使用 arguments[0] 输出方法的参数
send(); # 也可输出信息
# 创建utils对象,可将该对象传递给hook的方法,有些方法的参数是对象类型,需要创建对应的对象
var cls = utils.$new(参数);
# this 表示当前类
return this.xxx方法; # 为hook的代码返回值,可以是当前方法,也可以是其他
}
hook 类属性
# hook 类属性
utils.$init.implementation = funtion( 方法的参数a,b ){
console.log(a); # 输出信息 参数a 也可使用 arguments[0] 输出方法的参数
send(); # 也可输出信息
# 获取类属性的值
var val = $utils.属性.value;
$utils.属性.value = val
# 也可通过反射的方法获取类属性的值
var val = Java.cats(获取到对应的类utils.getClass(),clazz).getDeclaredField(要hook的属性);
# 设置属性可访问
val.setAccessible(true);
var value = val.get(从哪个类中获取utils);
val.set(为哪个类中设置utils,value);
# this 表示当前类
return this.xxx方法; # 为hook的代码返回值,可以是当前方法,也可以是其他
}
执行框架
# 执行框架
def message(message,data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
# attach apk进程,也可使用firda.get_usb_device()
process = frida.get_remote_device().attach('填写程序包名,可通过frida --ps -U 获取,或者其他程序获取apk信息 apkmsg')
# 为apk进程创建执行脚本
script = process.create_script(jscode)
script.on('message',message)
script.load()
script.read()