吾愛破解 - LCG - LSG |安卓破解|病毒分析|破解軟件|www.ycnqhj.icu

 找回密碼
 注冊[Register]

QQ登錄

只需一步,快速開始

搜索
查看: 1495|回復: 8
上一主題 下一主題

[Android 原創] 淘寶系MtopSDK逆向分析(一)

[復制鏈接]
跳轉到指定樓層
樓主
xyjwfn 發表于 2019-10-4 12:40 回帖獎勵

經過上一篇文章分析ANetwork框架的基礎運行方式后,本篇文章準備分析一下MtopSDK的初始化流程,如果大家還不知道Mtop在移動端App里面干啥的建議先讀一下《移動API網關
這篇文章簡單了解MtopSDK。

話不多說,直接開始分析先將文件定位到Lmtopsdk/mtop/intf/Mtop;這個類上:

.field protected static final instanceMap:Ljava/util/Map;
.field final initTask:Lmtopsdk/mtop/global/init/IMtopInitTask;  
.field volatile instanceId:Ljava/lang/String;
.field final mtopConfig:Lmtopsdk/mtop/global/MtopConfig;

里面有幾個重要的實例屬性:

  • instanceMap(存放Mtop實例的)
  • initTask(初始化任務)
  • instanceId(實例ID可能為: OPEN、INNER、PRODUCT)
  • mtopConfig(MTOP配置信息)

那Mtop這個類是如何構造的呢?細看之下會發現Mtop只有一個私有的構造方法:

.method private constructor <init>(Ljava/lang/String;Lmtopsdk/mtop/global/MtopConfig;)V

翻譯成Java代碼大概就是這樣:

private Mtop(String instancceId, MtopConfig config){
    ...
}

MtopConfig稍后再來分析,再繼續往下分析Mtop類還有個私有init方法和幾個靜態instance的方法:

.method private declared-synchronized init(Landroid/content/Context;Ljava/lang/String;)V
.method public static instance(Landroid/content/Context;)Lmtopsdk/mtop/intf/Mtop;
.method public static instance(Landroid/content/Context;Ljava/lang/String;)Lmtopsdk/mtop/intf/Mtop;
.method public static instance(Ljava/lang/String;Landroid/content/Context;)Lmtopsdk/mtop/intf/Mtop;
.method public static instance(Ljava/lang/String;Landroid/content/Context;Ljava/lang/String;)Lmtopsdk/mtop/intf/Mtop;

因為init方法是個私有的,不太可能從外部調用,所以直接先看下幾個instance方法。雖然instance有好幾個重載形式,但最終都還是調用的instance(Ljava/lang/String;Landroid/content/Context;Ljava/lang/String;),簡單的翻譯成Java代碼如下:


public static instance(Context ctx){
    instanec(ctx, null, null);
}

public static instance(Context ctx,String ttid){
    instanec(null, ctx, ttid);
}

public static instance(String instanceId, Context ctx){
    instanec(instanceId, ctx, null);
}

public static instance(String instanceId, Context ctx,String ttid){

}

知道最終的走向后,咱們就直接分析第四個instance方法就行啦,smali代碼就不貼了直接轉成Java方便閱讀:

public static instance(String instanceId, Context ctx,String ttid){
    if(instanceId == null){
        instanceId = "INNER";
    }

    Mtop mtop = instanceMap.get(instanceId); //獲取mtop實例
    if(mtop == null){
       synchronized (Mtop.class){
            mtop = instanceMap.get(instanceId); //獲取mtop實例
            if(mtop == null){
                Map<String, MtopConfig> mtopConfigs = MtopSetting.mtopConfigMap;
                MtopConfig config  = mtopConfigs.get(instanceId);
                if(config == null){
                    config = new MtopConfig(instanceId);
                }
                mtop = new MTop(instanceId, config);
                config.mtopInstance = mtop;

                //MtopSetting.mtopConfigMap.put(instanceId, config);
                instanceMap.put(instanceId, mtop);
            }
       }
    }

    if(mtop.isInit){
        return mtop;
    }

    mtop.init(ctx,ttid);
    return mtop;
}

上面的instance方法差不多就是創建Mtop實例、調用init方法,所以再來看一個Mtop的構造方法:

