負(fù)責(zé)的app在跑gts時(shí)報(bào)錯(cuò)邪码,結(jié)果有報(bào)錯(cuò)信息只有g(shù)ts的apk沒有源碼谢揪,導(dǎo)致無從查起扭弧。所以準(zhǔn)備反編譯gts的apk阎姥,結(jié)果發(fā)現(xiàn)問題, 記錄一下
首先第一時(shí)間用到是jadx,這是一個(gè)傻瓜式的工具鸽捻,只要打開工具呼巴,把a(bǔ)pp扔進(jìn)去就可以了...
這是下載地址: https://github.com/skylot/jadx/releases
結(jié)果沒有反應(yīng)....
于是想到bin目錄下面有個(gè)jadx.bat的腳本文件,估計(jì)是命令行工具御蒲,試試
jadx.bat GtsManagedProvisioning.apk
結(jié)果報(bào)錯(cuò):
表示錯(cuò)誤看不懂衣赶,只好找其它方式
反編譯還有一種方式是
- 把dex文件從apk解壓出來,得到classes.dex
- 然后用dex2jar把dex文件轉(zhuǎn)換成jar文件:
dex2jar.bat classes.dex
- 再把生成的classes.jar文件放到JD-GUI中即可
dex2jar下載: https://sourceforge.net/projects/dex2jar/
jd-gui下載: http://jd.benow.ca/
仍然報(bào)錯(cuò)
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,結(jié)果仍然不行)
此時(shí)想到干脆編譯下dex2jar的相關(guān)文件看看為什么報(bào)錯(cuò)
打開dex2jar-2.0\lib目錄碘箍,因?yàn)槭?code>reader.DexFileReader.<init> 處報(bào)錯(cuò)遵馆,所以應(yīng)該是DexFileReader初始化報(bào)錯(cuò)吧鲸郊,應(yīng)該是dex-reader-2.0.jar
或dex-reader-api-2.0.jar
把這兩個(gè)jar包扔到j(luò)dgui里面,很快便找到DexFileReader货邓,并在構(gòu)造方法里面秆撮,并找到相關(guān)源代碼
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)) {//這里主動(dòng)拋出異常
throw new DexException("not support version.");
}
....
}
可以猜測(cè)這在讀取第一個(gè)字符時(shí)通過比較version 值主動(dòng)拋出異常了
顯然version不等于3486512和3552048是罪魁禍?zhǔn)祝鼈兪鞘裁茨芈呖郑舷滤阉骺梢钥吹揭粋€(gè)定義的常量:
private static final int MAGIC_035 = 3486512;
private static final int MAGIC_036 = 3552048;
額像吻,MAGIC_035
和MAGIC_036
,網(wǎng)上查了一下复隆,說是dex頭部校驗(yàn)
老版本的magic version是035
優(yōu)化的dex文件拨匆,magic version是036
報(bào)錯(cuò)居然說不等于這兩個(gè),是什么情況挽拂?惭每??
用notpad++打開classes.dex文件亏栈,在頭部看到如下情況
第二行竟然是037Lㄐ取!H薇薄黎侈!嗯,我有一個(gè)大膽的想法: 把037闷游,改成036峻汉,保存,再用dex2jar
成功F晖P莘汀!再用jd-gui打開jar文件也能順利反編譯
遺留思考:
- magic version是dex校驗(yàn)的話业簿,為什么gts的apk為是037一個(gè)不合法的值瘤礁?難道這個(gè)apk比較特殊?(實(shí)際驗(yàn)證這個(gè)apk安裝不上)
- 為什么讀到的int值3552048,而通過notepad++顯示是036梅尤?(猜測(cè)與字符編碼有關(guān))