某电商App sign签名算法解析(五)

一、目标

李老板: 奋飞呀,据说某电商App升级了,搞出了一个64位的sign。更牛的是入参都加密了!

奋飞:这么拉风,拉出来咱们盘盘。

main.png v10.3.2

二、步骤

32位和64位

我们掌握了那么多方法,先搜字符串呢?还是先Hook呢?

子曾经曰过:看到32位签名就要想起MD5和HmacSHA1,看到64位签名就要想起HmacSHA256。

那就先搞搞java的密码学相关函数:

1var secretKeySpec = Java.use('javax.crypto.spec.SecretKeySpec'); 2secretKeySpec.$init.overload('[B','java.lang.String').implementation = function (a,b) { 3 var result = this.$init(a, b); 4 console.log(">>> 算法名" + b); 5 return result; 6} 7 8// /* 9var mac = Java.use('javax.crypto.Mac'); 10mac.getInstance.overload('java.lang.String').implementation = function (a) { 11 // showStacks(); 12 var result = this.getInstance(a); 13 console.log("mac ======================================"); 14 console.log("算法名:" + a); 15 return result; 16} 17 18mac.doFinal.overload('[B').implementation = function (a) { 19 // showStacks(); 20 var result = this.doFinal(a); 21 console.log("mac ======================================"); 22 console.log("doFinal参数:" + bytesToString(a)); 23 console.log("doFinal结果(hex):" + bytesToHex(result)); 24 console.log("doFinal结果(base):" + bytesToBase64(result)); 25 26 // var stack = threadinstance.currentThread().getStackTrace(); 27 // console.log("Full call stack:" + Where(stack)); 28 29 return result; 30} 31// */

跑一下。

TIP: 记得参考之前的文章 http://91fans.com.cn/post/ldqsignone/ 把frida端口号改改

rc1.png

好幸运,果然就是。

key是多少?

HmacSHA256 和 md5之类的区别是: 它是传一个key的。我们尝试把这个key找出来。

先打印堆栈

1Full call stack:dalvik.system.VMStack.getThreadStackTrace(Native Method) 2java.lang.Thread.getStackTrace(Thread.java:1720) 3javax.crypto.Mac.doFinal(Native Method) 4com.jxxxxong.sdk.xxcrashreport.a.z.a(XXCrashReportFile:63) 5com.jxxxxong.sdk.xxcrashreport.a.z.a(XXCrashReportFile:136) 6com.jxxxxong.sdk.xxcrashreport.a.o.Ve(XXCrashReportFile:154) 7com.jxxxxong.sdk.xxcrashreport.a.o.<init>(XXCrashReportFile:135) 8com.jxxxxong.sdk.xxcrashreport.a.o.<init>(XXCrashReportFile:37) 9com.jxxxxong.sdk.xxcrashreport.a.o$a.Vf(XXCrashReportFile:245) 10com.jxxxxong.sdk.xxcrashreport.a.ai$a.run(XXCrashReportFile:133)

本来想直接从静态代码里把这个key找出来,结果被绕来绕去搞的头晕。

算了,加个Hook吧。

1var getKeyCls = Java.use("com.jxxxxong.sdk.xxcrashreport.a.z"); 2getKeyCls.a.overload('[B', '[B').implementation = function(a,b){ 3 var result = this.a(a,b); 4 5 var StrCls = Java.use('java.lang.String'); 6 var keyStr = StrCls.$new(b); 7 var dataStr = StrCls.$new(a); 8 9 console.log(">>> dataStr=" + dataStr); 10 console.log(">>> key=" + keyStr); 11 console.log(">>> rc=" + result); 12 return result; 13}

继续跑下

rc2.png

验算下

明文有了,key有了,结果也有了。我们可以来验算下了。

