記一次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反編譯報錯
表示錯誤看不懂,只好找其它方式
反編譯還有一種方式是
- 把dex文件從apk解壓出來,得到classes.dex
- 然後用dex2jar把dex文件轉換成jar文件:
dex2jar.bat classes.dex
- 再把生成的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.jar
或dex-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_035
和MAGIC_036
,網上查了一下,說是dex頭部校驗
老版本的magic version是035
優化的dex文件,magic version是036
報錯居然說不等於這兩個,是什麼情況???
用notpad++打開classes.dex文件,在頭部看到如下情況
dex頭部
第二行竟然是037!!!!嗯,我有一個大膽的想法: 把037,改成036,保存,再用dex2jar
成功!!!再用jd-gui打開jar文件也能順利反編譯
遺留思考:
- magic version是dex校驗的話,爲什麼gts的apk爲是037一個不合法的值?難道這個apk比較特殊?(實際驗證這個apk安裝不上)
- 爲什麼讀到的int值3552048,而通過notepad++顯示是036?(猜測與字符編碼有關)