抓包 订阅
抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。 展开全文
抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。
信息
领    域
网游作弊
作    用
检查网络安全
分    类
截获、重发、编辑
中文名
抓包
外文名
packet capture
抓包背景知识
数据在网络上是以很小的称为帧(Frame)的单位传输的,帧由几部分组成,不同的部分执行不同的功能。帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上,通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧已到达,然后对其进行存储。就是在这个传输和接收的过程中,嗅探器会带来安全方面的问题。每一个在局域网(LAN)上的工作站都有其硬件地址,这些地址唯一地表示了网络上的机器(这一点与Internet地址系统比较相似)。当用户发送一个数据包时,如果为广播包,则可达到局域网中的所有机器,如果为单播包,则只能到达处于同一碰撞域中的机器。 在一般情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的数据包则不予响应(换句话说,工作站A不会捕获属于工作站B的数据,而是简单地忽略这些数据)。如果某个工作站的网络接口处于混杂模式,那么它就可以捕获网络上所有的数据包和帧。
收起全文
精华内容
下载资源
问答
  • 2020-06-07 11:54:36

    恭喜自己,文章投稿洋神公众号刊登成功。😁😁😁
    鸿洋 - 关于Android 抓包 与 反抓包

    现象与原因

    Android 对于 Http 和 Https 两类网络请求

    Http

    因为没有加密,属于明文传输,是可以抓包的。
    但是从 Android 9.0 开始,默认是禁止 App 使用 Http 这种使用所有未加密的连接,使用 Http 会导致程序报错。

    java.net.UnknownServiceException: CLEARTEXT communication

    但还是可以通过写一段关于网络安全的配置 network_security_config ,让系统允许继续使用 Http 协议。

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config cleartextTrafficPermitted="true" />
    </network-security-config>
    

    这里先跳过,下面会详细讲怎么让它生效。
    可以认为 Android9.0 以后不推荐使用 Http,要求开发者转移到 Https。


    Https

    Https 是一种使用了加密传输的协议,防止了 App 和 服务器之间的中间人进来拦截、伪造、篡改问题。
    但是如果是手机持有人,主动在手机里安装 charles 的根证书,实现了认证环节,是可以实现抓包的。
    然而 Android 也发现了这种漏洞,为了保护应用开发公司的通讯安全,在 Android7.0 以后,只信任 Android 设备的系统根证书。也就是如果你安装的 charles 根证书这类属于「用户证书」分类的证书,Android 系统是不认的,照样不让 Https 请求正常通过。
    程序会报错:

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

    而此时的 charles 显示如下:charles 显示红色X图标

    ps:一般在 Android 手机的这个打开路径下「设置 - 某个“安全”设置子页面 - 加密与凭证 - 信任的凭证」,可以看到该设备的所有根证书。
    分为「系统」和「用户」两个分类。





    ——————————————————————————————

    场景与解决办法

    一、开发者抓第三方的 Https 包

    如果第三方只是使用默认的 Android Https 配置,那么可以使用这两种方法可以抓到它们的请求包。

    1. 使用 Android7.0 以下的手机安装应用,然后抓包

    很好理解,上面讲过了只有 Android7.0 以后,才开始不信任用户根证书。

    2. 想办法把 你的 charles 证书或者其他证书,变成设备的根证书

    比如你是手机设备厂家,或者你可以编辑一套ROM出来,当然可以把任何个人证书给搞成是系统证书。
    另一种方法是,需要一部有Root权限的手机,安装 Xposed 的 JustTrustMe 模块来信任所有的证书。




    二、开发者抓自己 App 的 Https 包

    0.应该不会有人为了抓包,把 targetSdkVersion 强行改成低于24(Android 7.0)的版本吧。孩子睡觉老是踢被子,幸好被我及时发现打断了腿,否则肯定感冒。

    1. 使用 Android 提供的「网络安全配置(Network security configuration)」

    官方讲解文档:Android 开发者官网 网络安全配置
    步骤一:在 manifest 文件中配置一个 android:networkSecurityConfig 属性,填写一个 xml 文件。

    <?xml version="1.0" encoding="utf-8"?>
    <manifest ... >
        <application android:networkSecurityConfig="@xml/network_security_config"
                        ... >
            ...
        </application>
    </manifest>
    

    步骤二:在 res/xml 文件夹里创建一个 network_security_config.xml 文件,里面配置如下。
    配置的意思是在 debug 模式下,信任用户证书。

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <debug-overrides>
            <trust-anchors>
                <certificates src="user" />
            </trust-anchors>
        </debug-overrides>
    </network-security-config>
    

    一个很重要的知识点是,区分是不是 debug 包是通过 module 的 build.gralde 文件,在 buildType 里面的 debuggable 字段来决定的。

        buildTypes {
            release {
                signingConfig signingConfigs.release
                minifyEnabled true
                shrinkResources true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                //debuggable true  如果打生产包时候忘了关,就玩脱了
            }
            preRelease {
                signingConfig signingConfigs.release
                minifyEnabled true
                shrinkResources true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                debuggable true //推荐这种做法。创建一个预发布的 buildType,打开 debuggable=true 专门给测试人员能在正式域名环境里抓包检查用。
            }
            debug {
                minifyEnabled false
                shrinkResources false
            }
        }
    

    在 buildTypes 里配置这个 debuggable 属性,最终会被合并到 manifest 文件里面的 <application 结点下,增加一个 android:debuggable=“true” 属性。
    合并后的manifest文件

    2. 配置 OkHttp 信任所有证书

    在使用 builder 模式构建 OkHttpClient 的时候,增加 sslSocketFactory 和 hostnameVerifier 配置项。下面的演示代码里这两个配置项里面会信任所有证书。为了避免玩脱也记得只在 BuildConfig.DEBUG 条件下才使用这个配置。这个 BuildConfig.DEBUG 的值跟前面讲的 debuggable 是一致的。

    public class ZhihuHttp {
    
        public static final String ZHIHU_BASE_URL = "https://news-at.zhihu.com/api/";
    
        private static final ZhihuHttp zhihuHttp = new ZhihuHttp();
    
        private OkHttpClient okHttpClient;
    
        private static SSLSocketFactory createSSLSocketFactory() {
            SSLSocketFactory sSLSocketFactory = null;
            try {
                SSLContext sc = SSLContext.getInstance("TLS");
                sc.init(null, new TrustManager[]{new TrustAllManager()},
                        new SecureRandom());
                sSLSocketFactory = sc.getSocketFactory();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return sSLSocketFactory;
        }
    
        private static class TrustAllManager implements X509TrustManager {
            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }
    
            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }
    
            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        }
    
        private static class TrustAllHostnameVerifier implements HostnameVerifier {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        }
    
        private ZhihuHttp() {
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.connectTimeout(10, TimeUnit.SECONDS);
    
            if (BuildConfig.DEBUG) {
                builder.sslSocketFactory(createSSLSocketFactory(), new TrustAllManager());
                builder.hostnameVerifier(new TrustAllHostnameVerifier());
            }
    
            okHttpClient = builder.build();
        }
    
        public static ZhihuHttp getZhihuHttp() {
            return zhihuHttp;
        }
    
        public void getDailiesWithCallback() {
            Request request = new Request.Builder()
                    .url(ZHIHU_BASE_URL + "4/news/latest")
                    .build();
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(@NotNull Call call, @NotNull IOException e) {
                    Log.e("YAO", "ZhihuHttp.java - onFailure() ----- e:" + e.toString());
                    e.printStackTrace();
                }
    
                @Override
                public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                    Log.e("YAO", "ZhihuHttp.java - onResponse() ----- :" + response.toString());
                }
            });
        }
    
    }
    




    三、怎么防止被其他开发者抓包

    前面讲到,默认的 Android Https 配置下,只要使用 Android7.0 以下的手机、或者找个 Root 设备安装把用户证书(比如charles证书)想办法搞进系统证书那部分,就可以抓包了。这对于黑产来说也忒忒忒简单了。那么怎么防止呢?
    答案是配置你信任的网站证书或者配置信任的认证链

    1.Android 官方配置信息证书

    (声明:这种方法只能防篡改设备的根证书,防不了使用 Android7.0 以下的手机。)
    比如你可以像这样把你信任的网站的证书给搞下来
    步骤①:点击域名旁边锁的图标,弹出框里面点「证书」
    查看网站证书
    mac系统,对着证书那个图标拖动到某个文件夹里。这样你就能得到一个HTTPS的里面的SSL里面的非对称加密算法的公钥。
    拿到网站证书
    步骤②:放进 res/raw 文件夹里,在network_security_config.xml 里写上相关配置
    配置信任某几个证书

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
    
        <!-- 这个是全局的基础的配置 -->
        <base-config>
            <trust-anchors>
                <!-- 如果整个base-config都不写,就等于是<certificates src="system" /> -->
                <!-- 这里写全局基础配置,只信任下面某几个证书 -->
                <certificates src="@raw/zhihu" />
                <certificates src="@raw/baidu" />
            </trust-anchors>
        </base-config>
    
        <!-- 如果只对某些涉及数据安全的私密域名进行保护,可以针对某个域名,只信任某几个证书 -->
        <domain-config>
            <domain includeSubdomains="true">zhihu.com</domain>
            <trust-anchors>
                <certificates src="@raw/zhihu" />
                <certificates src="@raw/tencent" />
            </trust-anchors>
        </domain-config>
    
        <debug-overrides>
            <trust-anchors>
                <certificates src="user" />
            </trust-anchors>
        </debug-overrides>
    
    </network-security-config>
    

    以上就是 Android 官方推荐的做法。





    ——————————————————————————————

    2. OkHttp 配置信任认证链

    (声明:这种方法是全方面防御,在 Android7.0 以下设备也能起作用)
    参照这部分的 OkHttp官方介绍 以及 stack overflow,可以学到这部分的使用方法


    步骤①:写一个 CertificatePinner 的配置

    其中的 add方法两个参数。第一个参数是网址的域名host,第二个是sha256的证书。证书我们目前不清楚,先输入这么一段字符串。使用这么一段错误的配置运行后将会报错,然后在日志里得到正确的配置信息。

    注意第一个参数不要包含协议,也不要省略部分域名,错误示例 「https://news-at.zhihu.com」、「zhihu.com」。
    第二个参数是个假证书识别串,但是有效的,我测试时候乱输入了一串「sha256/wrong」没有触发到搜想要的结果。

    public class ZhihuHttp {
    
        public static final String ZHIHU_BASE_URL = "https://news-at.zhihu.com/api/";
    
        private static final ZhihuHttp zhihuHttp = new ZhihuHttp();
    
        private OkHttpClient okHttpClient;
    
        private ZhihuHttp() {
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.connectTimeout(10, TimeUnit.SECONDS);
    
            // 只信任网站对应的证书
            CertificatePinner certificatePinner = new CertificatePinner.Builder()
                    .add("news-at.zhihu.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
                    .build();
            builder.certificatePinner(certificatePinner);
            okHttpClient = builder.build();
        }
    
        public static ZhihuHttp getZhihuHttp() {
            return zhihuHttp;
        }
    
        public void getDailiesWithCallback() {
            Request request = new Request.Builder()
                    .url(ZHIHU_BASE_URL + "4/news/latest")
                    .build();
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(@NotNull Call call, @NotNull IOException e) {
                    Log.e("YAO", "ZhihuHttp.java - onFailure() ----- e:" + e.toString());
                    e.printStackTrace();
                }
    
                @Override
                public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                    Log.e("YAO", "ZhihuHttp.java - onResponse() ----- :" + response.toString());
                }
            });
        }
    
    }
    

    步骤②:执行代码后报错。搜索关键字,我们能得到这么一串报错
    Subscriber onError() : javax.net.ssl.SSLPeerUnverifiedException: Certificate pinning failure!
      Peer certificate chain:
        sha256/f5fNYvDJUKFsO51UowKkyKAlWXZXpaGK6Bah4yX9zmI=: CN=*.zhihu.com,OU=IT,O=智者四海(北京)技术有限公司,L=北京市,C=CN
        sha256/zUIraRNo+4JoAYA7ROeWjARtIoN4rIEbCpfCRQT6N6A=: CN=GeoTrust RSA CA 2018,OU=www.digicert.com,O=DigiCert Inc,C=US
        sha256/r/mIkG3eEpVdm+u/ko/cwxzOMo1bk4TyHIlByibiA5E=: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
      Pinned certificates for news-at.zhihu.com:
        sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
    

    这报错的意思是。现在访问这个链接的认证链是 Peer certificate chain 下面的3个sha256。
    「sha256/f5fNYvDJUKFsO51UowKkyKAlWXZXpaGK6Bah4yX9zmI=」
    「sha256/zUIraRNo+4JoAYA7ROeWjARtIoN4rIEbCpfCRQT6N6A=」
    「sha256/r/mIkG3eEpVdm+u/ko/cwxzOMo1bk4TyHIlByibiA5E=」
    链的含义是,第一个sha256对应的证书由第二个sha256对应的证书认证,第二个sha256对应的证书又第三个sha256对应的证书认证。

    在代码里配置的用于「news-at.zhihu.com」域名的认证 sha256 期望是
    「sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=」

    因为两者对应不上,所以请求失败。然而通过这个方法,我们得到正确的sha256,下面就拿这几个正确的sha256来配置。


    步骤③:配置正确 sha256

    CertificatePinner certificatePinner = new CertificatePinner.Builder()
            //正常请求下的证书验证链路
            .add("news-at.zhihu.com", "sha256/f5fNYvDJUKFsO51UowKkyKAlWXZXpaGK6Bah4yX9zmI=")//CN=*.zhihu.com,OU=IT,O=智者四海(北京)技术有限公司,L=北京市,C=CN
            .add("news-at.zhihu.com", "sha256/zUIraRNo+4JoAYA7ROeWjARtIoN4rIEbCpfCRQT6N6A=")//CN=GeoTrust RSA CA 2018,OU=www.digicert.com,O=DigiCert Inc,C=US
            .add("news-at.zhihu.com", "sha256/r/mIkG3eEpVdm+u/ko/cwxzOMo1bk4TyHIlByibiA5E=")//CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
            .build();
    

    配置后,这个域名的请求就不能被抓包了。因为开启抓包后,根证书是 charles 的公钥,跟期望的 sha256 匹配不上。
    一个很重要的点是,其实我们可以不用把3个 sha256 都加上。匹配逻辑是任意一个 sha256 匹配上请求就可以通过了。所以其实可以这么写。

    CertificatePinner certificatePinner = new CertificatePinner.Builder()
            //正常请求下的证书验证链路
            .add("news-at.zhihu.com", "sha256/f5fNYvDJUKFsO51UowKkyKAlWXZXpaGK6Bah4yX9zmI=")//CN=*.zhihu.com,OU=IT,O=智者四海(北京)技术有限公司,L=北京市,C=CN
            .build();
    

    域名hostname 支持通配符,可以参考 OkHttp CertificatePinner 里面的「Wildcard pattern rules」部分



    验证结果
    按照 OkHttp 官方指导配置完后,使用 charles 抓包看看还能不能在 Android 7.0 以下系统抓到包。
    验证结果,不能抓包,会出现一个报错:

    Subscriber onError() : javax.net.ssl.SSLPeerUnverifiedException: Certificate pinning failure!
      Peer certificate chain:
        sha256/dVUJFtUhQtJki5t0/j+hMYzTgtVkETqjsogUuyquPPo=: CN=*.zhihu.com,OU=IT,O=智者四海(北京)技术有限公司,L=北京市,C=CN
        sha256/54ZQa+M6vq6DhdR7DLkc1X6fWmVEZ6wLZaaYwoR4Uvw=: C=NZ,ST=Auckland,L=Auckland,O=XK72 Ltd,OU=https://charlesproxy.com/ssl,CN=Charles Proxy CA (2 十月 2017\, YaodeMacBook-Pro.local)
      Pinned certificates for news-at.zhihu.com:
        sha256/f5fNYvDJUKFsO51UowKkyKAlWXZXpaGK6Bah4yX9zmI=
        sha256/zUIraRNo+4JoAYA7ROeWjARtIoN4rIEbCpfCRQT6N6A=
        sha256/r/mIkG3eEpVdm+u/ko/cwxzOMo1bk4TyHIlByibiA5E=
    

    可以看到现在访问这个链接的认证链是 Peer certificate chain 下面的两个sha256。
    「sha256/dVUJFtUhQtJki5t0/j+hMYzTgtVkETqjsogUuyquPPo=」
    「sha256/54ZQa+M6vq6DhdR7DLkc1X6fWmVEZ6wLZaaYwoR4Uvw=」
    报错的信息里,第二个 sha256 冒号后面,显示这串字符来自我的 charles 公钥。


    对比 未使用 和 使用 抓包的报错信息,发现第一个 sha256 都是来自于知乎的公钥,但两个的 sha256 是不一样的。
    //未开启抓包
    sha256/f5fNYvDJUKFsO51UowKkyKAlWXZXpaGK6Bah4yX9zmI=: CN=*.zhihu.com,OU=IT,O=智者四海(北京)技术有限公司,L=北京市,C=CN
    //开启抓包
    sha256/dVUJFtUhQtJki5t0/j+hMYzTgtVkETqjsogUuyquPPo=: CN=*.zhihu.com,OU=IT,O=智者四海(北京)技术有限公司,L=北京市,C=CN
    

    一开始我一直以为这一串东西是SSL公钥进行一次hash算法得到的字符串。后面观察后发现不是。
    这是两个公钥在不同 「中间证书认证」-「中间证书认证」……「根证书认证」这种认证体系下的一个hash串。
    所以如果开启抓包,那么他对应的根证书是 charles 的公钥,得出的第一个来自知乎证书的 sha256 就会有所不同。


    warning: 配置信任某个具体证书一定要与服务器开发或运维沟通好,因为如果服务器进行了证书替换而App没有更新到最新证书,App的请求将会失效。如果开启的是全部域名的证书配置,意味着你连应用内升级或者热更新都用不了,绝对是重大事故。




    四、还有什么骚操作

    上面讲到我们配置到工程代码里的是 网站的公钥(任何人都可以随意下载)
    根据HTTPS的原理,公钥和私钥的原理,其实完全可以在代码里配置上开发者的 charles 公钥(只针对某台具体的笔记本,charles 为它生成的一对公钥私钥)。因为没人能根据公钥能破解出对应的私钥。
    所以如果在在 app 里配上我们某部电脑 charles 公钥,以后就可以用那个电脑抓正式环境正式域名的请求了。比如工程加上公司的公用开发机的 charles 公钥,或者核心App测试大佬的 charles 公钥。

    使用 Android 官方配置信任证书可以这些写

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
    
        <!-- 这个是全局的基础的配置 -->
        <base-config cleartextTrafficPermitted="true">
            <trust-anchors>
                <!-- 如果整个base-config都不写,就等于是<certificates src="system" /> -->
                <!-- 这里写全局基础配置,只信任下面某几个证书 -->
                <certificates src="@raw/zhihu" />
                <certificates src="@raw/yao_charles" />
            </trust-anchors>
        </base-config>
    
        <debug-overrides>
            <trust-anchors>
                <certificates src="user" />
            </trust-anchors>
        </debug-overrides>
    
    </network-security-config>
    

    使用OkHttp的配置的方法,这么写

    // 只信任网站对应的证书
    CertificatePinner certificatePinner = new CertificatePinner.Builder()
            //正常请求下的证书验证链路
            .add("news-at.zhihu.com", "sha256/f5fNYvDJUKFsO51UowKkyKAlWXZXpaGK6Bah4yX9zmI=")//CN=*.zhihu.com,OU=IT,O=智者四海(北京)技术有限公司,L=北京市,C=CN
            .add("news-at.zhihu.com", "sha256/zUIraRNo+4JoAYA7ROeWjARtIoN4rIEbCpfCRQT6N6A=")//CN=GeoTrust RSA CA 2018,OU=www.digicert.com,O=DigiCert Inc,C=US
            .add("news-at.zhihu.com", "sha256/r/mIkG3eEpVdm+u/ko/cwxzOMo1bk4TyHIlByibiA5E=")//CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
    
            //charles 抓包下的配置
            .add("news-at.zhihu.com", "sha256/dVUJFtUhQtJki5t0/j+hMYzTgtVkETqjsogUuyquPPo=")//CN=*.zhihu.com,OU=IT,O=智者四海(北京)技术有限公司,L=北京市,C=CN
            .add("news-at.zhihu.com", "sha256/54ZQa+M6vq6DhdR7DLkc1X6fWmVEZ6wLZaaYwoR4Uvw=")//C=NZ,ST=Auckland,L=Auckland,O=XK72 Ltd,OU=https://charlesproxy.com/ssl,CN=Charles Proxy CA (2 十月 2017\, YaodeMacBook-Pro.local)
            .build();
    





    ——————————————————————————————
    附赠一份看过的比较好的 HTTPS 文章《从0到1讲解HTTPS设计流程》,帮助解决95%关于 HTTPS 方面的疑问。

    更多相关内容
  • 资料包含视频+文档+工具,主要目的使用fiddler抓包工具实现购物商品的价格进行幕改来进行支付
  • Java抓包程序实现(附说明文档)

    千次下载 热门讨论 2015-04-27 11:13:51
    压缩包内包含了Java抓包用到到两个重要的软件,winpcap和jpcap,可以直接安装使用,本人亲测,windows 7环境下完美运行,JDK用的是1.7,需要配置下jpcap.dll到JDK的bin目录下。 另外还包含了一个Java程序(参考了...
  • Android抓包工具——Fiddler

    千次阅读 2022-05-24 15:30:38
    这里出现的名词,其实都是差不多的意思啊,这都跟抓包这个词有关,说到抓包呢我们今天就先来了解一下抓包的一些基础定义跟抓包工具Fiddler的使用跟安装吧。 本篇文章,博主只想使用通俗易懂的话语,让大家明白...

    前言

    🔥在平时和其他大佬交流时,总会出现这么些话,“抓个包看看就知道哪出问题了”,“抓流量啊,payload都在里面”,“这数据流怎么这么奇怪”。

    👉这里出现的名词,其实都是差不多的意思啊,这都跟抓包这个词有关,说到抓包呢我们今天就先来了解一下抓包的一些基础定义跟抓包工具Fiddler的使用跟安装吧。

    本篇文章,博主只想使用通俗易懂的话语,让大家明白以下内容:

    什么是抓包哪些场景需要用到抓包Fiddler抓包的原理怎样使用Fiddler进行移动端抓包

    抓包

    包 (Packet) 是TCP/IP协议通信传输中的数据单位,一般也称“数据包”。

    我们平常测试过程中所说的数据包其实就是接口请求的数据,在HTTP请求中,包括请求头信息、请求内容、响应头信息、响应内容。

    什么是抓包

    用特定的工具获取客户端与服务端之间发送和返回的数据包。目的是分析数据包的协议、内容等,从而判断接口的设计是否符合要求,比如抓包某次请求的请求参数与响应参数,查看参数是否正确。

    哪些场景下需要抓包

    对于初学者或者没有接触过接口测试的同学而言,可能不太明白做接口测试或者接口自动化测试为什么一定要学会对接口数据进行抓包。

    那么在哪些场景下需要抓包获取请求数据呢?

    1. 重现bug,需要截取数据定位问题时;
    2. 判断问题是前端bug还是后端bug时;
    3. 做接口测试,但开发没有提供接口文档时,需要抓包才能获取接口信息;
    4. 某个功能场景或者某些功能场景我们不知道调用了哪些接口,或者不知道接口调用的先后顺序时;
    5. 需要修改返回参数时(用于mock或者别的场景)

    在实际测试过程中,用的最多的场景是1、2、3、4。

    Fiddler

    抓包工具有很多种,如Wireshark、Fiddler、Charlse、Tcpdump、浏览器工具(F12)等,但在软件测试工作中抓包对象一般是HTTP协议的接口,所以最多的是浏览器工具、Fiddler/Charlse。

    Fiddler特点简单归纳如下:

    1. Fiddler能抓取客户端和服务器之间的HTTP/HTTPS请求,可以对接口请求设置断点,甚至修改输入输出数据
    2. Fiddler只能抓取HTTP/HTTPS协议
    3. Fiddler除能对PC端浏览器抓包外,还支持对移动端进行抓包

    Fiddler抓包原理

    通常,我们使用浏览器浏览网页,或者使用手机上的APP,交互可以使用以下简化的流程图表示:

    客户端(PC端或移动端) 向服务端通过发送HTTP请求进行数据交互,而我们的需求是,抓取这个交互过程中的数据。

    我们只需要在客户端与服务端之间加上一个中介,让它们之间交互的数据都通过这个中介,中介记录这些通过自身的数据,就能获取到客户端与服务端之间具体的交互数据了。

    Fiddler便可以充当这个中介角色,交互流程如下:

    启动Fiddler其实就是启动了一台代理web服务器(Proxy),代理地址为127.0.0.1,端口为8888。只要HTTP请求通过127.0.0.1:8888 (即Fiddler) 进行代理发送与接收,Fiddler就会记录经过自身的HTTP请求数据,便抓取到了HTTP请求的相关数据。

    而怎样才能使得HTTP请求都通过127.0.0.1:8888进行代理?Fiddler启动时IE浏览器的代理会自动设置127.0.0.1:8888为代理地址,Chrome、Firefox需要在浏览器中手动修改,移动端则需要在手机里设置。

    安装

    进入官网下载,地址为:https://www.telerik.com/download/fiddler

    需填写内容可填写如下,Windows系统点击【Download for Windows】,点击后会跳转页面并开始下载 (没有的话可以多尝试两次) ,如果没有下载可根据跳转页面提示进行点击。

    下载后得到安装文件FiddlerSetup.exe,一路傻瓜式安装即可。目前下载的版本为Progress Telerik Fiddler Classic。

    安装完成后,打开Fiddler,主界面如下:

    • 如图所示,切换至Inspectors可查看对应请求的请求参数和返回参数
    • 请求参数、返回参数不同内容及格式的展示,可以切换图中对应展示窗口顶部的Tab按钮,如Headers、WebForms、Raw、Json等。
    • 会话窗口图标说明见文章末说明。

    接下来介绍怎样使用Fiddler进行手机移动端抓包。

    Fiddler移动端抓包

    我们先来屡一下移动端抓包的大概思路:

    1. Fiddler需要设置允许远程计算机连接,即允许手机移动端抓包;
    2. 设置手机代理网络代理,使手机通过Fiddler代理发送HTTP请求 (即Fiddler充当数据发送接收的中介);
    3. https请求抓包设置(如果只抓取http请求,以上两步设置就可以了,但实际工作中经常需要抓取https请求数据)。

    按照如上思路我们开始进行具体设置。

    第一步:允许远程计算机连接

    设置步骤:Tools-->Options-->Connections-->勾选Allow remote computers to connect-->再点击OK,其他默认即可,如下图所示:

    勾选后如果有弹窗确认页面,点击【确定】即可。顺便说一下,上图勾选页面中的8888为默认的端口号,在第二步设置时需要使用。

    第二步,设置手机网络代理

    首先,需要先获取到安装Fiddler的电脑的IPv4地址,在cmd中输入ipconfig,如下图所示:

    然后,在手机上找到对应的WLAN网络,进行该网络代理的设置,以荣耀V20手机为例,操作步骤如下图所示:

    手机系统设置-->WLAN-->修改网络-->高级选项-->代理-->选择手动-->主机名填入上一步IPv4-->端口填入默认的8888-->保存

    注意:

    • 手机必须与电脑连接的是同一个网络,即连同一个WIFI或手机直接连电脑的热点,再对这个网络进行代理设置,否则无法抓取数据。
    • 第2步选择修改网络时,手机型号不同可能需要不一样的操作才能进入到修改网络页面。

    到这一步,重启Fiddler后,便可以对手机上的http请求进行抓包了。如果不能抓取的话,可以在手机里重新保存上图中的代理设置,再进行请求。到这一步后,手机上打开APP操作,抓包的http请求,如下图所示:

    可以看到,这里面只抓取了http请求,如果要对https请求进行抓包,则还需要进行下面的操作

    第三步,允许捕获HTTPS连接

    设置步骤:Tools-->Options-->HTTPS-->勾选Decrypt HTTPS traffic-->再勾选Ignore server certificate errors-->点击OK

    注意,保存设置后需要重启Fiddler才会生效

    第四步,手机安装证书

    步骤如下:

    1. 在手机上选择任意浏览器,输入第二步中的设置的代理地址,host为即Fiddler安装电脑的IPv4地址,端口号即为默认的8888
    2. 在1打开的网页中点击FiddlerRoot certificate下载证书

    Android手机到这一步就可以了,苹果手机还需要在手机设置里去信任下载的证书,信任证书的操作步骤这里不做过多说明。

    完成这两步后,我们即可以抓取手机发出的http请求,又可以抓取手机发出的https请求。在手机上打开今日头条APP,验证如下:

    至此,Fiddler移动端抓包设置便完成。

    附上会话窗口图标说明,如下:

    补充:

    如果有需要抓包工具跟教学视频的小伙伴,记得关注我私信【资料】哦

    结语

    学习是件需要坚持的事情,学习的过程可能会很枯燥,不过有一些人一起学的话大概就不会了吧,跟我一起学习,有人陪伴,就不会孤单。

    这篇贴子到这里就结束了,最后,希望看这篇帖子的朋友能够有所收获。欢迎留言,或是关注我的专栏和我交流。

    展开全文
  • 在Android手机上对https请求进行抓包

    万次阅读 多人点赞 2021-05-23 12:01:42
    前段时间跟QQ群里的群友聊天时无意聊到了抓包的话题。抓包可以说是程序员日常开发调试问题的一个重要手段,可以帮助我们理清客户端与服务器之间的数据传输问题,以便于甩锅。 在过去,网络请求基本都是靠的http协议...

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新。

    前段时间跟QQ群里的群友聊天时无意聊到了抓包的话题。抓包可以说是程序员日常开发调试问题的一个重要手段,可以帮助我们理清客户端与服务器之间的数据传输问题,以便于甩锅。

    在过去,网络请求基本都是靠的http协议,那个时候的抓包是一件非常简单的事情。然而这几年,http协议在逐渐被淘汰,几乎所有的网络请求都变成了https协议,这就使事情变得复杂了。

    群里一位朋友说,https是不可能被抓包的,不然怎么保证https传输的安全性,毕竟那么多大公司都在用这个协议来传输重要的数据。

    这其实是一个比较有意思的话题,https确实是非常安全的。但同时,https也确实是可以抓包的,它们两者之间并不冲突。

    考虑到仍然有许多朋友在这方面还有些不太了解,我准备写两篇文章来讲讲https抓包的相关知识。本篇文章先讲实践,教大家如何在Android手机上对https请求进行抓包。下一篇文章会讲原理,我们一起解析一下,为什么如此安全的https协议却仍然可以被抓包呢?

    那么先从实践看起吧。

    抓包工具的使用

    要对网络请求进行抓包,首先肯定要选择一个抓包工具才行。

    专业的抓包工具有很多,根据我的观察,国内的大多数开发者都比较喜欢用Charles这个工具来进行抓包。不过我个人更喜欢用Fiddler这个工具,而且我们平时工作时如果要进行抓包也都是用的Fiddler。因为Fiddler和微软内部的日志分析工具是相互兼容的,并且Fiddler的作者也在微软工作。

    那么本篇文章我都会以Fiddler这个工具来进行举例讲解,当然如果你习惯用Charles也完全没有问题,只是在工具的操作上可能会有所区别,原理是完全相同的。

    首先需要在你的电脑上安装Fiddler,这个工具是完全免费的,下载地址是:

    https://www.telerik.com/fiddler/fiddler-everywhere

    安装完成之后登录一下就可以使用了,它会自动抓取你当前这台电脑上的所有网络请求包。

    但是如果我们想要抓取手机上的网络请求,那么还需要做点额外的配置才行。

    首先从Fiddler顶部工具栏依次点击View -> Preferences -> Connections,将会看到如下所示界面:


    这里有两点需要注意,一个是端口号,默认值是8866,如果没有什么特殊需求的话可以不用修改。

    第二个是Allow remote computers to connect这个选项是一定要勾上的,不然手机上的网络请求将无法抓到。

    勾上第二个选项,点击SAVE,这样电脑端的配置就完成了。

    接下来我们还需要在手机端进行一些简单的配置。

    要确保的是,你的手机和用于抓包的这台电脑必须在同一个局域网下。

    然后修改手机当前连接Wifi的高级选项,将代理类型改为手动,将代理主机名改成电脑的ip地址,将代理端口改成8866,如下图所示:

    点击保存即可。

    完成以上配置之后,其实我们就可以使用Fiddler来对手机上的网络请求进行抓包了。不信你可以试一试在手机的浏览器上访问以下地址:

    http://guolin.tech/api/china/

    应该会看到如下界面:

    然后再到Fiddler中查看一下,你就能发现刚才手机上的网络请求包已经成功被Fiddler抓到了(有时Fiddler中显示的包信息过多,不方便查看,可以使用Ctrl+X清空信息):

    可以看到,这条网络请求的所有细节在Fiddler中一览无余,包括请求的头信息,响应的头信息,响应的body内容等等。

    抓包工具将网络通讯的背后细节全部搬到了台面上,这样当客户端和服务器遇到联调问题时,到底是客户端的锅还是服务器的锅,看一看抓出来的包就全部清楚了。

    以上就是抓包工具最传统的用法,然而这种用法现在已经不那么好使了,因为还在使用http协议的网络请求已经越来越少,绝大部分的网络请求都变成了https协议。

    对https请求进行抓包

    https协议是一种加密传输的网络协议,所传输的数据不再是以明文的方式来传输,而都是加密过后再进行传输的。

    这种协议保障了用户的数据安全,但对于抓包而言却是一件苦恼的事情。因为数据都加密了呀,我们抓到的包也都是一些密文信息,所以根本就无法用于定位问题。

    比如我们可以尝试在手机浏览器中访问一下必应,然后观看Fiddler中抓到的包信息,如下图所示:

    可以看到,Fiddler虽然能够捕获到访问必应的网络请求,但是却无法解密出具体的传输内容,这种包对于我们分析问题并没有任何帮助。

    那么对于https请求的网络包我们到底要怎么抓呢?别担心,Fiddler是支持这个功能的,下面跟着我一步步操作就行。

    首先需要在Fiddler中开启https抓包功能,从Fiddler顶部工具栏依次点击View -> Preferences -> HTTPS。

    在HTTPS设置页面中,先点击Trust root certificate来安装证书,然后勾选Capture HTTPS traffic选项,如下图所示:

    点击SAVE保存,这样你就可以抓到电脑上https请求的包了。

    但是手机上https请求的包我们还是抓不到的,你可以试试再次在手机上访问必应,将会看到如下界面:

    出现这种错误基本都是证书的原因导致的,在下篇文章中我会详细分析这个错误出现的原因,本篇文章中我们先将它解决就好了。

    在你的手机浏览器中访问如下地址:

    http://ipv4.fiddler:8866/

    将会看到一个由Fiddler内置的网页:

    点击FiddlerRoot certificate这个链接,下载并安装由Fiddler提供的手机证书。

    安装完成之后再次访问必应,你就会发现不会再报错了,而是可以正常显示出网页的内容:

    然后观察Fiddler,可以看到,请求必应首页的网络包也被成功抓到了,而且这次不再是密文,而是解密后的数据:

    对https请求的抓包问题,就这样解决了!

    对Android应用进行抓包

    如此看来,https抓包貌似也并不是一件难事。

    没错,但还有一个细节需要大家注意。上述方案只适用于对浏览器中的网络请求进行抓包,如果你是想要对其他应用程序的网络请求抓包的话,仍然还是抓不到的。

    为了证实这一点,我们就来新建一个应用程序,并编写一段最简单的网络请求代码,看看到底能不能抓到它发出的网络请求。

    整个程序非常简单,我们在MainActivity中加入一个按钮,当点击按钮时就发起一个网络请求,代码如下所示:

    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            val button: Button = findViewById(R.id.button)
            button.setOnClickListener {
            	sendRequest()
            }
        }
    
        private fun sendRequest() {
            thread {
                var connection: HttpURLConnection? = null
                try {
                    val response = StringBuilder()
                    val url = URL("https://www.bing.com")
                    connection = url.openConnection() as HttpURLConnection
                    val input = connection.inputStream
                    val reader = BufferedReader(InputStreamReader(input))
                    reader.use {
                        reader.forEachLine {
                            response.append(it)
                        }
                    }
                    Log.d("TAG", response.toString())
                } catch (e: Exception) {
                    e.printStackTrace()
                } finally {
                    connection?.disconnect()
                }
            }
        }
    
    }
    

    没错,总共就这么多代码。但是不要忘记我们还得在AndroidManifest.xml中声明网络权限:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.capturetest">
    
        <uses-permission android:name="android.permission.INTERNET" />
        ...
    
    </manifest>
    

    好了,现在来运行一下程序看一看效果吧。点击界面上的按钮,会向必应主页发起一条网络请求,然后观察Fiddler中的数据包:

    可以看到,我们是无法像之前在浏览器中那样,成功抓到并解析出https请求的包信息的。

    为什么会这样呢?这是因为Android在7.0系统中进行了一项安全升级。从Android 7.0系统开始,只是在手机上安装了抓包工具的证书,仍然是无法对https请求进行抓包的,还必须要在应用程序的代码中加入一段网络安全配置才行。

    这项升级使得每个应用程序都变得更加安全,因为对https抓包确实是一个比较危险的行为,所有加密传输的数据都以明文的形式展示出来了。当然,如果是为了调试程序而抓包,这算是一个正当理由,但是你也理应只能对自己的程序进行抓包调试而已。如果只要在手机上安装了证书就可以对所有App的https请求进行抓包,那么无疑大大降低了这些App的安全性。

    因此,Android 7.0系统中才做了这项安全升级。默认情况下,我们无法对各个App的https请求进行抓包,如果你是想要对自己App的https请求抓包的话,那么可以这样做。

    在res/xml目录下创建一个network_security_config.xml文件,然后加入如下配置:

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config cleartextTrafficPermitted="true">
            <trust-anchors>
                <certificates src="user"/>
                <certificates src="system"/>
            </trust-anchors>
        </base-config>
    </network-security-config>
    

    接下来还需要在AndroidManifest.xml中配置android:networkSecurityConfig属性来让上述配置生效:

    <application
        ...
        android:networkSecurityConfig="@xml/network_security_config">
        ...
    </application>
    

    这样我们就可以对当前的应用程序发出的https网络请求进行抓包了。

    重新运行一下程序,让我们再来试试吧,结果如下图所示:

    结果正如我们预期的那样工作了。

    最后一个小疑惑

    那么本篇文章的内容到这里就差不多该结束了。

    但是不知道大家有没有产生一个小疑惑,既然是从Android 7.0开始必须要在自己的应用程序中加入网络安全配置才能对https请求抓包,为什么我们一开始在浏览器中什么都没配,却也成功抓到了https请求的网络包呢?

    这个问题其实让我困惑了很久,直到现在加入了微软Edge项目组才终于解开了这个疑惑。

    Edge是一款基于Chromium内核的浏览器,Chrome也是,许多主流的浏览器都是。其实答案一直都在Chromium的源码中,只是我之前从来没有勇气去看过。

    我们来查看一下Chromium源码中的AndroidManifest.xml文件,部分代码如下图所示:

    可以看到,Chromium的源码中也加入了一段android:networkSecurityConfig配置,那么我们继续跟进去看看里面到底配置了什么:

    这不是和我们刚才在Demo中配置的内容一模一样吗?

    自此真相大白了,原来之所以浏览器不需要做额外的配置也能对https请求进行抓包,是因为Chromium源码中已经对此做好了配置,而所有基于Chromium内核的浏览器也就都自动拥有了这个功能。

    如果你想要在线查看Chromium的源码,可以访问这个地址:

    https://source.chromium.org/

    好了,本篇文章的内容就到这里。相信看完这篇文章,会对大家平时的网络开发与调试工作产生一定的帮助。

    解决了怎么用的问题,接下来就要去了解原理了。下篇文章中我们来一起探讨一下为什么传说中如此安全的https协议却仍然可以被抓包呢?点击这里继续阅读下篇文章

    另外,如果想要学习Kotlin和最新的Android知识,可以参考我的新书 《第一行代码 第3版》点击此处查看详情

    关注我的技术公众号,每个工作日都有优质技术文章推送。

    微信扫一扫下方二维码即可关注:

    展开全文
  • Fiddler如何抓包

    万次阅读 多人点赞 2021-01-28 15:38:06
    Fiddler在使用的过程中经常会碰到一些问题。这章补充一些Fiddler的用法。...如果证书没有安装成功,那么Fiddler只能到HTTP请求,不到HTTPS请求,如图2-2所示。所以一定要想办法把证书安装好。 图2-1 F.

    Fiddler在使用的过程中经常会碰到一些问题。这章补充一些Fiddler的用法。

    2.1 Fiddler必须要做的3个设置

    Fiddler需要进行3个设置,这样做使用Fiddler的过程才能顺畅。

    2.1.1 第1个设置:在Fiddler中安装证书

    大部分网站都是使用HTTPS协议,所以必须安装证书,这样才能捕获HTTPS,如图2-1所示。

    如果证书没有安装成功,那么Fiddler只能抓到HTTP请求,抓不到HTTPS请求,如图2-2所示。所以一定要想办法把证书安装好。

     

    图2-1 Fiddler安装证书

     

    图2-2 没有抓到HTTPS

    2.1.2 第2个设置:自动解压HTTP响应

    在Fiddler工具栏中选中“Decode”按钮,如图2-3所示。这样就会自动解压HTTP响应,否则我们看到的HTTP响应是乱码。

     

    图2-3 Fiddler选中Decode按钮

    2.1.3 第3个设置:隐藏“Tunner to”请求

    可以在Fiddler中隐藏“CONNECT Tunnels”请求,如图2-4所示。隐藏的方法是选择菜单栏中的Rules→Hide CONNECTs。这样Fiddler就不会捕获大量无用的握手验证请求,如图2-5所示。这些“Tunnel to”的请求对我们没什么用处。因为我们平常根本不关心HTTPS是如何建立连接的。我们抓包是为了看HTTP请求和响应的数据内容,抓HTTPS也是看数据内容,而不关心HTTPS的通信是怎么建立的。

     

    图2-4 在Fiddler中选中Hide CONNECTs

     

    图2-5 Fiddler中的握手验证请求

    2.2 不允许抓包

    软件开发商并不希望自己的软件被人抓包,抓包意味着自己的接口全部被人看得一清二楚,存在很多安全隐患。有很多App采取各种措施来防止被抓包。

    2.2.1 某些App抓不到包

    某些App为了不被抓包,直接会在代码里设置不允许使用代理,这样Fiddler就抓不到了。

    有些App能抓包,说明Fiddler的设置是正确的。某些App不能抓包,原因有很多,如下。

    • 可能是Fiddler证书原因,解决方法是需要用证书插件来重新制作一个证书,然后重新配置。
    • 这个App的开发者进行了特殊设置,不让抓包。

    2.2.2 HTTP请求和响应全部加密

    图2-6是一个查违章的App的抓包内容,可以看到这个App可以被抓包,但是其HTTP请求和HTTP响应全部被加密了,安全性很高。

     

    图2-6 查违章App的接口全部被加密

    2.2.3 不让抓包

    银行的App对安全性要求很高,所以一般不允许抓包。某款银行App在用Fiddler抓包的时候,App会提示网络错误,不让抓包,如图2-7所示。

     

    图2-7 某银行App不让抓包

    2.3 Fiddler抓不到包

    在使用Fiddler的过程中,有时候会发现Fiddler抓不到包。下面介绍如何解决抓包失败的问题。

    2.3.1 Fiddler的抓包开关

    Fiddler有一个抓包的开关。打开状态栏的时候,状态栏的最左边有个“Capturing”图标,如图2-8所示。如果没有这个图标,当然抓不到包了。初学者很容易忘记这个开关。

     

    图2-8 Fiddler的抓包开关

    2.3.2 浏览器抓不到包

    Fiddler能抓包是因为它是一个代理服务器。需要抓包的程序必须把代理指向Fiddler才行。如果浏览器抓不到包,可能是因为浏览器的代理设置没有指向Fiddler。我们可以先重启Fiddler,然后查看浏览器的代理服务器设置,或者换不同的浏览器试试。

    我们先来看一下Fiddler的抓包原理图,如图2-9所示。

     

    图2-9 浏览器的抓包原理

    如果是某一个浏览器抓不到包,解决方案是换其他的浏览器。比如IE和Chrome都能抓到,只是Firefox抓不到包,说明Fiddler本身没有问题,可能是Firefox的代理设置没有指向Fiddler。

    如果是所有的浏览器都抓不到包,这说明整个Fiddler都不工作。那么要先重启Fiddler,再检查下系统的代理设置,如图2-10所示。

     

    图2-10 系统代理设置

    设置系统代理的打开方式为:控制面板→Internet选项→连接→局域网设置→代理服务器。

    2.3.3 能抓HTTP不能抓HTTPS

    如果发现Fiddler可以抓到HTTP的请求,但是抓不到HTTPS的请求,这说明没有安装Fiddler的证书或者安装Fiddler证书失败。Fiddler可能会提示你安装证书。解决办法是重新安装证书,再重启Fiddler,如图2-11所示。

     

    图2-11 重新安装证书

    重新安装证书的操作是Options→Actions→Trust Root Certificate。

    2.3.4 抓不到手机中的包

    很多人会碰到这种情况:Fiddler能抓本地计算机浏览器的包,但是抓不到手机的包。本地计算机和手机位于同一个网络,各种配置也正常,但是手机的包就是抓不到。

    出现这样的问题的原因是Fiddler所在的计算机和手机之间的网络不通。即使Fiddler所在的计算机和手机连的是同一个Wi-Fi,也可能网络不通。在同一个Wi-Fi下,网络不一定是通的。操作系统上的防火墙或者其他软件的设置都会影响网络的通信。我们需要通过下面的步骤来检测网络是否是通的。

    第1步:测试Fiddler能否捕获本地计算机的浏览器的包,如果本地浏览器都不能抓包,那就说明Fiddler的配置有问题。

    第2步:如果Fiddler所在的计算机的IP地址是192.168.0.100,那么Fiddler证书网站的网址是http://192.168.0.100:8888。用计算机的浏览器访问Fiddler证书网站,如图2-12所示。

     

    图2-12 Fiddler Echo Service网页

    第3步:在手机没有设置代理的情况下,在手机上用浏览器打开Fiddler的证书网站。

    如果网页打不开,说明网络不通,原因可能如下。

    • 手机和计算机不在同一个网络。
    • Fiddler的允许远程连接的设置没有打开。
    • Windows的防火墙关闭(防火墙打开,可能会禁止8888端口对外开放)。

    只有Fiddler证书网站能打开,才能说明手机和计算机的网络是通的。再去修改手机上的代理设置,Fiddler才能对App进行抓包。

    2.3.5 经过上面的设置,还是抓不到包

    可以考虑换台计算机、换个手机试试,或者换别的抓包工具试试。

    2.3.6 mac OS系统上抓包

    Fiddler是用C#开发的,目前对mac OS的支持不太友好。现在很多人都用Mac笔记本办公,在mac OS系统上抓包可以考虑用另外两个工具:浏览器开发者工具和Charles。

    2.3.7 Fiddler证书安装不成功

    有时候会碰到Fiddler安装证书不成功的情况,如图2-13所示。

     

    图2-13 证书安装不成功

    这种情况一般在Windows7系统中出现,可以试图用下面介绍的两种方法来解决。

    方法1:从别的机器中复制一个Fiddler根证书“FiddlerRoot.cer”放到Fiddler的安装目录下面,然后再重新配置证书,如图2-14所示。

     

    图2-14 Fiddler证书

    方法2:使用Fiddler证书制作工具来重新制作证书,详细步骤如下。

    第1步:在Fiddler中删除证书。打开Fiddler,依次打开Tools→Options,取消选中Decrypt HTTP traffic,并且在Actions中单击“Remove Interception Certificates”,如图2-15所示。

     

    图2-15 Fiddler删除证书

    第2步:卸载证书。找到Fiddler的安装目录,其中有个unCert.exe文件。如果没有unCert.exe就不需要卸载,如图2-16所示。

    第3步:使用Fiddler证书制作工具来重新制作证书。下载Certificate Make插件,运行下载的文件之后会生成新的证书。

    第4步:在Fiddler中重新配置证书。

     

    图2-16 Fiddler卸载证书

    2.3.8 iOS系统10.3以上,手动信任证书

    若iOS系统版本是10.3以上,那么证书可能没有被信任,需要手动设置信任证书。依次打开设置→通用→关于本机→证书信任设置,将Fiddler证书启用即可,如图2-17所示。

     

    图2-17 iOS中启用Fiddler证书

    2.4 Fiddler包太多找不到自己想要的

    Fiddler启动后,Web Session列表就会抓到很多HTTP请求,初学者往往会比较迷茫,因为找不到自己要抓的包。下面介绍几个方法来找到自己要抓的包。

    2.4.1 停止抓包

    最推荐使用这个方法。在抓包之前,先把Web Session里面抓到的数据包全部清空,然后再操作网页。在抓到想要的包后,就暂停抓包,这个方法简单、实用。熟练使用这个方法后,就不需要使用其他过滤的方法了。抓包开关如图2-18所示。

     

    图2-18 抓包开关

    2.4.2 只抓手机,不抓本地的包

    在专门抓App的包的时候,Fiddler里面混杂了本地计算机和手机App的包,如果只想抓手机App的包,这时候可以选择“…from remote clients only”,如图2-19所示。

     

    图2-19 设置只抓远程的包

    2.4.3 过滤会话

    Fiddler有非常强大的过滤会话的功能,假如不想看到localhost的数据包,就可以把它隐藏。过滤的设置如图2-20所示。注意,在设置时两个Host之间要用分号隔开。

     

    图2-20 用Filters选项卡隐藏localhost

    注意:使用了Filters选项卡后,记得取消Filters选项卡。可能下次抓包的时候,忘记设置Filters选项卡而抓不到包。很多人犯过这个错误。

    2.4.4 只抓特定的进程

    在状态栏中选择Web Browsers或者Non-Browser来选择进程,如图2-21所示。此外,工具栏中还有个按钮:Any Process,单击这个按钮把十字图标拖曳到想要抓包的程序上面,就只会抓特定进程的包,如图2-22所示。

     

    图2-21 状态栏上按进程过滤

     

    图2-22 只抓特定的进程

    2.4.5 观察URL和HOST

    观察图2-23中的URL,可知这是登录相关的数据包。URL的命名都会是有意义的。比如登录的接口会包含login,注销的URL中会包含logout。

     

    图2-23 观察URL

    2.4.6 查看进程发包

    进程是计算机中程序的一次运行活动。Fiddler的Process列对应本地Windows进程。通过这一列我们可以知道是哪个进程在发包,如图2-24所示。

     

    图2-24 在Fiddler中查看进程

    2.5 HTTPS是否安全

    Fiddler能分析HTTPS流量是不是意味着HTTPS协议不安全?

    HTTPS是安全的,Fiddler抓HTTPS的时候安装了一个Fiddler的证书,所以Fiddler可以解密HTTPS的内容。HTTPS请求从计算机上发送到网络后,HTTPS的内容全部是加密的。

    2.6 计算机连接手机热点抓包

    在没有Wi-Fi的情况下,我们用手机开热点,计算机连接手机的热点来上网,这个时候计算机上的Fiddler能否抓到手机上的包呢?答案是不能。因为手机开热点后,采用的是GPRS手机流量上网,这个时候手机不能设置代理服务器的,如图2-25所示。

     

    图2-25 WLAN热点

    如果有两个手机,一台计算机,那么就可以抓包了。一个手机当成热点,另外一台手机和计算机都使用这个热点上网,手机的代理就可以指向计算机了。

    客户端如何抓包

    如果程序是用.NET开发的,那么Fiddler可以抓到包。因为.NET程序默认会使用系统代理。如果程序是用别的语言开发的,只要这个程序支持用户自定义代理,那么Fiddler也可以抓到包,比如Fiddler可以抓QQ。

    如果客户端程序不支持代理,那么Fiddler就抓不到包了。

    2.7 Fiddler测试App升级

    Fiddler常用于App的升级测试,我们可以利用Fiddler伪造响应来测试App升级。

    2.7.1 App升级原理

    App是否升级的检查是在启动App访问服务器时进行的,把本地计算机上App的最新版本号与服务器端的最新版本号作对比,如果不一致就提示升级。

    App升级的时候,App会发送一个HTTP请求,来问服务器有没有最新版。如图2-26所示,如果没有最新版,服务器返回的HTTP响应中会说没有更新。

     

    图2-26 App没有新版本

    如果有最新版,服务器返回的响应会告知有新版本,并且App端会有弹窗提示,如图2-27和图2-28所示。

     

    图2-27 App有新版本

     

    图2-28 App更新提示

    2.7.2 App升级的测试

    在实际测试中,我们一般不会去修改服务器,因为修改服务器会遇到下述问题。

    • 修改服务器的代码,需要有很好的代码能力,99%的人做不到。
    • 修改服务器的代码,还需要重新部署,耗时耗力。
    • 不灵活,升级的情况有好几种,每次修改都要重新部署。

    用Fiddler来模拟升级比较简单,如图2-29所示。

     

    图2-29 Fiddler模拟

    我们用Fiddler伪造一个HTTP响应就可以了。可以用下断点的方式修改HTTP响应,或者用Fiddler中的AutoResponder。接下来以坚果云为例介绍一下升级。

    2.7.3 坚果云的升级

    坚果云每次启动的时候,都会调用一个latestVersion的接口来查询服务器,看客户端有没有更新的版本,如图2-30所示。

    对比HTTP响应中的版本和本地版本,如果服务器返回的版本更高,那么客户端就会弹出对话框,提醒用户升级App。

     

    图2-30 坚果云的升级

    2.8 短链接

    短链接就是把普通网址转换成比较短的网址(如https://dwz.cn/8oVtHHyH)。在微博或者其他限制字数的应用里,短链接有很多好处:网址短、字符少、美观、便于发布和传播。

    我们平常工作中写邮件使用短链接也会让邮件更加简洁和美观。

    2.8.1 短链接原理解析

    当我们在浏览器里输入https://dwz.cn/8oVtHHyH时:

    • 浏览器会发送一个HTTP GET请求给dwz.cn;
    • dwz.cn服务器会通过短码8oVtHHyH获取对应的长网址;
    • 服务器返回HTTP 301或者302的响应,响应中包含了长网址;
    • 浏览器会跳转到长网址。

    2.8.2 使用短链接

    短链接的服务提供商有很多,比如:百度短网址http://dwz.cn,如图2-31所示。

     

    图2-31 使用百度短网址

    2.8.3 Fiddler抓包短链接

    打开Fiddler,再打开浏览器,输入网址https://dwz.cn/8oVtHHyH。用Fiddler抓包短链接如图2-32所示。

     

    图2-32 Fiddler抓包短链接

    从图2-32中可以看到短链接的原理很简单,利用HTTP协议的跳转,用301或者302都可以。

    2.9 本章小结

    本章介绍了Fiddler的常用使用技巧,包括抓包设置、抓不到包的解决方法等。读者可以对照本章排查Fiddler使用过程中遇到的问题。此外,读者还可以了解用Fiddler测试App升级和短链接的概念。

    本文摘自:《HTTP抓包之接口自动化测试》

    本书的内容都是我多年从事接口测试的经验总结,非常贴近我们的实际工作,能帮助大家解决实际工作中的难题。

    本书的内容比较简单,实例丰富,读者阅读起来会感觉比较轻松、容易上手,读完本书不需要花费太多时间。通过本书的学习,如果读者能够自行开发出一个订票工具,或者实现一个电商网站的自动下订单操作,那么恭喜你,已经掌握了本书的所有知识。

    本书的主要内容有HTTP的基础知识;如何使用Fiddler来抓HTTP包;如何分析HTTP包;如何通过JMeter和Postman等发送HTTP包,从而实现软件自动化测试和接口的自动化测试;如何使用抓包工具来实现安全测试和性能测试等;几个日常生活中应用比较广泛的综合实例。

    展开全文
  • 利用charles抓包

    千次阅读 2022-04-23 11:20:03
    所以我们这里从安装破解到抓包成功一步一步讲清楚。 下载并安装 我们进入charles官网进行下载:https://www.charlesproxy.com/latest-release/download.do ,我是mac,所以选择其中的macOS 下载dmg包之后我们正常的...
  • 通过抓包工具抓包APP就连不上网的解决方案

    万次阅读 多人点赞 2020-03-11 17:47:23
    笔者最近抓包某款APP,使用了各种抓包工具,但是只要通过抓包工具,APP就连不上网络,自然就无法顺利获取APP的数据信息,很是匪夷所思,这到底是一款何方神圣的APP。 不服气的我瞎折腾了7天时间,最终在逆向大神...
  • tcpdump抓包使用详解

    千次阅读 2021-05-11 10:23:52
    tcpdump能帮助我们捕捉并保存网络包,...1.针对特定网口抓包(-i选项)当我们不加任何选项执行tcpdump时,tcpdump将抓取通过所有网口的包;使用-i选项,我们可以在某个指定的网口抓包:linux:/tmp/lx # tcpdump -i eth...
  • 使用 charles 进行抓包

    千次阅读 2022-04-29 16:33:22
    1. Charles抓包代理配置 Proxy ---> Proxy Settings 默认端口是 8888,根据实际情况可修改。 当然,如果想要配置 https 2. Android手机抓包配置 首先查看本机的 ip 地址:Help ---> Local IP Address ...
  • fiddler 抓包详细教程

    万次阅读 多人点赞 2019-07-04 14:02:15
    为什么要先学fiddler? 学习接口测试必学http协议,如果直接先讲协议,我估计小伙伴们更懵,为了更好的理解协议,先从抓包开始。 结合抓包工具讲http协议更容易学一些。...1.用fiddler抓包时候,打开百...
  • 目录 一、写在前面 二、什么是中间人攻击 ... 四、中间人攻击的初步了解 ...八、https 可以抓包吗 九、预置证书/公钥更新问题 一、写在前面 首先,当个位读者在看到这篇文章时,我默认大家已经对...
  • 网络请求抓包是研发过程中常见问题,无论是开发时的接口调试,还是测试时的数据检验,都有网络抓包的需求。随着 HTTPS 协议的推广以及手机系统安全性的升级,抓包的门槛可能会逐渐变高; 在这篇文章里,我将带你从...
  • Android 7.0+模拟器Fiddler抓包详细教程

    千次阅读 2022-04-20 10:19:00
    = 24的话,那么应用默认是不信任安装的fiddler用户证书的,所以你就没法到应用发起的https请求,然后你在fiddler就会看到一堆200 HTTP Tunnel to xxx.xxx.xxx:443的请求日志,这些都是没有成功抓取的https请求,...
  • Android实时抓包分析的app

    热门讨论 2014-09-19 21:03:02
    在Adroid上就可以实时抓包的apk的源代码,手机没有root,这个apk就没法抓包了,仅做测试用的,
  • 使用wireshark对http请求进行抓包分析2.1.准备工作2.2.wireshark安装2.3.wireshark的简单使用2.4.wireshark抓取http请求过程3.使用jnetpcap对http请求进行抓包分析 本文主要分为三个阶段来进行展开 1.http请求建立的...
  • wireshark抓包 虚拟机抓包 手机抓包

    千次阅读 2021-07-29 11:14:21
    手机抓包 网络和Internet --> 移动热点 开启移动热点 让自己的手机连接该热点,打开wireshark找到对应网卡,即可抓包; 如果不知道是哪个网卡,也可以试着在手机上打开网页,看流量 虚拟机抓包 取消混杂模式 则...
  • linux抓包命令是什么

    千次阅读 2021-05-19 04:54:09
    linux抓包命令是“tcpdump”,可以抓取流动在网卡上的数据包,可以将网络中传送的数据包的“头”完全截获下来提供分析;它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉...
  • 网络/命令行抓包工具tcpdump详解

    千次阅读 2021-08-17 00:15:49
    概述用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的分析工具。tcpdump可以将网络中传送的...
  • wireshark抓包使用教程

    千次阅读 多人点赞 2021-08-04 10:46:57
    通过该例子学会怎么抓包以及如何简单查看分析数据包内容。 3、Wireshark过滤器使用。通过过滤器可以筛选出想要分析的内容。包括按照协议过滤、端口和主机名过滤、数据包内容过滤。 Wireshark软件安装 软件下载...
  • 广城云服务抓包(Charles抓包

    千次阅读 2022-03-20 11:41:19
    抓包?为什么要抓包, 为了实现程序自动化,为了爬虫。 Charles 是我用过最好用的抓包工具,安装过程也很简单安装过程可以看这篇文章 抓包工具Charles下载安装使用_Lucky52hz的博客-CSDN博客_charles下载。 安装...
  • 面向APP抓包方法

    千次阅读 2022-02-02 15:01:30
    面向APP抓包方法,采用Fiddler软件进行抓包
  • Charles 某音最新版本抓包环境搭建

    千次阅读 2022-03-27 16:21:29
    Charles 某音最新版本抓包环境搭建 操作环境 google nexus5x Android 8.1 Magisk 24.3 Douyin 17.3 kaliLinux win10 准备 刷机root相关的准备工作本篇就不啰嗦了,有兴趣的可参考之前的文章 google nexus5x 刷机...
  • 一、Charles手机抓包设置 第一步:设置Charles为允许状态,并设置好接入的接口 在Charles的菜单栏选择“Proxy”->“Proxy Settings”,填入代理端口8888(⚠️这个端口不一定填写8888,也可以写别的端口),☑...
  • 手机APP抓包过程

    万次阅读 2022-04-05 18:31:41
    0.手机连接WiFi,运行Fiddler的PC连接同一WiFi;...选择Connections标签,... 附https抓包解码原理时序图(以charles为例,Fiddler原理相同): 图片来自20 张图彻底弄懂 HTTPS 的原理!_公众号:码海的博客-CSDN博客 
  • charles抓包工具使用及手机抓包教程

    千次阅读 2022-04-10 17:20:11
    4.抓包实战 5.网络代理 6.参考文章 1.前言 不知道怎么抓包手机(移动端) 如何抓取手机HTTPS的包 2.操作环境条件 电脑系统:Mac OS 手机系统:Android 安装软件:Charles(4.1.2) ...
  • 如何在交换机上抓包

    万次阅读 多人点赞 2020-11-20 21:31:55
    在交换机上抓包,一般可排查一些网络问题。 下面是总结的在各厂商交换机上抓包方式。 H3C交换机抓包: 在华三交换机上可使用:packet-capture 命令,在用户视图下执行。 具体操作可查看这:...
  • 计算机网络——tcpdump/Wireshark抓包实战

    千次阅读 多人点赞 2021-11-21 09:16:53
    同时对网络抓包工具也是不熟悉,本博文将介绍计算机网络中用于抓包的两个常用工具tcpdump和Wireshark,通过使用tcpdump/Wireshark工具来对TCP的三次握手和四次挥手进行抓包实战,给大家学习和使用tcpdump/Wireshark...
  • 手把手教你Charles抓包工具使用

    万次阅读 多人点赞 2020-06-07 20:51:43
    web抓包 1,web 抓包 Charles Web抓包非常简单,启动Charles会自动与浏览器设置成代理,不需要进行过多的设置,接下来我就就是通过浏览器发送网络请求,Charles就会直接抓取到这些信息和响应信息 2,Web 抓取HTTPS...
  • 在上篇文章中Java抓包分析三(基于jnetpcap进行抓包)——抓取Http请求数据包,我们讲解了TCP三次握手的过程和如何抓取Http数据包,但是我们并没有进行一个数据分析,接下来这篇文章我们将要开始对Http抓取的数据报...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 273,690
精华内容 109,476
关键字:

抓包