0x00 起因
這是一個很狗血的故事臣嚣,我們一些同學(xué)在做反編譯apk的作業(yè)腐碱,然后呢突然有同學(xué)反饋就是說某郵箱大師的apk不能夠反編譯年缎,出現(xiàn)各種error忍弛。當(dāng)然起初我認(rèn)為是操作問題或者工具的問題,但是后來經(jīng)過我自己的實(shí)踐,發(fā)現(xiàn)的確也有這樣的問題渗勘。然后就開始了狗血之旅沐绒。error message如下:
com.googlecode.dex2jar.DexException: while accept method:[La/_;.a()V]
at com.googlecode.dex2jar.reader.DexFileReader.acceptMethod(DexFileReader.java:694)
at com.googlecode.dex2jar.reader.DexFileReader.acceptClass(DexFileReader.java:441)
at com.googlecode.dex2jar.reader.DexFileReader.accept(DexFileReader.java:323)
at com.googlecode.dex2jar.v3.Dex2jar.doTranslate(Dex2jar.java:85)
at com.googlecode.dex2jar.v3.Dex2jar.to(Dex2jar.java:261)
at com.googlecode.dex2jar.v3.Dex2jar.to(Dex2jar.java:252)
at com.googlecode.dex2jar.v3.Main.doData(Main.java:43)
at com.googlecode.dex2jar.v3.Main.doData(Main.java:35)
at com.googlecode.dex2jar.v3.Main.doFile(Main.java:63)
at com.googlecode.dex2jar.v3.Main.main(Main.java:86)
Caused by: com.googlecode.dex2jar.DexException: while accept code in method:[Landroid/_;.a()V]
at com.googlecode.dex2jar.reader.DexFileReader.acceptMethod(DexFileReader.java:684)
... 9 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: 4
at com.googlecode.dex2jar.v3.V3CodeAdapter.visitUnopStmt(V3CodeAdapter.java:631)
at com.googlecode.dex2jar.reader.DexOpcodeAdapter.x2x(DexOpcodeAdapter.java:529)
at com.googlecode.dex2jar.reader.DexCodeReader.acceptInsn(DexCodeReader.java:425)
at com.googlecode.dex2jar.reader.DexCodeReader.accept(DexCodeReader.java:337)
at com.googlecode.dex2jar.reader.DexFileReader.acceptMethod(DexFileReader.java:682)
... 9 more
Done.
0x01 調(diào)查
既然有了這樣一個錯誤,那么自然就開始了Google之旅旺坠。通過各種Google之后首先先排除了是dex2jar這個工具的問題乔遮。當(dāng)然這個其中也嘗試了其他的各種工具想來替代的使用。比如:
- Baksmali - 使用最廣泛的DEX反編譯工具 (apktool/antilvl等使用)(https://code.google.com/p/smali/)
- dex2jar - 可以把DEX反編譯成jar的工具取刃,然后通過JD-GUI查看蹋肮。(http://code.google.com/p/dex2jar/)
- IDA Pro - (這個就不在介紹了吧!)(https://www.hex-rays.com/index.shtml)
- androguard - 也是比較流行的璧疗。(https://code.google.com/p/androguard/)
但是可惜的是要么就是只有試用版坯辩,要么就是達(dá)不到我要的效果,我放棄了投機(jī)取巧的方式崩侠,還是安安靜靜地做個美男子去看問題吧漆魔。(浪費(fèi)大把時間。却音。有送。。)
既然不換工具僧家,那還是回到了dex文件本身,我大概也了解下結(jié)構(gòu)裸删。
以及反編譯之后的結(jié)構(gòu)
那么還是先做了反編譯:
java -jar baksmali-2.1.1.jar -o /test/ classes.dex
得到了:
根據(jù)我們的錯誤日志八拱,我們定位到問題就在[La/_;.a()V]這個地方。那么我找到了這個文件涯塔,字節(jié)碼如下:
.class public La/_;
.super Ljava/lang/Object;
.source "a.java"
# virtual methods
.method public a()V
.registers 2
.prologue
.line 5
double-to-int p3, v0
move-wide/16 p54870, v0
.line 6
.local v0, "i":I
nop
.line 7
return-void
.end method
網(wǎng)絡(luò)上說看雪上有一種常見的防護(hù)機(jī)制就是在smali中去寫廢代碼肌稻,但是從這個文件中我也沒有看到廢代碼。其實(shí)到了這里線索就斷了匕荸,就不知道應(yīng)該走了爹谭。
0x02 突破
在走投無路的時候突然就想到了是不是有可能保護(hù)的機(jī)制是一樣的,只不過不一定是廢代碼榛搔。那么接下來就是要做的是修改smali文件诺凡,將smali轉(zhuǎn)換成dex。使用了
java -jar smali-2.1.1.jar /Users/monkey/Documents/test -o classes.dex
但是無論我修改什么代碼貌似都會出現(xiàn)最初出現(xiàn)的那個錯誤日志践惑,緊接著我使用了老方法腹泌,就是傳說中的對比。我去下載了其他幾種apk尔觉,把字節(jié)碼的結(jié)構(gòu)和郵箱大師的結(jié)構(gòu)做了對比凉袱,發(fā)現(xiàn)其實(shí)其他apk并沒有出現(xiàn).smali這個文件,故而我就懷疑是不是這個文件本身就是阻礙反編譯的罪魁禍?zhǔn)住K晕覄h除了每個文件中的.smali文件专甩,大概有10多個钟鸵。接著打出dex,然后再用dex2jar對這個新的classes.dex反編譯涤躲,至少不報錯了棺耍。
0x03 結(jié)果
最后方法都試一樣的,使用JD-GUI打開jar文件篓叶,可以看到代碼了烈掠。這一路狗血的一塌糊涂。