一、目标
市面上生鲜App一大堆,买菜也确实是高频次的刚需,这些生鲜App还都有一些有意思的共性:
- 大都加壳了
- 大都不好抓包
今天我们分析的是 某生鲜App v9.9.59 的 mfsig 签名。
二、步骤
上jadx
看看这么少的包名和类名,基本可以断定是加壳了。
那就先复习下 某酒店App sign、appcode签名解析(二) 脱壳分析
BlackDex脱壳
脱完壳的结果拖到PC上,赶紧jadx一下,搜一搜 "mfsig"
我去,一个结果都没有。
二种可能,一是 App有别的道道,mfsig签名相关运算和过程都在so里面;另一种可能就是脱壳不干净,关键数据木有出来。
不管是哪种可能,都得再想想别的办法了。
hook_libart
我们观察一下, mfsig签名的值都是 mfsnm 开头。这就有突破点了。
复习下 某种草电商App签名算法解析(一) 把字符串匹配安排上。
if (addrNewStringUTF != null) {
Interceptor.attach(addrNewStringUTF, {
onEnter: function (args) {
if (args[1] != null) {
var string = Memory.readCString(args[1]);
if(string != null) {
if(string.toString().indexOf("mfsnm") >= 0 )
{
console.log("[NewStringUTF] bytes:" + string);
var threadef = Java.use('java.lang.Thread');
var threadinstance = threadef.$new();
var stack = threadinstance.currentThread().getStackTrace();
console.log("Rc Full call stack:" + Where(stack));
console.log(Thread.backtrace(this.context, Backtracer.FUZZY)
.map(DebugSymbol.fromAddress).join("\n"))
}
}
}
},
onLeave: function (retval) {}
});
}
跑起来
frida -U -f cn.mxxxfxxxh.application -l ms.js --no-pause
运气太好了,轻松逮住。
[Pixel 2 XL::cn.mxxxfxxxh.application]-> [NewStringUTF] bytes:mfsnmtyBmRQEmRmAVpF48icnVLkAGJ1KJJ0bGZOGIKWEFIgLLKO7KJK9JKCHJJ5IKk50KZW7I+SII59FG+GHLZcBI654Jl9MKmcDJKWCJkO8IZ95KKP5mBY1ma
Rc Full call stack:dalvik.system.VMStack.getThreadStackTrace(Native Method)
java.lang.Thread.getStackTrace(Thread.java:1720)
cn.mxxxfxxxh.wsg.SecurityLib.nativeSign(Native Method)
cn.mxxxfxxxh.wsg.SecurityLib.a(SecurityLib.java:24)
cn.mxxxfxxxh.wsg.a.a(SecurityManager.java:42)
赤果果的就是这个 nativeSign,之前脱壳出来的代码有用武之地了,盘它。
上Frida
var signatureCls = Java.use('cn.mxxxfxxxh.wsg.SecurityLib');
signatureCls.nativeSign.overload('android.content.Context', 'long', '[B').implementation = function(a,b,c){
var retval = this.nativeSign(a,b,c);
var StrCls = Java.use('java.lang.String');
var inStr = StrCls.$new(c);
console.log(">>> signature inStr = " + inStr);
console.log(" >>> signature rc= " + retval);
return retval;
}
再跑一下,入参和结果都出来了。
TIP: 这里解释一下byte[] 参数的打印,我们通过堆栈回溯,发现
String a = C15603SecurityLib.m17628a(f13866a, C3748b.m17632a(str).getBytes("UTF-8"));
这个byte[] 其实就是String转的,所以我们要打印它,只需要调用String的构造方法就行了。
三、总结
脱壳才是第一生产力,所以要多掌握一些脱壳工具和rom。
套路就是那么的相似,多熟练几个套路,遇到新的App就先都给他安排上。
当我们为生活疲于奔命的时候,生活已经离我们远去。