Android逆向-反編譯apk并重新打包

特定情況下,我們需要將出好的安裝包解開(kāi)替換某些資源和代碼,這種情況一般在游戲行業(yè)以及聚合SDK情況比較多鲫尊,這里不考慮分包和混淆情況。主要流程:

1.將更新的代碼轉(zhuǎn)換成smali格式沦偎;
2.使用apktool將apk反編譯疫向;
3.添加1中生成的smali竞帽、資源等;
4.使用apktool鸿捧、jarsigner屹篓、zipalign等工具和包、加密匙奴、對(duì)齊堆巧。

一、反編譯

方法1:

1.將apktool腳本和apktool.jar文件移動(dòng)到/usr/local/bin文件夾下泼菌;
2.使用命令chmod +x 分別對(duì)apktool和apktool.jar文件進(jìn)行提取權(quán)限谍肤;

cd /usr/local/bin
chmod +x apktool
chmod +x apktool.jar

3.終端輸入./apktool測(cè)試是否成功(或/usr/local/bin/apktool);
4.cd到apk所在目錄哗伯;
5.運(yùn)行apktool腳本進(jìn)行反編譯荒揣。

apktool d demo.apk -o [輸出目錄](méi)

解包之后目錄結(jié)構(gòu)如下(這里原工程未包含assets,libs):


image.png

這里源碼為.smali格式,如果需要查看源碼焊刹,需要做轉(zhuǎn)換
6.smali2dex

java -jar smali.jar -o 目標(biāo)dex文件 [smali文件夾] 

7.dex2jar

d2j-dex2jar.bat classes.dex

將生成的jar包導(dǎo)入JD-GUI查看源碼

方法2:

將apk更改為zip,拷貝其classes.dex等dex到dex2jar-2.0文件夾
雙擊dex2jar-2.0文件夾下的d2j-jar2dex.bat系任,再打開(kāi)cmd,進(jìn)入當(dāng)前dex2jar-2.0目錄虐块,執(zhí)行d2j-dex2jar classes.dex,得到的是classes-dex2jar.jar包俩滥。
獲得classes-dex2jar.jar,使用GUI工具打開(kāi)jar包。

方法3:

使用dex2jar-2.0工具贺奠,將apk種的dex文件轉(zhuǎn)換成jar霜旧,使用JD_GUI工具查看源碼。
1.將dex2jar里的d2j_invoke.sh和d2j-dex2jar.sh增加可執(zhí)行權(quán)限儡率。

sudo chmod +x d2j_invoke.sh
sudo chmod +x d2j-dex2jar.sh

2.然后進(jìn)到dex2jar這個(gè)文件夾下執(zhí)行:

d2j-dex2jar.sh test.apk

得到test-dex2jar.jar文件,使用GUI工具查看源碼挂据。

二、重新打包

解包的方式有很多儿普,但如果需要更改代碼崎逃,一般解包時(shí)使用apktool將源碼轉(zhuǎn)換成smali格式。將寫(xiě)好的代碼.java文件轉(zhuǎn)換成smali格式箕肃,然后合包婚脱,如下:

第一步:javac命令編譯java文件為class文件
第二步:dx命令將class文件轉(zhuǎn)化成dex文件
第三步:使用baksmali工具將dex文件轉(zhuǎn)化成smali文件

1.終端輸入命令:

apktool b demo unsigned-demo.apk -o [輸出目錄](méi)

此時(shí)生成的是未簽名的安裝包,需要簽名后才能安裝使用勺像。
2.APK簽名

格式:jarsigner -verbose -keystore [簽名文件名稱(chēng)] -signedjar [簽名后apk名稱(chēng)] [待簽名apk名稱(chēng)] [簽名別名]障贸,如下:
jarsigner -verbose -keystore android_release.keystore -signedjar signed-demo.apk unsigned-demo.apk android.keystore

驗(yàn)證應(yīng)用是否已簽名

jarsigner -verify [待驗(yàn)證的apk]
  1. zipalign
    zipalign 是一種歸檔對(duì)齊工具,可對(duì) Android 應(yīng)用 (APK) 文件提供重要的優(yōu)化吟宦。其目的是要確保所有未壓縮數(shù)據(jù)的開(kāi)頭均相對(duì)于文件開(kāi)頭部分執(zhí)行特定的對(duì)齊篮洁。具體來(lái)說(shuō),它會(huì)使 APK 中的所有未壓縮數(shù)據(jù)(例如圖片或原始文件)在 4 字節(jié)邊界上對(duì)齊殃姓。這樣一來(lái)袁波,即可使用 mmap() 直接訪(fǎng)問(wèn)所有部分瓦阐,即使其中包含具有對(duì)齊限制的二進(jìn)制數(shù)據(jù)也沒(méi)關(guān)系。這樣做的好處是可以減少運(yùn)行應(yīng)用時(shí)消耗的 RAM 容量篷牌。

