上期分析了某幸咖啡,是一个白盒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删掉,然后还审核不通过,后面估计发自己博客了