一、目标
App升级了,可是他的算法是否也升级了呢?这是个问题。我们需要来快速验证下,否则李老板就要抓狂了。
二、分析
在之前的 某电商App签名算法解析(一) 中我们定位了 com.xxxxxxxx.common.utils.BitmapkitUtils 类 和他的 getSignFromJni 函数是计算sign的关键函数。
在新版本里面,我们先用Objection来hook一下 com.xxxxxxxx.common.utils.BitmapkitUtils
objection -g com.xxxxxxxx.app.mall explore
android hooking watch class 'com.xxxxxxxx.common.utils.BitmapkitUtils'
然后从App中,打开任意商品页面:
(agent) [3688199735633] Called com.xxxxxxxx.common.utils.BitmapkitUtils.loadBMP()
(agent) [3688199735633] Called com.xxxxxxxx.common.utils.BitmapkitUtils.isFuncAvailable()
(agent) [3688199735633] Called com.xxxxxxxx.common.utils.BitmapkitUtils.loadBMP()
(agent) [3688199735633] Called com.xxxxxxxx.common.utils.BitmapkitUtils.getSignFromJni(android.content.Context, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
完美,说明函数入口没有变化,依然是 getSignFromJni 做的签名。
再来核对一下入参和返回值,是不是和抓包结果一致:
android hooking watch class_method 'com.xxxxxxxx.common.utils.BitmapkitUtils.getSignFromJni' --dump-args --dump-return
依然很OK,看到了熟悉的sign的值。
(agent) [1921806846023] Arguments com.xxxxxxxx.common.utils.BitmapkitUtils.getSignFromJni("<instance: android.content.Context, $className: com.xxxxxxxx.app.mall.JDApp>", "asynInteface", "{\"intefaceType\":\"asynIntefaceType\",\"skuId\":\"10026198901146\"}", "xxc930c5dcfe67xx", "android", "9.4.2")
(agent) [1921806846023] Return Value: "st=1615000030090&sign=7841200ddd83d8cda0828b1cae56b41e&sv=110"
现在就是最后一步了,验算sign结果是否和之前的版本一样。 这就要参考 算法还原的助手(一) 先让时间停下来, 把gettimeofday和lrand48的值固定下来。
翻出 知识星球 里面去年(庚子鼠年) 写的 Unidbg模拟执行大厂so实操教程 ,把新版本的apk载入一下。
// vm = emulator.createDalvikVM(new File("/Users/fenfei/Desktop/V9.2.2.85371_T1_350271430_lc029.apk"));
vm = emulator.createDalvikVM(new File("/Users/fenfei/Desktop/V9_4_2.apk"));
跑一跑
st=1606701201628&sign=59039230dc2e1ea27a4f250d9ec81b8c&sv=111
destroy
run
这个值很眼熟哦。
三、总结
快速验证算法是否升级,首先需要把变量固定下来。磨刀不误砍柴工,你的努力总会在恰当的时候发出耀眼的光芒。
天光亮,自然醒,之后二十四小时也没有一定要做的事情。于是,欢喜。
关注微信公众号,最新技术干货实时推送