01准备工具
- 手机一部,安装过微信
- 抓包工具,这里用的花瓶
- 微信开发者工具
- 小程序解包工具
- pychram 等IDE
02准备工作
- 抓包工具可以抓到小程序的包,这里不再分享了,网上搜索即可
- 抓到的小程序包之后,逆向解包
- 用测试账号appid,在微信开发者工具中打开解包后的代码
- 让代码编译无错
03开始逆向
先打开抓包工具,在手机上点点页面,抓到接口。
我们抓到了 v2/ticket/list接口,返回的是json对象,数据是门票的信息列表
观察querystring,没有加密内容。
观察header,发现是有Authorization 对象,里面有signature加密字段,我们需要处理的就是这个。
用过网关的同学就没必要看了,很熟悉的加密方式,它告诉你了加密方式,加密字段,唯一要处理的就是加密的Secret了。
我们在微信开发者工具中全局搜索Authorization , 仔细寻找可能加密的地方,打上断点(不是源代码)。
重新编译代码,让接口进入断点。
观察代码,我们需要处理y值,apiAppSecret,apiAppkey。
我们在花瓶抓包工具中,搜索apiAppkey,找到内容
紧接着发现这个key和Authorization 中的hmac id 不一致,就说明是加密的,我们需要对key和Secret进行解密
我们切换到微信开发者工具中,搜索接口'get/sign', 找到解密开始的地方
这里偷个懒,不扣取它的解密方法,直接拿返回值填上。然后就得到了解密后的key和Secret.
接着分析y值,
y = ["x-date: ".concat(m), c, "application/json", "application/json", d, h].join("\n")
它是有一个m(utc时间字符串),c(接口方式),两个固定值,d(post接口的参数的某种加密字符串),h(接口和query字符串的拼接,或者说是请求地址去掉host)用换行符拼接在一起组成了一个新的字符串
然后分析b也就是signature的生成方法。
i和r上面有定义
我们用webpack的逆向方式来扣去这一部分的加密js代码
05逆向js
webpack怎么扣js,这里也不说了。问了也顶多是复制粘贴。
完成之后,准备编写代码。大概的过程就是复制原来的代码,拿过来修改一下,保证运行不报错。
然后python代码调用一下
获取到正确的结果
然而在这个过程中,会碰到很多问题,比如怎么解小程序的包,怎么运行起来,怎么抓接口,怎么找加密方法,怎么解密等等。
处理方式就只有一个办法,就是一个一个问题解决。解决不了,就放弃,交给专业的人来解决!