r0capture 是比较好用的抓包工具

  1. 仅限安卓平台,测试安卓789101112 可用
  2. 无视所有证书校验或绑定,不用考虑任何证书的事情;
  3. 通杀TCP/IP四层模型中的应用层中的全部协议;
  4. 通杀协议包括:Http,WebSocket,Ftp,Xmpp,Imap,Smtp,Protobuf等等、以及它们的SSL版本;
  5. 通杀所有应用层框架,包括HttpUrlConnectionOkhttp1/3/4Retrofit/Volley等等;
  6. 无视加固,不管是整体壳还是二代壳或VMP,不用考虑加固的事情;
  7. App收发包函数定位功能
  8. App客户端证书导出功能
  9. host连接方式“-H”,用于Frida-server监听在非标准端口时的连接

http 抓包分析

  1. Java.use("java.net.SocketOutputStream").socketWrite0.overload('java.io.FileDescriptor', '[B', 'int', 'int').implementation = function (fd, bytearry, offset, byteCount) {
  2. var result = this.socketWrite0(fd, bytearry, offset, byteCount);
  3. var message = {};
  4. message["function"] = "HTTP_send";
  5. message["ssl_session_id"] = "";
  6. message["src_addr"] = ntohl(ipToNumber((this.socket.value.getLocalAddress().toString().split(":")[0]).split("/").pop()));
  7. message["src_port"] = parseInt(this.socket.value.getLocalPort().toString());
  8. message["dst_addr"] = ntohl(ipToNumber((this.socket.value.getRemoteSocketAddress().toString().split(":")[0]).split("/").pop()));
  9. message["dst_port"] = parseInt(this.socket.value.getRemoteSocketAddress().toString().split(":").pop());
  10. message["stack"] = Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()).toString();
  11. var ptr = Memory.alloc(byteCount);
  12. for (var i = 0; i < byteCount; ++i)
  13. Memory.writeS8(ptr.add(i), bytearry[offset + i]);
  14. send(message, Memory.readByteArray(ptr, byteCount))
  15. return result;
  16. }
  17. Java.use("java.net.SocketInputStream").socketRead0.overload('java.io.FileDescriptor', '[B', 'int', 'int', 'int').implementation = function (fd, bytearry, offset, byteCount, timeout) {
  18. var result = this.socketRead0(fd, bytearry, offset, byteCount, timeout);
  19. var message = {};
  20. message["function"] = "HTTP_recv";
  21. message["ssl_session_id"] = "";
  22. message["src_addr"] = ntohl(ipToNumber((this.socket.value.getRemoteSocketAddress().toString().split(":")[0]).split("/").pop()));
  23. message["src_port"] = parseInt(this.socket.value.getRemoteSocketAddress().toString().split(":").pop());
  24. message["dst_addr"] = ntohl(ipToNumber((this.socket.value.getLocalAddress().toString().split(":")[0]).split("/").pop()));
  25. message["dst_port"] = parseInt(this.socket.value.getLocalPort());
  26. message["stack"] = Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()).toString();
  27. if (result > 0) {
  28. var ptr = Memory.alloc(result);
  29. for (var i = 0; i < result; ++i)
  30. Memory.writeS8(ptr.add(i), bytearry[offset + i]);
  31. send(message, Memory.readByteArray(ptr, result))
  32. }
  33. return result;
  34. }

这里通过的是hook jdk 中提供的SocketInputStream 的socketWrite0 ,socketRead0 这两个底层的api接口,实现对数据进行dump,

那么不管是任何java层的第三方或者系统接口,最终会调取到socketWrite0 ,socketRead0来实现流量的收发, 这样就实现了不管是okhttp 还是retrofit ,流量最终都可以dump下来