注意:您必須在應(yīng)用構(gòu)建過(guò)程中的兩個(gè)特定時(shí)間點(diǎn)之一使用 zipalign睡蟋,具體在哪個(gè)時(shí)間點(diǎn)使用,取決于您所使用的應(yīng)用簽名工具:

  • 如果您使用的是 apksigner枷颊,則只能在為 APK 文件簽名之前執(zhí)行 zipalign戳杀。如果您在使用 apksigner 為 APK 簽名之后對(duì) APK 做出了進(jìn)一步更改,簽名便會(huì)失效夭苗。
  • 如果您使用的是 jarsigner信卡,則只能在為 APK 文件簽名之后執(zhí)行 zipalign。

要對(duì)齊 infile.apk 并將其保存為 outfile.apk题造,請(qǐng)運(yùn)行以下命令:

zipalign [-f] [-v] <alignment> infile.apk outfile.apk

要確認(rèn) existing.apk 的對(duì)齊方式傍菇,請(qǐng)運(yùn)行以下命令:

zipalign -c -v <alignment> existing.apk

zipalign說(shuō)明

Copyright (C) 2009 The Android Open Source Project

Usage: zipalign [-f] [-p] [-v] [-z] <align> infile.zip outfile.zip
       zipalign -c [-p] [-v] <align> infile.zip

  <alignment> 是一個(gè)整數(shù),用于定義字節(jié)對(duì)齊邊界界赔。此值必須始終為 4(可提供 32 位對(duì)齊)丢习,否則實(shí)際將不會(huì)執(zhí)行任何操作
  -c: check alignment only (確認(rèn)給定文件的對(duì)齊方式)
  -f: overwrite existing outfile.zip (覆蓋現(xiàn)有的 outfile.zip)
  -p: memory page alignment for stored shared object files(outfile.zip 應(yīng)對(duì) infile.zip 中的所有共享對(duì)象文件使用相同的頁(yè)面對(duì)齊方式)
  -v: verbose output(詳細(xì)輸出)
  -z: recompress using Zopfli

使用adb安裝

adb -d install -r test.apk

打開(kāi)應(yīng)用

adb shell am start com.android.test/.MainActivity
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者仔蝌。
  • 序言:七十年代末泛领,一起剝皮案震驚了整個(gè)濱河市荒吏,隨后出現(xiàn)的幾起案子敛惊,更是在濱河造成了極大的恐慌,老刑警劉巖绰更,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞧挤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡儡湾,警方通過(guò)查閱死者的電腦和手機(jī)特恬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)徐钠,“玉大人癌刽,你說(shuō)我怎么就攤上這事〕⒇ぃ” “怎么了显拜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)爹袁。 經(jīng)常有香客問(wèn)我远荠,道長(zhǎng),這世上最難降的妖魔是什么失息? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任譬淳,我火速辦了婚禮档址,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘邻梆。我一直安慰自己守伸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布浦妄。 她就那樣靜靜地躺著含友,像睡著了一般。 火紅的嫁衣襯著肌膚如雪校辩。 梳的紋絲不亂的頭發(fā)上窘问,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音宜咒,去河邊找鬼惠赫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛故黑,可吹牛的內(nèi)容都是我干的儿咱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼场晶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼混埠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起诗轻,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钳宪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后扳炬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吏颖,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年恨樟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了半醉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡劝术,死狀恐怖缩多,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情养晋,我是刑警寧澤衬吆,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站匙握,受9級(jí)特大地震影響咆槽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜圈纺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一秦忿、第九天 我趴在偏房一處隱蔽的房頂上張望麦射。 院中可真熱鬧,春花似錦灯谣、人聲如沸潜秋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)峻呛。三九已至,卻和暖如春辜窑,著一層夾襖步出監(jiān)牢的瞬間钩述,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工穆碎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牙勘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓所禀,卻偏偏與公主長(zhǎng)得像方面,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子色徘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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