吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 14474|回复: 39
收起左侧

[Android 原创] frida hook常用函数分享

  [复制链接]
骇客之技术 发表于 2020-6-9 20:09
本帖最后由 骇客之技术 于 2020-6-12 13:33 编辑

1. 免写参数
[JavaScript] 纯文本查看 复制代码
    
  // 函数原型 encodeRequest(int i, String str, String str2, String str3, String str4, String str5, byte[] bArr, int i2, int i3, String str6, byte b, byte b2, byte[] bArr2, boolean z)
    var CodecWarpper = Java.use("xx.CodecWarpper");
    CodecWarpper.encodeRequest.implementation = function() {
        var ret = this.encodeRequest.apply(this, arguments);
       //这里可以打印参数和返回值
        return ret;
    }


2. jstring, jbytearray 输出
[JavaScript] 纯文本查看 复制代码
function jstring2Str(jstring) {
   var ret;
   Java.perform(function() {
       var String = Java.use("java.lang.String");
       ret = Java.cast(jstring, String);
   });
   return ret;
}

function jbyteArray2Array(jbyteArray) {
   var ret;
   Java.perform(function() {
       var b = Java.use('[B');
       var buffer = Java.cast(jbyteArray, b);
       ret = Java.array('byte', buffer);
   });
   return ret;
}

其它类型可以参考上面的写法

3. bytes2Hex
java中 byte范围 -128~127
16进制范围 0 ~ 255
[JavaScript] 纯文本查看 复制代码
function bytes2Hex(arr) {
    var str = "[";
    for (var i = 0; i < arr.length; i++) {
        var z = parseInt(arr[i]);
        if (z < 0) z = 255 + z;
        var tmp = z.toString(16);
        if (tmp.length == 1) {
            tmp = "0" + tmp;
        }
        str = str + " " + tmp;
    }
    return (str + " ]").toUpperCase();
}


4. 获取方法名
[JavaScript] 纯文本查看 复制代码
function getMethodName() {
    var ret;
    Java.perform(function() {
        var Thread = Java.use("java.lang.Thread")
        ret = Thread.currentThread().getStackTrace()[2].getMethodName();
    });
    return ret;
}


5. 打印堆栈
[JavaScript] 纯文本查看 复制代码
function showStacks() {
    Java.perform(function() {
        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
    });
}


6. 输出类所有方法名
[JavaScript] 纯文本查看 复制代码
function enumMethods(targetClass) {
    var ret;
    Java.perform(function() {
            var hook = Java.use(targetClass);
            var ret = hook.class.getDeclaredMethods();
            ret.forEach(function(s) {
                console.log(s);
            })
    })
    return ret;
}


7. hook 所有重载函数
[JavaScript] 纯文本查看 复制代码
function hookAllOverloads(targetClass, targetMethod) {
    Java.perform(function () {
         var targetClassMethod = targetClass + '.' + targetMethod;
         var hook = Java.use(targetClass);
         var overloadCount = hook[targetMethod].overloads.length;
         for (var i = 0; i < overloadCount; i++) {
                hook[targetMethod].overloads[i].implementation = function() {
                     var retval = this[targetMethod].apply(this, arguments);
                     //这里可以打印结果和参数
                     return retval;
                 }
              }
   });
 }


8.输出 byte[] 等 java 对象
[JavaScript] 纯文本查看 复制代码
function jobj2Str(jobject) {
    var ret = JSON.stringify(jobject);
    return ret;
}


9. dump 地址
[JavaScript] 纯文本查看 复制代码
function dumpAddr(address, length) {
    length = length || 1024;
    console.log(hexdump(address, {
        offset: 0,
        length: length,
        header: true,
        ansi: false
    }));
}


10. ArrayBuffer 转换
[JavaScript] 纯文本查看 复制代码
function ab2Hex(buffer) {
    var arr = Array.prototype.map.call(new Uint8Array(buffer), function (x) {return ('00' + x.toString(16)).slice(-2)}).join(" ").toUpperCase();
    return "[" + arr + "]";
}

function ab2Str(buffer) {
    return String.fromCharCode.apply(null, new Uint8Array(buffer));
}


11. 获取类型
[JavaScript] 纯文本查看 复制代码
function getParamType(obj) {
    return obj == null ? String(obj) : Object.prototype.toString.call(obj).replace(/\[object\s+(\w+)\]/i, "$1") || "object";
}


12. hook native 函数
[JavaScript] 纯文本查看 复制代码
function hookNativeFun(callback, funName, moduleName) {
    var time = 1000;
    moduleName = moduleName || null;
    if (!(callback && callback.onEnter && callback.onLeave)) {
        console.log("callback error");
        return
    }
    var address = Module.findExportByName(moduleName, funName);
    if (address == null) {
        setTimeout(hookNativeFun, time, callback, funName, moduleName);
    } else {
        console.log(funName + " hook ok")
        var nativePointer = new NativePointer(address);
        Interceptor.attach(nativePointer, callback);
    }
}

以上为分析某款软件协议所写, 部分参考于网络~
不定期更新!

欢迎各位补充~

免费评分

参与人数 11吾爱币 +20 热心值 +11 收起 理由
QiuChenly + 2 + 1 谢谢@Thanks!
ae_86_110 + 2 + 2 我很赞同!
yiwai2012 + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
goda + 1 + 1 谢谢@Thanks!
新机穿越 + 1 + 1 我很赞同!
qtfreet00 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
生有涯知无涯 + 1 我很赞同!
红烧排骨 + 1 热心回复!
zsygood + 1 热心回复!
610100 + 3 + 1 谢谢@Thanks!
dwq308 + 1 + 1 又学了一招

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

逍遥御道 发表于 2020-6-10 01:01
我也来帖一个, 等待目标so加载 插入hook
[JavaScript] 纯文本查看 复制代码
jscode = """
send("Start Run....");
function StartHook(){
    send("in start hook function..");
    var hook_base = Module.findBaseAddress("xxxxx.so");
    if(null == hook_base || hook_base < 0)
    {
        setTimeout(StartHook, 500);
        return;
    }
    
    send("base : "+hook_base);
// ..................
    }); 
}

setTimeout(StartHook, 0);
"""
 楼主| 骇客之技术 发表于 2020-10-12 14:27
duan10jun 发表于 2020-10-7 22:11
楼主apply()方法是啥作用

这是js中的方法调用,和call类似
call() 方法分别接受参数。
apply() 方法接受数组形式的参数
hhhaiai 发表于 2020-11-10 09:42
很基础的函数,可以整理成工具簇方式放github
正己 发表于 2020-6-9 20:18
感谢分享,刚好在学习
东方学痞 发表于 2020-6-9 21:17
谢谢分享,学习一下
jackydong 发表于 2020-6-9 21:18
真是好东西,感谢感谢。
拉玛西亚 发表于 2020-6-9 23:16
虽然不懂,但是楼主的博学领我感动
wapjcxz 发表于 2020-6-10 06:32
我……说实话,看的有点蒙,
ridegod 发表于 2020-6-10 08:23
感谢分享
yooyooyooyoo 发表于 2020-6-10 09:53
学习学习
xixicoco 发表于 2020-6-10 11:12
好的,希望可以扩充
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-27 08:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表