? ? ? ? 在我們開發(fā)的過程中,幾乎每天都需要打包生成apk安裝包,那我們是否有仔細(xì)的了解過一個(gè)apk從生成窖认,到最后用戶的使用過程中,都會(huì)經(jīng)歷什么樣的過程告希,中間的實(shí)現(xiàn)原理是如何的扑浸,下面我們就一起了解一下吧。? ?
? ? ? ? Apk的生成過程:從Android Studio的項(xiàng)目創(chuàng)建到---------> 各大應(yīng)用應(yīng)用商店上架的Apk文件暂雹, 中間經(jīng)歷了什么首装?
知識(shí)點(diǎn)匯總:
一:生成各種代碼,資源文件杭跪,依賴包等文件仙逻,通過Gradle構(gòu)建生成Apk。
二:通過jks簽名文件涧尿,對(duì)生成的Apk文件進(jìn)行簽名系奉。
三:通過AndResGuard,Proguard對(duì)簽名Apk進(jìn)行混淆
四:通過愛加密姑廉,騰訊樂固等第三方工具缺亮,對(duì)Apk進(jìn)行加固
五:通過了解各大應(yīng)用商店的上架要求,完成Apk的上架
六:擴(kuò)展閱讀
一:各種代碼桥言,資源文件萌踱,依賴包等文件葵礼,通過Gradle構(gòu)建生成Apk
? ? ? ?我們從立項(xiàng)到后續(xù)的迭代開發(fā),大部分時(shí)候都是填充下面的配置文件和源碼文件并鸵,我們?cè)陂_發(fā)的過程中需要了解下面各個(gè)文件的作用是什么鸳粉?
項(xiàng)目配置文件:
1、AndroidManifest.xml文件园担。
2届谈、各種Build.Gradle配置文件。(grovvy語言)?
3弯汰、proguard_rules.pro配置文件艰山。?
4、jks或keystore簽名文件咏闪。
項(xiàng)目源碼文件:
1曙搬、AIDL文件。(多進(jìn)程)?
2汤踏、src文件夾各種java源碼文件织鲸。?
3、res文件夾各種資源文件溪胶。
4搂擦、asset文件夾文件。?
5哗脖、各種依賴的jar包瀑踢。?
6、各種依賴的aar包才避。?
7橱夭、各種依賴的module項(xiàng)目。
8桑逝、各種依賴的.so文件棘劣。(JNI開發(fā))
? ? ? ?我們知道,在做開發(fā)的時(shí)候楞遏,我們的開發(fā)平臺(tái)需要依賴JDK和SDK茬暇,其實(shí)在JDK和SDK中,里面除了開發(fā)需要的API源碼寡喝,里面還包含生成apk所需要的各種各樣的插件糙俗,下面就一一介紹這些插件吧。
? ? ? ?生成Apk相關(guān)插件介紹:
附加:jarsignr是Java本生自帶的一個(gè)工具预鬓,他可以對(duì)jar進(jìn)行簽名的巧骚。而signapk是后面專門為了Android應(yīng)用程序apk進(jìn)行簽名的工具,他們兩的簽名算法沒什么 區(qū)別,主要是簽名時(shí)使用的文件不一樣劈彪。
Apk的生成流程:(谷歌官方)
? ? ? ? 我們仔細(xì)的看看這張圖的流程竣蹦,最后會(huì)生成一個(gè)簽了名的apk文件,apk文件其實(shí)是一個(gè)壓縮文件粉臊,我們可以看看apk文件包含了什么草添?
Apk文件的組成:(解壓看看apk的組成)
各個(gè)文件夾的作用:
Apk各個(gè)文件夾詳解:
Assets目錄:存放需要打包到APK的靜態(tài)文件,該目錄與res目錄不同之處在于,Assets目錄支持任意深度的子目錄扼仲,我們的開發(fā)者可以根據(jù)自己的需求來任意部 署文件夾的架構(gòu),而且res目錄下的文件會(huì)在.R文件中生成與其對(duì)應(yīng)的資源ID抄淑,屠凶, Assets不會(huì)自動(dòng)生成對(duì)應(yīng)的id,訪問的時(shí)候需要AssetManager類肆资。
Lib目錄:該目錄用來存放應(yīng)用程序所依賴的native庫文件矗愧,native庫一般是用C/C++進(jìn)行編寫的,這里的lib庫可能包含4種不同類型郑原,根據(jù)CPU型號(hào)的不同唉韭,我們大體可 以分為ARM,ARM-v7a犯犁,MIPS属愤,X86,分別對(duì)應(yīng)著ARM架構(gòu)酸役,ARM-V7架構(gòu)住诸,MIPS 架構(gòu)和X86架構(gòu),這些so庫在apk包中構(gòu)成如下圖: ???????其中涣澡,不同的CPU架構(gòu)對(duì)應(yīng)著不同的目錄贱呐,每個(gè)目錄中可以存放非常多的對(duì)應(yīng)版 本的so庫,而且這個(gè)目錄的結(jié)構(gòu)固定入桂,用戶只能按照這個(gè)目錄來存放自己的so庫奄薇。 目前市場(chǎng)上使用的移動(dòng)終端大多是基于ARM或者ARM-v7a架構(gòu)的。從廠家上來分 是有三種抗愁,arm馁蒂,x86,MIPS驹愚,arm 系列是絕大多數(shù)手機(jī)上使用的远搪,x86 主要是運(yùn) 用在平板上,而 MIPS 逢捺,我基本上就沒見過谁鳍。
Res目錄:res是resource的縮寫,這個(gè)目錄存放的東西是資源文件,存放這個(gè)文件夾下的所有文件都會(huì)和上文所說的倘潜,映射到Android工程中的.R文件中绷柒,生成對(duì)應(yīng) 的資源ID,訪問的時(shí)候直接使用資源ID涮因,即R.ID.FILENAME废睦,res文件夾下可以包 含多個(gè)文件夾;anim是存放動(dòng)畫文件的养泡;drawable目錄存放圖形資源嗜湃;layout目錄 存放布局文件;values目錄存放一些特征值澜掩;colors.xml存放color的顏色值等等购披。
META-INF目錄:保存應(yīng)用程序的簽名信息,簽名信息可以驗(yàn)證APK文件的完整性肩榕。當(dāng)AndroidSDK在打包APK文件時(shí)會(huì)計(jì)算APK包中的所有文件信息的完整性刚陡,并且把 這些完整性保存到META-INF文件夾下,應(yīng)用程序在安裝的時(shí)候首先會(huì)根據(jù)META-INF文件夾校驗(yàn)APK的完整性株汉。通過這種手段筐乳,我們就可以在一定程度上保證APK中的每一個(gè)文件不被篡改。以此來確保我們的APK應(yīng)用程序不被惡意修改或者被病毒文件感染乔妈,這有利于確保Android應(yīng)用的完整性和系統(tǒng)的安全性蝙云。META-INF目錄中包含 的文件有CERT.RSA,CERT.SF和MANIFEST.MF褒翰。其中CERT.RSA是 開發(fā)者利用私鑰對(duì)APK進(jìn)行簽名的簽名文件贮懈,CERT.SF和MANIFEST.MF記錄了文件 中文件的SHA-1哈希值。
AndroidManifest.xml:這是Android應(yīng)用程序的配置文件优训,是一個(gè)用來描述Android應(yīng)用“整體咨詢”的設(shè)定文件朵你,簡(jiǎn)單的說,這相對(duì)于Android應(yīng)用向Android系統(tǒng)的“自我介紹”配置文件揣非,Android系統(tǒng)可以根據(jù)Androidmanifest.xml文件來完整的了解這個(gè)APK應(yīng)用程序的咨詢抡医。不難想到,每個(gè)Android應(yīng)用程序都必須包含一個(gè)Androidmanifest.xml文件,并且它的名字是固定的早敬,是禁止修改的忌傻。
classes.dex:傳統(tǒng)的Java程序,首先先把文件編譯成class文件搞监,字節(jié)碼都保存在了class文件中水孩,Java虛擬機(jī)可以通過解釋且執(zhí)行這些class文件。然而Dalvik虛擬機(jī)是在Java虛擬機(jī)進(jìn)行了優(yōu)化琐驴,執(zhí)行的是Dalvik字節(jié)碼俘种,而這些Dalvik字節(jié)碼就是由Java字節(jié)碼轉(zhuǎn)換而來的秤标。一般來說,Android應(yīng)用在打包的時(shí)候通過AndroidSDK中的dx工具將Java字節(jié)碼轉(zhuǎn)換為Dalvik字節(jié)碼宙刘。Dx工具可以對(duì)多個(gè)class文件進(jìn)行合并苍姜,重組和優(yōu)化,通過這些操作悬包,可以達(dá)到減小體積衙猪,縮短運(yùn)行時(shí)間的目的。
Resources.arsc:用來記錄資源文件和資源ID之間的映射關(guān)系布近,用來根據(jù)資源ID尋找資源垫释。Android的開發(fā)是分模塊的,res目錄專門用來存放資源文件吊输,當(dāng)在代碼中需要調(diào)用資源文件時(shí)饶号,只需要調(diào)用方法“findviewbyid()”就可以得到資源文件,每當(dāng)在res文件夾下放一個(gè)文件季蚂,aapt就會(huì)自動(dòng)生成對(duì)應(yīng)的ID保存在.R文件,我們調(diào)用這個(gè)ID就可以琅束,但是只有這個(gè)ID還不夠扭屁,.R文件只是保證編譯程序不報(bào)錯(cuò),實(shí)際上在程序運(yùn)行時(shí)涩禀,系統(tǒng)要根據(jù)ID去尋找對(duì)應(yīng)的資源路徑料滥,而resources.arsc文件就是用來記錄這些ID和資源文件位置對(duì)應(yīng)關(guān)系的文件。
二:通過jks簽名文件艾船,對(duì)生成的Apk文件進(jìn)行簽名
簽名流程:對(duì)APK中所有文件內(nèi)容分別進(jìn)行Hash計(jì)算葵腹,并將結(jié)果以BASE64編碼格式保存在MANIFEST.MF。使用開發(fā)者的私鑰對(duì)MANIFEST.MF進(jìn)行加密屿岂,將加密結(jié) 果保存在CERT.SF践宴。最后CERT.RSA(證書信息包括公鑰)和上面的兩個(gè)文件,放入 APK的META-INF目錄下爷怀。
兩種簽名機(jī)制V1和V2的區(qū)別:V1:通過ZIP條目進(jìn)行驗(yàn)證阻肩,這樣APK 簽署后可進(jìn)行許多修改可以移動(dòng)甚至重新 壓縮文件。 V2:驗(yàn)證壓縮文件的所有字節(jié)运授,而不是單個(gè) ZIP 條目烤惊,因此,在簽名后無法再 更改(包括 zipalign)吁朦。正因如此柒室,現(xiàn)在在編譯過程中,我們將壓縮逗宜、調(diào)整和簽署合 并成一步完成雄右。好處顯而易見空骚,更安全而且新的簽名可縮短在設(shè)備上進(jìn)行驗(yàn)證的 時(shí)間(不需要費(fèi)時(shí)地解壓縮然后驗(yàn)證),從而加快應(yīng)用安裝速度不脯。
附加:Android 7.0引入一項(xiàng)新的應(yīng)用簽名方案APK Signature Scheme v2府怯,它能提供更快的應(yīng)用安裝時(shí)間和更多針對(duì)授權(quán)APK文件更改的保護(hù),在默認(rèn)情況下防楷,Android Studio 2.2和 Android Plugin for Gradle 2.2 會(huì)使用APK Signature Scheme v2和傳統(tǒng)簽名方案來簽署您的應(yīng)用牺丙。
簽名文件jks詳解:
描述:jks文件是一個(gè)java中的密鑰管理庫,里面存放我們的私鑰复局,公鑰以及證書冲簿。
使用:應(yīng)用發(fā)布上線的時(shí)候,使用jks文件對(duì)其簽名,可以防止應(yīng)用被惡意篡改替換,同樣也是開發(fā)者身份的標(biāo)識(shí)亿昏,加強(qiáng)應(yīng)用的安全性峦剔。???????
? ? ? ?日常開發(fā)中經(jīng)常會(huì)使用到地圖,分享,支付等的第三方框架,申請(qǐng)時(shí)往往需要填入應(yīng)用的sha1值,正式發(fā)包時(shí)使用的是jks文件中的sha1值,本地測(cè)試時(shí)使用的是本地的debug.jks中的sha1值。 ????????
? ? ? ?得到了jks文件中的SHA1值,這個(gè)值就是申請(qǐng)時(shí)需要填入各個(gè)第三方平臺(tái)的正式包的值SHA1值角钩。這個(gè)SHA1值就是證書指紋吝沫,是對(duì)證書的數(shù)據(jù)摘要,證書是隱式創(chuàng)建的递礼,提取一下jks文件中的證書文件惨险,再對(duì)證書文件進(jìn)行摘要,使用sha1算法后,也就是是jks中的SHA1值脊髓。
Apk簽名需要解決什么問題:
第一點(diǎn):如何判斷證書是否有效???????
因?yàn)楹灻臅r(shí)候是使用私鑰對(duì)MANIFEST.MF進(jìn)行加密保存在CERT.SF中辫愉, 之后只需要用證書中的公鑰對(duì)CERT.SF進(jìn)行解密,將結(jié)果和MANIFEST.MF進(jìn)行 比較即可将硝,注意恭朗,在證書正確的情況下如果更改的APK里面文件內(nèi)容,此時(shí)以上 判斷還是不會(huì)通過依疼。因?yàn)镸ANIFEST.MF保存的是APK里面所有文件的Hash值痰腮, 只要改變了APK里文件內(nèi)容,Hash值就會(huì)變化涛贯。
第二點(diǎn):如何判斷APK是否被更改???????
在簽名保證MANIFEST.MF有效的前提下诽嘉,只要對(duì)當(dāng)前APK所有文件的內(nèi)容 的Hash值的BASE64編碼和MANIFEST.MF相應(yīng)文件存的值進(jìn)行比較即可。
? ?安裝應(yīng)用時(shí)PackageManagerService會(huì)對(duì)APK進(jìn)行簽名檢查弟翘,具體分為以下幾步:1.讀取CERT.RSA(證書信息包括公鑰)虫腋、MANIFEST.MF、CERT.SF 2.使用獲取的公鑰對(duì)CERT.SF解密稀余,將解密結(jié)果和MANIFEST.MF進(jìn)行比較悦冀,如果相同說明證書有效、MANIFEST.MF未被更改睛琳。 3.對(duì)APK中所有文件內(nèi)容分別進(jìn)行Hash計(jì)算盒蟆,將結(jié)果的BASE64編碼和MANIFEST.MF里的相應(yīng)內(nèi)容進(jìn)行比較踏烙,全部相同則APK的內(nèi)容未被更改。
三:通過AndResGuard历等,Proguard對(duì)簽名Apk進(jìn)行混淆
背景:由于java和.net這類高層抽象語言讨惩,具有天生的易反匯編特性,其編譯后的程序包包含了大量的源代碼變量寒屯、函數(shù)名荐捻、數(shù)據(jù)結(jié)構(gòu)等信息,根據(jù)其編譯后的程序包寡夹,可以非常容易的得到近乎源代碼質(zhì)量的反匯編代碼处面。如果不加混淆,相當(dāng)于直接將源代碼拱手送人菩掏,內(nèi)容嚴(yán)密的app權(quán)限審核可以說是形同虛設(shè)魂角。如果大家想避免源代碼泄漏后重新修改策劃而額外增加的工作量,建議都加上混淆智绸。
介紹:ProGuard是一個(gè)免費(fèi)的java類文件壓縮,優(yōu)化,混淆器.它探測(cè)并刪除沒有使用的類,字段,方法和屬性.它刪除沒有用的說明并使用字節(jié)碼得到最大優(yōu)化.它使用無意義的名字來重命名類,字段和方法野揪。
ProGuard功能介紹:
1、壓縮瞧栗。移除無效的類囱挑、類成員、方法沼溜、屬性等;?
2游添、優(yōu)化系草。分析和優(yōu)化方法的二進(jìn)制代碼;根據(jù)proguard-android-optimize.txt中的描述唆涝,優(yōu)化可能會(huì)造成一些潛在風(fēng)險(xiǎn)找都,不能保證在所有版本的Dalvik上都正常運(yùn)行。?
3廊酣、混淆能耻。把類名、屬性名亡驰、方法名替換為
簡(jiǎn)短且無意義的名稱晓猛;?
4、預(yù)校驗(yàn)凡辱。添加預(yù)校驗(yàn)信息戒职。這個(gè)預(yù)校驗(yàn)是作用在Java平臺(tái)上的,Android平臺(tái)上不需要這項(xiàng)功能透乾,去掉之后還可以加快混淆速度洪燥。
混淆原理:用“ 不能直接猜出含義 的通用變量名和函數(shù)名a b c等”替換編譯后程序包中“ 具有明顯語義信息的變量名和函數(shù)名”磕秤,這樣,通過逆向工程得到的只是難以理解的代碼捧韵。
混淆 ProGuard常用語法:
1市咆、-libraryjars class_path 應(yīng)用的依賴包,如android-support-v4?
2再来、-keep [,modifier,...] class_specification 不混淆某些類?
3蒙兰、-keepclassmembers [,modifier,...] class_specification 不混淆類的成員?
4、-keepclasseswithmembers [,modifier,...] class_specification 不混淆類及其成員?
5其弊、-keepnames class_specification 不混淆類及其成員名?
6癞己、-keepclassmembernames class_specification 不混淆類的成員名?
7、-keepclasseswithmembernames class_specification 不混淆類及其成員名?
8梭伐、-assumenosideeffects class_specification 假設(shè)調(diào)用不產(chǎn)生任何影響痹雅,在proguard 代碼優(yōu)化時(shí)會(huì)將該調(diào)用remove掉。如system.out.println和Log.v等等 -dontwarn [class_filter] 不提示warnning
附加:混淆配置開源項(xiàng)目:https://github.com/msdx/android-proguard-cn
從混淆的原理可以得出以下兩點(diǎn)信息:
1糊识、重命名變量名可能會(huì)導(dǎo)致程序異常绩社。因?yàn)槌绦蚴切枰脚_(tái)交互的,平臺(tái)只會(huì)以固定類名來調(diào)用我們的app赂苗,這就涉及到需要屏蔽不能重命名的函數(shù)及類 proguard.cfg文件就是起這個(gè)作用的愉耙,混淆后哪個(gè)地方出錯(cuò),就將相關(guān)的類和函數(shù)加入到混淆屏蔽列表里面去拌滋。?
2朴沿、由于混淆只改變字符串,并不能改變程序邏輯败砂,耐心的hacker還是能夠理解程序的設(shè)計(jì)思路并嘗試修改赌渣。但這類人群不會(huì)太多,加上有我們自定義框架的牽制昌犹,逆向工程也絕非輕而易舉坚芜。 ??????
? ?在package編譯時(shí)使用proguard混淆,即使用晦澀的名字重命名類名斜姥、字段名鸿竖、函數(shù)名,以精簡(jiǎn)、優(yōu)化和混淆代碼铸敏。使用proguard處理的好處是apk文件會(huì)有一點(diǎn)點(diǎn)變小缚忧,同時(shí)更加難于被反編譯。
混淆代碼的好處:
1搞坝、創(chuàng)建緊湊的代碼文檔是為了更快的網(wǎng)絡(luò)傳輸,快速裝載和更小的內(nèi)存占用搔谴。?
2、創(chuàng)建的程序和程序庫很難使用反向工程桩撮。?
3敦第、所以它能刪除來自源文件中的沒有調(diào)用的代碼峰弹。?
4、充分利用java6的快速加載的優(yōu)點(diǎn)來提前檢測(cè)和返回java6中存在的類文件芜果。?
檢查混淆和追蹤異常:
? ?混淆過的包必須進(jìn)行檢查鞠呈,避免因混淆引入的bug,一方面右钾,需要從代碼層面檢查蚁吝。使用上文的配置進(jìn)行混淆打包后在 <module-name>/build/outputs/mapping/ release/ 目錄下會(huì)輸出以下文件:
?1、dump.txt:說明apk中所有文件的內(nèi)部結(jié)構(gòu)舀射。
?2窘茁、mapping.txt:提供原始和混淆過的類,方法和字段名稱之間的轉(zhuǎn)換脆烟。
?3山林、seeds.txt:列出未進(jìn)行混淆的類和成員。
?4邢羔、usage.txt:列出從apk移除的代碼驼抹。
高級(jí)混淆的方法:???????
? ? ? ?因?yàn)镴ava語言是支持雙字符的,所以可以將包名拜鹤,類名框冀,變量名,方法名定義成中文敏簿,或者其他國(guó)家的語言都可以的明也。 ???????
? ? ? ?混淆一般是采用了proguard.jar工具,這個(gè)工具混淆之后的代碼默認(rèn)都是26個(gè)大小寫字母惯裕,所以如果想把代碼混淆成中文诡右,那么就需要對(duì)這個(gè)工具下手,由于 proguard.jar是一個(gè)開源項(xiàng)目轻猖,我們可以通過修改源碼里面的SimplyNameFactory的代碼,從而可以修改成中文域那,也可以修改成其他國(guó)家的語言咙边。
效果圖:
付費(fèi)混淆方案:
? ?Android默認(rèn)集成了ProGuard,它是一個(gè)免費(fèi)的用于壓縮、優(yōu)化和混淆Java字節(jié)碼的工具次员,混淆的功能主要是用簡(jiǎn)短的無意義的字母組合來對(duì)代碼中的類败许、字段、方法和屬性進(jìn)行重命名淑蔚,但它無法對(duì)字符串進(jìn)行混淆市殷。? ? ? ??
? ?即使用Proguard后,我們還是可以看到反編譯后代碼中完整的字符串定義刹衫,我們可以選擇商業(yè)版的Proguard-DexGuard醋寝。DexGuard對(duì)代碼搞挣、資源、字符串音羞、AndroidManifest.xml等進(jìn)行了全面的加密和混淆囱桨。
混淆資源:
資源加載過程分析:???????
? ? ? ?在開發(fā)過程中我們通過aapt生成的R.java中的常量來使用資源,而在編譯之后使用常量的地方都會(huì)被替換為常量的值嗅绰,也就是說我們通過Resource使用一個(gè)int數(shù)值來查找使用資源舍肠。那么Resource是怎么通過int數(shù)值找到具體的資源呢?我們解壓apk可以看到里面有個(gè)resources.arsc文件窘面,這個(gè)文件也是由aapt生成翠语,文件中保存著資源id和資源key的映射關(guān)系。Resource就是按照這個(gè)映射關(guān)系找到資源的财边。
資源混淆原理和實(shí)現(xiàn):???????
? ? ? ? 一般情況下查找資源的過程中不會(huì)用到資源名肌括,也就是key。當(dāng)然res數(shù)據(jù)中也有當(dāng)前res的key在key string pool中的索引制圈,但一般情況下用不到们童。根據(jù)這個(gè)原理我們可以在打包完成之后對(duì)key進(jìn)行混淆。而且剛剛說到res數(shù)據(jù)中保存的都是字符串在string pool中的索引鲸鹦。所以我們混淆只需要修改res string pool和spec string pool兩個(gè)字符串池慧库。其他的數(shù)據(jù)不用修改,從而實(shí)現(xiàn)馋嗜,資源名在在最終的 Apk中得到修改齐板。
混淆資源的好處:
1、解決apk瘦身,主要就是壓縮了資源文件葛菇。?
2甘磨、修改了文件名字及映射關(guān)系,即使用晦澀的名字重命名眯停。
混淆資源的方案:
1济舆、微信資源混淆方案(https://github.com/shwenzhang/AndResGuard)?
2、美團(tuán)資源混淆方案(僅僅是提供了修改的思路,并未將混淆的函數(shù)公開)
四:通過愛加密莺债,騰訊樂固等第三方工具滋觉,對(duì)Apk進(jìn)行加固
加固原理分析:
1、為什么要對(duì)原始dex進(jìn)行加密齐邦,同時(shí)用脫殼dex文件替換原始dex文件椎侠?大部分的apk反編譯工具(dex2jar、apktools措拇、jui等)都是對(duì)dex文件進(jìn)行反編譯我纪,將dex文件反編譯成smail,然后再轉(zhuǎn)化成class文件進(jìn)行閱讀和修改。用脫殼dex替換原始dex文件之后浅悉,用上面的反編譯工具反編譯apk文件趟据,只能看到脫殼程序的class文件,看不到apk本身的class文件仇冯。對(duì)dex文件進(jìn)行加密之宿,這樣即使第三方拿到了dex文件,也無法解密苛坚,也就無法對(duì)其進(jìn)行解析和分析膘掰。?
2秧耗、怎么確保apk功能正常運(yùn)行?加固后的apk啟動(dòng)之后,脫殼dex文件會(huì)對(duì)加密后的dex文件進(jìn)行解密胃惜,然后基于dexclassload動(dòng)態(tài)加載解密后的dex文件熬词。從用戶的角度惫搏,加固前后App的功能和體驗(yàn)基本是一樣的剥哑。這個(gè)和插件化的原理是一樣的。?
3冒掌、dex加固主要是防止被靜態(tài)反編譯噪裕,進(jìn)而獲取源碼并修改。
對(duì)App dex進(jìn)行加固的基本步驟如下:?
1股毫、從App原始apk文件里獲取到原始dex文件膳音。?
2、對(duì)原始dex文件進(jìn)行加密铃诬,并將加密后的dex文件和相關(guān)的文件存放到assert目錄里祭陷。?
3、用脫殼dex文件替換原始apk文件里的dex文件趣席;脫殼dex文件的作用主要有兩個(gè)兵志,一個(gè)是解密加密后的dex文件;二是基于dexclassloader動(dòng)態(tài)加載解密后的dex文件宣肚。
4想罕、因?yàn)樵糰pk文件已經(jīng)被修改,所以需要?jiǎng)h除原始apk的簽名信息霉涨,即刪除META-INF目錄下的.RSA弧呐、.SF 和MANIFEST.MF文件。?
5嵌纲、生成加固后的apk文件。?
6腥沽、對(duì)加固后的apk文件進(jìn)行簽名逮走,apk加固完成。
大致流程圖:
1今阳、源apk:需要加密的apk程序师溅,源dex來自于源apk茅信。
2、殼程序:Android工程墓臭,提供殼dex蘸鲸,殼dex主要作為工程入口,解密出源dex窿锉,映射到源dex等操作酌摇。?
3、加密程序:java工程嗡载,主要是做對(duì)源dex加密且和殼dex合并成新dex的操作窑多。
加固的優(yōu)點(diǎn):
1、對(duì)App進(jìn)行加固洼滚,可以有效防止移動(dòng)應(yīng)用被破解埂息、盜版、二次打包遥巴、注入千康、反編譯等,保障程序的安全性铲掐、穩(wěn)定性拾弃。對(duì)于金融類App,尤其重要迹炼。
加固的缺點(diǎn):
1砸彬、無法擺脫對(duì)JNI的依賴,存在被記錄修復(fù)的可能性斯入。?
2砂碉、由Java轉(zhuǎn)換成等價(jià)的C/C++,會(huì)導(dǎo)致體積程線性增大,性能有所下降刻两。
附加:(騰訊樂固)
免費(fèi)版本:使用通用加固策略增蹭,保證基本的 App 安全,普遍適用于各種應(yīng)用磅摹,穩(wěn)定 性和兼容性可靠滋迈。?
收費(fèi)版本:是針對(duì)于應(yīng)用自身的特性,及用戶需要户誓,專屬加固策略饼灿,實(shí)現(xiàn)更高的 App 安全標(biāo)準(zhǔn);同時(shí)帝美,基于人工的加固策略審核碍彭,以及加固后的兼容性測(cè)試服務(wù),可以 更好的保證應(yīng)用加固后的穩(wěn)定性和兼容性。
加固技術(shù)發(fā)展歷程:???????
? ? ? ?傳統(tǒng)App加固技術(shù)庇忌,前后經(jīng)歷了五代技術(shù)變更舞箍,保護(hù)級(jí)別每一代都有所提升,但其固有的安全缺陷和兼容性問題始終未能得到解決皆疹。而下一代加固技術(shù)—虛機(jī)源碼保護(hù)疏橄,適用代碼類型更廣泛,App保護(hù)級(jí)別更高略就,兼容性更強(qiáng)捎迫,堪稱未來級(jí)別的保護(hù)方案。
圖解:
第一代加固技術(shù):動(dòng)態(tài)加載
描述:用于保護(hù)應(yīng)用的邏輯不被逆向與分析残制,最早普遍在惡意軟件中使用立砸,其主要 基于Java虛擬機(jī)提供的動(dòng)態(tài)加載技術(shù)。?
第二代加固技術(shù):不落地加載?
描述:在APK修改方面已經(jīng)完善初茶,能做到對(duì)開發(fā)的零干擾颗祝。開發(fā)過程中不需要對(duì)應(yīng) 用做特殊處理,只需要在最終發(fā)布前進(jìn)行保護(hù)即可恼布。而為了實(shí)現(xiàn)這個(gè)零干擾的流程 螺戳,Loader需要處理好Android的組件的生命周期。 ?
第三代加固技術(shù):指令抽離?
描述:由于第二代加固技術(shù)僅僅對(duì)文件級(jí)別進(jìn)行加密折汞,其帶來的問題是內(nèi)存中的 Payload是連續(xù)的倔幼,可以被攻擊者輕易獲取。第三代加固技術(shù)對(duì)這部分進(jìn)行了改 進(jìn)爽待,將保護(hù)級(jí)別降到了函數(shù)級(jí)別损同。 ?
第四代加固技術(shù):指令轉(zhuǎn)換/VMP?
描述:第三代加固技術(shù)在函數(shù)級(jí)別的保護(hù),使用Android虛擬機(jī)內(nèi)的解釋器執(zhí)行 代碼鸟款,帶來可能被記錄的缺陷膏燃,
第四代加固技術(shù)使用自己的解釋器來避免第三代 的缺陷。而自定義的解釋器無法對(duì)Android系統(tǒng)內(nèi)的其他函數(shù)進(jìn)行直接調(diào)用何什,必須 使用JAVA的JNI接口進(jìn)行調(diào)用组哩。 ?
第五代加固技術(shù):虛機(jī)源碼保護(hù)?
描述:跟第四代的VMP加固技術(shù),虛機(jī)源碼保護(hù)加固是用虛機(jī)技術(shù)保護(hù)所有的代 碼处渣,包括Java伶贰,Kotlin,C/C++罐栈,Objective-C黍衙,Swift等多種代碼,具備極高的兼容 性荠诬;使App得到更高安全級(jí)別的保護(hù)琅翻,運(yùn)行更加穩(wěn)定涯捻。
五:通過了解各大應(yīng)用商店的上架要求,完成Apk的上架
背景:國(guó)內(nèi)目前流量逐漸中心化望迎,而一些還不錯(cuò)的小市場(chǎng)逐漸被各種收購(gòu),更加造成了目前這種流量集中的情況凌外。???????所以在這種情況下辩尊,就沒必要花費(fèi)太多精力上n個(gè)市場(chǎng)。一般來講的話康辑,應(yīng)用發(fā)到百度摄欲、小米、vivo疮薇、360胸墙、應(yīng)用寶、華為按咒、oppo迟隅、魅族、pp助手励七、豌豆莢這幾個(gè)市場(chǎng)就可以了智袭。
多渠道打包工具:
1、美團(tuán)wallehttps://github.com/Meituan-Dianping/walle?
2掠抬、騰訊VasDollyhttps://github.com/Tencent/VasDolly
一般市場(chǎng)所需其他資質(zhì)如下:
1吼野、影音娛樂:視頻播放器、音樂播放器及電臺(tái)需要《計(jì)算機(jī)軟件著作權(quán)證書》两波,網(wǎng)絡(luò)直播及美女主播需要《信息網(wǎng)絡(luò)傳播視聽節(jié)目許可證》或《網(wǎng)絡(luò)視聽許可證》或《節(jié)目制作經(jīng)營(yíng)許可證》等相關(guān)資質(zhì)證件瞳步。 ?
2、新聞閱讀: 《計(jì)算機(jī)軟件著作權(quán)證書》或《互聯(lián)網(wǎng)新聞信息服務(wù)許可證》等企業(yè)相關(guān)經(jīng)營(yíng)許可資質(zhì)腰奋。?
3单起、金融理財(cái): ???????
? ? ? ?涉及金融產(chǎn)品支付、銀行氛堕、網(wǎng)貸需要《支付業(yè)務(wù)許可證》或《金融許可證》或《融資性擔(dān)保機(jī)構(gòu)經(jīng)營(yíng)許可證》或者《資金托管協(xié)議》+授權(quán)方《支付業(yè)務(wù)許可證》馏臭。 ???????
? ? ? ? 涉及證券、期貨讼稚、基金需要《中華人民共和國(guó)經(jīng)營(yíng)證券業(yè)務(wù)許可證》或《經(jīng)營(yíng)期貨業(yè)務(wù)許可證》或《中華人民共和國(guó)基金銷售業(yè)務(wù)資格證書》等相關(guān)業(yè)務(wù)許可證書或者《營(yíng)業(yè)執(zhí)照》(經(jīng)營(yíng)范圍標(biāo)明有相關(guān)業(yè)務(wù)許可的)括儒。 涉及彩票需要《彩票中心授權(quán)書》+《計(jì)算機(jī)軟件著作權(quán)證書》。 ???????涉及金融理財(cái)資訊需要《營(yíng)業(yè)執(zhí)照》(經(jīng)營(yíng)范圍標(biāo)明金融信息咨詢锐想、證券咨詢等相關(guān)信息)帮寻。 ???????
? 涉及貴金屬類需要《計(jì)算機(jī)軟件著作權(quán)證書》+《貴金屬交易相關(guān)授權(quán)資質(zhì)》。
4赠摇、醫(yī)療健康:涉及支付固逗、醫(yī)生問診的應(yīng)用需提供《互聯(lián)網(wǎng)醫(yī)療保健信息服務(wù)審核同意書》或《中華人民共和國(guó)互聯(lián)網(wǎng)藥品信息服務(wù)資格證書》等相關(guān)醫(yī)療執(zhí)業(yè)許可證書浅蚪。?
5、學(xué)習(xí)辦公: 有支付項(xiàng)烫罩,提供《計(jì)算機(jī)軟件著作權(quán)證書》惜傲。?
6、社交通訊: 涉及支付贝攒、同城交友盗誊、網(wǎng)絡(luò)電話、網(wǎng)賺隘弊、紅包需提供《計(jì)算機(jī)軟件著作權(quán)證書》,然后發(fā)布到各個(gè)市場(chǎng)哈踱,等審核就可以了,一般1~5天應(yīng)用就會(huì)上線梨熙。
APP上架到各大應(yīng)用市場(chǎng)技巧:
1开镣、安卓各大應(yīng)用市場(chǎng)都需要軟件著作權(quán),而且基本上都要實(shí)名制咽扇,實(shí)名制的信息得與著作權(quán)一致就是公司的完全一致邪财。所以APP開發(fā)期間,就應(yīng)該著手申請(qǐng)著作權(quán)肌割,基本上最便宜300塊可以搞掂卧蜓,加急的話幾千到上萬都可能。一般建議打好提前量把敞。一般易版權(quán)各家主流平臺(tái)認(rèn)的多些弥奸,但是態(tài)度不咋地。?
2奋早、應(yīng)用寶及小米盛霎,華為市場(chǎng)要求安裝之后的APP名字和著作權(quán),提交的名字完全一致耽装,否則會(huì)直接拒絕愤炸。 ?
3、應(yīng)用寶要求APP必須要能退出掉奄,所以最好在首頁連續(xù)兩秒重復(fù)按退出就提示并退出规个。但是蘋果缺禁止任何形式的退出APP的行為,否則直接拒絕姓建。 4诞仓、蘋果絕對(duì)禁止任何形式的更新,哪怕是檢測(cè)跟應(yīng)用商店綁定的速兔。蘋果認(rèn)為更新的事情應(yīng)該由他們來提示用戶墅拭,而且把升級(jí)的權(quán)利交給用戶。如果你非要加自動(dòng)升級(jí)涣狗,那切記千萬不要在軟件審核期間打開或者提示否則必拒谍婉。 ?
5舒憾、應(yīng)用寶可以在微信內(nèi)直接可以安裝,一般我們會(huì)視為安卓發(fā)布最重要的一步穗熬,而且要求最多镀迂,如果應(yīng)用寶獲得通過,VIVO/OPPO會(huì)自動(dòng)采集唤蔗,比較方便招拙。但是應(yīng)用寶的后臺(tái)數(shù)第一難用,切記每次退回來之后措译,記得把編譯序號(hào)加一,上傳安裝包之后保存之后再刷新饰序,看看是不是最新的领虹。他們的緩存非常嚴(yán)重!
6求豫、如果APP需要登錄塌衰,應(yīng)用寶一定要把APP的賬號(hào)和密碼做一張圖片,上傳到證書欄蝠嘉,不然肯定不能過最疆。?
7、蘋果沒事不要把最小年紀(jì)選的太低蚤告,尤其有資訊的努酸,有圖片的,蘋果卡的太嚴(yán)了杜恰,最好選17+获诈。圖標(biāo)更加不能更色情,圖片和內(nèi)容最好別跟性扯上關(guān)系心褐。?
8舔涎、H5的應(yīng)用功能不能太簡(jiǎn)單,不然很難過小米和蘋果逗爹。如果欄目有內(nèi)容亡嫌,最好都填好。不要控掘而,不然小米很難過挟冠。?
9、樂視手機(jī)不要管了镣屹,他們的審核人員都辭職了圃郊。根本不會(huì)有人搭理你。?
10女蜈、蘋果申請(qǐng)使用攝像頭持舆,相冊(cè)色瘩,日歷的時(shí)候,一定要把plist文件的描述寫的非常清楚逸寓,不然會(huì)直接拒絕居兆,參考范例,因需要拍攝個(gè)人頭像竹伸,請(qǐng)您授權(quán)應(yīng)用使用你的攝像頭泥栖。 ?
11、APP不要帶會(huì)造成程序奔潰的BUG勋篓,不然一定會(huì)被各大應(yīng)用市場(chǎng)拒絕吧享。尤其是蘋果,我在后臺(tái)監(jiān)控過譬嚣,他們當(dāng)真會(huì)把每個(gè)APP的功能都點(diǎn)擊一遍钢颂。。我的APP他們查了20分鐘拜银。
12殊鞭、一般建議提交順序?yàn)橄劝沧浚筇O果尼桶。安卓先提交VIVO操灿,OPPO,他們較為容易泵督,而且他們會(huì)亂采應(yīng)用寶的APP趾盐,你再上傳就要認(rèn)領(lǐng)APP,很麻煩小腊。再小米谤碳,華為,魅族溢豆,三星蜒简,這幾個(gè)市場(chǎng)都覆蓋的話,基本上安卓各大手機(jī)品牌覆蓋完了漩仙。然后是應(yīng)用寶搓茬,阿里,最后是百度队他。百度對(duì)資質(zhì)要求最高卷仑。可以其他都上傳好了再找百度麸折。他們一般會(huì)看了別人都上了锡凝,那我也上吧。至于蘋果垢啼,得預(yù)留2-3個(gè)月的審核時(shí)間窜锯。?
13张肾、應(yīng)用寶和360要求App必須要加固,但是他們的在線加固不靠譜锚扎,經(jīng)常失敗吞瞪。建議用應(yīng)用寶的離線版本來加固,速度快多了驾孔。
六:擴(kuò)展閱讀
1芍秆、https://blog.csdn.net/Qiled/article/details/80984385(APK基本文件結(jié)構(gòu))?
2、https://blog.csdn.net/zxt94/article/details/72764824( 各大應(yīng)用商店APP上架指南)?
3翠勉、https://blog.csdn.net/admans/article/details/83578444( APP上架到各大應(yīng)用商店的小總結(jié))?
4妖啥、https://blog.csdn.net/u010610734/article/details/83104544(Android各大主流 應(yīng)用市場(chǎng)地址以及素材要求)?
5、http://www.reibang.com/p/b0242614150b(APP上架到各大應(yīng)用市場(chǎng)技巧)
6对碌、http://www.reibang.com/p/f982fe73490f(Android安全防護(hù)之旅---帶你把Apk 混淆成中文語言代碼)?
7迹栓、https://www.cnblogs.com/cute/p/4809386.html(Android中的Apk的加固(加殼) 原理解析和實(shí)現(xiàn))?
8、https://blog.csdn.net/tabactivity/article/details/81318036(APP加固技術(shù)歷程 及未來級(jí)別方案:虛機(jī)源碼保護(hù))?
9俭缓、http://www.reibang.com/p/e12f738a81e9(Android簽名打包中的jks文件)