某钱包转账付款算法分析篇

VSole2021-12-21 16:04:47

抓包

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

定位

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

!str.contains("qpay_ydt.cgi") && !str.contains("qpay_balance.cgi") && !str.contains("qpay_fpay_regbind.cgi")

看到此处,它判断的这3个URL接口名称,恰是支付的,估计是它排除掉不是它的接口。

这里直接对它进行HOOK,我使用的是frida(雷电4模拟器环境),我们对这个signEncdata函数进行分析它具体的传参,根据代码过程大概判断出,str是URL,剩余2个,拭目以待。

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        }

…………

结果就是,该HOOK代码并没有触发,也就是并没有执行到此处,但是我们发现当前class处几乎每个函数都是加密相关,我对他们进行了逐一HOOK,最终发现encypt函数有了反应。

如下面图所示:

但是代码没有能正常解析出来,具体它的参数打印出来的是:

[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×tamp=1635639827&is_reentry=0&skey=v0aaf855a20617de1e4cf7b447711a49[encypt] -->  pskey:D2bVXKh4GsqkNgFevM37b3Qf8h6yNyC4F4-e937-w58_

参数名我是根据查找调用它的上一层代码进行翻译出来的,如图片箭头所示:

这些数据最长的就是postdata,也就是它发出去的数据的明文。

这个函数触发了2次,第一次估计是在支付之前获取某些信息,而第二次则是提交支付密码(参数p,也是加密后的)以及token_id(支付订单号)进行完成支付。

而skey估计则是cookie之类的关键token。

枯燥无味的分析

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

 

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

L_0x01b4:            com.tenpay.ndk.DesEncUtil r0 = com.tenpay.sdk.basebl.EncryptRequest.des     // Catch:{ all -> 0x01cc }            java.lang.String r2 = r8.toString()     // Catch:{ all -> 0x01cc }            postdata2 = keyIndex            r0.encryptDes(postdata2, r2)     // Catch:{ all -> 0x01cc }

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

var DesEncUtil = Java.use("com.tenpay.ndk.DesEncUtil");       DesEncUtil['encryptDes'].overload('int', 'java.lang.String').implementation = function(key,data){           var ret = this.encryptDes(key,data)           console.log("[encryptDes] data -->  "+data)           console.log("[encryptDes] key -->  "+key)           console.log("[encryptDes] ret -->  "+ret)           return ret        }

以下HOOK出来的打印数据:

[encryptDes] data -->  pskey=D2bVXKh4GsqkNgFevM37b3Qf8h6yNyC4F4-e937-w58_&skey=v0aaf855a20617de1e4cf7b447711a49&uin=276265453&skey_type=0&h_net_type=WIFI&h_model=android_mqq&h_edition=84&h_location=2F55FF2C8A2AA4435A87356EA9373F29%7C%7CMI%209%7C7.1.2%2Csdk25%7C3E2A52202DF351F3821979EE78BEB82C%7CD41D8CD98F00B204E9800998ECF8427E%7C1%7C&h_qq_guid=3E2A52202DF351F3821979EE78BEB82C&h_qq_appid=537100433&h_exten=[encryptDes] key -->  8[encryptDes] ret -->  true ------ [encryptDes] data -->  pskey=D2bVXKh4GsqkNgFevM37b3Qf8h6yNyC4F4-e937-w58_&token_id=5M460db95537d6b5adb2a100c1870f77&p=31363335363339383237F0D6C4CEE093903BFD05D6303A581B97E8442ABD7934E8CCC9D71AAF6B60BD5186B12729677B20A25232EDECB539B81775F69AD79B48AF90B0D96BD8AB1D18E3EEAC513F451010C782F3919935171EA650F937A4C733865ECE77E9B4352D6BE6360D50605106FD9581221F92A809A42FC8617884EEAD942F721C71A3A32B9A642F94676A49F7C74E45B0D7B62802809FDEE2EE68×tamp=1635639827&is_reentry=0&skey=v0aaf855a20617de1e4cf7b447711a49&h_net_type=WIFI&h_model=android_mqq&h_edition=84&h_location=2F55FF2C8A2AA4435A87356EA9373F29%7C%7CMI%209%7C7.1.2%2Csdk25%7C3E2A52202DF351F3821979EE78BEB82C%7CD41D8CD98F00B204E9800998ECF8427E%7C1%7C&h_qq_guid=3E2A52202DF351F3821979EE78BEB82C&h_qq_appid=537100433&h_exten=[encryptDes] key -->  8[encryptDes] ret -->  true

我们看到,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没去看)

