某雪冰城sha256withrsa

上期分析了某幸咖啡,是一个白盒aes,难度稍微有点大,是so的,这期想来分析下某雪冰城,下期还是有关奶茶的.
就如标题所说,sha256withrsa,这个碰到的就比较少了,这个是什么加密方式呢?就是名字里的意思,明文先sha256哈希后给rsa加密,rsa是非对称加密,有公钥和私钥,一般是公钥加密,私钥解密,并且私钥比公钥要长很多,私钥也可以推出公钥,反过来不行.
rsa常见的秘钥位数有以下几种,1024 位、2048 位和 4096 位,分别是128字节,256字节,512字节,这个争对的是公钥来说的,这个某雪冰城有点反常,它把私钥放到了app里,公钥放到服务器,不知道写这个app的程序员是怎么想的,要下岗了.

首先抓个包

在这里插入图片描述

有个时间戳和sign是变化的,shopid就是商家id,appid是固定的
所以关注点就是就是这个sign了

脱壳

加密做不好,只能期望这个壳可以保护它
在这里插入图片描述

360加固,主要是整体加固,把未脱壳的反编译一下
在这里插入图片描述
看到了qihoo,没错就是奇虎360的,可以看到反编译出来的类很少,相关的dex都隐藏起来了,只有执行这个app的时候才会在内存中解密,整体加固的壳还是很好脱的,还是fart脱壳机
dex文件已经上传到123云盘https://www.123pan.com/s/4O7Zjv-O9nBd.html

定位

在这里插入图片描述

这里的字符串没有加密,可以直接搜到,不过有点多,可以排除几个系统的类在跟过去,这样的话略显麻烦.
有更简单的方式,hook hsahmap的put方法或者base64的encodeToString都可以找到,因为表单的参数很喜欢这样添加,sign的结果里有+/=也像是base64过的.

function call(){
    Java.perform(function () {
        var hashMap = Java.use("java.util.HashMap");
        hashMap.put.implementation = function (a, b) {
            if (a != null && a.equals("sign")) {
                console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()))
                console.log("hashMap.put: ", a, b);
            }
            return this.put(a, b);
        }
    })
}
function call(){
    Java.perform(function () {
    let Base64 = Java.use("android.util.Base64");
Base64["encodeToString"].overload('[B', 'int').implementation = function (input, flags) {
    console.log(`Base64.encodeToString is called: input=${input}, flags=${flags}`);
    let result = this["encodeToString"](input, flags);
    console.log(`Base64.encodeToString result=${result}`);
    return result;
};
    })
}

直接搜这个类即可
在这里插入图片描述
最终会是java层的加密,没有so的,所以这里定位就讲详细点吧,顺便分享一些技巧
在这里插入图片描述

只勾类名可以搜的快点

在这里插入图片描述
有sign字眼,直接搜也是可以定位到这里的,从a方法点过去
在这里插入图片描述
先分析下函数里的范围,然后点一下return的位置,优先看返回值,因为最终结果是通过返回值返回回去的,有的时候是通过参数返回回去的,比如往一个map里添加或者stringbuilder里添加,这种就要关注参数.
在这里插入图片描述
有两处,如果你来分析的话你觉得那处可能性大,当然可以两个都hook下,凭直觉应该优先考虑后面的,前面一个返回的是proxy.result,并且初看并没有对传参的map做什么处理,hook一下下面的

let e = Java.use("com.mxbc.mxsa.network.feima.e");
e["a"].overload('java.lang.String').implementation = function (str) {
    console.log(`e.a is called: str=${str}`);
    let result = this["a"](str);
    console.log(`e.a result=${result}`);
    return result;
};

直接右键复制frida片段即可,省的写一些重载的代码.发个包验证下就是这里.有的时候猜流程可以节省很多时间,尤其是分支比较多的时候.
在这里插入图片描述
点过去就到这里了,还是优先看函数的范围及返回值,可以看到base64以及privateKey以及sha256withrsa字眼,hook一下base64的encodetostring方法发现就是这里.
写个java层的主动调用,这样手机就可以息屏了,wifi也可以关掉了,尽量减少网络请求,事实上,分析其他app也是这样的分析流程,主动调用几乎是必不可少的,相当于手上有一个发包的按钮,并且可以确保只用一次,如果你hook一个so的函数,你在app界面上点击会发出很多请求,很多加密都走这个流程,会严重影响调试,这也是java层的一个技巧,也可以配合着hook so使用.

function call2(){
    var str = 'appId=ba660596c1d911ebabac005056883e3e&t=1711598878330'
    Java.perform(function (){
        let e = Java.use("com.mxbc.mxsa.network.feima.e");
        var res = e["a"](str)
        console.log('res',res)
    })
}

外面包一个函数,调用的时候直接call2()就好了.
中间的也没有什么好分析的,看java代码就好了,只不过这里app写的有点不安全,它竟然用私钥拿来加密,这个错误有可能会产生很严重的后果,私钥可以推出公钥.后续的可操作性就很大了.

总结

就分析到这里了,java层的没什么好分析的,安全性比某幸咖啡差了很多,新手可以拿来练练手
下期接着分析奶茶类的,分析完就换个行业.
文章老是莫名被某sdn删掉,然后还审核不通过,后面估计发自己博客了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨如画.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值