記一次dex的反編譯

記一次dex的反編譯

原文:https://www.jianshu.com/p/55bf5f688e9a

負責的app在跑gts時報錯,結果有報錯信息只有gts的apk沒有源碼,導致無從查起。所以準備反編譯gts的apk,結果發現問題, 記錄一下

首先第一時間用到是jadx,這是一個傻瓜式的工具,只要打開工具,把app扔進去就可以了...
這是下載地址: https://github.com/skylot/jadx/releases
結果沒有反應....
於是想到bin目錄下面有個jadx.bat的腳本文件,估計是命令行工具,試試

jadx.bat GtsManagedProvisioning.apk

結果報錯:

 

jadx反編譯報錯

表示錯誤看不懂,只好找其它方式

反編譯還有一種方式是

  1. 把dex文件從apk解壓出來,得到classes.dex
  2. 然後用dex2jar把dex文件轉換成jar文件: dex2jar.bat classes.dex
  3. 再把生成的classes.jar文件放到JD-GUI中即可

dex2jar下載: https://sourceforge.net/projects/dex2jar/
jd-gui下載: http://jd.benow.ca/

仍然報錯

dex2jar .\classes.dex -> .\classes-dex2jar.jar
com.googlecode.d2j.DexException: not support version.
        at com.googlecode.d2j.reader.DexFileReader.<init>(DexFileReader.java:151)
        at com.googlecode.d2j.reader.DexFileReader.<init>(DexFileReader.java:211)
        at com.googlecode.dex2jar.tools.Dex2jarCmd.doCommandLine(Dex2jarCmd.java:104)
        at com.googlecode.dex2jar.tools.BaseCmd.doMain(BaseCmd.java:288)
        at com.googlecode.dex2jar.tools.Dex2jarCmd.main(Dex2jarCmd.java:32)

提示not support version,版本不支持?(看到這條信息我還以爲要下載最新版本的dex2jar,結果仍然不行)

此時想到乾脆編譯下dex2jar的相關文件看看爲什麼報錯
打開dex2jar-2.0\lib目錄,因爲是reader.DexFileReader.<init> 處報錯,所以應該是DexFileReader初始化報錯吧,應該是dex-reader-2.0.jardex-reader-api-2.0.jar把這兩個jar包扔到jdgui裏面,很快便找到DexFileReader,並在構造方法裏面,並找到相關源代碼

public DexFileReader(ByteBuffer in)
  {
    in.position(0);
    in = in.asReadOnlyBuffer().order(ByteOrder.LITTLE_ENDIAN);
    int magic = in.getInt() & 0xFFFFFF;
    if (magic != 7890276)
    {
      if (magic == 7955812) {
        throw new DexException("Not support odex");
      }
      throw new DexException("not support magic.");
    }
    int version = in.getInt() & 0xFFFFFF;
    if ((version != 3486512) && (version != 3552048)) {//這裏主動拋出異常
      throw new DexException("not support version.");
    }
    ....
}

可以猜測這在讀取第一個字符時通過比較version 值主動拋出異常了
顯然version不等於3486512和3552048是罪魁禍首,它們是什麼呢,上下搜索可以看到一個定義的常量:

  private static final int MAGIC_035 = 3486512;
  private static final int MAGIC_036 = 3552048;

額,MAGIC_035MAGIC_036,網上查了一下,說是dex頭部校驗

老版本的magic version是035
優化的dex文件,magic version是036
報錯居然說不等於這兩個,是什麼情況???

用notpad++打開classes.dex文件,在頭部看到如下情況

 

dex頭部

第二行竟然是037!!!!嗯,我有一個大膽的想法: 把037,改成036,保存,再用dex2jar
成功!!!再用jd-gui打開jar文件也能順利反編譯

遺留思考:

  1. magic version是dex校驗的話,爲什麼gts的apk爲是037一個不合法的值?難道這個apk比較特殊?(實際驗證這個apk安裝不上)
  2. 爲什麼讀到的int值3552048,而通過notepad++顯示是036?(猜測與字符編碼有關)
發佈了102 篇原創文章 · 獲贊 94 · 訪問量 52萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章