首页
社区
课程
招聘
[原创]某讯QQ钱包转账付款算法分析篇
发表于: 2021-10-31 08:48 42966

[原创]某讯QQ钱包转账付款算法分析篇

2021-10-31 08:48
42966

具体如何抓包就不在陈述,抓包我们会发现qpay_unified_config.cgi、qpay_balance.cgi等接口,但它的POST以及返回的数据都是十六进制的数据,毫无疑问是经过了加密,接下来就是分析如何找到它加密部分。(具体它的每个参数含义就暂时不讲解)

把整个apk拖入jadx-gui后,初始化检索之后可以直接通过网址进行定位。
图片描述
图片描述

看到此处,它判断的这3个URL接口名称,恰是支付的,估计是它排除掉不是它的接口。
这里直接对它进行HOOK,我使用的是frida(雷电4模拟器环境),我们对这个signEncdata函数进行分析它具体的传参,根据代码过程大概判断出,str是URL,剩余2个,拭目以待。

…………

结果就是,该HOOK代码并没有触发,也就是并没有执行到此处,但是我们发现当前class处几乎每个函数都是加密相关,我对他们进行了逐一HOOK,最终发现encypt函数有了反应。
如下面图所示:
图片描述
但是代码没有能正常解析出来,具体它的参数打印出来的是:

参数名我是根据查找调用它的上一层代码进行翻译出来的,如图片箭头所示
图片描述
这些数据最长的就是postdata,也就是它发出去的数据的明文。
这个函数触发了2次,第一次估计是在支付之前获取某些信息,而第二次则是提交支付密码(参数p,也是加密后的)以及token_id(支付订单号)进行完成支付。
而skey估计则是cookie之类的关键token

找到了它的关键代码,就需要对它进行算法的还原,具体它postdata数据是如何构造的,它的每个参数含义就暂时不往回追溯,根据当前的encypt函数,继续往下阅读,但因为代码是无法正常翻译成java,只能通过阅读class的原生指令。

我们直接拉到最后,前面基本上都是构造它的数据以及获取更多的其它设备信息,因为我们看到了如 getNetworkType、getDeviceInfo、getMsgNo等关键字,估计是在进一步获取更多信息。

这里我直接拉倒最后(部分参数名被我改了一下),r2 就是它最终构造完的信息,postdata2其实是keyIndex(忘记改回名字),那么就可以继续跳转到 r0.encryptDes 里面下个hook查看它传进去的r2了。

以下HOOK出来的打印数据:

我们看到,data数据其实就是上一个hook的数据拼接在一起,但是看到它后面多出了h_net_type和h_model等相关设备的状态信息,也就证实了刚刚说的那些关键字所获取出来的数据。 而这个key = 8 是比较迷惑的,我们现在把跟到encryptDes函数里面查看它具体进行的部分(因为我们看到它返回的是bool型,而不是最终的加密结果)
图片描述
如上图所示,跟进去我们发现了它真正的加密过程是在so层中完成。
通过看到SoLoad.loadSo(context);部分,我们需要找到它加载的so文件
图片描述
我们看到它加载的是cftutils_v1、qwssl两个文件。
但奈何查找整个apk资源,并没有发现2个so文件。
尝试全局检索他们的名字,也无结果
图片描述

与其所是运气,也可以说是技巧,通过XSearch工具,我按照搜索qwssl名字,搜出了一张后缀名jpg图片格式的文件
图片描述
但是它并不能正常打开查看,通过十六进制查看发现,它竟然是一个APK格式
图片描述
把他转换成zip格式打开,发现了新大陆
图片描述
图片描述
进入lib发现了2个惊喜文件

最后我们使用ida载入这2个so,并看到了具体实现过程
图片描述
而前面所说过的keyindex,其实就如箭头所示,unk_26004是一个存放加密公钥的常量,它应该是偏移了几位进行读取,以达到部分混淆作用把。

此处我没有继续往下分析了,因为基本上也差不多了明了了整个算法过程,只需要时间基本上都能完成了。(当然还有它那个密码p没去看)

!str.contains("qpay_ydt.cgi") && !str.contains("qpay_balance.cgi") && !str.contains("qpay_fpay_regbind.cgi")
!str.contains("qpay_ydt.cgi") && !str.contains("qpay_balance.cgi") && !str.contains("qpay_fpay_regbind.cgi")
var EncryptRequest = Java.use("com.tenpay.sdk.basebl.EncryptRequest");
        EncryptRequest['signEncdata'].implementation = function(str,str2,map){
            console.log('[signEncdata] -->  str:'+str)
            console.log('[signEncdata] -->  str2:'+str2)
            console.log(map)
            var ret = this.signEncdata(str,str2,map)
            console.log("[signEncdata] ret -- >" +ret)
            return ret
        }
var EncryptRequest = Java.use("com.tenpay.sdk.basebl.EncryptRequest");
        EncryptRequest['signEncdata'].implementation = function(str,str2,map){
            console.log('[signEncdata] -->  str:'+str)
            console.log('[signEncdata] -->  str2:'+str2)
            console.log(map)
            var ret = this.signEncdata(str,str2,map)
            console.log("[signEncdata] ret -- >" +ret)
            return ret
        }
 
[encypt] -->  qquin:276265453
[encypt] -->  url:https://myun.tenpay.com/cgi-bin/qwallet_misc/qpay_unified_config.cgi?ver=2.0&chv=3
[encypt] -->  keyIndex:8
[encypt] -->  postdata:skey=v0aaf855a20617de1e4cf7b447711a49&uin=276265453&skey_type=0
[encypt] -->  pskey:D2bVXKh4GsqkNgFevM37b3Qf8h6yNyC4F4-e937-w58_
 
