工作记录#Android App 抓包工具对比

9,229 阅读6分钟

因为需要分析竞品App一些信息的更新机制,所以就用到了抓包工具,这里简单分析下三种抓包工具,主要分析Fillder,如有不当,请多指教。


知识补充

在介绍抓包工具之前,如果对HTTPS原理、SSL/TSL、CA证书不了解的,可以查看我之前写的一个分析文档与Demo—— HttpsCertDemo,这里主要分析了以上原理,并自制CA证书(使用win10+openssl),完成了一个简易的前后端Https通讯的Demo。如果已经了解以上知识,那我们就愉快地继续往下看吧。


WireShark

WireShark是一款非常流行,功能十分强大的网络数据分析工具,可以显示网络封包的详细信息,需要网络协议有一定的了解才比较容易看懂。它的名字就很霸气,可以翻译成通讯鲨鱼?进入官网可以看到他们的标语 Go DeepAbout Wireshark里面有一句这么说:

It lets you see what’s happening on your network at a microscopic level.

在分析HTTPS握手过程的时候就是用WireShark作为分析工具的,这个工具相对于FildderCharles比较偏底层,它会展示服务器与客户端的每次“交流”,包括详细的握手流程,重复、缺失、乱序的TCP请求,重连请求等都可以看到:

这里罗列的太详细,而我们所需要的只是精确到每次的POST、GET等请求即可(等下可以对比下Fildder)。

PS:当然如果非要用也是可以的,但是如果需要查看HTTPS中的内容就需要获取对称加密的秘钥并配置WireShark去读取,可以参考这篇文章,这种方法只适用于浏览器。手机抓包可以参考这篇文章,但是这里面只讲了如何抓包,没讲如何解密HTTPS,当然你可以想办法从手机端获取秘钥,这里我没有做深入研究。


Fiddler

Web debugging proxy tool to log all HTTP(S) traffic between your computer and the Internet. Inspect traffic, set breakpoints, and fiddle with request/response.

Fildder是一款定位HTTP/HTTPS调试的工具,能记录所有客户端和服务器的HTTP/HTTPS请求,允许你监视,设置断点,甚至修改输入输出数据。

如果平时开发过程中只是涉及到HTTP/HTTPS上层网络协议的话,使用Fildder足够了。具体操作与使用方法可以参考官网教程 ConfigureForAndroidConfigure Fiddler to Decrypt HTTPS Traffic 等,更简单的使用教程可以参考这篇文章

原理分析

在使用Fildder前,服务器客户端愉快的进行着通讯,因为有着HTTPS的加密保护,大家也都不知道他们在交流什么:

此时我们进行了一顿骚操作:

  • 手机(安装了准备抓包的客户端)、我的电脑(安装了Fildder)连接同一局域网
  • 手机配置代理,IP是电脑IP,端口为Fildder的监听端口

此时手机的所有请求就会经过电脑中的Fildder再请求到互联网上了,变成了这样:

但是此时虽然HTTP的报文可以被截取,但是对于HTTPS相关的请求,客户端都报“网络错误”之类的错误(因为被抓包的App是release版本的,所以看不到具体报错信息,但其实是证书验证失败)。此时我们需要将Fildder的自制证书添加到手机的证书信任列表中(用手机浏览器访问电脑IP+Fildder端口下载证书,具体参考上方给出的链接)。添加后,大部分客户端与服务器之间的那点“小秘密”都一览无余,为什么说大部分呢,小部分又是谁?我们先来看看原理:

我们来看下Fildder此时都做了些什么,它使用一种中间人攻击的方式(MITM):

  1. 客户端请求建立HTTPS链接,发送客户端支持的加密协议及版本列表等信息给服务器端。
  2. Fildder伪装成客户端请求服务器
  3. 服务器收到Fiddler的请求以后,从请求中筛选合适的加密协议。并返回服务器CA证书,证书中包括公钥信息。
  4. Fildder根据服务器域名动态生成自签证书(使用装入客户端的证书进行签发),然后下发给客户端,此时客户端进行验证证书,会读取到之前安装的fillder证书,就可以验证通过了Fildder能否抓取证书就看这一步了,可能会出现验证不了的情况)
  5. 在上传对称秘钥的过程中,Fildder使用根证书私钥解密,获取对称秘钥。
  6. 接下来的网络传输都会使用这个对称秘钥进行解密
  7. .....

这里需要注意:

  • 我们事先将Fildder的证书安装到手机上,我们叫它证书A,然后Fildder在获取服务器下发证书的时候,使用服务器域名+证书A签发一个新证书,我们叫它证书B。将证书B发给客户端,让客户端误以为这是服务器发来的。
  • 客户端在验证证书的时候,会取到证书A进行验证,自然就验证通过了,此时Fildder也可以使用证书A的私钥对加密信息进行解密,获取对称秘钥。

什么时候会抓包失败

  1. 被抓包的App的网络框架被设置了不能请求代理地址
  2. 一些Android系统只信任系统证书,或者App设置了只信任系统证书,因为不能修改App内容,这个时候可能需要Root机子了,参考
  3. 设置了证书固定(Certificate Pinning)的App,参考JustTrustMe。破解的原理大致是,Hook创建SSLContext等涉及TrustManager相关的方法,将固定的证书移除。验证pin的源码位置:NetworkSecurityTrustManager#checkPins(如有错误请指出)
  4. 指定了信任证书,如果使用的是OkHttp,就是设置了指定的TrustManager
    //TrustManager
    TrustManagerFactory trustManagerFactory =
            TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustManagerFactory.init(getKeyStore());

    TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
    if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
        throw new IllegalStateException("Unexpected default trust managers:"
             + Arrays.toString(trustManagers));
    }

    //SSLContext
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, trustManagers, new SecureRandom());
    // OkHttp 的 builder
    builder.sslSocketFactory(
            sslContext.getSocketFactory(),
            (X509TrustManager) trustManagers[0]
    );

如果用Fildder抓包会报如下错误:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

如果你用OkHttp设置了信任所有证书,那就要注意了,你的信息就会被一览无余了。

最后,关于如何配置信任证书、固定证书,大家可以查看Android官网的 网络安全配置


Charles

Charles大家可以自己去试试,与Fildder类似。 PS:是要付费的,不过网上很多破解网站...