一、目标
市面上生鲜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就先都给他安排上。
当我们为生活疲于奔命的时候,生活已经离我们远去。
TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。
关注微信公众号: 奋飞安全,最新技术干货实时推送