iOS逆向-Frida Hook所有TCP请求与响应

引言

在移动安全研究中,网络通信分析是理解应用行为的关键环节。对于iOS应用,虽然抓包工具(如Charles、Wireshark)可以捕获明文流量,但面对加密协议或非标准端口时,直接Hook应用层的TCP请求/响应能提供更底层的视角。本文将通过Frida工具,实现iOS应用中Objective-C层和Native层TCP通信的全面监控。

一、Frida简介

Frida是一款动态插桩工具,支持通过JavaScript脚本注入目标进程,实时修改内存数据或拦截函数调用。在iOS逆向中,Frida可用于:

  • Hook Objective-C方法

  • 拦截C/C++函数

  • 动态分析加密算法

  • 监控文件、网络等系统调用

二、iOS网络通信机制

iOS应用通常通过以下方式处理TCP通信:

  1. 高级API

    • NSURLConnection / NSURLSession(HTTP协议)

    • CFStream(Core Foundation层)

  2. BSD Socket

    • 使用C函数如socketconnectsendrecv

  3. 第三方库

    • CocoaAsyncSocket、SwiftSocket等开源封装

三、Hook实现步骤

1. Hook Objective-C层通信

对于使用NSURLSession等高级API的应用,直接Hook相关类的方法:

// 监控NSURLSession的数据任务创建
ObjC.choose(ObjC.classes.NSURLSession, {
  onMatch: function(session) {
    var original = session.URLSession_dataTaskWithRequest_;
    session.URLSession_dataTaskWithRequest_ = ObjC.implement(
      session.URLSession_dataTaskWithRequest_,
      function(handle, selector, session, request, completion) {
        console.log(`[OC] Request URL: ${request.URL().absoluteString()}`);
        console.log(`[OC] Headers: ${JSON.stringify(request.allHTTPHeaderFields())}`);
        return original(handle, selector, session, request, completion);
      }
    );
  }
});

// Hook NSURLSession的接收数据回调
var URLSessionDelegate = ObjC.protocols.NSURLSessionDataDelegate;
ObjC.classes.NSURLSession.implement_method(
  URLSessionDelegate.methods[3],  // didReceiveData: 方法索引可能变化
  function(handle, selector, session, dataTask, data) {
    var bytes = data.bytes().readByteArray(data.length());
    console.log(`[OC] Response Data (${data.length()} bytes):\n${bytesToHex(bytes)}`);
  }
);

2. Hook Native层BSD Socket

拦截底层C函数以捕获原始TCP数据:

// 拦截socket连接
Interceptor.attach(Module.findExportByName('libsystem_network.dylib', 'connect'), {
  onEnter: function(args) {
    this.fd = args[0];
    var sockaddr = args[1];
    var family = sockaddr.add(0).readU16();
    if (family === 2) { // AF_INET
      var port = sockaddr.add(2).readU16();
      port = ((port & 0xFF00) >> 8) | ((port & 0xFF) << 8); // 转换端口字节序
      var ip = sockaddr.add(4).readByteArray(4);
      console.log(`[Native] connect -> ${ip[0]}.${ip[1]}.${ip[2]}.${ip[3]}:${port}`);
    }
  }
});

// 拦截send函数
Interceptor.attach(Module.findExportByName('libsystem_network.dylib', 'send'), {
  onEnter: function(args) {
    this.fd = args[0];
    this.buf = args[1];
    this.len = args[2].toInt32();
  },
  onLeave: function(retval) {
    if (this.len > 0) {
      var data = ptr(this.buf).readByteArray(this.len);
      console.log(`[Native][send] fd=${this.fd}, len=${this.len}\n${bytesToHex(data)}`);
    }
  }
});

// 拦截recv函数
Interceptor.attach(Module.findExportByName('libsystem_network.dylib', 'recv'), {
  onEnter: function(args) {
    this.fd = args[0];
    this.buf = args[1];
    this.len = args[2].toInt32();
  },
  onLeave: function(retval) {
    var bytesRead = retval.toInt32();
    if (bytesRead > 0) {
      var data = ptr(this.buf).readByteArray(bytesRead);
      console.log(`[Native][recv] fd=${this.fd}, len=${bytesRead}\n${bytesToHex(data)}`);
    }
  }
});

3. 辅助工具函数
// 字节数组转HEX字符串
function bytesToHex(bytes) {
  return Array.from(new Uint8Array(bytes), byte => 
    byte.toString(16).padStart(2, '0')
  ).join(' ');
}

// 监听进程退出
Process.enumerateModules();

四、完整脚本使用

  1. 保存脚本:将代码保存为ios_tcp_hook.js

  2. 注入进程

    frida -U -f com.example.app -l ios_tcp_hook.js --no-pause

  3. 触发网络请求:操作应用触发TCP通信

五、注意事项

  1. 环境要求

    • 越狱iOS设备

    • 安装Frida服务(通过Cydia)

  2. 数据过滤:高频请求需添加过滤规则,避免日志爆炸

  3. 加密流量:若通信使用TLS,需额外Hook SSL库(如SecureTransport)

  4. 多线程处理:网络请求可能在子线程执行,注意线程安全

