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);
}
}
以上为分析某款软件协议所写, 部分参考于网络~
不定期更新!
欢迎各位补充~
我也来帖一个, 等待目标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);
""" duan10jun 发表于 2020-10-7 22:11
楼主apply()方法是啥作用
这是js中的方法调用,和call类似
call() 方法分别接受参数。
apply() 方法接受数组形式的参数 很基础的函数,可以整理成工具簇方式放github 感谢分享,刚好在学习 谢谢分享,学习一下:lol 真是好东西,感谢感谢。 虽然不懂,但是楼主的博学领我感动 我……说实话,看的有点蒙, 感谢分享 学习学习 好的,希望可以扩充