轉載自公衆號“嵌入式Linux技術分享 ”
今天主要結合記賬軟件App,對Android APK反編譯之ARSC進行分析。
如果APK被加固導致無法使用apktool進行反編譯,這時我們只能利用unzip解壓APK,對解壓的文件進行分析,如下圖所示。
解壓後的AndroidMainfest.xml和resource.arsc都是二進制文件,下面主要分析resource.arsc文件,該ARSC格式文件內容對應Android App軟件工程res目下相關內容,存放了資源相關的信息。
首先我們看下記賬軟件res目錄下兩個xml文件,public.xml和strings.xml。描述一個屬性特徵需要type、key和value三個值,type可以是mipmap、layout、menu、strings等類型。如下是public.xml部分代碼,光亮處type爲mipmap,key爲ic_launcher。
下圖是strings.xml部分代碼,光亮處type爲string,key爲abc_action_bar_home_description,value爲Navigate home。
重點來了,下面利用010Editor工具分析resource.arsc文件,查詢上面public.xml和strings.xml中ic_launcher和abc_action_bar_home_description兩個屬性值。
先貼一個ARSC文件格式核心部分,如下圖所示,分別指出了Type、Key和Value的Pool,以及實際的Type、Key和Value。
下圖是Type Pools的信息,我們可以找到關心的類型mipmap的數組下標爲12,類型string的數組下標爲13。
第一個實例,我們定位ic_launcher的屬性值。首先我們需要知道ic_launcher的type爲mipmap,查Type Pools,對應的type數組下標爲12,查找結果如下圖所示,其中ResTable_typeSpec結構體header中id就是Type id,另外struct ResTable_entry entry[0]顯示的ic_launcher就是Key值,Value值是404,dataType爲Type_STRING。
根據屬性Value值是404,查詢Value Pool,如下所示,得到ic_launcher屬性值爲res/mipmap-mdpi-v4/ic_launcher.png
第二個實例,我們定位abc_action_bar_home_description的屬性值。首先我們需要知道abc_action_bar_home_description的type爲string,查Type Pools,對應的數組下標爲13,查找結果如下圖所示,abc_action_bar_home_description屬性的Value值是1951。
根據屬性Value值是1951,查詢Value Pool,如下所示,得到abc_action_bar_home_description屬性值爲Navigate home。
綜上,上面對ARSC文件的分析結果與實際res目錄下文件內容一致。