六、扩展思路

  1. 协议解析:将HEX数据解析为HTTP、Protobuf等格式

  2. 流量重放:修改数据包内容后重新发送

  3. 自动化分析:结合Python脚本批量处理日志

  4. 非越狱方案:通过Frida Gadget注入未签名应用

结语

通过Frida Hook TCP通信,开发者可以深入理解iOS应用的网络行为,快速定位协议漏洞或分析加密逻辑。本文提供的方法覆盖了从高级API到底层Socket的全链路监控,读者可根据实际需求调整Hook点,进一步提升逆向工程效率。

“知识是武器,请合法使用技术。”

附录

<think>好的,我需要帮用户了解Frida的基本使用方法。用户之前问过GG修改器是否能替代Frida,现在转向询问Frida的具体使用,可能有一定的技术基础,但可能是新手。 首先,我应该从Frida的概述开始,说明它是一个动态代码插桩工具,支持多平台,用于逆向工程和安全分析。然后,需要介绍安装步骤,包括安装Python包、设备端配置(比如Android需要frida-server)、以及基本命令。 接下来,用户可能需要具体的例子来理解如何Hook函数,比如JavaScript的示例,修改参数或返回值。同时,应该涵盖常用场景,如Hook Java方法和Native库,以及动态修改内存数据。 还要注意提到工具的使用注意事项,比如需要root或越狱设备,合法性问题,以及如何结合其他工具使用。要确保步骤清晰,代码示例正确,避免技术错误,同时用中文简洁明了地解释。 需要检查是否有遗漏的重要步骤,比如设备连接、端口转发,或者常见问题解决方法。最后,提供学习资源,如官方文档和社区,帮助用户进一步学习。</think>以下是 **Frida 使用入门指南**,涵盖基础配置、常用场景代码示例,帮助快速上手: --- ### 一、环境准备 1. **安装 Frida** ```bash # 安装 Python 版 Frida 客户端 pip install frida-tools ``` 2. **设备端配置** - **Android**: 1. 下载对应架构的 `frida-server`([官网](https://frida.re/docs/install/)) 2. 推送至设备并运行: ```bash adb push frida-server /data/local/tmp/ adb shell "chmod +x /data/local/tmp/frida-server" adb shell "/data/local/tmp/frida-server &" ``` - **iOS**:需越狱后通过 Cydia 安装 `Frida` 插件 - **PC 应用**:直接注入无需额外服务端 --- ### 二、基础使用:Hook 函数 #### 场景1:Hook Java 方法(Android) ```javascript // script.js Java.perform(() => { // 定位目标类方法 let MyClass = Java.use("com.example.MyClass"); // Hook 方法并修改返回值 MyClass.getSecret.implementation = function() { console.log("原返回值:", this.getSecret()); return "Hacked!"; // 强制返回新值 }; }); ``` 运行脚本: ```bash frida -U -l script.js -f com.example.app --no-pause ``` - `-U`:连接 USB 设备 - `-f`:启动应用并附加 - `--no-pause`:立即执行脚本 --- #### 场景2:Hook Native 函数(C/C++) ```javascript // 挂钩 libnative.so 中的函数 encrypt() Interceptor.attach(Module.findExportByName("libnative.so", "encrypt"), { onEnter: function(args) { console.log("输入参数:", args[0].readCString()); }, onLeave: function(retval) { console.log("返回值:", retval.readCString()); retval.replace(0); // 强制返回 0 } }); ``` --- ### 三、进阶操作 #### 1. **动态修改内存数据** ```javascript // 修改内存中的整数值(如游戏血量) let address = ptr("0x12345678"); // 目标地址 Memory.writeInt(address, 9999); ``` #### 2. **绕过 SSL Pinning** ```javascript // 禁用证书验证 Java.perform(() => { let X509TrustManager = Java.use("javax.net.ssl.X509TrustManager"); X509TrustManager.checkServerTrusted.implementation = function() {}; }); ``` #### 3. **调用内部方法** ```javascript let instance = Java.choose("com.example.MyClass", { onMatch: function(obj) { obj.hiddenMethod("test"); // 直接调用私有方法 }, onComplete: () => {} }); ``` --- ### 四、常用命令 | 功能 | 命令示例 | |-----------------------|----------------------------------| | 列出进程 | `frida-ps -U` | | 附加到运行中的进程 | `frida -U com.example.app` | | 生成崩溃报告 | `frida -U -D crashdump app` | | 端口转发(Android) | `adb forward tcp:27042 tcp:27042` | --- ### 五、注意事项 1. **Root/越狱需求**:Android 需 Root,iOS 需越狱(或使用 objection 无 root 注入) 2. **反调试绕过**:部分应用会检测 Frida,需配合工具如 [frida-detection-bypass](https://github.com/httptoolkit/frida-android-unpinning) 3. **合法性**:仅限授权测试,未经许可使用可能违法 --- ### 六、学习资源 - **官方文档**:[Frida.re](https://frida.re/docs/home/) - **代码库**:[Frida Scripts](https://codeshare.frida.re/) - **书籍推荐**:《Android应用安全防护和逆向分析》 **实践建议**:从修改单机游戏或开源应用开始,逐步深入复杂场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值