首页 > 编程知识 正文

支付宝扫码支付测试用例,验证码识别算法

时间:2023-05-05 20:33:59 阅读:13585 作者:2225

在这期间,我想到了接受支付宝(Alipay )的任务收集宝藏的小程序…

是的,我想制作一个获取所有任务、全自动进行任务的工具,抓起包就有sign复选标记,有本帖

抓住后,整个小程序都在用https传输数据。

替代方式的解读目的wgdsp需要wgdsp的方法。 我们让小程序投降,告诉他自己坦率地用在sign上的所有参数。

0x0手机环境安卓11k 40稳定版/miui12/解锁BL口罩(Move Certificates )用于LSPosed框架0x1的工具手机端Drony 1.3.154 )角色:构建梯形图指定的iii 下载地址:论坛内帖子: https://www.52pojie.cn/thread-1340770-1-1.html )支付宝(Alipay )黄鸟抓包MT管理器(文件搜索等工作)电脑端fiddler )以下部分简称软盘) notepad ) jsTTML一缩放】【可否】解压缩软件0x2实现解密流程1 .小程序抓小黄鸟包很麻烦,想换成fiddler drony包。 一开始用黄鸟的APP抓住包。 虽然抓得很紧,但用注入器抓住很麻烦,所以考虑到用电脑软盘抓住包,以前使用的是Drony。

但是,更改为Android11后,旧版本无法获取wifi列表,因此更新了Drony。 我之前说过Drony是怎么使用的,如果需要的话可以自己跳: fiddler drony可以抓包

fiddler drony抓住包配置好drony后,打开转发,电脑打开软盘,手机打开支付宝(Alipay ) APP,进入小程序,软盘抓住包

sign是6e2edd 36 a 36 df 5609 e 71 e 22 a6 FB 41987

任务列表get是指headers中包含sign/token/等信息。

直接打开任务/列表? 由于提示了{'code':-2001,' msg': '签名错误' },进一步验证了sign是验证签名的想法,接下来考虑得到sign值的算法。

2 .从源代码中分析sign在论坛中搜索以下“支付宝(Alipay )小程序”,结果找到了获取源代码19年的帖子:

捕获支付宝(Alipay )小程序和获取源代码(https://www.52pojie.cn/forum.php? mod=viewthreadtid=1050690 )

没想到21年了,还是有效的。

他说他获得源代码并在MT管理器中直接在/data/user/0/com.eg.Android.AliPay gphone/files/nebulainstallapps /目录中查找了小程序的名称

如上所述, tar文件包含applet的源代码,但不幸的是MT无法打开(更改ZIP后缀也无法打开)。 所以,传输到电脑上用解压缩软件打开。

还是小程序的源代码,有html和两个js文件

解压缩分析全部解压缩到文件夹中,搜索Task/list发现包含在两个JS中。

但是,在index.js中发现不是Task而是Task。 因为不区分大小写,所以排除。

所以index.worker.js成为了我们的目标,打开文件,再次搜索并发现

up taskinfo : function ((s.default.get ) URL:'task/list ',data:(is_filter:filter3360getter 1,) 0}.then((function ) e ) ({ var t //此处省略n多代码} ) ) ) catch ) (function ) }由s.default.get方法调用

然后搜索get:

s.default.get方法搜索get:发现其中有疑似网络请求的代码

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

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) + 'nn参数p:' + JSON.stringify(p) + 'nnp._url:' + p._url + 'nnh:' + h + 'nnbase64后sign值:' + g, showCancel: !1,//变量data已经在request函数一开始就用e赋值了 confirmText: "已阅,退下吧"}) 小程序文件校验失败,重新请求了index.worker.js

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

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

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

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

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。