以羊了个羊为例,浅谈小程序抓包与响应报文修改

语言: CN / TW / HK

在前面的文章中,我们一起制作了一个天眼查小程序,其中涉及到了微信小程序的抓取过程,应众多读者的要求,今天我们一起来看看微信小程序的抓包流程

本来是想以天眼查小程序作为抓包主体的,但是这两天羊了个羊实在是太火了,没办法,咱们也来追一追热点,今天我们的目标程序就是羊了个羊了!

而且从9月20号的某个时刻开始,羊了个羊的接口正式进入到V2时代,也就是相关的通关接口进行了加密处理,请求时需要携带参数 MatchPlayInfo ,而该参数又是通过 JavaScript 的混淆代码来处理的,所以导致一键通过程序都失效了,那么咱们只能另寻出路了,修改 response 响应消息的方法也就应运而生!

MitmProxy 的使用

我们这里使用的抓包程序是 MitmProxy,这是一个用 Python 编写的工具,其安装使用简单,而且通过与自定义的 Python 脚本相结合,可以非常方便的篡改 request 和 response 内容

安装配置 MitmProxy

安装非常简单,直接 pip 即可

pip install mitmproxy

完成安装之后,我们就可以通过命令 mitmdump 来启动了

可以看到,以上面的命令启动之后,会在本地启动一个监听了8080端口的程序,这个就是我们的抓包代理进程了

设置手机代理

这里我们需要保证手机与电脑处于同一个 WiFi 网络之中,我们通过命令 ipconfig 获取电脑的 IP 地址

然后我们进入手机的无线局域网设置当中,选择当前连接的 WiFi,进行 HTTP 代码设置

在代理设置中,服务器填写电脑的 IP 地址,端口填写 8080

这样代理就设置好了

安装证书

为了让手机信任我们的代理,还需要安装证书,通过手机浏览器访问地址:http://mitm.it/

我们选择对应的设备证书下载,比如 Apple 证书

下载完成后,通过设置,“已下载描述文件”进入安装即可

至此,MitmProxy 以及手机侧的配置都已经完成,我们可以进行抓包操作了

抓包操作

我们通过手机打开《羊了个羊》小程序,如果我们运行 mitmdump 命令的界面有数据包打印,那么就说明我们的配置是成功的

下面我们来编写 Python 脚本,来修改 response 内容

修改 response

通过抓包信息分析,我们知道返回地图的接口是 map_info_ex 接口,其响应消息体的内容为

{"err_code":0,"err_msg":"","data":
        {"map_md5":["046ef1bab26e5b9bfe2473ded237b572","046ef1bab26e5b9bfe2473ded237b572"],
         "map_seed":[3622853803,3053757364,32667028,3621470055]}}

我们只需要把 map_md5 中的第二个值改为与第一个值一致就可以达到第二关的难度与第一关一样的效果,下面就开始干吧~

对于 MitmProxy 工具而言,我们有如下事件可以截取

针对 HTTP 生命周期的事件:

  • 请求:def request(self, flow: mitmproxy.http.HTTPFlow):
  • 响应:def response(self, flow: mitmproxy.http.HTTPFlow):
  • 其它:

    • def http_connect(self, flow: mitmproxy.http.HTTPFlow):
    • def requestheaders(self, flow: mitmproxy.http.HTTPFlow):
    • def responseheaders(self, flow: mitmproxy.http.HTTPFlow):
    • def error(self, flow: mitmproxy.http.HTTPFlow):

这里我们主要用到了响应事件,代码如下

def response(flow):
    tmp_txt = {"err_code":0,"err_msg":"","data":
        {"map_md5":["046ef1bab26e5b9bfe2473ded237b572","046ef1bab26e5b9bfe2473ded237b572"],
         "map_seed":[3622853803,3053757364,32667028,3621470055]}}
    if "map_info_ex" in flow.request.url:
        info(str(response.text))
        print(type(tmp_txt))
        print(type(json.dumps(tmp_txt)))
        response.set_text(json.dumps(tmp_txt))
        info(str(response.text))

我们判断请求 url 中是否包含 map_info_ex ,如果包含,则篡改 response 信息

下面我们以如下命令重新启动代理程序

这样,当我通过第一关之后,进入第二关时,其难度还是与第一关一样的,怎么样,开心吧!

当然我们还可以篡改其他接口,比如 rank 接口,话题接口等等,都可以轻松达到我们想要的目的,就不再一一赘述了

好了,这就是今天分享的全部内容,喜欢就点个赞吧~

本文由mdnice多平台发布