记录一些frida 的用法
下边是py脚本,然后需要同步修改包名和js的名称,js里面就是写hook的脚本
import subprocess
import frida
from pip._vendor.distlib.compat import raw_input
def cmd(cmd):
subprocess.run(cmd, shell=True)
def my_message_handler(message , payload): #定义错误处理
print(message)
print(payload)
if __name__ == '__main__':
# cmd('adb shell "su -c /data/local/tmp/frida-server-15.2.2-android-arm64 &"') #开启手机端frida-server
pkg="com.xxx" # 包名
device = frida.get_usb_device()
pid = device.spawn(pkg)
print("pid-->" + str(pid))
device.resume(pid)
print("resume")
# time.sleep(1)
session = device.attach(pid)
print("attach")
with open('hook_xxx.js', 'r', encoding='utf-8') as file:
script_code = file.read()
script = session.create_script(script_code)
script.on("message", my_message_handler) # 调用错误处理
script.load()
# 脚本会持续运行等待输入
raw_input()
function writeFile(content) {
var file = new File("/data/user/0/包名/log_log.txt","a+");//a+表示追加内容,此处的模式和c语言的fopen函数模式相同
file.write(content+"\n");
file.flush()
file.close();
}
function setC16092() {
var C16092 = Java.use("pkg+类名");
C16092.f41744 = false;
console.log("输出日志")
}
// 创建一个 Java 方法的处理函数
function hookMethod() {
Java.use(classname).methodname.overload('android.content.Context').implementation = function(arg1) {
console.log("返回false--1")
setC16092()
return false
}
Java.use(classname).methodname.overload('android.content.Context').implementation = function(arg1) {
console.log("返回false--1")
setC16092()
return false
}
//
Java.use(classname).methodname.overload().implementation = function(arg1) {
console.log("false--1")
setC16092()
return false
}
// 接口返回-----这里是修改boolean对象,可以直接新建一个boolean对象
Java.use(classname).onSuccess.overload('java.lang.Object').implementation = function(arg1) {
console.log("接口返回值" + arg1)
// 查看参数是什么类型,这里打印出来的是 java.lang.Boolean
console.log(arg1.$className)
// 新建一个Boolean对象,并且设置值为false
var Boolean = Java.use('java.lang.Boolean');
var booleanObj = Boolean.$new(false);
console.log("值mValue="+booleanObj);
setC16092()
this.onSuccess(booleanObj)
}
Java.use(classname).methodname.implementation = function(arg1) {
console.log("原本设置的值"+arg1)
setC16092()
this.methodname(false) // 设置审核状态方法为false
}
// 直接修改这个方法返回值为false,这个方法代表自然量的意思
Java.use(classname).methodname.implementation = function() {
console.log("自然量返回"+arg1)
return false
}
/ 直接修改这个方法返回值为false,这个方法代表自然量的意思
Java.use(classname).methodname.implementation = function(arg1) {
console.log("设置一个属性"+arg1)
return false
}
// arg1:
Java.use(classname).methodname.overload('java.lang.String','java.lang.String').implementation = function(arg1,arg2) {
console.log("arg1=" + arg1)
console.log("arg2=" + arg2)
// 这里怎么设置
setC16092()
this.methodname(arg1,arg2)
}
// {"aaa":true} 接口 能否修改成 {"aaa":false}
Java.use(classname).onSuccess.implementation = function(arg1) {
console.log('blackList的值:'+ arg1);
// 导入 Java 类
var JSONObject = Java.use('com.alibaba.fastjson.JSONObject');
// 创建一个新的 JSONObject 对象
var jsonObject = JSONObject.$new();
var Boolean = Java.use('java.lang.Boolean');
var booleanObj = Boolean.$new(false);
// 打印原始 JSONObject 对象
jsonObject.put('aaa', booleanObj);
console.log('原始JSONObject对象:'+ jsonObject);
this.onSuccess(jsonObject);
}
// 监听 com.blankj.utilcode.util.PhoneUtils 这个类的 isSimCardReady
Java.use(classname).methodname.implementation = function() {
var boo = this.methodname()
console.log('返回值是:'+ boo);
return true;
}
// 监听 这个类的 变量为false
Java.use(classname).methodname.implementation = function() {
var boo = this.methodname()
console.log('原始返回值是:'+ boo);
return false;
}
// 返回
Java.use(classname).methodname.overload('android.content.Context').implementation = function(arg1) {
var boo = this.methodname(arg1)
console.log('获取设备id的值是:');
//
return 'cb62218e88d66acd';
}
// 将打印日志,保存到集合中,最后将集合写到txt文档中,这样才能获取到我们需要的关键词
// Java.use("com.xiang.yun.encode.AESUtils").decrypt.overload('java.lang.String').implementation = function(arg1) {
// var jiemiStr = this.decrypt(arg1)
// var str = "原始串=" + arg1 + " 解密之后的串= " + jiemiStr;
// console.log(str)
// writeFile(str)
//
// return jiemiStr
// }
// 输出是否为自然量,以及当前城市是否拉黑
// Java.use("to0").o0oOoO.overload('iv0','org.json.JSONObject').implementation = function(arg1,arg2) {
// console.log("iv0=" + arg1)
// console.log("arg2=" + arg2.toString(4))
// }
// var jSONObject = Java.use("org.json.JSONObject");
// jSONObject.put.overload('java.lang.String', 'java.lang.Object').implementation = function (a, b) {
// console.log("JSONObject.put: ", a, b);
// return this.put(a, b);
// }
// jSONObject.getString.implementation = function (a) {
// var result = this.getString(a);
// console.log("JSONObject.getString: ", a, result);
// return result;
// }
// jSONObject.getBoolean.overload('java.lang.String').implementation = function(arg1) {
// var result = this.getBoolean(arg1);
// if (arg1 == 'blackList') {
// console.log("JSONObject.getBoolean的key是 blackList: ", arg1, result);
// return false
// }
// console.log("JSONObject.getBoolean: ", arg1, result);
// return result
// }
// jSONObject.optBoolean.overload('java.lang.String','boolean').implementation = function(arg1,arg2) {
// var result
// if (arg1 == 'isNatureChannel') {
// result = this.optBoolean(arg1,false);
// console.log("JSONObject.optBoolean.isNatureChannel: ", arg1, result);
// return false
// }else {
// result = this.optBoolean(arg1,arg2);
// }
// console.log("JSONObject.optBoolean: ", arg1, result);
// return result
// }
// 是否自然量,活动渠道等的返回值
/**
**/
Java.use("类名").methodName.overload('org.json.JSONObject').implementation = function(arg1) {
// 将JSONObject转成String,然后做字符串替换
// 这种方法直接修改jsonobject里面的值
arg1.put("key",false);
console.log("arg1=" + arg1.toString(4))
return this.methodName(arg1)
}
}
// Frida 脚本的入口点
Java.perform(function() {
console.log("Inside-java-perform-function");
hookMethod();
});