app抓包无数据

2020-11-17 11:57:16

参考地址 还在为大厂app抓不到包而犯愁吗?原因很简单,解决方法更简单!

抓不到请求的现象

我们经常在wifi设置中 设置代理到我们的pc http代理软件上,多数情况下,此时我们开启的app流量都可以在代理软件上看到,比如charles , fiddler等等。 但是细心的人会发现 某些大厂的app 某些请求 在这些 http代理软件上就是抓不到, 给人的感觉就是 流量没从代理软件走一样。

抓不到请求的原因

大家都知道 http协议下层是tcp协议,tcp协议都是内置在操作系统里面的,我们最多只能使用tcp协议对外暴露的socket接口来进行编程, 我们是无法修改操作系统本身的tcp协议的实现的。

但是http协议不同,http协议 都是各个开发者自己实现的, 换句话说 你要实现什么样的http客户端,这个客户端对http协议实现的好坏,实现了多少,支持哪些细节都是你自己决定的。 比如说android上 最有名的okhttp 就是一个http客户端的实现。

既然是自己实现,那就有说法了,虽然你系统设置了代理,但是我完全可以不使用你的代理(或者说我压根就没实现http协议中 proxy的部分)。 这样自然就会像大厂中的某些app一样, 你虽然设置了代理 但是你还是无法抓包。

因为人家http协议的客户端 压根就没有使用你系统设置的 代理

作者:vivo祁同伟
链接:https://juejin.im/post/6860818685763223565

看源码

想明白这个,我们再带着目的 去看源码 就很简单了。

首先okhttp 是肯定有实现http代理的部分的,否则我们每天也不可能使用代理 愉快的进行抓包。 那么既然有大厂的app 抓不到,那么肯定是某些属性 动态设置了。

注意看下面的代码:

如果我这样设置了,你就会发现 你的app的接口 也会抓不到了。

继续看源码: 

注释说的很明白,大概意思就是当你设置了这个属性以后,我们就不会使用系统代理了。 

其实flutter也是有类似的功能,只不过okhttp 默认情况下是使用系统代理的,你要不想使用 你就必须写额外的代码,但是flutter是反过来的, flutter是默认就不使用系统代理,你要开启代理,必须在代码中进行设置:

lass ProxyDio {
  //填入你的代理地址
  static const _PROXY_IP_ADDRESS = "10.12.65.66";
  //填入你的代理端口号
  static const _PROXY_PORT_NUM = "5000";

  static Dio getProxyDio() {
    var dio = Dio();
    final adapter = dio.httpClientAdapter as DefaultHttpClientAdapter;
    adapter.onHttpClientCreate = (client) {
      // 设置该客户端的代理为指定的 ip:端口
      client.findProxy = (uri) {
        // localProxyIPAddress 和 localProxyPort 是在外部被忽略文件中定义, 方便各个开发者自行更改.
        return "PROXY " + _PROXY_IP_ADDRESS + ":" + _PROXY_PORT_NUM;
      };
      // 安卓机上面证书授权:
      client.badCertificateCallback = (cert, host, port) => true;
    };
    return dio;
  }
}123456789101112131415161718192021

特殊定制

了解到 事情的来龙去脉以后,我们还需要思考1个问题,为什么大厂的app 是有些接口抓不到,有些接口 就能抓到呢? 这里其实有3个原因。

第一: webview webview 使用的http协议 显然跟我们的okhttp是不一样的。而webview使用的 http协议栈 默认都是c代码的实现,我们很难干预,从测试的情况来看,这个http协议栈的实现 是会使用默认系统代理的。 我暂时没找到 关闭这个功能的api,如果有小伙伴实现了 可以告诉我

第二:可以针对性的对某些敏感接口 使用no_proxy,而其余接口保持正常。

实际上okhttp做的非常强大,对于代理的设置 他可以做到针对 接口地址不同 而 使用不一样的设置。

比如这种写法 和上面的no_proxy 就是差不多效果的 

再看看

第三: 即使你使用了全局的no_proxy 代理,但是通常 我们的app里面都不会只有一个okhttp的 client,因为还有其他第三方的库引进来,他们的client 如果没有使用 no_proxy 那他们的接口 还是可以被抓包软件抓到的。

当然这个问题也是可以解决的,我们只要利用 字节码修改技术 直接修改 字节码即可。 这里就不多介绍了,有兴趣的可以自己实现。

使用了no_proxy 真的就抓不到了吗?

当然不是,解决问题的方法就很多,最简单的就是使用drony这个软件,模拟一个vpn网络 即可。 原理很简单,让流量走到vpn里面, 然后vpn默认使用代理 即可。


  • 2019-12-19 00:16:30

    android采用FFmpeg实现音频混合与拼接剪切

    接触FFmpeg有一段时间了,它是音视频开发的开源库,几乎其他所有播放器、直播平台都基于FFmpeg进行二次开发。本篇文章来总结下采用FFmpeg进行音频处理:音频混合、音频剪切、音频拼接与音频转码。

  • 2019-12-19 15:01:58

    spring boot 在Linux下服务启动报错Unable to find Java

    将 Spring boot 安装为 Linux 服务启动,后输入 service myapp start 报错 Unable to find Java ,但是使用 java -jar myapp.jar 启动成功。不知道为啥引起的,经过百度找到下面这个解决方法和我的情况一样,终于把问题解决

  • 2019-12-19 16:44:01

    根据条件配置多个npm仓库

    scope 是一种很好的包管理方式。统一的“命名空间”,清晰、好辨识;在 registry 中使用统一的 organization 管理,不必担心命名冲突和冒用等。 在实际使用中,一个常见的场景是公司的私有仓库。使用统一的 scope 定义在私有仓库中定义私有包,绝对是一个非常好的方式。 指定 scope 从指定仓库安装

  • 2019-12-20 13:24:58

    瓦片地图生成使用以及原理

    我们都知道地球是圆的,电脑显示器是平的,要想让位于球面的形状显示在平面的显示器上就必然需要一个转换过程,这个过程就叫做投影(Projection)。在地球上我们通过经纬度来描述某个位置,而经过投影之后的地图也有自己的坐标系统,本篇文章就来详细介绍在百度地图API中涉及的各种坐标体系。

  • 2019-12-20 13:27:16

    腾讯地图谷歌和高德地图等自定义地图区别

    腾讯、百度、Google的地图投影均采用Web Mercator 投影坐标系;腾讯与Google的地图瓦片分辨率及切片范围是完全相同的,仅仅是命名规则稍有不同,这就使得同一位置和缩放级别的地图瓦片是完全可以重叠的;而百度地图每个缩放级别分辨率与前两者均不相同,而且地图瓦片的坐标原点做了一定的偏移,导致百度地图与前两者的瓦片是无法重叠的,这是因为百度在GCJ-02的基础上又进行了加密处理,形成了百度独有的BD-09坐标系。