HTTPS 抓包分析

  1. Interceptor.attach(addresses["SSL_read"],
  2. {
  3. onEnter: function (args) {
  4. var message = getPortsAndAddresses(SSL_get_fd(args[0]), true);
  5. message["ssl_session_id"] = getSslSessionId(args[0]);
  6. message["function"] = "SSL_read";
  7. message["stack"] = SSLstackread;
  8. this.message = message;
  9. this.buf = args[1];
  10. },
  11. onLeave: function (retval) {
  12. retval |= 0; // Cast retval to 32-bit integer.
  13. if (retval <= 0) {
  14. return;
  15. }
  16. send(this.message, Memory.readByteArray(this.buf, retval));
  17. }
  18. });
  19. Interceptor.attach(addresses["SSL_write"],
  20. {
  21. onEnter: function (args) {
  22. var message = getPortsAndAddresses(SSL_get_fd(args[0]), false);
  23. message["ssl_session_id"] = getSslSessionId(args[0]);
  24. message["function"] = "SSL_write";
  25. message["stack"] = SSLstackwrite;
  26. send(message, Memory.readByteArray(args[1], parseInt(args[2])));
  27. },
  28. onLeave: function (retval) {
  29. }
  30. });

通过hook http://aospxref.com/android-8.1.0_r81/xref/external/conscrypt/common/src/main/java/org/conscrypt/NativeCrypto.java

的 native 方法 SSL_read SSL_write, 使流量进入SSL层时对数据进行dump

客户端证书导出功能

  1. function storeP12(pri, p7, p12Path, p12Password) {
  2. var X509Certificate = Java.use("java.security.cert.X509Certificate")
  3. var p7X509 = Java.cast(p7, X509Certificate);
  4. var chain = Java.array("java.security.cert.X509Certificate", [p7X509])
  5. var ks = Java.use("java.security.KeyStore").getInstance("PKCS12", "BC");
  6. ks.load(null, null);
  7. ks.setKeyEntry("client", pri, Java.use('java.lang.String').$new(p12Password).toCharArray(), chain);
  8. try {
  9. var out = Java.use("java.io.FileOutputStream").$new(p12Path);
  10. ks.store(out, Java.use('java.lang.String').$new(p12Password).toCharArray())
  11. } catch (exp) {
  12. console.log(exp)
  13. }
  14. }
  15. //在服务器校验客户端的情形下,帮助dump客户端证书,并保存为p12的格式,证书密码为r0ysue
  16. Java.use("java.security.KeyStore$PrivateKeyEntry").getPrivateKey.implementation = function () {
  17. var result = this.getPrivateKey()
  18. var packageName = Java.use("android.app.ActivityThread").currentApplication().getApplicationContext().getPackageName();
  19. storeP12(this.getPrivateKey(), this.getCertificate(), '/sdcard/Download/' + packageName + uuid(10, 16) + '.p12', 'r0ysue');
  20. var message = {};
  21. message["function"] = "dumpClinetCertificate=>" + '/sdcard/Download/' + packageName + uuid(10, 16) + '.p12' + ' pwd: r0ysue';
  22. message["stack"] = Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new());
  23. var data = Memory.alloc(1);
  24. send(message, Memory.readByteArray(data, 1))
  25. return result;
  26. }
  27. Java.use("java.security.KeyStore$PrivateKeyEntry").getCertificateChain.implementation = function () {
  28. var result = this.getCertificateChain()
  29. var packageName = Java.use("android.app.ActivityThread").currentApplication().getApplicationContext().getPackageName();
  30. storeP12(this.getPrivateKey(), this.getCertificate(), '/sdcard/Download/' + packageName + uuid(10, 16) + '.p12', 'r0ysue');
  31. var message = {};
  32. message["function"] = "dumpClinetCertificate=>" + '/sdcard/Download/' + packageName + uuid(10, 16) + '.p12' + ' pwd: r0ysue';
  33. message["stack"] = Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new());
  34. var data = Memory.alloc(1);
  35. send(message, Memory.readByteArray(data, 1))
  36. return result;
  37. }

通过hook KeyStore$PrivateKeyEntry 将证书导出到/sdcard/Download/

