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

公众号: 奋飞安全
• 阅读 1412

一、目标

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

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

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

二、步骤

32位和64位

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

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

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

var secretKeySpec = Java.use('javax.crypto.spec.SecretKeySpec');
secretKeySpec.$init.overload('[B','java.lang.String').implementation = function (a,b) {
    var result = this.$init(a, b);
    console.log(">>> 算法名" + b);
    return result;
}

// /*
var mac = Java.use('javax.crypto.Mac');
mac.getInstance.overload('java.lang.String').implementation = function (a) {
    // showStacks();
    var result = this.getInstance(a);
    console.log("mac ======================================");
    console.log("算法名:" + a);
    return result;
}

mac.doFinal.overload('[B').implementation = function (a) {
    // showStacks();
    var result = this.doFinal(a);
    console.log("mac ======================================");
    console.log("doFinal参数:" + bytesToString(a));
    console.log("doFinal结果(hex):" + bytesToHex(result));
    console.log("doFinal结果(base):" + bytesToBase64(result));

    // var stack = threadinstance.currentThread().getStackTrace();
    // console.log("Full call stack:" + Where(stack));

    return result;
}
// */

跑一下。

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

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

好幸运,果然就是。

key是多少?

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

先打印堆栈

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

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

算了,加个Hook吧。

var getKeyCls = Java.use("com.jxxxxong.sdk.xxcrashreport.a.z");
getKeyCls.a.overload('[B', '[B').implementation = function(a,b){
        var result = this.a(a,b);

        var StrCls = Java.use('java.lang.String');
        var keyStr = StrCls.$new(b);
        var dataStr = StrCls.$new(a);

        console.log(">>> dataStr=" + dataStr);
        console.log(">>> key=" + keyStr);
        console.log(">>> rc=" + result);
        return result;
}

继续跑下

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

验算下

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

def main():
    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')

    # 890394FD47EB218CADB73B3FFF976CFE571AC255E1BD5F7AFE427CED13B52DBC
    signature = hmac.new(appsecret, data, digestmod=sha256).hexdigest().upper()
    print(signature)

人生苦短,快用Python

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

三、总结

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

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

所以,老板永远是对的

某电商App sign签名算法解析(五) 从你站着的地方挖下去,一定可以挖出清泉来。

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

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

点赞
收藏
评论区
推荐文章
不能Hook的人生不值得 jsHook和模拟执行
一、目标李老板:奋飞呀,上次分析的那个App光能Debug还不够呀,网页中的js也用不了Frida,我还想Hook它的函数,咋搞呀?再有App可以RPC去执行签名,这个js我如何去利用呀?总不能代码都改成js去做请求吧?奋飞:老板呀,你一下提这么多要求,不是明摆着要我们加班吗?这次加班费可得加倍。二、步骤最简单易行的jsHookcon
某电商App sign签名算法解析(六)
一、目标sign的入参是加密的,不过带有很明显的两个特征,一个是结尾,再一个就是R4iSK开头。有这两个特征,我们就可以入手了。二、步骤先从Base64入手结尾的数据大概率是Base64,我们先Hook下//Base64varBase64ClassJava.use("android.util.Base64");Base64Class.e
某神奇App data加密算法解析(一)
一、目标李老板:奋飞呀,我遇到一个超级牛掰的App,它请求的时候有个data参数加密,用尽了你介绍的所有的方法,都找不到它是如何加密的。奋飞:子曾经曰过,老板的嘴,骗人的鬼。有这么牛掰的App,那么我们这帮兄弟早就失业了。某神奇Appv10.1.0点社区随便打开一篇有评论的文章今天的目标就是这个data二、步骤搜索特征字符串目标是data,所以我
某车联网App 通讯协议加密分析
一、目标李老板:最近刚买了辆新车,他带的App挺有意思,要不要盘一盘?奋飞:我去,加壳了,还挺有意思,搞一搞。v6.1.0二、步骤抓包我的抓包环境是Mac10.14.6httpToolKit,这一步很顺利的抓到包了。1:main可以看到,http请求和返回值都是加密的,我们的目标就是这个 request 和 response的来历的。脱壳
某站App签名算法解析(一)
一、目标我们来分析某站App的sign签名算法,先搜索一下游戏,抓包结果:二、步骤这个sign依然是32位的字符串都9020年了,这种规模用户的App应该是不会裸奔在java层了,我们就直接一点,在so里面搜索sign可惜没有结果……藏起来的东西一定是重要的东西so层导出函数给java层调用,有两种方法,一种是静态注册,直接会体现在so的导出表
手把手教你从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 sign签名分析 复习下之前的技巧
一、目标现在内容电商,社交电商,直播电商等等概念多的眼花缭乱,终极目的就一条,卖货给你。正如我们分析他的sign签名一样,套路就一条,jadxfrida这个sign数了数,正好32位,难道是md5?二、步骤上jadx先搜索下"sign"记得带上引号。结果只有40多个,而且第二个开上去就有眼缘,点进去看看Stringam7166a(b
某小说App返回数据 解密分析
一、目标李老板:奋飞呀,最近被隔离在小区里,没啥可干的呀。奋飞:看小说呀,量大管饱。我们今天的目标就是某小说Appv20210953二、步骤搜索url字符串App请求小说内容的时候没有加签名,但是返回的数据是加密的。那么我们先去jadx搜索一下这个url(novelcontent),看看有没有发现。结果是没有收获。那么很有可能这个url不是在apk中写
某音乐App 抓包和signature签名分析
一、目标李老板:奋飞呀,最近我想下个歌,现在听歌软件都这么顽固了,包都抓不到?奋飞:抓不到包的原因太多了,咱们得用排除法分析下。某音乐App10.8.4二、步骤排查协议李老板也跟我们混了这么多期,所以基本排除抓包环境的问题。那么另一个可能就是像某手使用的quic协议或者某鱼使用的spdy协议了。上jadx搜一下"quic",如果搜不到还可
公众号:  奋飞安全
公众号: 奋飞安全
Lv1
奋飞,国家高级信息系统项目管理师,独立安全研究员。 http://91fans.com.cn/
文章
60
粉丝
4
获赞
44