最近根據(jù)別人的博客看了下如何對(duì)應(yīng)用進(jìn)行二次打包及皂。之前沒有真正實(shí)踐過(guò)甫男,今天就來(lái)自己動(dòng)手實(shí)現(xiàn)一下且改。聲明,本篇博客內(nèi)容也是根據(jù)別人的博客進(jìn)行學(xué)習(xí)板驳,然后我自己總結(jié)寫出的钾虐,目的就是好記性不如爛指頭,還是敲一遍記得深笋庄,我的學(xué)習(xí)鏈接:http://www.reibang.com/p/7e5ad780f8ab/comments/3607759#comment-3607759 在此也向作者表示感謝.
一效扫、二次打包的概念
所謂的二次打包的概念,即對(duì)已經(jīng)編譯發(fā)布的apk文件直砂,即已經(jīng)使用簽名文件進(jìn)行正式簽名的應(yīng)用文件進(jìn)行自己的修改之后菌仁,再次簽名打包發(fā)布的過(guò)程稱為二次打包。
二静暂、二次打包能干什么
我們知道济丘,最終我們發(fā)布到應(yīng)用市場(chǎng)供用戶下載的是一個(gè).apk形式的文件,apk文件其實(shí)就是一種特殊的文件格式洽蛀,其實(shí)就是資源文件摹迷,布局文件,主配置文件郊供,dex文件以及簽名驗(yàn)證文件等的文件集合。我們把.apk文件的后綴名修改為.zip包驮审,然后進(jìn)行解壓縮進(jìn)行查看,就能看到上面說(shuō)的一些文件目錄及文件的羅列地来,在此不在貼圖。具體說(shuō)到二次打包能干什么熙掺,其實(shí)就是我們可以對(duì)原來(lái)的apk文件中的源碼進(jìn)行修改未斑,然后重新編譯币绩,進(jìn)行二次打包,重新發(fā)布測(cè)試类浪,從而達(dá)到我們修改別人的apk文件的目的载城。
三肌似、二次打包需要的準(zhǔn)備
- adb shell dumpsys activity activities 命令, 該命令會(huì)列出當(dāng)前連接設(shè)備運(yùn)行的Activity棧的情況费就,其中就可以看到應(yīng)用包名川队,類的全路徑名等詳細(xì)信息睬澡。這有助于我們定為分析界面的相關(guān)信息眠蚂。
- apktool, dex2jar, jd-gui三個(gè)反編譯工具的準(zhǔn)備逝慧。apktool工具下載是建議安裝最新的昔脯,有的版本比較老在反編譯的時(shí)候可能會(huì)報(bào)錯(cuò)笛臣。dex2jar工具是將dex文件轉(zhuǎn)變成jar文件的工具;jd-gui工具是我們查看生成的jar文件的圖形化工具沈堡;關(guān)于如何準(zhǔn)備三個(gè)工具以及使用說(shuō)明,比較簡(jiǎn)單诞丽,就不在此敘述了。
- apk反編譯命令
apktool d demo.apk
- 生成keystore文件
keytool -genkey -alias androidauto.keystore -keyalg RSA -validity 20000 -keystore android.keystore
- apk文件進(jìn)行簽名
jarsigner -keystore demo.keystore -storepass password -signedjar demo.apk demo_signed.apk demo.keystore
如上命令就是使用demo.keystore簽名文件對(duì)apk文件進(jìn)行簽名刑赶。另外懂衩,在執(zhí)行如上簽名命令時(shí)勃痴,有的jdk如果是1.7版本時(shí),可能會(huì)簽名失敗沛申,提示警告,信息如下:
No -tsa or -tsacert is provided and this jar is not timestamped. Without a timestamp, users may not be able to validate this jar after the signer certificate's expiration date (2019-08-16) or after any future revocation date.
此時(shí)尖淘,需要修改如上的簽名命令著觉,修改后如下:
jarsigner -digestalg SHA1 -sigalg MD5withRSA -keystore demo.keystore -storepass password -signedjar demo.apk demo_signed.apk demo.keystore
- 卸載安裝命令
//先卸載 package為應(yīng)用包名
adb uninstall package
//然后進(jìn)行重新安裝
adb install package
不出意外,安裝就能成功趁桃。如果要驗(yàn)證的話,自己可以到應(yīng)用市場(chǎng)下載官方的apk文件油啤,然后試圖安裝替換蟀苛,會(huì)提示失敗,因?yàn)楹灻灰恢隆?/p>
準(zhǔn)備工作就是這么多帜平,接下來(lái)就是具體的二次打包的步驟
四裆甩、如何進(jìn)行二次打包
首先說(shuō)一下本次實(shí)踐的終極目標(biāo),修改某個(gè)應(yīng)用中一個(gè)界面的點(diǎn)擊事件淑掌,使其不能產(chǎn)生頁(yè)面跳轉(zhuǎn)事件抛腕,如下圖:
我們的目的就是讓右上角的意見反饋按鈕事件失效,無(wú)法完成跳轉(zhuǎn)摔敛,以完成我們修改的目的全封。依舊,Talk is cheap, show me the code.下面將二次打包的主要步驟分步驟敘述如下,為了方便說(shuō)明行楞,以某個(gè)應(yīng)用為例進(jìn)行說(shuō)明:
-
1.修改文件查看目錄結(jié)構(gòu)土匀。修改.apk文件為.zip后綴名并進(jìn)行解壓, 查看得到的目錄文件
-
2.查找代碼入口,尋找關(guān)鍵信息证杭。移動(dòng)設(shè)備安裝官方apk應(yīng)用妒御,并將要修改的設(shè)置界面打開到當(dāng)前顯示界面,然后執(zhí)行前面說(shuō)過(guò)的棧分析命令進(jìn)行查看送讲,如下:
通過(guò)上面的棧信息,我們可以清晰的看到,包名肥橙,相關(guān)類名及其全路徑存筏,這對(duì)我們后面找代碼至關(guān)重要。這里我們就看到我們要修改的類為BaseSettingActivity椭坚,全路徑名也要記住。
-
3.因?yàn)榇藨?yīng)用有三個(gè)dex文件券册,理論上來(lái)說(shuō)我們并不能確定BaseSettingActivity在哪個(gè)dex文件中垂涯,所以只能一個(gè)一個(gè)來(lái)進(jìn)行測(cè)試。首先將classes.dex拷貝出來(lái)使用dexjar工具進(jìn)行反編譯骄蝇,得到classes-dex2jar.jar文件,如下圖:
-
4.使用jd-gui圖形化工具查看相關(guān)代碼操骡,查找線索册招。
混淆后的代碼aQ變量就是反饋控件變量,同時(shí)還可以看到設(shè)置了監(jiān)聽事件鹦倚。
-
5.在Smali文件中找到對(duì)應(yīng)代碼進(jìn)行修改
將上圖中的設(shè)置監(jiān)聽事件的關(guān)鍵代碼刪除冀惭,也就是我們本次修改的目的,使點(diǎn)擊事件失效媒楼。
6.將修改后的smali代碼重新編譯成jar然后編譯成dex文件戚丸,再次進(jìn)行簽名扔嵌,最后安裝試驗(yàn)夺颤。關(guān)于如何進(jìn)行二次簽名以及流程世澜,請(qǐng)查看:http://www.reibang.com/p/3322d873af53
五、二次打包的意義
整個(gè)反編譯寥裂,分析封恰,修改,重新打包簽名這一整個(gè)過(guò)程下來(lái)诺舔,可以發(fā)現(xiàn),其實(shí)中間涉及的流程和內(nèi)容挺多的遗遵,同時(shí)還涉及到很多平時(shí)不容易涉及的原理知識(shí)點(diǎn)等內(nèi)容逸嘀。所以,掌握二次打包這整個(gè)過(guò)程翼岁,有助于我們更好的理解整個(gè)Android項(xiàng)目的內(nèi)在結(jié)構(gòu)司光,編譯過(guò)程,發(fā)布流程甚至安全防護(hù)等方面的知識(shí)榆俺。
六坞淮、延伸及拓展
通過(guò)上面的反編譯過(guò)程我們看到,通過(guò)反編譯工具回窘,我們可以拿到別人項(xiàng)目的混淆后的代碼啡直。雖然混淆代碼是將變量及類名做了處理苍碟,但是其實(shí)還是不夠安全撮执,如果被別人盯上,分析出業(yè)務(wù)邏輯理論上只是時(shí)間問題蜓肆。所以在安全防護(hù)這方面继效,敵追我趕装获,又出現(xiàn)了應(yīng)用加固這種說(shuō)法,增加別人破解的難度穴豫,不讓別人反編譯精肃,提高門檻。當(dāng)然司抱,有矛自然有盾,對(duì)應(yīng)的肯定就是脫殼技術(shù)匀谣,可以將加固的文件進(jìn)行脫殼资溃,然后反編譯。打算下一目標(biāo)學(xué)習(xí)學(xué)習(xí)脫殼宝恶,看能否研究個(gè)皮毛趴捅。