某物小程序sign逆向-记录
评估了一下,逆向某物小程序要比APP简单,这篇文章主要记录一下小程序的反编译过程和sign的逆向。
小程序逆向的过程(以pc端小程序为例):
- 找到所需的接口、参数
- 找到小程序的wxapkg
- 解密小程序包(有些wxapkg有加密)
- 反编译小程序
- 找加密函数(扣js)
- 测试接口
分析接口及接口参数

这个接口就是我们需要的,主要加密参数是sign,这个sign所有接口都要用到的,data加密也是要用到sign的,后面会写一篇data的解密。目标找到了,接下来的就是反编译,找到加密的js。
找到小程序的wxapkg
截图的就是我们要找的路径及wxapkg包。

如果不确定文件夹对应的小程序,就把下面这些文件夹删了,重新启动微信小程序就会生成一个新的文件。

解密小程序包
有些小程序包是有加密的,比如在反编译时提示:

Error: Magic number is not correct!
讯享网
像这个提示说明小程序有加密了,用下面这个解密工具可以解密

解密成功的包在wxpack文件夹里面
解密工具的下载:
讯享网https://wwu.lanzoub.com/ieCOG03v1u4f 密码:dusv
反编译
wxappunpacker下载地址:

https://gitee.com/ksd/wxappUnpacker
讯享网npm install npm install esprima npm install css-tree npm install cssbeautify npm install vm2 npm install uglify-es npm install js-beautify
node wuWxapkg.js 包的路径

注:反编译出来的文件会在wxapkg包当前的路径下
找加密函数(扣js)
sign长度是32的,可以大胆猜测一下是否是md5加密的,在js文件里搜索md5关键词发现只有一个文件有md5相关的。

定位到这个文件后,一个个看,发现下面这里非常可疑。

经过分析md5加密的值是把提交的dict转换成字符串 + 一个常量。
改写成python:
def get_sign(data): data_str = '' for i in sorted(data): data_str += i + str(data[i]) print(data_str) res = data_str + "反编译js中找到这个常量" h1 = hashlib.md5() h1.update(res.encode(encoding='utf-8')) sign = h1.hexdigest() return sign data = {
"tabId":"","limit":20,"lastId":3,"platform":"h5","version":"4.73.0","isVisitor":"false","newAdvForH5":"true"} get_sign(data)
当然,这只是我们的猜想,接下来还要校验我们的猜想是否正确。
测试接口
经过测试我们的猜想是没问题的,完整代码:
import requests import hashlib def get_info(): headers = {
'Host': 'app.dewu.com', 'Connection': 'keep-alive', 'AppId': 'wxapp', 'SK': '换成自己抓包的数据', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat', 'appVersion': '4.4.0', 'content-type': 'application/json', 'platform': 'h5', 'wxapp-route-id': '[object Undefined]', 'Referer': 'https://servicewechat.com/wx3c12cdd0ae8b1a7b/340/page-frame.html', } data = {
"tabId":"","limit":20,"lastId":3,"platform":"h5","version":"4.73.0","isVisitor":"false","newAdvForH5":"true"} sign = get_sign(data) data["sign"] = sign print(data) response = requests.post('https://app.dewu.com/api/v1/h5/index/fire/index', headers=headers, verify=False,json=data) print(response.text) def get_sign(data): data_str = '' for i in sorted(data): data_str += i + str(data[i]) print(data_str) res = data_str + "反编译js中找到" h1 = hashlib.md5() h1.update(res.encode(encoding='utf-8')) sign = h1.hexdigest() return sign get_info()

现在某物小程序的大部分接口提交data以及返回的数据都是加密,同时也要用到这个sign,后面会写一篇关于data的解密。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/121983.html