frida hook笔记

记录一些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();
});

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值