--------
 
[encypt] -->  qquin:276265453
[encypt] -->  url:https://myun.tenpay.com/cgi-bin/clientv1.0/qpay_balance.cgi?ver=2.0&chv=3
[encypt] -->  keyIndex:8
[encypt] -->  postdata:token_id=5M6477be1c9445ba1621c6319e403075&p=31363335363339383237F0D6C4CEE093903BFD05D6303A581B97E8442ABD7934E8CCC9D71AAF6B60BD5186B12729677B20A25232EDECB539B81775F69AD79B48AF90B0D96BD8AB1D18E3EEAC513F451010C782F3919935171EA650F937A4C733865ECE77E9B4352D6BE6360D50605106FD9581221F92A809A42FC8617884EEAD942F721C71A3A32B9A642F94676A49F7C74E45B0D7B62802809FDEE2EE68&timestamp=1635639827&is_reentry=0&skey=v0aaf855a20617de1e4cf7b447711a49
[encypt] -->  pskey:D2bVXKh4GsqkNgFevM37b3Qf8h6yNyC4F4-e937-w58_
[encypt] -->  qquin:276265453
[encypt] -->  url:https://myun.tenpay.com/cgi-bin/qwallet_misc/qpay_unified_config.cgi?ver=2.0&chv=3
[encypt] -->  keyIndex:8
[encypt] -->  postdata:skey=v0aaf855a20617de1e4cf7b447711a49&uin=276265453&skey_type=0
[encypt] -->  pskey:D2bVXKh4GsqkNgFevM37b3Qf8h6yNyC4F4-e937-w58_
 
--------
 
[encypt] -->  qquin:276265453
[encypt] -->  url:https://myun.tenpay.com/cgi-bin/clientv1.0/qpay_balance.cgi?ver=2.0&chv=3

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2021-10-31 08:55 被kzzll编辑 ,原因:
收藏
免费 16
支持
分享
最新回复 (43)
雪    币: 225
活跃值: (1089)
能力值: ( LV3,RANK:27 )
在线值:
发帖
回帖
粉丝
2
很刑
2021-11-1 16:14
2
雪    币: 4116
活跃值: (1034)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
有点刑
2021-11-1 17:10
0
雪    币: 206
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
越来越刑了
2021-11-1 17:43
0
雪    币: 311
活跃值: (336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这波厉害了
2021-11-1 19:24
0
雪    币: 1744
活跃值: (3449)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
越来越有判头了。
2021-11-1 19:44
2
雪    币: 409
活跃值: (257)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
太刑了[daxiaogoutou]
2021-11-1 20:00
0
雪    币: 232
活跃值: (1793)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
8
电脑啥配置,jadx跑了好久跑不出来
2021-11-1 22:55
0
雪    币: 3420
活跃值: (1160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
大佬真的是太刑了
2021-11-1 23:32
0
雪    币: 1744
活跃值: (3449)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
10
falconnnn 电脑啥配置,jadx跑了好久跑不出来[em_35]
虚拟内存分高一点,至少16G
2021-11-2 00:13
0
雪    币: 1744
活跃值: (3449)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
11
本来在想发个密码算法分析的帖子,看到这种大佬的回复的我瑟瑟发抖了。。。
2021-11-2 00:15
1
雪    币: 2089
活跃值: (3933)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
刑啊!太刑了!
2021-11-2 11:15
0
雪    币: 7118
活跃值: (3711)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
asd
13
我看刑,相当可铐,这日子越来越有判头了 
2021-11-2 11:34
0
雪    币: 1258
活跃值: (1434)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
利害了
2021-11-2 16:56
0
雪    币: 1672
活跃值: (2272)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
厉害。
2021-11-3 04:06
0
雪    币: 995
活跃值: (669)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
真刑啊。。。
2021-11-3 14:01
0
雪    币: 1114
活跃值: (2094)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
17
p是RSA
2021-11-3 15:45
0
雪    币: 1744
活跃值: (3449)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
18
DiamondH p是RSA
直接unidbg调用了。
2021-11-3 17:50
0
雪    币: 450
活跃值: (3210)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
很刑!很有判头!
2021-11-3 20:58
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
神州刑 我看行
2021-11-3 23:16
0
雪    币: 4859
活跃值: (3532)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
kzzll 虚拟内存分高一点,至少16G
java -Xms128M -Xmx6g 是用这个命令修改? 我怎么还是提示内存不足  能给个命令?最近刚学安卓逆向
2021-11-5 13:21
0
雪    币: 4859
活跃值: (3532)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
kzzll 本来在想发个密码算法分析的帖子,看到这种大佬的回复的我瑟瑟发抖了。。。
发 我是马化腾亲戚 保你没事
2021-11-5 13:22
0
雪    币: 38
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
楼主越来越可拷了
2021-11-5 14:29
0
雪    币: 14824
活跃值: (6063)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
楼上的想歪了。这个是不可能搞出什么西西的。因为实际在服务器端完成客户端只提供凭据(而且要2个客户端同时提交凭据服务器端效验)。
不过楼主花功夫分析,不排除有歪念的想法。
2021-11-5 16:27
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
25
已举报,盼望楼主刑起来
2021-11-5 19:19
0
游客
登录 | 注册 方可回帖
返回
//