写了一个frida快速启动脚本

frida-start.sh 服务端端启动

#!/bin/bash
handle_int() {
    echo "捕获到ctrl+c操作"
	  adb shell "su 0 -c kill -9 $(adb shell ps | grep 'h16' | awk '{print $2}')"
}

# 使用 trap 命令设置 SIGINT 信号的处理函数
trap 'handle_int' SIGINT

adb shell "su -s /bin/sh -c 'cd /data/local/lingdian/ && ls && ./16.sh'"

frida-txt.sh 客户端启动

#!/bin/bash
execute_frida(){
      # 检查是否提供了参数,否则使用默认值
    local param1=${1:-$default_param1}
    local param2=${2:-$default_param2}
    local param3=${3:-$default_param3}
    echo "参数1:启动方式" $param1
    echo "参数2:包名" $param2
    echo "参数3:文件名" $param3
    port_num=27042
    # 根据param1的值执行不同的操作
    case $param1 in
        1)
            echo "参数是 1,自己启动"
            frida -H 127.0.0.1:$port_num -f $param2 -l $param3.js -o 1.txt
            ;;
        2)
            echo "参数是 2,当前页面hook"
            frida -H 127.0.0.1:$port_num -F -l $param3.js -o 1.txt
            ;;
        *)
            echo "未知参数 $param1,执行默认操作或退出"
            # 这里可以放置默认需要执行的命令,或者选择退出脚本
            # exit 1  # 如果想要在遇到未知参数时退出脚本,可以取消注释这行代码
            ;;
    esac
}
for line in `cat app.txt`
do
    array=(${line//==/ })
    if [[ "${array[4]}" == "开启" ]]; then
         execute_frida "${array[3]}" "${array[1]}" "${array[2]}"
    fi
done

app.txt

#app名称==包名==文件名==启动方式=开启frida(启动方式1是自己启动,2是附加)
大姨妈==com.yoloho.dayima==dayimi==2
b站==tv.danmaku.bili==bibi==2==开启==

示例.js

Java.perform(function () {
    //打印所有堆栈信息
    function showStacks() {
        console.log(Java.use("android.util.Log").getStackTraceString(
            Java.use("java.lang.Throwable").$new())
        );
    }
});
//todo 1 hashMap的hook
var HashMapClass = Java.use('java.util.HashMap');
HashMapClass.put.overload('java.lang.Object', 'java.lang.Object').implementation = function (key, value) {
    if (key === "time") {
        console.log("    Key: ", key);
        console.log("    Value: ", value);
    }
    return this.put(key, value);
};
//todo 2 string的hook
var mapClass = Java.use("java.lang.String")
mapClass.toString.implementation = function () {
    var originalResult = this.toString();
    if (typeof originalResult === 'string' && originalResult.includes("卡密不存在")) {
        console.log("key2:" + originalResult)
        showStacks()
    return originalResult;
}

// todo 3 StringBuffer的append方法StringBuilder的append方法
var StringBufferClass = Java.use('java.lang.StringBuffer');
var StringBuilderClass = Java.use('java.lang.StringBuilder');


StringBufferClass.append.overload('java.lang.String').implementation = function (time) {
    console.log("[StringBuffer.append] Intercepted time: " + time);
    return this.append(time);
};

StringBuilderClass.append.overload('java.lang.String').implementation = function (time) {
    console.log("[StringBuilder.append] Intercepted time: " + time);
    return this.append(time);
};
//todo 4 打印对象和map的值
var EncryptUtilsClass = Java.use('com.gacne.www.network.EncryptUtils');
var originalAWithMap = EncryptUtilsClass.a.overload('android.content.Context', 'java.util.Map');
originalAWithMap.implementation = function (context, paramMap) {
    const objClass = Java.use("java.lang.Object").getClass.apply(context);
    const className = Java.use("java.lang.Class").getName.apply(objClass).toString();
    const currentApplication = Java.use(className);
    const fieldNames = currentApplication.class.getDeclaredFields();
    for (let i = 0; i < fieldNames.length; i++) {
        const fieldName = fieldNames[i].toString();
        try {
            fieldNames[i].setAccessible(true);
            const value = fieldNames[i].get(context);
            console.log("属性名称:"+fieldName + ": " + value);
        } catch (error) {
            console.error("Error" + fieldName);
        }
    }
    var HashMap = Java.use('java.util.HashMap');
    console.log("map:" + Java.cast(paramMap, HashMap).toString());
    return originalAWithMap.call(this, context, paramMap);
};

//todo 5 优化打印对象
function printObject(context) {
    const objClass = Java.use("java.lang.Object").getClass.apply(context);
    const className = Java.use("java.lang.Class").getName.apply(objClass).toString();
    const currentApplication = Java.use(className);
    const fieldNames = currentApplication.class.getDeclaredFields();
    for (let i = 0; i < fieldNames.length; i++) {
        const fieldName = fieldNames[i].toString();
        try {
            fieldNames[i].setAccessible(true);
            const value = fieldNames[i].get(context);
            console.log("属性名称:"+fieldName + ": " + value);
        } catch (error) {
            console.error("Error" + fieldName);
        }
    }
}
//todo 6 优化打印Map
function printMap(paramMap) {
    var HashMap = Java.use('java.util.HashMap');
    console.log("map:" + Java.cast(paramMap, HashMap).toString());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值