手把手教你搞懂Android反編譯

手把手教你搞懂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è)部分:

  1. 一個(gè)是對(duì)代碼反編譯泣栈,也就是java文件的反編譯。
  2. 一個(gè)是對(duì)資源反編譯醉冤,也就是res文件的反編譯秩霍。

所需的工具

反編譯代碼的工具:

反編譯資源的工具:

熱身準(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)頭的文件夾,替換成下圖即可:

ic_launche

在最后重新打包后我們的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)手修改:

  1. 打開(kāi)smail里的LoginActivity$UserLoginTask.smali文件.

  2. 全局搜索if-eqz厂汗,通過(guò)AlertDialog關(guān)鍵字輔助定位,發(fā)現(xiàn)在第228行

  3. 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ò)激活了:

1

怎么樣板熊?總的來(lái)說(shuō)還是挺有意思的吧,不過(guò)別用歪了察绷。

參考鏈接:

Android安全攻防戰(zhàn)干签,反編譯與混淆技術(shù)完全解析(上)- 郭霖

Android安全技術(shù)解密與防范 - 周圣韜

Done

作者: @biggergao
個(gè)人博客: Mr.碼了戈壁

2016年06月29日

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拆撼,隨后出現(xiàn)的幾起案子筒严,更是在濱河造成了極大的恐慌丹泉,老刑警劉巖情萤,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸭蛙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡筋岛,警方通過(guò)查閱死者的電腦和手機(jī)娶视,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)睁宰,“玉大人肪获,你說(shuō)我怎么就攤上這事∑馍担” “怎么了孝赫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)红符。 經(jīng)常有香客問(wèn)我青柄,道長(zhǎng),這世上最難降的妖魔是什么预侯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任致开,我火速辦了婚禮,結(jié)果婚禮上萎馅,老公的妹妹穿的比我還像新娘双戳。我一直安慰自己,他們只是感情好糜芳,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布飒货。 她就那樣靜靜地躺著,像睡著了一般峭竣。 火紅的嫁衣襯著肌膚如雪塘辅。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天邪驮,我揣著相機(jī)與錄音莫辨,去河邊找鬼。 笑死毅访,一個(gè)胖子當(dāng)著我的面吹牛沮榜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喻粹,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蟆融,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了守呜?” 一聲冷哼從身側(cè)響起型酥,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤山憨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后弥喉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體郁竟,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年由境,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棚亩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虏杰,死狀恐怖讥蟆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纺阔,我是刑警寧澤瘸彤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站笛钝,受9級(jí)特大地震影響质况,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜婆翔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一拯杠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啃奴,春花似錦潭陪、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瘟则,卻和暖如春黎炉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背醋拧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工慷嗜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丹壕。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓庆械,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親菌赖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缭乘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評(píng)論 25 707
  • apk是安卓工程打包的最終形式,將apk安裝到手機(jī)或者模擬器上就可以使用APP琉用。反編譯apk則是將該安卓工程的源碼...
    隋胖胖LoveFat閱讀 66,579評(píng)論 6 56
  • 前言 處理反編譯堕绩,首先先要了解apk文件的結(jié)構(gòu)策幼,然后是編譯過(guò)程,最后是反編譯奴紧。反編譯Apk的目的就是Apk拆成我們...
    yzzCool閱讀 5,694評(píng)論 0 8
  • 學(xué)習(xí)的方式有很多種特姐,Read the fucking source code 絕對(duì)不失為最佳的方式。除了閱讀 An...
    亦楓閱讀 3,517評(píng)論 2 18
  • 書(shū)中最開(kāi)始提了兩個(gè)概念绰寞,淘金思維和海綿思維到逊。一種指不加加以思考,幾近于全盤(pán)吸收的思維滤钱。另一種則是對(duì)任何事物都帶著問(wèn)...
    前世小光閱讀 235評(píng)論 0 0