搞個大點的 某團購App mtgsig


一、目標

李老板: 奮飛呀,最近更新的都是些小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 討論下。

關注微信公眾號 奮飛安全,最新技術干貨實時推送


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM