前段时间想到支付宝的一个做任务领集分宝的小程序…
挺好的,想要做一个获取到所有任务,然后全自动做任务的工具,抓包发现有sign验签,于是有了本帖
抓完才发现,整个小程序是用https传输数据的。

另类方式破解的目的


小白就要有小白的办法,咱们要让小程序投降,让他自己乖乖的把sign用到的所有参数都告诉我。

0x0手机环境


  • 安卓11
  • K40稳定版/miui12/解锁BL
  • 已刷面具(刷了Move Certificates)
  • LSPosed框架

0x1用到的工具


  • 手机端
  1. Drony 1.3.154 (作用:应该搭建梯子转发请求到指定ip:端口。下载地址:论坛内帖子:https://www.52pojie.cn/thread-1340770-1-1.html)
  2. 支付宝
  3. 小黄鸟抓包
  4. MT管理器(搜索文件等工作)
  • 电脑端
  1. fiddler(以下部分地方会简称fd)
  2. Notepad++(JSTool插件,一键美化/缩放JS代码)【可有可无】
  3. 解压缩软件

0x2实现解密的过程


1.支付宝小程序抓包


小黄鸟抓包麻烦,所以想换成fiddler+drony抓包

一开始用的是小黄鸟APP抓包,抓的挺全的,但是用注入器比较麻烦,所以想着用电脑FD抓包,之前用过Drony,
但是换了安卓11之后旧版本获取不到wifi列表,所以更新了一下Drony,Drony怎么用之前已经讲过了,需要的话可以自己跳转:fiddler+drony抓包

fiddler+drony抓包

配置好drony之后开启转发,电脑打开fd,手机打开支付宝APP,并进入小程序,fd抓到包
sign为6e2edd36a36df5609e71e22a6fb41987

任务列表get,就是在headers里面有sign/token/等信息。
直接打开Task/list?会提示{"code":-2001,"msg":"签名错误"},就更加验证了sign是验签的想法,所以接下来我们要想办法得到sign值的算法。

2.从源码入手分析sign

在论坛内搜了以下“支付宝小程序”结果搜到一个19年的源码获取的帖子:
支付宝小程序抓包与源码获取(https://www.52pojie.cn/forum.php?mod=viewthread&tid=1050690)
没想到21年了,竟然还有效。。。

拿到源码

于是用MT管理器在/data/user/0/com.eg.android.AlipayGphone/files/nebulaInstallApps/目录中直接搜索小程序的名字,果然搜到了2个文件

按照上贴中的说法.tar文件里面包括了小程序的源码,可恶的是MT竟然打不开(改ZIP后缀也打开失败),所以传到电脑用解压软件打开。
果然是小程序的源码,有html和2个js文件

解压分析

全部解压到文件夹,搜索Task/list发现2个JS中都包含了。

但是我们依次打开搜索发现index.js中并不是Task,而是task。。未区分大小写字母,所以排除掉。
所以index.worker.js就成为了我们的目标,打开文件,再次搜索发现

upTaskInfo: function () {s.default.get({url: "Task/list",data: {is_filter: 0,filter: getApp().globalData.filter},login: !1,loading: !0}).then((function (e) {var t//此处省略N多代码})).catch((function (e) {}))
}

可以看得到调用了s.default.get方法,由url看出2个参数的值全都是0,所以getApp().globalData.filter=0
然后搜索get:

s.default.get方法

搜索get:,发现其中有一处疑似网络请求的代码

HOST: s,
API_ROOT: s + "/",
API_VERSION: u,
DEVICE_TYPE: r,
APP_ID: c,
get: function (e) {return e.method = "GET",this.request(e)
},
post: function (e) {return e.method = "POST",this.request(e)
}

再看看this.request

搜索request:找到request函数(其实一开始我是搜索sign,找到的request函数,不过都差不多啦),

request: function (e) {var n,u,r,c,l,d,m,p,h,g,v = this;if (1 == a.default.state.foo ? (this.HOST = "https://a.b.com", this.API_ROOT = "https://a.b.com/") :(this.HOST = s, this.API_ROOT = s + "/"), e = Object.assign({data: {}},e), n = Date.parse(new Date) / 1e3 + "", u = Math.ceil(1e4 * Math.random()) + "", r = f, -1 !== e.url.indexOf("Ad/record") && (e.data.filter = getApp().globalData.filter), c = {}, "string" == typeof(l = e.url.split("?"))[1]) {for (d in l = l[1].split("&"))c[(m = l[d].split("="))[0]] = m[1];e.url = l[0]}return Object.assign(e.data, c),Object.keys(e.data).forEach((function (t) {void 0 === e.data[t] && (e.data[t] = "")})),p = {},Object.assign(p, e.data),p.appid = this.APP_ID,p.nonce = u,p.timestamp = n,p.os = this.DEVICE_TYPE,p.v = this.API_VERSION,p.token = r,p._url = this.API_ROOT + e.url.split("?")[0],h = "",Object.keys(p).sort().forEach((function (e) {h += e + p[e]})),g = (0, o.hexMD5)(i.Base64.encode(h)),new Promise((function (a, o) {t.request({url: v.API_ROOT + e.url,data: e.data,method: e.method ? e.method : "POST",header: {"Cache-Control": "no-cache","Content-Type": "application/x-www-form-urlencoded",os: v.DEVICE_TYPE,appid: v.APP_ID,nonce: u,v: v.API_VERSION,timestamp: n,token: r,sign: g,"Adzone-Id": getApp().globalData.adzoneId},success: function (n) {-2e3 == n.data.code ? (v.login((function () {a(v.request(e))})), t.showToast({content: "需要授权登录"})) : a(n)},fail: function (e) {o(e)}})}))
}

稍微分析一下,可得出

修改JS后放回手机原目录

PS:其实一开始我没想到这么多,我还以为sign就只是简单的字符串拼接然后加一个key,md5一下。。。以上均为小程序投降之后的分析
我一开始不是分析JS来着,index.worker.js修改了JS的代码,在request函数return之前,把所有的参数全都提示了一个遍,上代码:

Object.assign(e.data, c), Object.keys(e.data).forEach((function (t) {void 0 === e.data[t] && (e.data[t] = "")})), p = {}, Object.assign(p, e.data), p.appid = this.APP_ID, p.nonce = u, p.timestamp = n, p.os = this.DEVICE_TYPE, p.v = this.API_VERSION, p.token = r, p._url = this.API_ROOT + e.url.split("?")[0], h = "", Object.keys(p).sort().forEach((function (e) {h += e + p[e]}));
g = (0, o.hexMD5)(i.Base64.encode(h));//sign的值gt.showModal({title: "参数信息提示",content: 'request参数e:' + JSON.stringify(data) + '\n\n参数p:' + JSON.stringify(p) + '\n\np._url:' + p._url + '\n\nh:' + h + '\n\nbase64后sign值:' + g,showCancel: !1,//变量data已经在request函数一开始就用e赋值了confirmText: "已阅,退下吧"
})

小程序文件校验失败,重新请求了index.worker.js

但是保存index.worker.js放回.tar压缩包,传到小程序目录后,重新打开小程序。小程序竟然重新加载了。(后来一看才发现,目录里面的cert.jsonsign.json可能是验证文件md5之类的文件,发现修改后会重新请求)

但是fd中出现了index.worker.js的请求… 那不一个样道理吗,所以用FD的自动响应(AutoResponder),返回修改后的JS。

那,这不就缴械了吗,sign为6e2edd36a36df5609e71e22a6fb41987

0x3结案小程序已经交出了钥匙


PS:每个接口的h值拼接的字符串不一样,但是直接用js的方法来说。
sign加密的步骤大约就是:每个接口的参数加上参数p的总和按照ascii码值大小顺序,然后value+key拼接,最后base64编码后,md5即为sign值

[另类方式破解]支付宝的小程序sign验签参数算法相关推荐

  1. 支付宝小程序根据验签与解密处理解析获取手机号码

    1.进入 小程序详情页 > 开发设置 > 内容加密方式,首次设置可以看到 设置 按钮(若已设置则为 查看 按钮),经过核身校验后可以查看 AES 设置页面(该密钥由蚂蚁开放平台生成,开发者 ...

  2. 记一次安卓小程序sign的逆向

    记一次安卓小程序sign的逆向 ​ 最近因为疫情原因居家办公了,而且任务量比较大,其余的时间也都在学习,这次记录一个前几天遇到的一个特殊的sign值的逆向,之前写的安卓测试技巧阅读量还可以,可以看出大 ...

  3. 一码多用:扫描一个二维码自动跳转支付宝/微信小程序、安卓/iosAPP

    随着支付宝,微信小程序的慢慢崛起,现在很多公司同一款程序都开发了四个版本.支付宝/微信小程序.安卓/iosAPP.但是随着程序的增加,引导用户使用就成了问题.比如,一家店门口如何贴一张二维码.实现用户 ...

  4. 淘宝、支付宝菜鸟小程序取件码找不到的解决方法

    淘宝.支付宝菜鸟小程序身份码找不到的解决方法 今天拿快递的时候在淘宝里面找身份码,死活找不到,明明之前可以找到的,最后还是下载了菜鸟裹裹app才能取件.上网搜索了一下,发现有的地方很早就把小程序里面的 ...

  5. 获取微信小程序码传递的参数 / 微信开发者工具模拟扫描小程序码调试

    本文主要介绍如何在微信开发者工具中,模拟微信扫描小程序码打开小程序的场景,进行调试. 二维码调试可以看这篇文章:微信开发者工具模拟扫描二维码调试 添加编译模式 添加一个咱们自定义的编译模式 输入模式名 ...

  6. uniapp App跳转微信小程序并互相传递参数、接收微信小程序传递的参数

    本文是uniapp打包成安卓App. 一.注意事项 1.用到了分享功能,在打包App时,需要配置manifest.json:App 模块配置->Share.按照提示填写微信分享的信息,appid ...

  7. 小程序分享并携带参数,方便做分销,拼团,返佣等功能

    最近在做社区团购和拼团类的功能,我们需要通过小程序分享给好友,让好友来助力,这个分享的时候,我们就要携带参数了,所以就顺便研究了下小程序分享并携带参数.其实代码很简单,就是测试的时候有些麻烦. 前期准 ...

  8. java写微信小程序答辩问题_java微信小程序开发中加密解密算法总结

    详解java微信小程序开发中加密解密算法 一.概述 微信推出了小程序,很多公司的客户端应用不仅具有了APP.H5.还接入了小程序开发.但是,小程序中竟然没有提供Java版本的加密数据解密算法.这着实让 ...

  9. 小程序内页面内参数的携带跳转和获取

    今天用网上的接口自己按设计写的一个网页 我是先写的首页之后写的页面搜索 点击页面搜索框后会跳到搜索页面,搜索页面是一个独立出来的组件 <view class="search" ...

最新文章

  1. 几种检查调试CSS布局的有效方法
  2. 牛客小白赛190615场
  3. 二叉树结点入度等于出度
  4. RSA体系 c++/java相互进行加签验签--转
  5. 记一次httpclient调用失败
  6. 你不知道的JS5-原型
  7. 爬get接口_网络字体反爬之起点中文小说
  8. Java一个月学到springboot_Java基础学习路线之SpringBoot入门
  9. 海量数据处理相关算法及数据结构【转】
  10. php 浏览网页的原理,PHP网页运行原理
  11. 2021安徽安全员B证考试多选练习题库
  12. 教你从redhat官网获取ISO镜像
  13. “堆排序算法”(C语言实现)
  14. Assets Error Listings APP-OFA-XXXX (文档 ID 1460268.1)
  15. 谨慎redis的timeout参数
  16. Windows下调试工具Windbg入门
  17. Alibaba Cloud Linux 3安装MySql8.0过程及配置
  18. 成为一名大数据工程师,需要具备什么技能?
  19. 计算机硬件 系统安装维护教程 01硬件篇-02:主板、内存、显卡、电源、硬盘(NGFF与nvme的关系)
  20. 烦心事一件接着一件,此起彼伏

热门文章

  1. 2021年茶艺师(初级)考试题及茶艺师(初级)考试资料
  2. 计算机密码忘了幽默回答,要不是他,你根本不会忘记密码
  3. Java并发编程78讲--29 第29讲:HahMap 为什么是线程不安全的?
  4. 【稳定性day12】阿里电商系统的高可用架构 - 上云面临的挑战
  5. 什么是RAID及常见RAID详解
  6. D-Map: Visual Analysis of Ego-centric Information Diffusion Patterns in Social Media
  7. 图像处理46-分水岭算法
  8. 2021年江苏制造业百强企业排行榜:24家苏州企业营收比重达43.66%(附年榜TOP100详单)
  9. 学生学计算机情况调查问卷报告怎么写,学生计算机基础情况了解调查问卷.doc...
  10. 黑盒子测试方法(Black-Box Testing)