重写(rewrite)

原理简述

QX这类的代理类App,核心能力是四项:

  • 接管:可以将设备发出的网络连接进行接管,QX采用虚拟网卡(TUN模式)接管

  • 处理:可以对被接管的网络请求和响应进行修改。包括 URL 重定向、本地文件映射、使用 JavaScript 自定义修改等多种方式。

  • 转发:可以将被接管的网络请求转发给其他代理服务器。可以是全局转发,也可以按照非常灵活的规则系统确定出口策略。

  • 截获:可以截获并保存网络请求和响应的具体数据,同时可对 HTTPS 加密流量进行 MITM 解密。

重写就是当中的处理这一部分。

使用重写功能,需要在设置页面中开启。

目前 QX 提供的修改能力包括(rewrite):

• 重定向(302,307,request-header, request-body,script-request-header,script-request-body,其中,重定向主机仅可使用302,307,不支持直接修改url重定向主机)

• 本地文件映射(echo-resonse,script-echo-response,script-analyze-echo-response)

• 请求头和响应头修改(request-header,response-header)

• JavaScript 脚本修改

其中脚本修改的功能最为强大,可通过脚本间接实现其他几项能力。但是由于脚本编写繁琐,运行时开销略大,简单需求还是应该通过其他方式实现。

同时因为处理只能对HTTP流量进行处理,所以其中一些HTTPS需要对其mitm解密后才能进行处理,所以重写这部分和mitm的联系是很紧密的。

开启mitm见之前的mitm章节

当前QX支持的重写有如下类型:

简单讲解一下重写类型含义

  • reject:对正则匹配的URL返回404状态(returns HTTP status code 404 with no content)

  • reject-img:对正则匹配的URL返回HTTP 200响应和1像素的gif(returns HTTP status code 200 with content of 1px gif

  • reject-dict:对正则匹配的URL返回空JSON对象的和HTTP 200响应(returns HTTP status code 200 with content of empty json object

  • reject-array:对正则匹配的URL返回空JSON数组的HTTP 200响应 (returns HTTP status code 200 with content of empty json array

  • reject-200:对正则匹配的URL返回空响应体的HTTP响应(returns HTTP status code 200 with no content

  • 302:对正则匹配的URL,会将POST请求改成GET,不保留请求体

  • 307:对正则匹配的URL,将POST重定向到POST,PUT重定向到PUT,会保留请求体

  • request-header:请求头,通过正则可以匹配多个连续的请求头,实现基于多个头信息进行规则匹配修改请求头。(The "request-header" works for all the http headers not just one single header, so you can match two or more headers including CRLF in one regular expression.)

  • request-body:通过正则匹配URL修改请求体

  • response-header、response-body:通过正则匹配URL修改响应头、响应体

  • echo-response:通过正则匹配URL直接返回响应体内容,可用于直接返回原始响应、构造自定义响应、调试及占位等用途,这是一种返回静态数据的mock方法

  • script-analyze-echo-response、script-echo-response:对正则匹配的URL返回一个通过脚本script的方式处理过的由用户自定义的响应体,区别是script-analyze-echo-response同时包含全部$request数据,比如BoxJs 、SubStore 均使用此方式工作;script-echo-response不包含全部$request数据 一般用来返回由用户自行构造的响应数据 功能近似于Mock。

  • script-request-header、script-request-body、script-response-header、script-response-body:分别是通过脚本(script)的方式对正则匹配的URL返回的请求头、请求体、响应头、响应体进行处理,并返回经过脚本处理后的相应内容。

script-echo-response 和script-response-body区别是前者是返回一个由用户完全虚构的响应,后者是返回一个修改过的收到的真实响应。

脚本存放位置

脚本的保存位置:

1.可以放 github 后, 远程使用对应链接(raw 链接)

2.也可以放本地的 My iPhone - Quantumult X - Scripts 文件夹

3.如果QX的其它设置中资源中iCloud云盘开关打卡的话,则是在iCloud Drive - Quantumult X - Scrips文件夹

补充一点官方文档说明

如果”rewrite”与响应体相关,长度和编码相关的 HTTP 头字段会由 Quantumult 自动处理,所以你不需要自行处理。对 response-body 和 script-response-body 支持的最大响应大小是 1024kB(解压后)

如果响应体为空,与响应体相关的 rewrite 将不会被执行

在重写规则中使用javascript时,你可以使用这些对象:$request、$response、$notify(标题,副标题,消息)、console.log(消息)和Quantumult内置的对象都有”$“前缀。

支持:$request.scheme、$request.method、$request.url、$request.path、$request.headers、$response.statusCode、$response.headers、$response.body

$notify(标题,副标题,消息)会在启用了Quantumult通知时发出iOS通知。

$prefs用于持久化存储:$prefs.valueForKey(键)、$prefs.setValueForKey(值,键)、$prefs.removeValueForKey(键)、$prefs.removeAllValues()。

console.log(消息)会在日志级别为“debug”时输出日志到Quantumult日志文件。

setTimeout(函数(){ },间隔)会在间隔(毫秒)后运行函数。

重写按加载顺序进行匹配,与分流规则类似同样存在优先级⁠,本地>远程,上面的>下面的规则。可以点击“重写规则”查看加载顺序。

根据以上对重写类型的介绍可以看出,重写一般较多的用来去广告,通过脚本进行 app 的签到以及 app 的内购破解等。 重写和分流一样,分为本地重写[rewrite_local]远程重写资源[rewrite_remote]两种。

新人建议使用远程重写资源的方式,不建议使用本地重写。

最后更新于