首先我们抓取一下我们要测试的app的某一个目标api,通过抓api的包,得到关键字。
例如:关键字:x-sap-ri
我们得到想要的关键字后,通过拦截 类,寻找我们的关键字,及找到发包收包的位置,并输出当时的调用栈,在栈里我们阔以定位到,是那个包里的类调用了。
使用 Frida 脚本用于监控 Java 中 HashMap
的 put
方法,特别是当键为 "x-sap-ri"
时,记录调用栈和键值对。这个脚本可以帮助我们在动态分析 Android 应用时捕获特定的键值对操作。
代码分析
Java.perform(function (){
// 获取 HashMap 类的引用
var hashMap = Java.use("java.util.HashMap");
// 重写 put 方法的实现
hashMap.put.implementation = function (a, b) {
// 检查键是否为 "x-sap-ri"
if(a != null && a.equals("x-sap-ri")){
// 打印调用栈
console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
// 打印键和值
console.log("hashMap.put: ", a, b);
}
// 调用原始的 put 方法
return this.put(a, b);
}
});
关键点解释
-
Java.perform: 这是 Frida 的一个函数,用于确保在 Java 虚拟机环境中安全地执行代码。所有的 Java 相关操作都应该在这个函数内部进行。
-
Java.use: 用于获取 Java 类的引用。在这里,我们获取了
java.util.HashMap
类。 -
hashMap.put.implementation: 通过重写
put
方法的实现,可以在调用该方法时插入自定义逻辑。 -
条件判断: 检查键
a
是否为null
,并且是否等于"x-sap-ri"
。如果条件满足,则记录调用栈和传入的键值对。 -
调用原始方法: 使用
this.put(a, b)
调用原始的put
方法,以确保HashMap
的正常功能不受影响。
完整示例
以下是一个改进后的完整示例,监控 put
和 get
方法,并增加了一些额外的日志信息:
Java.perform(function () {
var hashMap = Java.use("java.util.HashMap");
// 重写 put 方法
hashMap.put.implementation = function (a, b) {
if (a != null && a.equals("x-sap-ri")) {
console.log("[INFO] hashMap.put called with key: " + a + ", value: " + b);
console.log("[TRACE] Call stack: " + Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
}
return this.put(a, b);
};
// 重写 get 方法
hashMap.get.implementation = function (a) {
var value = this.get(a);
if (a != null && a.equals("x-sap-ri")) {
console.log("[INFO] hashMap.get called with key: " + a + ", returned value: " + value);
}
return value;
};
});
运行脚本
要运行这个 Frida 脚本,需要:
- 在设备上安装 Frida Server。
- 使用
frida -U -l your_script.js -f com.example.app
命令启动目标应用程序并加载脚本,com.example.app
替换为您要分析的应用程序的包名。
输出结果:
java.lang.Throwable
at java.util.HashMap.put(Native Method)
at org.json.JSONObject.put(JSONObject.java:276)
at org.json.JSONTokener.readObject(JSONTokener.java:394)
at org.json.JSONTokener.nextValue(JSONTokener.java:104)
at org.json.JSONObject.<init>(JSONObject.java:168)
at org.json.JSONObject.<init>(JSONObject.java:185)
at com.shopee.shpssdk.SHPSSDK.uvwvvwvvw(Unknown Source:81)
at com.shopee.shpssdk.SHPSSDK.requestDefense(Unknown Source:59)
hashMap.put: x-sap-ri 443e41678c54f44f62b70d1901d115bc703ebab92a5b4251176d
在com.shopee.shpssdk.SHPSSDK.uvwvvwvvw方法里