本作品采用《CC 协议》,转载必须注明作者和本文链接
定位把整个apk拖入jadx-gui后,初始化检索之后可以直接通过网址进行定位。!看到此处,它判断的这3个URL接口名称,恰是支付的,估计是它排除掉不是它的接口。结果就是,该HOOK代码并没有触发,也就是并没有执行到此处,但是我们发现当前class处几乎每个函数都是加密相关,我对他们进行了逐一HOOK,最终发现encypt函数有了反应。
本案入选最高人民法院《民法典颁布后人格权司法保护典型民事案例》。遂判决孙按照侵权行为所获利益支付公共利益损害赔偿款34000元,并向社会公众赔礼道歉。
本文研究了国外应对勒索攻击的最新举措,并提出了我国推进勒索攻击治理法治化、强化关键信息基础设施网络安全保护、加强组织或国际间合作等建议。
非法获取公民个人信息的行为对众多不特定公众的信息权益造成侵害,严重损害了社会公共利益。今年2月,汨罗市检察院以侵犯公民个人信息罪对被告人钟提起公诉。钟对附带民事公益诉讼判决部分不服,提起上诉。
后对方称需要三连单才可以返钱,事主按照对方要求向对方转账两单分别为319元、998元,第三单对方称需要转2980元,事主转账后对方称事主未完成任务,需要继续再刷2次2980元的单子,事主表示要退款,对方称只有完成订单才能退钱,遂事主报警。刷单本身就属违法行为,切不可参与!兼职要通过正规渠道,一旦被,请及时报警。
北京朝阳区人民法院认为,凌胜、凌瑞的行为已构成盗窃罪,分别判处有期徒刑十二年,罚金人民币二十万元,剥夺政治权利二年等。
为了特殊服务的验资款 客服说平台提供异性特殊服务,但需要验资,王随即打了2万元验资款。为了尽快拿回验资款,王陆续充值20万元,将APP会员升到了VIP7。警方提醒网上的一切陌生链接不要点很多特殊服务都是由诈骗团伙雇用专门的键盘手运营APP是假的美女也是假的一定要擦亮眼睛把持住才能让钱包不亏空才能让内心不自责
填写个人信息、参与视频会议、提供短信验证码、远程电脑操作......继新密警方成功破获全国首起利用数字人民币电信诈骗案件后,类似的“隐形高科技”犯罪在贵州省玉屏侗族自治县宣告成功破获:“电信诈骗,识别特点往往是大量分散的钱集中到一个账户里面,随即迅速分散开,消失在众多账户中,不同以往,这次犯罪分子利用数字人民币‘Digital Currency(数字货币)/Electeonic Payment(电
目前,夏、张等24名犯罪嫌疑人因涉嫌非法获取计算机信息系统数据罪被闵行警方依法取保候审,案件正在进一步侦办中。网络犯罪猖獗,国际刑警组织截获价值 1.3 亿美元的资产The Hacker News 网站披露, 国际刑警组织宣布,在一项全球打击网络犯罪的活动中,逮捕近 1000 名嫌疑人并扣押价值 1.3 亿美元的虚拟资产。
完善数字人民币相关法律法规、创新技术防范应用,数字人民币将对电信网络诈骗综合治理发挥举足轻重的作用。
VSole
网络安全专家