最近有需求要采集热度星选小程序的数据,就抓包看了下接口,发现有个sign签名参数,sign大概率是小程序前端js生成的,就准备逆向搞一下。
一、获取小程序wxapkg文件
- 首先通过abd连接手机,进入adb shell;
- 进入微信的小程序目录,我这里路径是: /data/data/com.tencent.mm/MicroMsg/6ff23bxxxbcf62faxxxd2077cdxxx7f9/appbrand/pkg,每个人路径不一样,可以按我的路径找一下;
- 删除所有wxpkg文件,然后在手机上重新打开热度小程序;
- 导出新出现的wxpkg文件,我这里热度的文件是:_284004603_153.wxapkg(可以用adb pull导出到电脑上,没有权限的话可以在手机上搞个临时目录);
二、小程序反编译
小程序反编译可以用wxappUnpacker工具,不过我这里反编译的时候一直报错,后面用了另一位大佬的反编译工具unveilr(https://github.com/r3x5ur/unveilr)。
具体unveilr的安装使用可以看下大佬的github,上面有教程。
三、Sign签名逆向
通过unveilr反编译后,会生成小程序的项目文件,使用微信开发者工具打开该项目。
然后直接先通过搜索“md5”找一下代码,运气很好,直接就找到了。
这里调用了o.sign函数,入参是h,然后字母都大写了一下(以我的经验猜测,这里大概率sign就是一个字典排序,然后拼接成字符串md5一下)。那我们这里只要扣一下e、sign两个函数就好。
很明显就是拼接成字符串,然后md5了一下。这里扣下js代码跑一下测试。
很明显,拼接后的字符串md5后结果和抓包结果一致。
四、改写成Python代码
这一步很简单,我直接放代码吧。
import hashlib
def get_sign(data: dict):
data_sorted = [k + '=' + data[k] for k in sorted(data)]
data_sorted.append('secret=EC7259DFCAD1715C23D400B7A88407A3')
sign_text = '&'.join(data_sorted)
print(sign_text)
md5 = hashlib.md5()
md5.update(sign_text.encode(encoding='utf-8'))
sign = md5.hexdigest().upper()
return sign
正文完