Loading... ## 0x01 前言 理论上我们可以通过反射的思想,写出一个脚本hook住所有的类,以及类的方法和重载,这样也就不用考虑定位了,自动化的实现我们快速hook的需求,将hook的所有日志保留,然后我们去搜索我们需要的东西。现在人工智能、大数据、AI这么火,怎么让我们逆向也变得智能呢?输入一个简单的指令,程序自我hook,快速计算,然后反馈关键的类、方法给我们。也许这样的工具已经有大佬实现了。 ## 0x02 枚举所有的加载的类 enumerateLoadedClassesSync 列出当前已经加载的类,但是有很多,打印出来的数据多的看不清,全部hook APP 肯定会奔溃。 可以过滤出我们需要的类 ```javascript Java.perform(function(){ var classz = Java.enumerateLoadedClassesSync(); for(var i=0;i<classz.length;i++){ if (classz[i].indexOf("com.xiaojianbang.app") != -1){ console.log(classz[i]) } } }) ``` 返回的结果,可以看出,从几百,几千缩减了到几个几十个,在对他们进行hook,此时问题应该不大。先来看结果: ```shell [Xiaomi MI 8::HookTestDemo]-> com.xiaojianbang.app.DESede com.xiaojianbang.app.Money$innerClass com.xiaojianbang.app.Money com.xiaojianbang.app.MainActivity$1 com.xiaojianbang.app.MainActivity com.xiaojianbang.app.SHA com.xiaojianbang.app.RSA com.xiaojianbang.app.MAC com.xiaojianbang.app.Utils com.xiaojianbang.app.AES com.xiaojianbang.app.DES com.xiaojianbang.app.NativeHelper com.xiaojianbang.app.RSAHex com.xiaojianbang.app.MD5 com.xiaojianbang.app.ShufferMap ``` ## 0x03 枚举一个类的所有方法 现在我们要 获取一个类的所有方法: ```javascript var MainActivity = Java.use("com.xiaojianbang.app.MainActivity"); var methods = MainActivity.class.getDeclaredMethods(); for(var i=0;i<methods.length;i++){ console.log(methods[i].getName()) } ``` 返回结果: ```javascript [Xiaomi MI 8::HookTestDemo]-> decrypt onClick onCreate showMap_ toastPrint ``` 对比源代码 太多了所以部分截图,方法名也是一一对上的。 ![image.png](http://type.zimopy.com/usr/uploads/2024/01/708327677.png) ## 0x04 hook 一个类其中的某个方法的所有重载 如果方法的重载只有2、3个可以手动写,但是有10个?100个?所有看代码: ```javascript var Utils = Java.use("com.xiaojianbang.app.Utils"); Utils["test"].implementation = function () { console.log("test is called"); var ret = this.test(); console.log('test ret value is ' + ret); return ret; }; 结果:可以看出有三个重载 [Xiaomi MI 8::HookTestDemo]-> Error: test(): has more than one overload, use .overload(<signature>) to choose from: .overload() .overload('com.xiaojianbang.app.Money') .overload('int') at throwOverloadError (frida/node_modules/frida-java-bridge/lib/class-factory.js:1020) at frida/node_modules/frida-java-bridge/lib/class-factory.js:707 ``` 利用反射的思想,来一次性hook住他们 ```javascript var Utils = Java.use("com.xiaojianbang.app.Utils"); var overloads = Utils["test"].overloads; for (var i=0;i< overloads.length;i++){ overloads[i].implementation = function () { var params = ""; for(var j=0;j<arguments.length;j++){ params = params +arguments[j]+" " } console.log("params",params) return this.test.apply(this,arguments); }; } ``` ## 0x05 综合上面所有的,一次性hook多个类的所有方法及重载 ### 完整代码如下: ```javascript var classz = Java.enumerateLoadedClassesSync(); for (var i = 0; i < classz.length; i++) { if (classz[i].indexOf("om.xiaojianbang.app.Utils") != -1) { var class_name = classz[i]; console.log("class_name", class_name); var cz = Java.use(class_name); var methods = cz.class.getDeclaredMethods(); for (var i1 = 0; i1 < methods.length-1; i1++) { var classz_method_name = methods[i1].getName(); console.log("classz_method_name => ", class_name, classz_method_name) try { var overloadAyy = cz[classz_method_name].overloads; console.log(overloadAyy) if (overloadAyy && overloadAyy.length>0){ for (var i2 = 0; i2 < overloadAyy.length; i2++) { overloadAyy[i2].implementation = function () { var params = ""; for (var j = 0; j < arguments.length; j++) { params = params + arguments[j] + " " } console.log("params", class_name, classz_method_name, params) return this[classz_method_name].apply(this, arguments); }; } }else{ cz[classz_method_name].implementation = function () { var params = ""; for (var j = 0; j < arguments.length; j++) { params = params + arguments[j] + " " } console.log("params", class_name, classz_method_name, params) return cz[classz_method_name].apply(this, arguments); }; } } catch (error) { console.log("异常类的加载,请特殊处理", class_name, classz_method_name) } } } } ``` [原文地址](https://bbs.kanxue.com/thread-278047.htm) 最后修改:2024 年 01 月 23 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