Android odex,oat文件的反編譯,回編譯


現在,許多Android手機的ROM包在生成過程中都啟用優化,把jar文件抽空,生成odex/oat和vdex文件,以在運行時省掉編譯時間。如果想對這些jar進行修改,就要修改它們所對應的odex或者oat文件。本文以/system/framework/oat/arm64/am.odex為例,講解它的反編譯和回編譯過程

本文用到的工具:baksmali.jar和smali.jar

下載地址:
https://bitbucket.org/JesusFreke/smali/downloads

將odex/oat反編譯

在執行反編譯前,先將odex/oat和它的依賴復制到同一目錄下。如果在反編譯odex/oat的時候,沒有找到依賴,就會報類似於下面的錯誤:

Exception in thread "main" org.jf.dexlib2.DexFileFactory$DexFileNotFoundException: Could not locate the embedded dex file /system/framework/am.jar. Is the vdex file missing?
	at org.jf.dexlib2.dexbacked.OatFile$OatDexEntry.getDexFile(OatFile.java:586)
	at org.jf.dexlib2.dexbacked.OatFile$OatDexEntry.getDexFile(OatFile.java:567)
	at org.jf.baksmali.DexInputCommand.loadDexFile(DexInputCommand.java:158)
	at org.jf.baksmali.DisassembleCommand.run(DisassembleCommand.java:162)
	at org.jf.baksmali.Main.main(Main.java:102)
Caused by: org.jf.dexlib2.dexbacked.DexBackedDexFile$NotADexFile: Not a valid dex magic value: 7f 45 4c 46 02 01 01 03
	at org.jf.dexlib2.util.DexUtil.verifyDexHeader(DexUtil.java:93)
	at org.jf.dexlib2.dexbacked.OatFile$OatDexEntry.getDexFile(OatFile.java:583)
	... 4 more

(1) 在復制依賴前先掛載system.img到mysystem目錄:

mkdir -p mysystem && sudo mount -o loop system.img mysystem

(2) 復制以boot開頭的文件依賴

然后執行下面的命令復制依賴到當前目錄:

cp mysystem/framework/arm64/* .

(3) 復制odex/oat本身及相關文件

cp mysystem/framework/oat/arm64/am.* .

這個路徑不是死的,請根據實際情況復制。如果沒有system.img鏡像,或者無法掛載,也可以從手機把相關文件復制出來:adb pull /system/framework

(4) 反編譯odex/oat

java -jar baksmali-2.3.4.jar x am.odex

  • x deodex的縮寫

反編譯后,會生成out目錄,里面存放反編譯出來的代碼,代碼格式為smali

現在,你可以對里面的代碼進行修改了

將smali編譯成dex

修改完畢后,將out目錄下smali代碼編譯成dex:

java -jar smali-2.3.4.jar as out/ -a 28 -o am.dex

  • as assemble的縮寫
  • -a 指定API版本
  • -o 指定輸出的dex文件

如果沒有錯誤就會生成am.dex文件。如果有錯誤就根據日志的內容去解決錯誤

將dex編譯成odex/oat

dex編譯成odex/oat是在手機上進行的,所以生成了dex文件以后,我們把am.dex推到手機:

adb push am.dex /data/local/tmp

讓手機連接到電腦,打開USB調試,在命令行執行adb shell,接着輸入下面的命令進行編譯:

export ANDROID_DATA=/data

export ANDROID_ROOT=/system

dex2oat --dex-file=/data/local/tmp/am.dex --oat-file=/data/local/tmp/am.odex  --instruction-set=arm64 --runtime-arg -Xms64m --runtime-arg -Xmx128m
  • --dex-file 指定要編譯的dex文件
  • --oat-file 指定要輸出的odex/oat文件
  • --instruction-set 指定cpu架構
  • --runtime-arg 指定dex2oat運行時的參數,如果編譯時發生內存不足,可以把Xms和Xmx調大

編譯成功后,會在/data/local/tmp目錄生成odex/oat和vdex文件,將它們替換到系統試試吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM