frida常用hook方法

frida 常用hook方法

打印byte(byte[]转成字符串)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//将byte[]转成String的方法
function byteToString(arr) {
if(typeof arr === 'string') {
return arr;
}
var str = '',
_arr = arr;
for(var i = 0; i < _arr.length; i++) {
var one = _arr[i].toString(2),
v = one.match(/^1+?(?=0)/);
if(v && one.length == 8) {
var bytesLength = v[0].length;
var store = _arr[i].toString(2).slice(7 - bytesLength);
for(var st = 1; st < bytesLength; st++) {
store += _arr[st + i].toString(2).slice(2);
}
str += String.fromCharCode(parseInt(store, 2));
i += bytesLength - 1;
} else {
str += String.fromCharCode(_arr[i]);
}
}
return str;
}

字符串转byte[]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//字符串转换byte[]的方法
stringToBytes = function(str) {
var ch, st, re = [];
for (var i = 0; i < str.length; i++ ) {
ch = str.charCodeAt(i);
st = [];

do {
st.push( ch & 0xFF );
ch = ch >> 8;
}
while ( ch );
re = re.concat( st.reverse() );
}
return re;
}

frida 打印成员变量

1
2
3
var d = this._d;//获取成员属性d
console.log("old d:"+d.value);//获取成员属性的值
this._d.value = null;//置空

通过反射获取所有成员变量

1
2
3
4
5
6
7
8
9
var fields = Java.cast(this.getClass(),Java.use('java.lang.Class')).getDeclaredFields();
//console.log(fields);
for (var i = 0; i < fields.length; i++) {
var field = fields[i];
field.setAccessible(true);
var name = field.getName();
var value =field.get(this)
console.log("name:"+name+"\tvalue:"+value);
}

获取一个就把getDeclaredFields() 改成 getDeclaredField(‘FieldName’);
同上。记得开启强制读取以及是否为空。否则容易报错碍眼。

hook 所有的网络请求(快速定位发生请求的代码位置)

1
2
3
4
5
     Java.use('java.net.URL').$init.overload('java.lang.String').implementation = function (apiUrl){
console.log(apiUrl);
//printStack();
this.$init(apiUrl);
};

打印堆栈(辅助定位class信息,我一般配合url对象可以快速找到协议类)

1
2
3
4
5
6
7
8
9
//打印堆栈
function printStack(){
var threadef = Java.use('java.lang.Thread');
var threadinstance = threadef.$new();
var stack = threadinstance.currentThread().getStackTrace();
for(var i = 0;i<stack.length;i++){
console.log("Full call stack:" + stack[i].toString());
}
}

frida 技巧

frida 常见的一些技巧
例如一个参数很长,那么我建议写一个错误的参数类型,然frida报错,报错找不到这个方法。同时他会返回可用的hook的参数列表。。。偷懒必备

so的问题,注意so加载时间,以防未加载就进行hook。。。否则会报错null。
有时候hook方法的时候会报错xxxx。具体的错误信息忘记报错了。。。得换下一个方法,估计是frida的一个bug。

谢谢,爱你么么哒