1. 程式人生 > >反編譯framework原始碼的方法

反編譯framework原始碼的方法

反編譯

    工作中經常遇到很多第三方應用或Rom需要反編譯看原始碼實現,對於第三方應用很簡單拿到apk檔案後直接用apktool解開就可以了。但是對於系統應用或framework模組部分就不行了,因為廠包肯定會開啟odex,所以將apk或jar包pull到本地後會發現裡面只有資原始檔或META-INF等,裡面沒有classes.dex位元組碼檔案。

    但是我們知道編譯的時候開啟odex同時會在相應目錄下編譯一份oat檔案,而oat檔案實際是個Elf格式的二進位制檔案,裡面包含了verify&optimize之後的Dex位元組碼檔案和相應的機器碼檔案。要想將Dex位元組碼檔案提取出來,就需要用到系統提供的oatdump這個工具了。通過oatdump將Dex位元組碼檔案提取出來之後,然後再用dex2jar轉換為jar包檔案,就可以通過JD-Gui之類的工具直接查看了。不過JD-GUI有時候解析出來的Jar檔案有問題,而且有些內容無法解析出來,那就只能通過閱讀smali來手動推導了。

    以手中的Nexus 為例,需要反編譯PowerManagerService的某個方法實現。具體步驟如下:

     1)首先將機器中的services.jar 對應的oat檔案pull到本地:adb pull /system/framework/oat/arm/services.odex (注意機器CpuAbi)

     2)通過oatdump將裡面的dex檔案提取出來:oatdump --oat-file=services.odex --export-dex-to=./

  在當前目錄下生成services.jar_export.dex位元組碼檔案。這裡oatdump是本地編譯Rom的時候生成的,位於out/host/linux-x86/bin/oatdump

     3)然後再用dex2jar-2.0工具將dex位元組碼檔案轉化為jar包。d2j-dex2jar.sh service.jar_export.dex 會在當前目錄生成一個services.jar_export-dex2jar.jar的Jar檔案。

     4)啟動JD-GUI即可檢視services.jar-export-dex2jar.jar檔案了。