Loading... # 创建数据类型 ## frida如何创建byte[]类型参数 ```js var buffer = Java.array('byte', [ 13, 37, 42 ]); ``` # 转换数据类型 ## 将byte[]转成String的方法 ```js function bytesToString(bytes) { var javaString = Java.use('java.lang.String'); return javaString.$new(bytes); } ``` ## jstring, jbytearray 输出 ```js 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; } ``` ## 输出 byte[] 等 java 对象 ```js function jobj2Str(jobject) { var ret = JSON.stringify(jobject); return ret; } ``` ## ArrayBuffer 转换 ```js 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)); } ``` ## bytes2Hex java中 byte范围 -128~127 16进制范围 0 ~ 255 ```js 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(); } ``` ## class转class ```js function classToClass(src, dstClass) { return Java.cast(src, Java.use(dstClass)) } ``` # Hook时操作数据 ## 输出长整型 ```java return Java.use('java.lang.Long').valueOf(1700114126258); ``` # 获取变量数据 ## frida 打印成员变量 ```js var d = this._d;//获取成员属性d console.log("old d:"+d.value);//获取成员属性的值 this._d.value = null;//置空 ``` ## 通过反射获取所有成员变量 ```js 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 所有的网络请求 快速定位发生请求的代码位置 ```js Java.use('java.net.URL').$init.overload('java.lang.String').implementation = function (apiUrl) { console.log(apiUrl); //printStack(); this.$init(apiUrl); }; ``` 最后修改:2023 年 12 月 22 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请随意赞赏