Frida抓包flutter app过程记录
Frida 是一个动态代码插装工具,可以用于跨平台的逆向工程和测试。要使用 Frida 抓包 Flutter 应用,你需要先确保你的设备已经root或者使用了像 Frida 这样的工具进行了越狱。
以下是一个简单的示例,展示如何使用 Frida 来拦截 Flutter 应用的网络请求:
- 确保你的设备上安装了 Frida 服务端和客户端。
- 启动你的 Flutter 应用。
- 使用 Frida 的命令行工具来附加到应用进程:
frida -U -f com.example.yourapp packageName
- 编写 JavaScript 代码来拦截网络请求:
// frida_hook.js
function hexdump(buffer) {
if (!buffer) {
return "";
}
var hexStr = "";
for (var i = 0; i < buffer.byteLength; i++) {
var byte = buffer[i];
var hex = byte.toString(16);
hexStr += (hex.length == 2 ? hex : "0" + hex);
}
return hexStr;
}
function onSend(message, payload) {
console.log("Sending: " + hexdump(payload));
}
function onReceive(message, payload) {
console.log("Received: " + hexdump(payload));
}
function hookDartVM() {
var dartVM = Process.findModuleByName("libdart.so");
if (dartVM !== null) {
Interceptor.attach(dartVM.base, {
onEnter: function(args) {
var functionName = this.context.context.pc.toString();
if (functionName.includes("_ZN3dart8internal16NativeApiWrapper15PostByteArrayENS_6ThreadERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEbPNS_6HandleINS_10PortableIntEPKNS9_5MutexEEE")) {
var payload = Memory.readByteArray(args[3], args[5]);
onSend(functionName, payload);
}
},
onLeave: function(retval) {
var functionName = this.context.context.pc.toString();
if (functionName.includes("_ZN3dart8internal16NativeApiWrapper15PostByteArrayENS_6ThreadERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEbPNS_6HandleINS_10PortableIntEPKNS9_5MutexEEE")) {
var payload = Memory.readByteArray(retval, args[5]);
onReceive(functionName, payload);
}
}
});
}
}
hookDartVM();
- 将上述 JavaScript 代码加载到 Frida 会话中:
frida -U -f com.example.yourapp --eval-file frida_hook.js
这段代码会在 Flutter 应用的 Dart VM 层面拦截网
评论已关闭