骇客之技术 发表于 2020-6-9 20:09

frida hook常用函数分享

本帖最后由 骇客之技术 于 2020-6-12 13:33 编辑

1. 免写参数
   
// 函数原型 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 输出
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
function bytes2Hex(arr) {
    var str = "[";
    for (var i = 0; i < arr.length; i++) {
      var z = parseInt(arr);
      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. 获取方法名
function getMethodName() {
    var ret;
    Java.perform(function() {
      var Thread = Java.use("java.lang.Thread")
      ret = Thread.currentThread().getStackTrace().getMethodName();
    });
    return ret;
}


5. 打印堆栈
function showStacks() {
    Java.perform(function() {
      console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
    });
}


6. 输出类所有方法名
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 所有重载函数
function hookAllOverloads(targetClass, targetMethod) {
    Java.perform(function () {
         var targetClassMethod = targetClass + '.' + targetMethod;
         var hook = Java.use(targetClass);
         var overloadCount = hook.overloads.length;
         for (var i = 0; i < overloadCount; i++) {
                hook.overloads.implementation = function() {
                     var retval = this.apply(this, arguments);
                     //这里可以打印结果和参数
                     return retval;
               }
            }
   });
}

8.输出 byte[] 等 java 对象
function jobj2Str(jobject) {
    var ret = JSON.stringify(jobject);
    return ret;
}

9. dump 地址
function dumpAddr(address, length) {
    length = length || 1024;
    console.log(hexdump(address, {
      offset: 0,
      length: length,
      header: true,
      ansi: false
    }));
}

10. ArrayBuffer 转换
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. 获取类型
function getParamType(obj) {
    return obj == null ? String(obj) : Object.prototype.toString.call(obj).replace(/\/i, "$1") || "object";
}

12. hook native 函数
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);
    }
}
以上为分析某款软件协议所写, 部分参考于网络~
不定期更新!

欢迎各位补充~

逍遥御道 发表于 2020-6-10 01:01

我也来帖一个, 等待目标so加载 插入hook
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

谢谢分享,学习一下:lol

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

好的,希望可以扩充
页: [1] 2 3 4
查看完整版本: frida hook常用函数分享