天天看點

android 反編譯(dex 和 odex),非腦殘轉帖,絕對可靠

Android 反編譯

反編譯odex檔案(比如framework.odex),若是反編譯dex,直接第4步

1.因為反編譯odex的工具在D:\Develop tools\android反編譯工具\odex中,是以為了運作指令友善一點在odex目錄裡面,将system的目錄結構給建立一下,将反編譯的odex中所引用的全部包都放到相應的目錄下

system-----

     |-------app

     |-------framework

2.java -jar baksmali-2.0.3.jar -d ./system/framework -x ./system/framework/framework.odex

-d      指定bootclasspath dir

-x      deodex the given odex file. This option is ignored if the input file is not an odex file

-a      --api-level <API_LEVEL>,The numeric api-level of the file being disassembled. If not specified, it defaults to 15 (ICS).

         網上非常多人轉那個文章都寫的是-a 12, 不是必需

3.運作完上面的指令後就會在odex目錄下生成一個out目錄,裡面就是層次結構了,注意:在運作上面指令之前看一下之前有木有out目錄,有舊的out目錄的話,可能導緻以下要運作的指令抛出異常,是以要将舊的out目錄删除,異常例如以下:

UNEXPECTED TOP-LEVEL EXCEPTION:org.jf.util.ExceptionWithContext: Unsigned short value out of range: 78281        at org.jf.dexlib2.writer.DexDataWriter.writeUshort(DexDataWriter.java:116)        at org.jf.dexlib2.writer.InstructionWriter.write(InstructionWriter.java:312)        at org.jf.dexlib2.writer.DexWriter.writeCodeItem(DexWriter.java:980)        at org.jf.dexlib2.writer.DexWriter.writeDebugAndCodeItems(DexWriter.java:759)        at org.jf.dexlib2.writer.DexWriter.writeTo(DexWriter.java:214)        at org.jf.dexlib2.writer.DexWriter.writeTo(DexWriter.java:192)        at org.jf.smali.main.main(main.java:229)

最後将轉為classes.dex的指令:java -Xmx512M -jar smali-2.0.3.jar out -o classes.dex

4.最後一步就是講classes.dex反編譯為jar檔案了,用d2j-dex2jar指令:d2j-dex2jar -f classes.dex