r0capture 原理分析的更多相关文章

  1. Handler系列之原理分析

    上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...

  2. Java NIO使用及原理分析(1-4)(转)

    转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...

  3. 原子类java.util.concurrent.atomic.*原理分析

    原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...

  4. Android中Input型输入设备驱动原理分析(一)

    转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...

  5. 转载:AbstractQueuedSynchronizer的介绍和原理分析

    简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...

  6. Camel运行原理分析

    Camel运行原理分析 以一个简单的例子说明一下camel的运行原理,例子本身很简单,目的就是将一个目录下的文件搬运到另一个文件夹,处理器只是将文件(限于文本文件)的内容打印到控制台,首先代码如下: ...

  7. NOR Flash擦写和原理分析

    NOR Flash擦写和原理分析 1. NOR FLASH 的简单介绍 NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直 ...

  8. 使用AsyncTask异步更新UI界面及原理分析

    概述: AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类.AsyncTask的内部实现是一个线程池,所有提交的异步任务都会在这个线程池中的工作线 ...

  9. (转)Android 系统 root 破解原理分析

    现在Android系统的root破解基本上成为大家的必备技能!网上也有很多中一键破解的软件,使root破解越来越容易.但是你思考过root破解的 原理吗?root破解的本质是什么呢?难道是利用了Lin ...

  10. SPI协议及工作原理分析

    说明.文章摘自:SPI协议及其工作原理分析 http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial ...

随机推荐

  1. [转帖]iptables ip_conntrack_max 调整

    https://www.diewufeiyang.com/post/583.html 一.概念 ==================== -允许的最大跟踪连接条目:CONNTRACK_MAX(默认值是 ...

  2. [转帖]关于F5负载均衡你认识多少?

    https://www.cnblogs.com/xiexun/p/10718348.html 网络负载均衡(load balance),就是将负载(工作任务)进行平衡.分摊到多个操作单元上进行执行,例 ...

  3. [转帖]jmeter压力测试

    使用jmeter 进行并发压力测试. 首先需要安装好jmeter,下面以widows操作平台为例: 1.确保电脑安装并配置好java环境:具体怎么下载和配置请自行百度: 2.登录jmeter官网htt ...

  4. [转帖] 原来awk真是神器啊

    https://www.cnblogs.com/codelogs/p/16060082.html 简介# 刚开始入门awk时,觉得awk很简单,像是一个玩具,根本无法应用到工作之中,但随着对awk的了 ...

  5. 【记录一个问题】vm-select和vm-storage均无法做并行查询

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 看我提的这个issue: need parallel qu ...

  6. WPF内嵌Http协议的Server端

    需求:有时后比如WPF,WinForm,Windows服务这些程序可能需要对外提供接口用于第三方服务主动通信,调用推送一些服务或者数据. 想到的部分实现方式: 一.使用Socket/WebSocket ...

  7. Elasticsearch向量检索的演进与变革:从基础到应用

    Elasticsearch向量检索的演进与变革:从基础到应用 1.引言 向量检索已经成为现代搜索和推荐系统的核心组件. 通过将复杂的对象(例如文本.图像或声音)转换为数值向量,并在多维空间中进行相似性 ...

  8. 【二】最新多智能体强化学习文章如何查阅{顶会:AAAI、 ICML }

    相关文章: [一]最新多智能体强化学习方法[总结] [二]最新多智能体强化学习文章如何查阅{顶会:AAAI. ICML } [三]多智能体强化学习(MARL)近年研究概览 {Analysis of e ...

  9. Flask 框架:实现简单API测试接口

    通过使用Python中Flask框架实现一个简单的API接口程序,用户可发送JSON格式的请求,服务器响应请求,并以JSON格式将数据返回给用户,此处代码是一个模板可以测试接口时使用. Flask代码 ...

  10. C/C++ 监控磁盘与目录操作

    遍历磁盘容量: #include <stdio.h> #include <Windows.h> void GetDrivesType(const char* lpRootPat ...