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默认使用代理 即可。


  • 2018-12-04 15:31:15

    iOS--Pod install && Pod update

    许多人在最初接触CocoaPods时认为pod install只是在第一次为项目设置CocoaPods时使用,之后都应该使用pod update.看起来是这样,但也不是(But that's not the case at all.)。 这篇文章的目的就是教你啥时候用pod install,啥时候用pod update

  • 2018-12-04 15:33:19

    CocoaPods安装和使用教程

    当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等。可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而其他类库又用到其他类库,“子子孙孙无穷尽也”,这也许是比较特殊的情况。总之小编的意思就是,手动一个个去下载所需类库十分麻烦。另外一种常见情况是,你项目中用到的类库有更新,你必须得重新下载新版本,重新加入到项目中,十分麻烦。如果能有什么工具能解决这些恼人的问题,那将“善莫大焉”。所以,你需要 CocoaPods。

  • 2018-12-04 23:37:37

    pod install 和 pod update

    当我们新建一个Podfile文件运行后,会自动生成一个Podfile.lock文件,Podfile.lock文件里存储着我们已经安装的依赖库(pods)的版本。 当我们第一次运行Podfile时,如果对依赖库不指定版本的话,cocoapods会安装最新的版本,同时将pods的版本记录在Podfile.lock文件中。这个文件会保持对每个pod已安装版本的跟踪,并且锁定这些版本。

  • 2018-12-04 23:40:26

    pod删除已导入的第三方库和移除项目中的cocoapods

    CocoaPods是一个负责管理iOS项目中第三方开源库的工具。CocoaPods的项目源码在Github上管理。在我们有了CocoaPods这个工具之后,只需要将用到的第三方开源库放到一个名为Podfile的文件中,然后在命令行执行$ pod install命令。CocoaPods就会自动将这些第三方开源库的源码下载下来,并且为我的工程设置好相应的系统依赖和编译参数. 但是如果我们导入的某个第三方不适用,或者我们又不想使用该第三方,那我们又该如何将这些相关的东西从我们的项目中清理出去呢?

  • 2018-12-04 23:41:47

    制作自己的Pod库(公有/私有)

    目的:1.管理自己常用的类;2.组件化开发步骤:1.想一个比较酷的名字,在桌面简历文件夹。2.打开terminal,cd到这个文件夹下面,执行pod lib create  xxx(这里我们以JJCategoryKit为例子,下同)命令,如下图。这个过程会问几个问题,根据实际情况输入回答即可。这里我们选择添加demo,结束的时候会自动Lanuch这个app. 作者:深水日月 链接:https://www.jianshu.com/p/ece0b5721461 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 2018-12-05 06:08:26

    CocoaPods建立私有仓库 spec repo

    好多项目里都有公共的组件,copy来,copy去很容易出错,而且不容易维护,所以就想到用用cocoapods 建自己的私有库,Carthage用法虽然相对简单,但是它是把公共组件都放在framework里不容易单步调试,所以我还是选择用Cocoapods 来建立私有仓库 参考使用Cocoapods创建私有podspec

  • 2018-12-05 15:11:18

    为什么 Objective-C非常难

    作为一个Objective-C的coder,我总能听到一部 分人在这门语言上抱怨有很多问题。他们总在想快速学习这门语言来写一个App出来,但他们也总是联想到Objective-C看上去实在太难了或者在想这 些语法符号都是神马玩意?不错,他们问得非常好,所以本人也解释一下为什么很多程序员相比较学习Ruby或者Java很容易,但在决定开发iOS或者OS X应用时会那么犹豫。

  • 2018-12-05 15:22:23

    十分钟让你明白Objective-C的语法(和Java、C++的对比)

    很多想开发iOS,或者正在开发iOS的程序员以前都做过Java或者C++,当第一次看到Objective-C的代码时都会头疼,Objective-C的代码在语法上和Java, C++有着很大的区别,有的同学会感觉像是看天书一样。不过,语言都是相通的,有很多共性。下面列出Objective-C语言的语法和Java,C++的对比,这样你就会很容易Objective-C的语法是怎么回事了。

  • 2018-12-05 15:33:33

    一篇文章看懂有关iOS开发语言的一切!

    OS开发语言有哪些?OS开发语言主要包括什么?iOS开发语言具体怎么学习?今天重点介绍一下: iOS开发语言主要包括:C语言基础、Obiective-C编程、Swift、UIKit框架详解这几大块,在这里项目阶段就不详细的介绍了。 C语言基础 C语言是开发语言的基础,是最常用的一门程序设计语言,最常用于编写计算机程序。

  • 2018-12-06 10:03:36

    定时杀掉processlist sleep状态的线程

    由于程序设计的Bug,导致目前这个项目使用的数据库中有很多Sleep状态的线程。找了很多解决办法,还没发现最终有效的解决方案。只能临时使用如下方法: 编写shell文件,如killSleepProcess.sh