一、目标
李老板: 奋飞呀,最近更新的都是些小App,要不要分析个大点的?
奋飞: 你是老板,你说了算喽。
大公司果然大气,人家签名是一个字段,他直接一堆字段。
main.pngmtgsig 就是我们今天的目标
二、步骤
Jadx搜索 “mtgsig”
结果
public static final String MTG_SIG_HEADER = "mtgsig";
继续Jadx MTG_SIG_HEADER
找到了这个 makeHeader 函数
s1.pngHook之
var signCls = Java.use("com.mxx.android.common.mtguard.wtscore.plugin.sign.core.WTSign");
signCls.makeHeader.implementation = function(a,b){
var rc = this.makeHeader(a,b);
console.log(">>> rc=" + rc);
return rc;
}
跑起来
>>> rc={"a0":"1.5","a1":"9b69f861-e054-4bc4-9daf-d36ae205ed3e","a2":"73a251e151ab949912ab68226ab96799b478eb2a","a3":2,"a4":1619572653,"a5":"OgkiOY9ddFObzxjxdyEibG6zSvjMTm+1miRg447HjfNOCqFrudZ/vrOpk6hai/+TacmmG83UPjqoWk1mQlHcIxCSzerxptOiGEaOt25zjBGPhjHt1sg9bhqg/mnWDTYUNA25WxMDtFxX9r8OZFJjH/cU3MhTSEkgTmw+pYDawdJbPF4CwrO99app5xY82x/4nZD/1CHYcggE1gkepGw5LF2gaJsDHqtLVNHb/DKL8UWdMNohVPYTXIX5Q2oPvxqVyQefBBat15vf9levYWKLfMVQ4xCfCfbbCBzixUb8VKw7JM9tzArMqpkbM+lM","a6":0,"d1":"9f3b94a2f89b7830da8c16ed73e7419e83870877"}
没问题,就是他了, 收工回家
RPC调用前的准备
李老板:奋飞呀,友司都已经 996 ,007 了,咱们起码不能6点就准时下班吧? 这样下去我下午和别的老板吹牛X的时候会被笑话的。
奋飞: 那好吧,你是老板,你说了算喽。 咱们6点01分下班,把公司门口的表调慢一分钟。以后你就是新时代的李扒皮了,够拉轰吧。
我们观察下 makeHeader 函数, 第一个参数是 byte[] 类型,第二个参数是枚举型。 用我们之前的 bytesToString 函数打印下
console.log("a=" + bytesToString(a));
console.log("b=" + b);
console.log(">>> rc=" + rc);
好的,没问题,入参清晰了。
a=GET /mop/entry/guideLayerEntry __reqTraceID=bf7c285b-f476-425d-805f-2c33abd974cb&ci=10&latlng=&model=MI%20NOTE%20Pro&msid=8673020214763141619572366484&userid=-1&utm_campaign=AgroupBgroupC0E0Ghomepage&utm_content=867302021476314&utm_medium=android&utm_source=wandoujia&utm_term=1100080206&uuid=00000000000002EE5C4ACB0554DCE9FFF3AB6EA7AA1740000000000000108337&version_name=11.8.206
b=FAST
>>> rc={"a0":"1.5","a1":"9b69f861-e054-4bc4-9daf-d36ae205ed3e","a2":"fc568f7eff071afdc5d12aaf0eeb9dc734fbed7a","a3":2,"a4":1619572653,"a5":"OgkiOY9ddFObzxjxdyEibG6zSvjMTm+1miRg447HjfNOCqFrudZ/vrOpk6hai/+TacmmG83UPjqoWk1mQlHcIxCSzerxptOiGEaOt25zjBGPhjHt1sg9bhqg/mnWDTYUNA25WxMDtFxX9r8OZFJjH/cU3MhTSEkgTmw+pYDawdJbPF4CwrO99app5xY82x/4nZD/1CHYcggE1gkepGw5LF2gaJsDHqtLVNHb/DKL8UWdMNohVPYTXIX5Q2oPvxqVyQefBBat15vf9levYWKLfMVQ4xCfCfbbCBzixUb8VKw7JM9tzArMqpkbM+lM","a6":0,"d1":"2d1d2f72034de8360ee6e21f29837e94d5254857"}
那么下一步就是构造个字符串,转成 byte[] ,然后调用下 makeHeader 不就OK了。
感觉有点麻烦,李老板这么坏,咱们得摸会鱼,前几天在清华公开课学的 摸鱼学导论 得用上,我们讲究学以致用。
var signCls = Java.use("com.meituan.android.common.mtguard.wtscore.plugin.sign.core.WTSign");
signCls.makeHeader.implementation = function(a,b){
var rc = this.makeHeader(a,b);
var StrCls = Java.use('java.lang.String');
var OutStr = StrCls.$new("GET /mop/entry/guideLayerEntry __reqTraceID=bf7c285b-f476-425d-805f-2c33abd974cb&ci=10&latlng=&model=MI%20NOTE%20Pro&msid=8673020214763141619572366484&userid=-1&utm_campaign=AgroupBgroupC0E0Ghomepage&utm_content=867302021476314&utm_medium=android&utm_source=wandoujia&utm_term=1100080206&uuid=00000000000002EE5C4ACB0554DCE9FFF3AB6EA7AA1740000000000000108337&version_name=11.8.206");
var myRc = this.makeHeader(OutStr.getBytes(),b);
console.log("#### myRc=" + myRc);
console.log("a=" + bytesToString(a));
console.log("b=" + b);
console.log(">>> rc=" + rc);
return rc;
}
我们偷个懒,直接在Hook这个函数的时候,写死一个字符串值,然后 getBytes 转成 byte[] ,直接调用下看看结果:
#### myRc={"a0":"1.5","a1":"9b69f861-e054-4bc4-9daf-d36ae205ed3e","a2":"fc568f7eff071afdc5d12aaf0eeb9dc734fbed7a","a3":2,"a4":1619574692,"a5":"g/pDS/G/6rmL0K1YP94jPk7oWNSpEp+MuACRTKqTgl+oUG/rIn7XPv/bvLjNRK80rtInhRbJGKfrpXXqw3CLreUr7q0fGBQfrcGL15kJQ66OaVBkvlt3fH2WsqpgTanIKvGNmTtT4hfJfIe0y1JcbGA0xW0V69I6L3jBaCiE6E54HsNtGSaCAnBBn5jzRpe88vtx+MTB3FGdme/cLlHcDGTyBNP4tbKXseHLT2wvUrlLDYiWxAHYNkoREwtpKZns1xUyJRSl1EfvPE3R2Jo4/8OtEYlu9NiS6BJ9VRrH+nwKzW5VSDrXZmXXk55E","a6":0,"d1":"c5a9bf4c610171f14c20559dd34154ecb35ccfb3"}
结果证明:
- 入参一致的情况下,a0 a1 a2 不变, a3 看上去像是时间戳, a5 和 d1的值不一样了。
后面我们不管是实际来RPC调用或者用unidbg来跑就心里有底了。
三、总结
大公司还是有大公司的特点,人家工资高,工作时间长,必然是要搞的复杂点。
然后就是分析的时候还是得多掌握几门手艺,先简单明了的验证下,再进行下一步。不要贸然写一堆代码下去,这年头代码这么贵,先打个草稿不香吗?
ffshow.jpeg我认为,对世界的状态唉声叹气没什么意义,除非你能想到什么方式来改进它。否则,要么老实搬砖,要么去找个公园,躺着晒太阳吧。 ----海淀野生仁波切
网友评论