0

fenfei331的个人空间

 3 years ago
source link: https://my.oschina.net/u/4918684/blog/5037156
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

李老板: 奋飞呀,最近更新的都是些小App,要不要分析个大点的?

奋飞: 你是老板,你说了算喽。

大公司果然大气,人家签名是一个字段,他直接一堆字段。

mtgsig 就是我们今天的目标

Jadx搜索 “mtgsig”

public static final String MTG_SIG_HEADER = "mtgsig";

继续Jadx MTG_SIG_HEADER

找到了这个 makeHeader 函数

Hook之

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调用前的准备

李老板:奋飞呀,友司都已经 996007 了,咱们起码不能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来跑就心里有底了。

大公司还是有大公司的特点,人家工资高,工作时间长,必然是要搞的复杂点。

然后就是分析的时候还是得多掌握几门手艺,先简单明了的验证下,再进行下一步。不要贸然写一堆代码下去,这年头代码这么贵,先打个草稿不香吗?

我认为,对世界的状态唉声叹气没什么意义,除非你能想到什么方式来改进它。否则,要么老实搬砖,要么去找个公园,躺着晒太阳吧。 ----海淀野生仁波切

TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。

关注微信公众号 奋飞安全,最新技术干货实时推送


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK