ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 编写hook代码 #### 脚本模板 ``` import frida import sys # get_usb_device获取设备 rdev = frida.get_remote_device() # # 查看所有进程 processes = rdev.enumerate_processes() print(processes) # 查看当前进程 front_app = rdev.get_frontmost_application() print(front_app) def on_message(message, data): if message["type"] == 'send': print("[*] {0}".format(message['payload'])) else: print(message) # js脚本 jscode = """ console.log("======Start HOOK======"); function hook(){ //固定写法所有脚本就要丢在里面 Java.perform(function () { //Java.use获取java.security.MessageDigest这个类 var c =Java.use('java.security.MessageDigest'); // 剩下就是方法合集 ..... }); } setImmediate(hook,0) """ # 获取给定包名的app进程 # 如果存在两个一样的进程名可以采用rdev.attach(pid)的方式 # 这里 hook 当前进程 session = rdev.attach(front_app.pid) script = session.create_script(jscode) # 打印效果 script.on("message", on_message) # 加载脚本 script.load() sys.stdin.read() ``` ### 脚本写法 #### 方法重载(overload) > Java的方法重载,就类里面多个方法他们的名字可以相同, 但是传入的参数必须不同。方法重载与修饰符和返回值类型无关, 与参数的名称无关,只与参数列表的个数,类型,顺序相关 > java重载方法代码示例 ``` public class Aa { public static void main(String[] args) { byte a=1; byte b=2; System.out.println(isSame(a,b)); System.out.println(isSame(11,12)); System.out.println(isSame((short)11,(short)13)); } public static boolean isSame(byte a,byte b){ System.out.println("YES!"); return a==b; } public static boolean isSame(short a,short b){ System.out.println("YES!"); return a==b; } public static boolean isSame(int a,int b){ System.out.println("YES!"); return a==b; } } ``` 根据重载方法的属性,编写相应的hook脚本 自吐MD5算法获取明文部分 ``` console.log("======Start HOOK======"); // 字节数组转换 字符串 function bytesToString(value) { var buffer = Java.array('byte', value); var StringClass = Java.use('java.lang.String'); return StringClass.$new(buffer); } function hook(){ Java.perform(function () { //Java.use获取java.security.MessageDigest这个类 var BB = Java.use("java.security.MessageDigest"); // 重载类里面的 update 方法 可以传入多个参数 // overload方法中指定参数类型 [B 字节类型 BB.update.overload('[B').implementation = function (args1, args2, args3, args4, args5, args6) { // 打印出明文 console.log(bytesToString(args1)) } }); } setImmediate(hook,0) ``` 对应的java代码部分update方法 ``` public void update(byte input) { engineUpdate(input); this.state = 1; } ``` overload方法中指定参数类型 | Java Type (Java中参数类型) | Frida Type (frida脚本中参数类型) | | --- | --- | | int | int | | byte | byte | | short | short | | long | long | | float | float | | double | double | | char | char | | (比如String、List) | .(比如java.lang.String、java.util.List) | | int[] | [I | | byte[] | [B | | short[] | [S | | long[] | [J | | float[] | [F | | double[] | [D | | char[] | [C | | [](比如String[]) | L.; (比如 [Ljava.lang.String;) | 当参数是某个类对象时,则需要在overload中填写其完整包名路径+类名即可,跟上面的(比如String、List) ``` BB.update.overload("xxx.xxx.xxx.Xxx").implementation = function (val1){ console.log(val1) } ``` 普通方法 okhttp3 自吐脚本 ``` console.log("======Start HOOK======"); function hook(){ Java.perform(function () { //Java.use获取okhttp3.OkHttpClient这个类 var OkHttpClient = Java.use("okhttp3.OkHttpClient") // 调用 newCall 方法 打印出传入参数 request OkHttpClient.newCall.implementation = function (request) { var result = this.newCall(request) console.log(request.toString()) return result } }) } setImmediate(hook,0) ```