Androidmanifest文件加固和對抗
前言
惡意軟件為了不讓我們很容易反編譯一個apk,會對androidmanifest文件進行魔改加固,本文探索androidmanifest加固的常見手法以及對抗方法。這里提供一個惡意樣本的androidmanifest.xml文件,我們學完之后可以動手實踐。
1、Androidmanifest文件組成
這里貼一張經典圖,主要描述了androidmanifest的組成
?
androidmanifest文件頭部僅僅占了8個字節,緊跟其后的是StringPoolType字符串常量池
(為了方便我們觀察分析,可以先安裝一下010editor的模板,詳細見2、010editor模板)
Magic Number
這個值作為頭部,是經常會被魔改的,需要重點關注
?
StylesStart
該值一般為0,也是經常會發現魔改

StringPool

?尋找一個字符串,如何計算?
1、獲得字符串存放開放位置:0xac(172),此時的0xac是不帶開頭的8個字節
所以需要我們加上8,最終字符串在文件中的開始位置是:0xb4
2、獲取第一個字符串的偏移,可以看到,偏移為0
?
3、計算字符串最終存儲的地方: 0xb4 = 0xb4 + 0
讀取字符串,以字節00結束

?讀取到的字符為:theme
總結:
stringpool是緊跟在文件頭后面的一塊區域,用于存儲文件所有用到的字符串
這個地方呢,也是經常發生魔改加固的,比如:將StringCount修改為0xFFFFFF無窮大
在經過我們的手動計算和分析后,我們對該區域有了更深的了解。
2、010editor模板
使用010editor工具打開,安裝模板庫
?
搜索:androidmanifest.bt

?安裝完成且運行之后:
?
會發現完整的結構,幫助我們分析
3、使用AXMLPrinter2進行的排錯和修復
用法十分簡單:
java -jar AXMLPrinter2.jar AndroidManifest_origin.xml
會有一系列的報錯,但是不要慌張,根據這些報錯來對原androidmanifest.xml進行修復

?意思是:出乎意料的0x80003(正常讀取的數據),此時卻讀取到:0x80000
按照小端序,正常的數據應該是: 03 00 08
使用 010editor 打開
?
將其修復

?保存,再次嘗試運行AXMLPrinter2

?好家伙還有錯誤,這個-71304363,不方便我們分析,將其轉換為python的hex數據
NegativeArraySizeException 表示在創建數組的時候,數組的大小出現了負數。
androidmanifest加固后文件與正常的androidmanifest文件對比之后就可以發現魔改的地方。

?將其修改回去

運行仍然報錯,是個新錯誤:

?再次去分析:
?
stringoffsets如此離譜,并且數組的大小變為了0xff
?

根據報錯的信息,嘗試把FF修改為24
?

?再次運行

?成功拿到反編譯后的androidmanifest.xml文件
總結:
這個例子有三個魔改點經常出現在androidmanifest.xml加固
惡意軟件通過修改這些魔改點來對抗反編譯