V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
ethusdt
0.01D
V2EX  ›  iDev

iOS 可以几行代码绕过系统代理, 为什么大家都不这么做?

  •  
  •   ethusdt ·
    FaiChou · Nov 24, 2020 · 18188 views
    This topic created in 1981 days ago, the information mentioned may be changed or developed.

    昨天经过测试, 发现这样的代码, 可以绕过系统代理:

    let sessionConfig = URLSessionConfiguration.default
    var proxyDict = [AnyHashable : Any]()
    sessionConfig.connectionProxyDictionary = proxyDict // 主要是这一行
    let session = URLSession.init(configuration: sessionConfig, delegate: nil, delegateQueue: OperationQueue.current)
    // 网络请求
    

    普通的抓包工具(应用层抓包)是抓取不到请求的, 只有 wireshark 这种作用在上层协议的工具才可以.

    为什么要绕过系统代理? 可以避免 MITM, 手机上现在很多软件可以 hack 其他软件, 比如圈 X, 在收到网络请求时候可以对请求进行更改, 或者修改 body 信息.

    既然开发者可以一行代码来 bypass 绕过系统代理, 为什么不做呢? 猜测如下两点:

    1. 网络请求不使用 URLSession, 用其他的网络请求框架比如 Alamofire 没有这功能
    2. 软件没必要绕过系统代理, 有些场景是要考虑系统代理的

    我不是 iOS 开发者, 目前只能猜测以上两条. 希望专业的朋友指正.

    延伸自这个帖子: /t/715477

    Supplement 1  ·  Nov 24, 2020
    有些表达问题让大家困扰.

    本文不探究如何抓包, 即使用了 SSL-Pinning 也可以越狱破解形式 hack, 道高一尺魔高一丈.

    代理: iOS 上通常以 VPN 形式存在, 比如小火煎 /Surge/圈 X/所有抓包工具等.
    MITM: 解析 HTTPS 请求, 所有抓包工具都具备的功能, 现在的代理软件「进行 MITM 再执行脚本」已经很成熟了.

    使用了例子中的代码, https 请求会变成 tcp 请求(在 Loon 的请求中可以看到):

    https://tva1.sinaimg.cn/large/0081Kckwly1gl03v6hs9kj30n00asgnh.jpg

    https://tva1.sinaimg.cn/large/0081Kckwly1gl03wkeqc4j30n005rgms.jpg
    Supplement 2  ·  Nov 24, 2020
    我再补充下, 用这个方法不会影响用户的使用, 即使用户不能联网, 使用 VPN 后才能联网, 也不会影响这种用户.

    这个方法只是让 iOS 设备里其他的代理软件无法通过 MITM 方法解析 HTTPS 请求. 因为请求会变成 tcp 请求(从现象来看是这样的).. 具体我没研究..还请大佬指导下, 对不对.
    Supplement 3  ·  Nov 24, 2020
    感谢 46L 的朋友质疑, 我让重新考虑了一下. 可能自始至终我的表达都是错误的, 因为我是一瓶子不满状态, 很久没写代码了, 对这方面了解不是很多, 误导了大家.

    经过我的实验, 使用这行代码, Charles/HTTP Catcher 无法抓到包; 注释这行代码, Charles/HTTP Catcher 可以抓取到 https 请求. 无法抓包的情况下在 Loon 里可以看到它请求是 tcp 请求. 因为我遇到这问题时候先进行了搜索: "ios swift bypass system proxy" 于是以为这行代码的作用是绕过了系统代理. 代码从这里来的:

    https://stackoverflow.com/questions/28061353/how-to-bypass-proxy-in-ios-programmatically/48261195

    所以使用代理才能联网的网络环境下, 这行代码会不会造成 app 不能上网, 有待验证. 希望专业的朋友指导下.
    62 replies    2020-11-25 09:32:24 +08:00
    zengxs
        1
    zengxs  
       Nov 24, 2020
    没有必要

    有些网络环境下必须使用代理才能上网

    然后如果别人想抓你的包,你就算绕过系统代理也没用,我直接用 shadowrocket 开个全局 VPN,你怎么都绕不过

    想要避免 MITM 可以用 ssl pinning 校验证书
    LudwigWS
        2
    LudwigWS  
       Nov 24, 2020 via iPhone
    学到了,以后我就这么抓包
    longaiwp
        3
    longaiwp  
       Nov 24, 2020
    因为没什么用,真要抓包直接 VPN 接口拦住一样的。
    ethusdt
        4
    ethusdt  
    OP
       Nov 24, 2020
    @longaiwp #3 很多抓包工具 比如 Charles(macOS)/HTTP Catcher(iOS)/Thor(iOS) 都是设置的 Network Extension (VPN)形式, 但它们作用在应用层, 我给的例子中代码可以绕过应用层代理, 想要抓包只能去 tcp 层做文章. 所以还是有用的.
    ethusdt
        5
    ethusdt  
    OP
       Nov 24, 2020
    @zengxs #1 小火煎全局 VPN 是作用在应用层的, 用我给的例子, 是无法解析请求的. 我在圈 X/Loon 上做了很多测试, 都是一样的结果. 而且全局不全局只是请求是否都走代理服务器, 即使不开全局, 所有请求也会被小火煎这种 V 批 N 软件过滤.
    zengxs
        6
    zengxs  
       Nov 24, 2020
    @FaiChou #4 OK,就算在小火煎抓不到,但是如果别人真想抓你包直接在网关就能拦截,甚至不用在设备上进行任何操作

    防 MITM 还是 ssl pinning 比较有效
    littiefish
        7
    littiefish  
       Nov 24, 2020 via iPhone
    奸商学会这个,以后估计没法过滤广告了。
    ethusdt
        8
    ethusdt  
    OP
       Nov 24, 2020
    @zengxs #1
    @longaiwp #3

    这是我在 Loon 下的截图, 可以看到所有请求这些工具都会过滤, 根据规则有些请求走直连, 有些请求走代理服务器.

    https://tva1.sinaimg.cn/large/0081Kckwly1gl02o505toj30n01dsakp.jpg
    fffang
        9
    fffang  
       Nov 24, 2020
    因为不知道,哈哈哈
    zengxs
        10
    zengxs  
       Nov 24, 2020
    @zengxs #6 当然你也可以双管齐下 哈哈哈
    ethusdt
        11
    ethusdt  
    OP
       Nov 24, 2020
    @zengxs #6 是的, 即使 ssl pinning, 如果想抓包, 也有方法的, 越狱后什么都能做, 道高一尺魔高一丈.

    所以我的问题是, 简单一行代码可以让 MITM 失效, 为什么大家都没这么做?

    我再讲个例子, 京东 /淘宝的比价( https://raw.githubusercontent.com/yichahucha/surge/master/tb_price.js), 就是利用了 MITM 方式进行更改请求, 如果 jd/tb 加了这行代码, 就可以规避这个比价功能.
    TanMusong
        12
    TanMusong  
       Nov 24, 2020
    从我自己这考虑,抓包我从 pc 共享 wifi 抓,不知道这个能不能防住昂,其次项目内协议有加密,用于防止 MITM,或者应用破解修改,或者内存值修改等各种破解,没加密的比如下载,或者啥获取公共信息接口,一般也随便别人抓。
    ethusdt
        13
    ethusdt  
    OP
       Nov 24, 2020
    @fffang #9 这个可能性不是很高.. 毕竟手机上 MITM 修改接口请求已经很成熟了. 即使没有 Surge/圈 X/Loon 这种跑脚本的, 之前用 Thor 也是简单更改 http response 的.
    l764191074537
        14
    l764191074537  
       Nov 24, 2020
    世界上只有一种反爬虫手段,就是让抓取数据成本比数据本身的成本高,其他都是纸老虎。
    zengxs
        15
    zengxs  
       Nov 24, 2020
    @FaiChou #11

    这就不清楚了,可能他们觉得不需要防止这个吧

    这些大厂如果真的想防抓包的话,像微信的 mmtls 一样搞个私有协议就行了
    TanMusong
        16
    TanMusong  
       Nov 24, 2020   ❤️ 5
    问了一下朋友
    我:绕过系统代理可以防止 MITM,为啥不做呢?
    他:为啥要绕过系统代理,能确定用户不需要代理么?
    我:用的少吧
    他:少不是没有啊,你给数据加密不就行了,你能解决的为什么要用用户做代偿
    Leonard
        17
    Leonard  
       Nov 24, 2020
    为什么不让用户用代理?
    zycode277
        18
    zycode277  
       Nov 24, 2020
    .. 那有些人就是要用代理才能访问外网怎么办
    ethusdt
        19
    ethusdt  
    OP
       Nov 24, 2020
    @Leonard #17 没有不让啊. 用户用了代理也能完成请求. 只要能联网就可以完成请求. 要考虑不能联网局域网情况下, 通过其他设备开一个访问互联网的服务这种情况吗? 还是极少数的.
    GM
        20
    GM  
       Nov 24, 2020   ❤️ 3
    因为用户会骂娘,巨 tmd 烦那些自作聪明绕过系统设置的应用。
    mxalbert1996
        21
    mxalbert1996  
       Nov 24, 2020 via Android
    我用几行代码就可以恶心用户,为什么不这么做?
    ethusdt
        22
    ethusdt  
    OP
       Nov 24, 2020
    @zycode277 #18

    @Leonard #17

    A 设备连接在局域网下, 通过 B 设备(同一局域网下)的代理服务, 访问互联网. 这种情况作为开发者还是不用考虑了, 除非你这 app 需要特定 VPN 的情况. 而且, 我的例子代码, 是可以让它成功请求的, 只是在手机系统上的其他软件就看不到.
    weizhen199
        23
    weizhen199  
       Nov 24, 2020
    加个选项呗
    yov123456
        24
    yov123456  
       Nov 24, 2020
    surge 照样能抓到,走 tun 分析包头的
    ethusdt
        25
    ethusdt  
    OP
       Nov 24, 2020
    @mxalbert1996 #21
    @GM #20

    bypass system proxy 为啥会恶心用户自作聪明? iOS 下有个第三方微博 VVebo, 应该就是用的这种方法规避 MITM 抓包. 对用户来说一点感觉没有, 即使我开着全局代理, 也不影响它正常请求. 但对于想要抓包的人, 就需要多做点准备了.
    Lax
        26
    Lax  
       Nov 24, 2020
    什么理论? proxy == MITM ?
    icyalala
        27
    icyalala  
       Nov 24, 2020
    在 M1 Mac 上已经一览无余了,管你怎么搞。。
    ethusdt
        28
    ethusdt  
    OP
       Nov 24, 2020
    @Lax #26 可能表达有误, 大家都能懂就行. proxy 代理, 在 iOS 上通常以 V 批 N 形式存在, MITM 可以解析 https 请求.
    also24
        29
    also24  
       Nov 24, 2020
    @FaiChou #25
    如果 『系统代理』这个功能的存在,只是为了抓包做服务,那大可以用各种手段规避跳过。

    但是这里有一个问题:
    『系统代理』这个功能,为什么会存在?只是为了方便抓包么?
    SingeeKing
        30
    SingeeKing  
    PRO
       Nov 24, 2020
    真要防止被抓包正确做法不应该是 HTTPS + SSL Pinning 吗,就算再考虑防止 SSL Kill Switch 再加一层应用加密就好了,为什么要直接禁止用户用代理(楼主做法还是好的,银行那种不用 bypass 而是检测到用代理直接弹窗让你关才是最恶心的)

    另外,我个人觉得 SSL Pinning 其实也不是很好,因为某些特殊的情况确实必须让网络走指定代理并且信任根证书做审计……
    Lax
        31
    Lax  
       Nov 24, 2020
    @FaiChou MITM 已经是个专用名词了,不建议滥用。

    Google Drive 的 macOS 客户端不尊重系统的 proxy 设置,非常恶心,不开全局 VPN 几乎不能用。
    gefranks
        32
    gefranks  
       Nov 24, 2020
    最烦这种不按套路出牌的歪门邪道, 我这里有个东西,用了 3 个不同的库, 分别要在 java 本身, 源代码, 运行的 profile 里设代理,反胃中
    weixiangzhe
        33
    weixiangzhe  
       Nov 24, 2020 via Android
    我知道支付宝和银行 app 都有做
    lululau
        34
    lululau  
       Nov 24, 2020
    mitmproxy 透明模式轻松抓
    wwqgtxx
        35
    wwqgtxx  
       Nov 24, 2020 via iPhone
    因为有很多的公司网络就是要设置系统代理才能访问外网,你是要把这些用户都赶走么
    47jm9ozp
        36
    47jm9ozp  
       Nov 24, 2020 via iPhone
    我用几行代码就可以让一小部分正常用户无法使用,还可以给更小一部分不正常用户增加抓包的麻烦程度,为什么不这么做呢?
    ethusdt
        37
    ethusdt  
    OP
       Nov 24, 2020
    @wwqgtxx #35
    @ooxxcc #36
    用这个方法并不会影响正常用户使用. 即使他用设置系统代理, 也能使用.




    @lululau #34 是的, 我用的就是 mitmproxy client 配合电脑上的 mitmproxy 可以抓取. 它从 tcp 层进行抓包.


    @Lax #31 macOS 下要分开讨论, 的确很多软件即使开了全局代理也没办法, 只能借助 Surge 或者 Proxifier 等工具才可以.
    Rekkles
        38
    Rekkles  
       Nov 24, 2020
    0.01%的用户的恶意行为 要其他 99.99%的用户买单的代码
    ethusdt
        39
    ethusdt  
    OP
       Nov 24, 2020
    @Rekkles #38 请看我的补充, 不会影响用户正常使用.
    GM
        40
    GM  
       Nov 24, 2020   ❤️ 6
    @FaiChou
    对想抓你包的人来说,你加一万行代码都没用,照抓不误。
    对需要设置系统代理才能上网的用户来说,他想骂娘。
    ErrorMan
        41
    ErrorMan  
       Nov 24, 2020
    试图忽略小众用户,这种操作合适么,会抓包的也是极少数人,为了这个牺牲正常用户也太拉跨了
    lcdtyph
        42
    lcdtyph  
       Nov 24, 2020 via iPhone   ❤️ 2
    实际上 qx surge 等软件有两种代理方式,一种是开在本地的 http 代理,即你说的可以 bypass 的方式

    第二种是虚拟出来的 utun 网络设备,这个网络设备的 handler 中有一套自己的 tcp/ip 协议栈来处理应用过来的连接,自然也可以对这个连接的内容识别和修改。比如 surge 有个选项是 perform on tcp connection 就是你这种方式无法绕过的
    ethusdt
        43
    ethusdt  
    OP
       Nov 24, 2020 via iPhone
    @lcdtyph 谢谢指正。平时用 Loon 比较多。
    justsosososo
        44
    justsosososo  
       Nov 24, 2020
    没必要 防抓包就得上证书
    no1xsyzy
        45
    no1xsyzy  
       Nov 24, 2020
    你可能不知道 proxy 的功能……
    我看你是接触到了 proxy 用于 MITM 自己的设备上的应用来实现抓包
    但除此以外,proxy 也用于:
    1. 科学上网
    2. 内网审计(某些内网必须通过 DMZ 主机上设置的代理才能访问互联网,不然连路由表都没有)
    3. 匿名化

    你想象一下,如果 Google * App 设置了绕过代理多少人用不了?
    ysc3839
        46
    ysc3839  
       Nov 24, 2020 via Android
    @FaiChou 你确定绕过了代理也能正常使用?前面的人说的是内网环境,必须通过一个代理服务器访问外网,你不走这个代理,怎么连接外网?
    Lemeng
        47
    Lemeng  
       Nov 24, 2020
    来学习的
    Suclogger
        48
    Suclogger  
       Nov 24, 2020
    既然考虑越狱场景,一行 hook URLSession 的 init 方法不就把你这个绕过了?
    ethusdt
        49
    ethusdt  
    OP
       Nov 24, 2020
    @no1xsyzy #45 谢谢补充, 第三点的确没用过.


    @ysc3839 #46 嗯, 你这么一说我又想了下, 可能自始至终我的表达都是错误的, 因为我是一瓶子不满状态, 对这方面了解不是很多, 误导了大家. 经过我的实验, 使用这行代码, Charles/HTTP Catcher 无法抓到包, 注释这行代码, Charles/HTTP Catcher 可以抓取到 https 请求. 无法抓包的情况下在 Loon 里可以看到它请求是 tcp 请求. 因为我遇到这问题时候先进行了搜索: "ios swift bypass system proxy" 于是以为这行代码的作用是绕过了系统代理. 代码从这里来的:

    https://stackoverflow.com/questions/28061353/how-to-bypass-proxy-in-ios-programmatically/48261195
    Lax
        50
    Lax  
       Nov 24, 2020   ❤️ 1
    ```
    我再补充下, 用这个方法不会影响用户的使用, 即使用户不能联网, 使用 VPN 后才能联网, 也不会影响这种用户.
    ```

    在最近几年 VPN 用来翻墙普及前,大部分翻进内网或者翻出外网都是通过代理方式的。
    看起来,楼主和其他几位朋友的分歧,在于是不是把这种使用代理功能进行代理上网的用户算作“正常使用”。
    在电脑端这部分用户的基数还比较大,在 iOS 手机端确实用的比较少了。
    eluotao
        51
    eluotao  
       Nov 24, 2020
    有没有抓包高手 帮我抓个包. 这个软件禁止打开抓包工具
    no1xsyzy
        52
    no1xsyzy  
       Nov 24, 2020
    @eluotao 抓好了已经发给你了
    eluotao
        53
    eluotao  
       Nov 24, 2020
    @no1xsyzy 什么意思?
    tinydancer
        54
    tinydancer  
       Nov 24, 2020
    lover of life,singer of songs
    ethusdt
        55
    ethusdt  
    OP
       Nov 24, 2020
    @tinydancer #54 freddie mercury
    Enivel
        56
    Enivel  
       Nov 24, 2020
    xhj 是支持 socks proxy 的, 正常来说其他的工具也都支持. 即使按照 LZ 的方式设置了, 换一种 proxy 来 MITM 也是分分钟的事吧
    oxromantic
        57
    oxromantic  
       Nov 24, 2020   ❤️ 1
    因为抓包不必要靠代理模式啊,我写了个抓包改包软件,有兴趣可以试试

    打开透明代理模式就是走 tun 抓包改包,也支持配置额外的上一级 http connect over tls 代理 (tls <-> nginx-stream <-> tinyproxy)

    https://testflight.apple.com/join/KcQagFCK
    MrKrabs
        58
    MrKrabs  
       Nov 24, 2020
    network extension 直接秒了
    overflower
        59
    overflower  
       Nov 24, 2020
    @FaiChou 虽然只联网不用代理也可以完成请求,但是不代表这就满足了用户的需求,有些人就是有需要。
    lujie2012
        60
    lujie2012  
       Nov 24, 2020
    抓包有用么,给你抓,客户端 Data 数据加密,拿到有什么用。反编译,root 系统,包破解才到位。直接路由器里面分析包结构,更到位
    iseki
        61
    iseki  
       Nov 24, 2020
    恶心了用户,破坏了系统本身的优雅设计,还没能实现自己的目的,为什么要这么折腾自己呢?
    studyro
        62
    studyro  
       Nov 25, 2020
    1. 不能防止抓包
    2. 导致了部分用户完全不可用

    图个啥?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5599 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 118ms · UTC 07:21 · PVG 15:21 · LAX 00:21 · JFK 03:21
    ♥ Do have faith in what you're doing.