1def main(): 2 data = "yingyan&R4iSKKKKKKKKKK3Ckm6NCKyP4XpntPMcsmTiVIdoeOlPYBLNS1PK0O4e747X79c5P3zFQbh3LbJlFUCRaaIQTPKmipOYkJUu6OAqZT1xx6MMacwy/v5yxRvbdYAwdhXVCF7zmi+DHbQ16PPDpn/R9PPnPifGbirJeG9yKKKK&R4iSKKKKKKKKKBC0CtGnLKMgYWz/LGKKKK==&android&10.3.2&R4iSKKKKKKKKKOlFz0/FIGUKUpUcZGYKKKK=&R4iSKKKKKKKKKKlShOtDUJLIsFKLKA589d0AKKKK&uvReport&R4iSKKKKKKKKKNC0KKNrTV2rKqKKKK==&huawei&R4iSKKKKKKKKKNC0CJRGCtS3DKSK/BvloKuKKKK=&E1.1&1641614274084&R4iSKKKKKKKKKNDBjBK0JNG1DurECbE0iBGOKNhLaV4GKKKK".encode('utf-8') 3 4 # 890394FD47EB218CADB73B3FFF976CFE571AC255E1BD5F7AFE427CED13B52DBC 5 signature = hmac.new(appsecret, data, digestmod=sha256).hexdigest().upper() 6 print(signature)

人生苦短,快用Python

收工~ 休息一下,入参的加密明天搞吧。

三、总结

重新抓了一下包,比对了一下 &sign=xxx&sv=xxx 模式的签名依然存在,大概率算法没变。

64位的sign之前的版本也存在,大概率也没变。

所以,老板永远是对的

ffshow.jpeg 从你站着的地方挖下去,一定可以挖出清泉来。

TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。

关注微信公众号: 奋飞安全,最新技术干货实时推送

点赞
收藏

评论区

加载中...

相关推荐

不能Hook的人生不值得 jsHook和模拟执行

一、目标李老板:奋飞呀,上次分析的那个App光能Debug还不够呀,网页中的js也用不了Frida,我还想Hook它的函数,咋搞呀?再有App可以RPC去执行签名,这个js我如何去利用呀?总不能代码都改成js去做请求吧?奋飞:老板呀,你一下提这么多要求,不是明摆着要我们加班吗?这次加班费可得加倍。二、步骤最简单易行的jsHookcon

某神奇App data加密算法解析(一)

一、目标李老板:奋飞呀,我遇到一个超级牛掰的App,它请求的时候有个data参数加密,用尽了你介绍的所有的方法,都找不到它是如何加密的。奋飞:子曾经曰过,老板的嘴,骗人的鬼。有这么牛掰的App,那么我们这帮兄弟早就失业了。某神奇Appv10.1.0点社区随便打开一篇有评论的文章今天的目标就是这个data二、步骤搜索特征字符串目标是data,所以我

某电商App sign签名算法解析(六)

一、目标sign的入参是加密的,不过带有很明显的两个特征,一个是结尾,再一个就是R4iSK开头。有这两个特征,我们就可以入手了。二、步骤先从Base64入手结尾的数据大概率是Base64,我们先Hook下//Base64varBase64ClassJava.use("android.util.Base64");Base64Class.e

手把手教你从Apk中取出算法

一、目标李老板:奋飞呀,我最近从Apk里面跟踪到一个算法,代码清晰,但是我不会java,把他翻译成python貌似挺费劲的,有没有轻松省力的方法呀?奋飞:有的呀,给我加工资,我来翻译。某电商Appv10.4.5,升级之后老有小伙伴说他的sign算法变了,其实他就是做了点小动作。sign参数没有动,uuid是明文去做签名,但是抓包请求里面找不到明文uu

在Frida里面做http请求: 聊聊jar to dex

一、目标李老板:奋飞呀,你hook这个App之后拿到token,然后上报给我的服务器好不好?奋飞:木问题。二、步骤gumjshttp在frida里面做http请求,最根正苗红的必须是gumjshttp,大胡子出品,有保障可惜的是我没有搞明白,李老板催的紧,木有时间去慢慢研究了。先搞个Server测试子曾经曰过:人生苦短,快用Python。不过

某小说App返回数据 解密分析

一、目标李老板:奋飞呀,最近被隔离在小区里,没啥可干的呀。奋飞:看小说呀,量大管饱。我们今天的目标就是某小说Appv20210953二、步骤搜索url字符串App请求小说内容的时候没有加签名,但是返回的数据是加密的。那么我们先去jadx搜索一下这个url(novelcontent),看看有没有发现。结果是没有收获。那么很有可能这个url不是在apk中写