APK加固是對(duì)APK代碼邏輯的一種保護(hù),原理是將APK文件進(jìn)行某種形式的轉(zhuǎn)換,包括不限于隱藏、混淆、加等操作,進(jìn)一步保護(hù)軟件的利益不受損壞。
成都創(chuàng)新互聯(lián)是一家企業(yè)級(jí)云計(jì)算解決方案提供商,超15年IDC數(shù)據(jù)中心運(yùn)營(yíng)經(jīng)驗(yàn)。主營(yíng)GPU顯卡服務(wù)器,站群服務(wù)器,重慶服務(wù)器托管,海外高防服務(wù)器,機(jī)柜大帶寬租用·托管,動(dòng)態(tài)撥號(hào)VPS,海外云手機(jī),海外云服務(wù)器,海外服務(wù)器租用托管等。
常見APK應(yīng)用加固主要有DEX文件、SDK文件、SO文件加固這三類。DEX加固技術(shù)包括混淆代碼、整體DEX加固、拆分DEX加固、虛擬機(jī)加固、Java2C加固,當(dāng)前性能最強(qiáng)的加固方案是Java2c,將java指令轉(zhuǎn)成c/c++指令,并做虛假控制流、字符串加密等處理,逆向難度最高。SO庫(kù)文件一般存放著核心算法、重要協(xié)議等重要信息。SO加固大概可以分為有源保護(hù)和無(wú)源保護(hù),有源保護(hù)分為自解密、混淆、源碼VMP等,無(wú)源保護(hù)分為加殼、VMP保護(hù)。
APK加固后,可以降低被逆向破解風(fēng)險(xiǎn),目前有些云安全平臺(tái)提供系統(tǒng)的APP加固服務(wù),如網(wǎng)易易盾、360加固、阿里云等,想要系統(tǒng)提升APK安全等級(jí)可以了解下。
上個(gè)月公司一個(gè)項(xiàng)目突然要找第三方進(jìn)行安全漏洞的檢測(cè),于是打包了一個(gè)apk文件,發(fā)到第三方結(jié)構(gòu)進(jìn)行了安全檢測(cè),這項(xiàng)目我入職前就已經(jīng)快完成的階段,我后面基本是維護(hù)和小更新.比較坑的是之前的哥們連混淆都沒(méi)有,更不要說(shuō)加固了,最后掃出了30多個(gè)漏洞,看到檢測(cè)報(bào)告都懵逼了.
自己對(duì)混淆和加固之前也只是知道皮毛沒(méi)有深究,這次修復(fù)漏洞踩了不少坑,都是邊上網(wǎng)搜資料邊踩坑,總算搞定了,寫出來(lái)防止后人踩坑 ,這里主要講加固簽名的坑,混淆這里不說(shuō)了(自己對(duì)混淆還不熟)
很容易理解,ture是已簽名,false是未簽名,都為true的話說(shuō)明v1,v2都成功簽名了.
然后把兩個(gè)md5的值進(jìn)行比對(duì),如果一致說(shuō)明你的簽名沒(méi)用錯(cuò)秘鑰 - -||
4.手動(dòng)進(jìn)行簽名操作:
java -jar apksigner.jar sign --ks /Users/xxxx/Desktop/key.jks --ks-key-alias test --ks-pass pass: 123456 --key-pass pass: 123456 --out /Users/xxxx/Desktop/簽名后的安裝包.apk /Users/xxxx/Desktop/需要進(jìn)行簽名的安裝包.apk
上面的命令會(huì)執(zhí)行同時(shí)執(zhí)行v1,v2簽名
注意仔細(xì)看上的命令行:進(jìn)了黑色加粗的文字需要替換成實(shí)際的信息
說(shuō)個(gè)小插曲,我們的項(xiàng)目找的是一個(gè)規(guī)模很大的公司進(jìn)行檢測(cè),開始用了網(wǎng)上的免費(fèi)的加固工具加固拿去檢測(cè),別人拿去測(cè)試之后全部都脫殼了,說(shuō)這種免費(fèi)的加固安全沒(méi)有保障,要用他們的加固服務(wù)可以解決,要收費(fèi)..呵呵,因?yàn)轫?xiàng)目比較特殊只能答應(yīng)了,打包簽名了apk,發(fā)到他們那邊進(jìn)行了加固后他們把a(bǔ)pk發(fā)回來(lái)讓我重新簽名,簽名后apk用不了,閃退....老板說(shuō)別人大公司應(yīng)該不會(huì)出現(xiàn)這種小問(wèn)題,是我的問(wèn)題.恩,自己也懷疑是我的錯(cuò). 當(dāng)天折騰到凌晨才下班,經(jīng)歷了上面的一頓折騰后發(fā)現(xiàn)v1,v2都簽名了,并且md5值也沒(méi)問(wèn)題. 這時(shí)就有底氣的去質(zhì)問(wèn)那家公司,最后發(fā)現(xiàn)是他們的加固出問(wèn)題.
一般來(lái)說(shuō)進(jìn)行了上面的方法重新簽名并且檢查md5值沒(méi)錯(cuò),應(yīng)該不會(huì)出問(wèn)題了這時(shí)候可以去質(zhì)疑一下加固方的問(wèn)題.
github參考鏈接1
github參考鏈接2
先寫這些記錄一下,后面有需要再更新,有什么問(wèn)題可以在下面留言討論.
DexClassLoader加載的類是沒(méi)有組件生命周期的,也就是說(shuō)即使DexClassLoader通過(guò)對(duì)APK的動(dòng)態(tài)加載完成了對(duì)組件類的加載,當(dāng)系統(tǒng)啟動(dòng)該組件時(shí),依然會(huì)出現(xiàn)加載類失敗的異常。
需要替換系統(tǒng)組件的classloader才可以。加固廠商必然饒不過(guò)去
兩種解決方案:
1、替換系統(tǒng)組件類加載器為我們的DexClassLoader,同時(shí)設(shè)置DexClassLoader的parent為系統(tǒng)組件類加載器;
2、打破原有的雙親關(guān)系,在系統(tǒng)組件類加載器和BootClassLoader的中間插入我們自己的DexClassLoader即可;
殼與脫殼之二代殼函數(shù)抽取/#源碼分析
Android中實(shí)現(xiàn)「類方法指令抽取方式」加固方案原理解析
Android免Root權(quán)限通過(guò)Hook系統(tǒng)函數(shù)修改程序運(yùn)行時(shí)內(nèi)存指令邏輯
強(qiáng)烈建議閱讀此文章
ART 在 Android 安全攻防中的應(yīng)用
加固。據(jù)國(guó)外媒體報(bào)道,谷歌將對(duì)AndroidMarket進(jìn)行安全加固,這項(xiàng)措施是在遭受惡意應(yīng)用程序攻擊之后所采用的,同時(shí)公司已經(jīng)在遠(yuǎn)程將受感染設(shè)備中的惡意應(yīng)用程序刪除。
應(yīng)用寶在線加固:
加固完成后,需要對(duì)加固后的包進(jìn)行重新簽名(騰訊云應(yīng)用安全在線加固的時(shí)候會(huì)將您的簽名信息刪除后再加固,所以加固后的安裝包是沒(méi)有簽名信息的,需要您對(duì)加固包重新簽名)
使用樂(lè)固進(jìn)行重簽名:
至此,完成。
加固的過(guò)程中需要三個(gè)對(duì)象:1、需要加密的Apk(源Apk)2、殼程序Apk(負(fù)責(zé)解密Apk工作)3、加密工具(將源Apk進(jìn)行加密和殼Dex合并成新的Dex)主要步驟:我們拿到需要加密的Apk和自己的殼程序Apk,然后用加密算法對(duì)源Apk進(jìn)行加密在將殼Apk進(jìn)行合并得到新的Dex文件,最后替換殼程序中的dex文件即可,得到新的Apk,那么這個(gè)新的Apk我們也叫作脫殼程序Apk.他已經(jīng)不是一個(gè)完整意義上的Apk程序了,他的主要工作是:負(fù)責(zé)解密源Apk.然后加載Apk,讓其正常運(yùn)行起來(lái)。