1. 程式人生 > >五、Android安全機制之反編譯(你也可以擁有iPhone X)

五、Android安全機制之反編譯(你也可以擁有iPhone X)

    Android應用的反編譯需要了解smali,熟練使用常用的反編譯工具。比如apktool,Jd-jui,dex2jar,Android逆向助手,AXMLPrinter2,jadx,Xposed,IDA,APK改之理,AndroidKiller以及一些adb、aapt指令和windows批處理等。

    關於反編譯的流程和工具的使用方式,下面以一個反編譯例項來進行闡述。首先明確我們的目標就是逆向手機QQ,需要達到兩個目的:

1,修改QQ空間說說尾巴的手機型號,比如修改為iPhoneX,先上效果圖


2,阻止QQ訊息的撤回。

    實現這兩個功能只需要三步即可:

破解簽名→修改本機資訊→找到並刪除撤回邏輯程式碼

1、破解簽名:

    首先下載此工具,然後根據操作說明,配置好JAVA_HOME和aapt工具目錄,把手機QQ的Apk命名為src.apk放入資料夾,雙擊kstools.bat即可執行破解。

    步驟都很明確,這裡就不贅述了,執行完後生成signed.apk,直接安裝發現並沒有破解成功,提示Appid is invalid!


    直接開啟把剛剛安裝的apk裡面class.dex解壓出來用jadx開啟:

    發現hook程式碼是成功添加了的,然後檢視是否有新增在application的attachBaseContext


    顯然並沒有新增hook呼叫程式碼,這也是此工具的一個bug,那麼接下來我們手動新增,為了方便,我這裡寫了兩個批處理Dex2Smali.bat和DexDecompile.bat:


    Dex2Smali是把dex轉為smail,當前資料夾放入class.dex,雙擊生成包含smail的classes資料夾:

    接著找到從classes資料夾找到QFixApplication.smali,接下來只要修改此檔案即可

    為了更便捷的修改,這裡直接將此檔案複製到AndroidStudio裡,同時把那兩個hook檔案程式碼也複製過來,保持相同的包名,然後在相同包名下新建一個QFixApplication.java繼承Application,重寫attchBaseContext方法,在方法裡寫入hook程式碼的呼叫,為什麼要相同包名呢?因為生成的smali的方法呼叫是攜帶包名資訊的,如果不一樣則會重打包失敗。弄好了如下圖所示:

接著通過外掛執行Smali轉換,外掛請自行去下載安裝

    轉換完成後直接找到attchBaseContext方法,複製下面紅框那句,這句其實就是呼叫hook方法轉換為smali程式碼的形式。

    接下來開啟QFixApplication.smali,找到attchBaseContext方法新增上面這句程式碼


    把修改好的QFixApplication.smali檔案覆蓋原檔案,完成後直接執行DexDecompile.bat,這個批處理檔案作用是將smali轉成dex,然後替換src.apk裡的dex檔案,重簽名,adb安裝和開啟應用。通過這一系列的步驟之後,簽名就已經被破解,並可以直接安裝開啟,此時的QFixApplication.java的attchBaseContext程式碼如下:


2、修改本機資訊:

至此,簽名已破解完畢,接下來修改本機資訊,安卓中獲取手機資訊是通過Build類來獲取,所以只要修改Build類裡對應的值,則可以修改本機的一些資訊,比如,硬體廠商,手機型號等資訊。在ServiceManagerWraper新增如下程式碼,轉為smali並替換即可。


3、找到並刪除撤回邏輯程式碼:

    當訊息被撤回,聊天視窗會顯示xxx撤回了一條訊息,那麼我們以“撤回了一條訊息”這個字串為入口,找到最終的邏輯程式碼,為方便查詢,這裡用了改之理工具開啟。

    直接搜尋“撤回了一條訊息”,在strings.xml裡搜尋到對應的結果,顯然資源名被混淆了。

    搜尋[email protected],找到對應的id

    接著再搜尋id“0x7f0b2b32”

    程式碼裡有兩個類用到,分別是TroopHandler和BaseMessageManager,因為訊息撤回可以在多個場景(私聊,群聊,討論組聊)下使用,應該有統一的某處處理,猜想應該是在BaseMessageManager類裡處理。BaseMessageManager類用到此id的在一個 public void b(ArrayList arrayList) 方法裡。直接暴力一點把BaseMessageManager.smali裡這個方法裡所有程式碼去除,然後替換重打包。發現訊息已經無法被撤回了,也證明了我們的猜想是正確的。

    適當的猜想有助於我們在反編譯過程中快速找到正確的突破點。上面搜尋關鍵資訊用到了改之理,它是一款反編譯編輯器,反編譯後的smali程式碼可以直接編輯完重打包安裝,但僅限於體積較小、未加固、未防apktool的apk,所以侷限性很大,這裡只用到了它的搜尋功能。

鄭重宣告:本編內容只限於學習研究範圍,請勿用於商業謀利及任何非法的目的,否則帶來一切法律責任都由操作者承擔,與本文作者無關。