手把手教你搞懂Android反編譯
轉(zhuǎn)載時(shí)請(qǐng)必須注明出處:http://www.iosxxoo.com/2016/06/29/2016-06-29/
前言
反編譯別人的程序不是什么值得炫耀的事锋爪,希望大家最好只是興趣探索,而不是利益驅(qū)動(dòng)。本文主要目的是繞開(kāi)一個(gè)簡(jiǎn)單的激活程序。
什么是反編譯
我們知道债蜜,Android的程序打包后會(huì)生成一個(gè)APK文件警儒,這個(gè)文件可以直接安裝到任何Android手機(jī)上,因此抱慌,反編譯就是對(duì)這個(gè)APK進(jìn)行反編譯歹鱼。Android的反編譯分成兩個(gè)部分:
- 一個(gè)是對(duì)代碼反編譯泣栈,也就是java文件的反編譯。
- 一個(gè)是對(duì)資源反編譯醉冤,也就是res文件的反編譯秩霍。
所需的工具
-
Android Studio:安卓開(kāi)發(fā)IDE
反編譯代碼的工具:
-
dex2jar: 把dex文件轉(zhuǎn)成jar文件
-
jd-gui: 這個(gè)工具用于將jar文件轉(zhuǎn)換成java代碼
下載地址:http://jd.benow.ca/
反編譯資源的工具:
-
APKTool: 本文重要工具,APK逆向工具蚁阳,使用簡(jiǎn)單
熱身準(zhǔn)備
首先我們需要一個(gè)APK,這里我自己寫(xiě)了一個(gè)鸽照,源碼下載地址:http://download.csdn.net/detail/u012891055/9671973螺捐,打包成APK后下載到手機(jī)上。
它的主要功能是模擬郵箱激活,如果我們輸入了錯(cuò)誤的數(shù)據(jù)則無(wú)法通過(guò)激活定血。所以我們的目的很簡(jiǎn)單赔癌,就是讓這個(gè)判斷邏輯失效。
主要源碼說(shuō)明:
第51行
存儲(chǔ)的正確的兩個(gè)激活號(hào)碼澜沟,通過(guò):
將賬號(hào)密碼隔開(kāi)灾票,如下
private static final String[] DUMMY_CREDENTIALS = new String[]{
"foo@163.com:20135115",
"bar@163.com:20135115"
};
現(xiàn)在只有激活碼正確才能通過(guò)激活。
第331行
是Execute函數(shù)茫虽,邏輯判斷的部分刊苍。
@Override
protected void onPostExecute(final Boolean success) {
mAuthTask = null;
showProgress(false);
if (success) {
new AlertDialog.Builder(LoginActivity.this)
.setTitle("恭喜您")
.setMessage("成功激活!")
.show();
// finish();
} else {
mPasswordView.setError(getString(R.string.error_incorrect_password));
mPasswordView.requestFocus();
}
}
反編譯代碼
dex2jar解壓下來(lái)文件很多,在mac上我們需要用到dex2jar的是這三個(gè)東西(windows上對(duì)應(yīng)用bat文件):
- d2j_invoke.sh
- d2j-dex2jar.sh
- lib
AndroidStudio
打包好的APK文件
的后綴濒析,需改為.zip
正什,然后解壓
。從解壓的文件中找到classes.dex文件号杏,并將其放入dex2jar同一目錄下婴氮,如下:
并在cmd中也進(jìn)入到同樣的目錄,然后執(zhí)行:
sh d2j-dex2jar.sh classes.dex
執(zhí)行如下:
然后我們會(huì)得到一個(gè)classes-dex2jar.jar文件盾致,我們借助JD-GUI工具打開(kāi)即可主经,打開(kāi)如下:
可以看到代碼非常清晰,這樣我們就可以看到整個(gè)APP的代碼邏輯了庭惜。
反編譯資源
apktool下載完成后有一個(gè).sh文件和.jar文件罩驻,我們把APK放進(jìn)來(lái),如下:
在cmd中進(jìn)入apktool目錄蜈块,執(zhí)行命令:
sh apktool.sh apktool d FooApp.apk
d是decode的意思鉴腻,表示我們要對(duì)FooApp解碼,結(jié)果如下:
然后你會(huì)驚喜的發(fā)現(xiàn)多了一個(gè)FooApp文件夾百揭。
主要目錄說(shuō)明:
- AndroidManifest.xml:描述文件
- res:資源文件
- smail:反編譯出來(lái)的所有代碼爽哎,語(yǔ)法與java不同,類似匯編器一,是Android虛擬機(jī)所使用的寄存器語(yǔ)言
修改App icon
打開(kāi)我們的描述文件课锌,高清無(wú)碼:
可以看到我們的App icon名稱為ic_launcher,我們找到所有mipmap開(kāi)頭的文件夾,替換成下圖即可:
在最后重新打包后我們的App icon就會(huì)被修改了祈秕,不過(guò)在重新打包之前渺贤,我們還有最重要的一件事沒(méi)有做,那就是修改激活碼判斷邏輯请毛。
修改邏輯
我們通過(guò)源碼或者JD-GUI查看反編譯的代碼可以看到激活碼判斷邏輯如下:
@Override
protected void onPostExecute(final Boolean success) {
mAuthTask = null;
showProgress(false);
if (success) {
// 激活碼正確
new AlertDialog.Builder(LoginActivity.this)
.setTitle("恭喜您")
.setMessage("成功激活!")
.show();
// finish();
} else {
mPasswordView.setError(getString(R.string.error_incorrect_password));
mPasswordView.requestFocus();
}
}
所以我們只需要找到反編譯后的if(success)
的語(yǔ)句志鞍,并將其修改成if(!success)
即可,如下:
if (success)//修改成if(!success)
{
...
} else {
...
}
這樣我們就成功的顛倒了以前的邏輯方仿,我們輸入一個(gè)錯(cuò)誤的激活碼固棚,就會(huì)被判斷成正確的统翩。挺簡(jiǎn)單的,是吧此洲。
現(xiàn)在我們來(lái)動(dòng)手修改:
打開(kāi)smail里的
LoginActivity$UserLoginTask.smali
文件.-
全局搜索
if-eqz
厂汗,通過(guò)AlertDialog
關(guān)鍵字輔助定位,發(fā)現(xiàn)在第228行
:
ok呜师,就是這里了娶桦,然后將
if-eqz
修改成if-nez
,他們對(duì)應(yīng)Java
的語(yǔ)法如下:
Smail 語(yǔ)法 | Java 語(yǔ)法 |
---|---|
if-eqz v0, | if(v0 == 0) |
if-nez v0, | if(v0 != 0) |
ok汁汗,大功告成衷畦,現(xiàn)在就可以重新打包了。關(guān)于smail語(yǔ)法碰酝,有興趣的直接Google就行了霎匈。
重新打包
我們大概修改后兩個(gè)地方,其實(shí)重新打包也十分簡(jiǎn)單送爸,在cmd中執(zhí)行以下命令即可:
sh apktool.sh b FooAPP -o NewFooApp.apk
其中b是build的意思铛嘱,表示我們要將FooAPP文件夾打包成APK文件,-o用于指定新生成的APK文件名袭厂,這里新的文件叫作NewFooApp.apk墨吓。執(zhí)行結(jié)果如下圖所示:
然后你會(huì)發(fā)現(xiàn)同級(jí)目錄下生成了新的apk文件:
但是要注意,這個(gè)apk現(xiàn)在還是不能安裝的纹磺,因?yàn)槲覀儧](méi)有對(duì)它進(jìn)行簽名帖烘,重新簽名后它就是個(gè)名副其實(shí)的盜版軟件了,大家一定要強(qiáng)烈譴責(zé)這種行為橄杨。
重新簽名
重新簽名也是很簡(jiǎn)單的秘症,我直接用的一個(gè)已有簽名文件,使用Android Studio或者Eclipse都可以非常簡(jiǎn)單地生成一個(gè)簽名文件式矫。
在cmd中執(zhí)行格式如下:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 簽名文件名 -storepass 簽名密碼 待簽名的APK文件名 簽名的別名
然后我們就可以用這個(gè)apk進(jìn)行安裝了乡摹,為了追求更快的運(yùn)行速度,我們可以對(duì)其進(jìn)行一次字節(jié)對(duì)齊采转,這里就不說(shuō)了聪廉。
使用盜版APK
我們用NewFooApp.apk
安裝好盜版app后,發(fā)現(xiàn)圖標(biāo)變成了籃球故慈,并且隨便輸入數(shù)據(jù)都能通過(guò)激活了:
怎么樣板熊?總的來(lái)說(shuō)還是挺有意思的吧,不過(guò)別用歪了察绷。
參考鏈接:
Android安全攻防戰(zhàn)干签,反編譯與混淆技術(shù)完全解析(上)- 郭霖
Done
作者: @biggergao
個(gè)人博客: Mr.碼了戈壁
2016年06月29日