febsky 发表于 2018-12-24 13:45

2018-12-16-绕过麻花影视抓包检测(完成)

本帖最后由 febsky 于 2019-1-2 17:57 编辑

目的:能够用Charles或者fiddler抓包

**因为版主说文章发的太分散了,所以整理了一下放到里第一片里面,这个系列也不再单独更新 [首页地址](https://www.52pojie.cn/thread-842708-1-1.html)**

本来想抓包看看他的api请求,然后分析api加密和参数等问题呢,结果挂上Charles之后竟然界面没有数据并且 Toast 提示 `请关闭代{过}{滤}理重试`。

我能猜测到的引起这种现象的有两种情况:1,证书不匹配,项目固定了证书,或者服务端对客户端证书进行了验证;2,项目里面有代{过}{滤}理检测

进一步猜测并测试,我们再尝试一个别的代{过}{滤}理。用手机上的app,packet capture尝试一下结果竟然可以访问,而且也能够抓到数据。所以猜测证书引起的可能性不大。

并且它Toast 提示 `请关闭代{过}{滤}理重试`。这一行提示出卖了他。说明他知道我挂了代{过}{滤}理,那么它里面很有可能进行了网络代{过}{滤}理检测。


网上搜一下判断当前wifi是否使用了代{过}{滤}理的基本方法,都是下面这段代码:

```java
public static boolean isWifiProxy() {
    final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
    String proxyAddress;
    int proxyPort;
    if (IS_ICS_OR_LATER) {
      proxyAddress = System.getProperty("http.proxyHost");
      String portStr = System.getProperty("http.proxyPort");
      proxyPort = Integer.parseInt((portStr != null ? portStr : "-1"));
    } else {
      proxyAddress = android.net.Proxy.getHost(context);
      proxyPort = android.net.Proxy.getPort(context);
    }
    return (!TextUtils.isEmpty(proxyAddress)) && (proxyPort != -1);
}

```

jadx 全局搜索 `System.getProperty("http.proxyHost");`

得到 `com.mh.movie.core.app.i`

```
//不就是特么这个方法吗、
    private boolean a(Context context) {
      CharSequence property;
      int parseInt;
      if ((VERSION.SDK_INT >= 14 ? 1 : null) != null) {
            property = System.getProperty("http.proxyHost");
            String property2 = System.getProperty("http.proxyPort");
            if (TextUtils.isEmpty(property2)) {
                property2 = "-1";
            }
            parseInt = Integer.parseInt(property2);
      } else {
            String host = Proxy.getHost(context);
            parseInt = Proxy.getPort(context);
            property = host;
      }
      StringBuilder stringBuilder = new StringBuilder();
      stringBuilder.append("proxyAddress : ");
      stringBuilder.append(property);
      stringBuilder.append(", port : ");
      stringBuilder.append(parseInt);
      Log.i("checkWifiProxy", stringBuilder.toString());
      if (TextUtils.isEmpty(property) || parseInt == -1) {
            return false;
      }
      return true;
    }
```

直接修改 `.class public Lcom/mh/movie/core/app/i;` 里面的代码为,直接返回false就行了,表明没有是用代{过}{滤}理:

```smali
.method private a(Landroid/content/Context;)Z
    .locals 7

    const/4 v1, 0x0

    return v1
.end method
```


本来以为事情到这里就结束了,但是,TMD 、虽然能访问网络,但是抓不到包,抓不到包。。。。。why?


对于一些常用的网络库,其实是提供了我们设置的代{过}{滤}理的接口,我们只需要将其设置成无代{过}{滤}理的模式,它就不会去应用系统默认的代{过}{滤}理了。

就拿比较常用的 OkHttp 来举例,在初始化的时候,就可以通过 proxy() 方法,为 OkHttp 设置一个代{过}{滤}理。

```
var httpBuilder = OkHttpClient.Builder()
                .addInterceptor(defaultInterceptor())
                .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS)
                .writeTimeout(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS)
                .readTimeout(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS)
                .proxy(Proxy.NO_PROXY)
```

全局搜索`Proxy.NO_PROXY` 这个玩意,都删了。

其实最后锁定到
是这个`com.jess.arms.b.b.f` 类里面的设置引起,但是目前我也没有办法直接锁定到这个类,因为这个项目用了Dagger 。我尝试出来的,jadx 全局搜索一共就是四五处用到这个NO_PROXY 的地方。然后一个个的改,而这个类最复杂,我放到最后才改。结果发现是这个类影响的。

好了终于可以,终于可以能够抓到包了。


>总结一下,他这里的抓包防护总共有两处1,检查是不是用了Http代{过}{滤}理,如果是,那么客户端不再发送网络请求,2,通过Okhttp 设置默认代{过}{滤}理,那么就不会走我们的Charles代{过}{滤}理了。设计很精巧

五月何欢 发表于 2018-12-24 14:55

麻花难得的良心了,,没有那种不良广告,界面也算是清爽,这点还是能忍,毕竟要吃饭,生存。

狂暴补师亚丝娜 发表于 2018-12-26 11:15

yunruifuzhu 发表于 2018-12-25 17:32
我看过,它这个可以抓到包,但播放视频的时候就抓不到了。m3u8的加密视频      http://yunruiml.cn/com.o ...

已分析。
视频接口:
GET //mov/browse?movId=108939&version=v2&server=http%3A%2F%2Fapi1.jinsuiyumi.com%2F&url=mov%2Fbrowse HTTP/1.1
Cookie: JSESSIONID=50EC15A54B8723C725E251519BDF025E
X-Auth-Key: 368480924a6c78e2e8681551a7cf4c21
flowId: d6479aa9-fa48-4690-a67f-11aecdb20d911545793630617
X-Auth-Nonce: 88127698
Version: 114002201
Ip: 10.0.3.15
Response-Content-Type: application/json
Seq: 2953087ced728c6bda082C30mC3WuEJKvDpG
X-Auth-TimeStamp: 1545793630617
X-Auth-Sign: 9g7EdKcsiEyATA7d25va7Juz0rA%3D
User-Agent: Dalvik/2.1.0 (Linux; U; Android 6.0.1; MuMu Build/V417IR)
Host: api1.jinsuiyumi.com
Connection: Keep-Alive
Accept-Encoding: gzip, deflate



播放地址:
http://php.gamexbk.com/video/42/1sdde00470/93bef1sdde00470_360P.m3u8

播放地址加密了,解析ts为:
http://php.gamexbk.com/video/42/1sdde00470/93bef1sdde00470_360P_TS/1sdde00470_360P_0000.ts

最后的0000改成0001又是一个新的ts~~~自行写脚本跑就可以了

star321123 发表于 2018-12-24 14:25

看不懂,大佬把麻花的视频地址搞出来能播放那就美滋滋了

Hmily 发表于 2018-12-24 14:29

@febsky 要是讨论贴就发讨论区,如果是同样类型的分享,你就合并到一个帖子就行了别刷一堆主题,把这个帖子内容编辑到之前的,然后回复我,我给你删除这个。

狂暴补师亚丝娜 发表于 2018-12-24 15:05

本帖最后由 狂暴补师亚丝娜 于 2018-12-24 15:11 编辑

感谢楼主告知APP,为了答谢楼主,送麻花影视海王接口一份:

接口如下:GET /api/app/video/ver2/user/clickPlayVideo_tv/7/1450?videoId=100856&time=1545634798226 HTTP/1.1
Content-Type: application/json
Accept: application/json
accessToken: f1c8cc0689c442fb1fad6ae6e8f0db195e42652273f257a8519a863da2a8e0b8
X-Client-NonceStr: TfibHpw33t
X-Client-IP: 127.0.0.1
X-Client-TimeStamp: 1543592259810
X-Client-Version: 1.0.1
X-Client-Sign: 0a9e3fb9a7b2c3dd6fdda9d33bc2cf7480827952891d1d8bfb682b4aeb63f13f
X-Auth-Token: mb_token:25361603:b22edbb38c1f8474bcb64a3165a2b079
X-Client-Token:
Host: api.zztxwj.com
Connection: Keep-Alive
User-Agent: okhttp/3.10.0
Accept-Encoding: identity

直接用fiddler,get一下,拿到json过后拼接即可。
如:
http://v.yimohui2017.com/v2/m_20 ... 1fe8b623_1080P.m3u8

后续:
区区一个麻花影视的本地代{过}{滤}理,证书绑定,不足以让人畏惧。

狂暴补师亚丝娜 发表于 2018-12-24 15:14

star321123 发表于 2018-12-24 14:25
看不懂,大佬把麻花的视频地址搞出来能播放那就美滋滋了

楼下 发布

罗茂松 发表于 2018-12-24 15:21

谢谢分享,太好了,试试

PJGeek 发表于 2018-12-24 15:30

都是能人 看不明白 太高深了属于 哪方面的内容

zhouminglong 发表于 2018-12-24 15:46

看不懂,玩不转!!!!

febsky 发表于 2018-12-24 15:48

Hmily 发表于 2018-12-24 14:29
@febsky 要是讨论贴就发讨论区,如果是同样类型的分享,你就合并到一个帖子就行了别刷一堆主题,把这个帖子 ...

抱歉哈,我没搞懂这些区到底怎么分的,我感觉是技术分享,怎么能是讨论帖呢?而且,每一篇是不同的技术点,合并到一篇文章里面怎么看?
页: [1] 2 3 4 5 6 7 8
查看完整版本: 2018-12-16-绕过麻花影视抓包检测(完成)