.method private constructor <init>(Ljava/lang/String;Lmtopsdk/mtop/global/MtopConfig;)V
    ...
    iput-object p2, p0, Lmtopsdk/mtop/intf/Mtop;->mtopConfig:Lmtopsdk/mtop/global/MtopConfig;

    invoke-static {p1}, Lmtopsdk/mtop/global/init/MtopInitTaskFactory;->getMtopInitTask(Ljava/lang/String;)Lmtopsdk/mtop/global/init/IMtopInitTask;

    move-result-object v0

    iput-object v0, p0, Lmtopsdk/mtop/intf/Mtop;->initTask:Lmtopsdk/mtop/global/init/IMtopInitTask; 

    ....
.end method

Mtop構造方法做了一些實例屬性的初始化工作,需要注意的是initTask這個實例屬性的獲取是從MtopInitTaskFactory里面獲取的,跟過去看一下,是如何獲取IMtopInitTask的實例的:

public static IMtopInitTask getMtopInitTask(String instanceId){

    switch{
        case "INNER":
        default:
            return InnerMtopInitTask();
        case "OPEN":
            returnn OpenMtopInitTask();
        case "PRODUCT":
            return ProductMtopInitTask();
    }
}

大概意思就是通過不同的instancceId獲取對應的初始化任務。

有了IMtopInitTask實例后在哪里執行呢?繼續分析Mtop的init方法會發現有一段運行IMtopInitTask的代碼:

    new-instance v0, Lmtopsdk/mtop/intf/Mtop$1;
    invoke-direct {v0, p0}, Lmtopsdk/mtop/intf/Mtop$1;-><init>(Lmtopsdk/mtop/intf/Mtop;)V
    invoke-static {v0}, Lmtopsdk/mtop/util/MtopSDKThreadPoolExecutorFactory;->submit(Ljava/lang/Runnable;)Ljava/util/concurrent/Future;

在分析IMtopInitTask的幾個實現類之前,先去分析一下比較重要的類:MtopSetting,看名字知道專門用來配置Mtop和MtopConfig的,它有個靜態屬性和幾個方法來設置一些配置:

 protected static final Map<String, MtopConfig> mtopConfigMap;
 public static MapConfig getMtopConfigByID(String instanceId){ }
 ...

getMtopConfigByID這個方法會通過instanceId獲取MtopConfig的實例,如果沒有的話會創建一個新的并且將它放入到mtopConfigMap中,方便下次獲取。其他的方法都是通過getMtopConfigByID獲取Mtop或MtopConfig實例后調用相應的設置項。

經過上面的一翻分析,猜測以下類的主要作用:

  • MtopSettings (設置工具類)
  • MtopConfig (存在Mtop配置類)
  • Mtop (Mtop核心功能類)
  • IMtopInitTask (Mtop初始化任務)

現在有人instanceId就能知道對應的IMtopInitTask實例來初始化Mtop,下一篇文章再來分析IMtopInitTask實例,最終完成爬包功能!!

最后歡迎大家關注我的公眾號,獲取最新的進展。

免責聲明: 本文章僅限用于學習和研究目的;不得將上述內容用于商業或者非法用途,否則,一切后果請讀者自負。

免費評分

參與人數 4吾愛幣 +11 熱心值 +4 收起 理由
qtfreet00 + 9 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
寶寶噠277 + 1 + 1 用心討論,共獲提升!
zhangpan0912 + 1 + 1 [email protected]
不拍電影不掉淚 + 1 我很贊同!

查看全部評分

發帖前要善用論壇搜索功能,那里可能會有你要找的答案或者已經有人發布過相同內容了,請勿重復發帖。

沙發
木ID 發表于 2019-10-4 13:30
看不懂哦哦
3#
soulmutou 發表于 2019-10-4 13:36
4#
傾注你的笑sf 發表于 2019-10-4 21:21
5#
白菜 發表于 2019-10-4 22:10
有些地方不太懂,可否交流一下
6#
 樓主| xyjwfn 發表于 2019-10-5 08:18 <
白菜 發表于 2019-10-4 22:10
有些地方不太懂,可否交流一下

歡迎一起交流的
7#
Disk4mat 發表于 2019-10-5 11:39
感謝樓主分享,學習了
8#
明日清晨 發表于 2019-10-5 19:06
支持一下!樓主辛苦!
9#
愛你一輩子 發表于 2019-10-5 23:00
看看,不錯,正在研究中心
您需要登錄后才可以回帖 登錄 | 注冊[Register]

本版積分規則 警告:禁止回復與主題無關內容,違者重罰!

快速回復 收藏帖子 返回列表 搜索

RSS訂閱|小黑屋|聯系我們|吾愛破解 - LCG - LSG ( 京ICP備16042023號 | 京公網安備 11010502030087號 )

GMT+8, 2019-10-12 13:08

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表
新疆时时开奖历史记录