愛(ài)加密 可以給apk文件加殼,保護(hù)安卓應(yīng)用源碼的安全,你可以看一看:
公司主營(yíng)業(yè)務(wù):網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出沙市免費(fèi)做網(wǎng)站回饋大家。
版權(quán)聲明:本文為博主原創(chuàng)文章,若轉(zhuǎn)載請(qǐng)注明出處:
首先加殼的方法和代碼都是從Jack_Jia的博客學(xué)習(xí)的。
詳見(jiàn):
由于本人從c++開(kāi)發(fā)直接跳到Android開(kāi)發(fā),沒(méi)有對(duì)android進(jìn)行系統(tǒng)的學(xué)習(xí),看上面博客時(shí)還是有很多不理解的地方。本文把不理解的地方梳理一下,最后提供個(gè)測(cè)試源碼(加了比較詳細(xì)的注釋)。希望對(duì)于跟我一樣安卓基礎(chǔ)不是太好的人有一定幫助。
正文:
apk加殼的目的(我的用途):增加apk靜態(tài)分析的難度。(如果反編譯的人知道是加殼的,可以在data/包名目錄下 找到真正的apk。所以在殼上增加正常的代碼的話可以增加迷惑性)
基礎(chǔ)知識(shí):ClassLoader: 這個(gè)寫(xiě)的不錯(cuò)想了解的可以去看看。
整個(gè)加殼的過(guò)程涉及到三個(gè)程序:要加殼的apk,加殼程序(demo中的apkjm),解殼程序(demo中的myunshell)。
其中加殼程序就是把要加殼的apk放入解殼程序的dex文件中。
解殼程序是最后替代我們apk安裝到手機(jī)中運(yùn)行的程序。它在執(zhí)行中從自己的dex中釋放出我們apk程序。
步驟:
1.實(shí)現(xiàn)加殼程序。
2.實(shí)現(xiàn)解殼程序:按博客創(chuàng)建個(gè)解殼的Application。如果我們的apk中用到了 Application,需要在解殼程序的xml文件中添加:
meta-data android:name="APPLICATION_CLASS_NAME" android:value="com.***.Application"/
com.***.Application 是我們apk的Application類名 加上我們apk的包名
注:1.我們apk用到的權(quán)限和組件都需要添加到解殼程序的xml中,組件都需要加上完整的包名路徑。
2.我們apk內(nèi)用到的資源也就是res文件內(nèi)的東西,需要拷貝到解殼程序的res中。
3.如果我們apk靜態(tài)注冊(cè)了廣播接收器,那廣播接收器類需要在解殼程序中實(shí)現(xiàn)。
3.解殼程序完成后,把bin文件夾內(nèi)的dex文件拷出來(lái),用加密程序把我們的apk添加到該dex文件中。
4.把新生成的dex文件覆蓋bin文件夾中原來(lái)的dex文件,并把a(bǔ)pk文件也刪掉,重新運(yùn)行解殼程序生成新的解殼apk。 這個(gè)apk就是我們需要的最后的apk文件了。加殼就完成了。
另外:1.在解殼程序中對(duì)我們apk文件進(jìn)行解密函數(shù)調(diào)用的地方不對(duì)。 在demo中做了修改和說(shuō)明。
2.我在釋放apk的時(shí)候加了個(gè)判斷,如果文件存在就不再釋放了,如果是在測(cè)試的時(shí)候,可以先屏蔽掉,免的每次運(yùn)行調(diào)試前要先刪掉原來(lái)的程序。
[java] view plain copy
if (!dexFile.exists())
{
dexFile.createNewFile(); //在payload_odex文件夾內(nèi),創(chuàng)建payload.apk
// 讀取程序classes.dex文件
byte[] dexdata = this.readDexFileFromApk();
// 分離出解殼后的apk文件已用于動(dòng)態(tài)加載
this.splitPayLoadFromDex(dexdata);
}
demo地址:
講講大概思路,技術(shù)細(xì)節(jié)就不能公開(kāi)了。
破解加了dex殼的app,關(guān)鍵是要獲得解密后的源dex,現(xiàn)在Android加殼技術(shù)還很不成熟,大多都是通過(guò)DexClassLoader或者隱藏的函數(shù)openDexFile來(lái)將源dex加載進(jìn)來(lái),然后動(dòng)態(tài)替換Application來(lái)啟動(dòng)源程序,跟Windows上傳統(tǒng)的PE文件加殼有一定區(qū)別。
要破解傳統(tǒng)的殼,需要跟蹤控制流找到OEP,然后把源程序從內(nèi)存中dump下來(lái),重建輸入表,最困難的就是要跟著外殼的控制流走,安全工程師為了加大破解難度,使用了很多技術(shù)來(lái)讓破解者走得更艱難。安全工程師與破解者對(duì)抗的關(guān)鍵點(diǎn)就在尋找OEP的困難性上。
在Android平臺(tái)上,正因?yàn)樾屡d的dex加殼技術(shù)不成熟,導(dǎo)致有些另類的脫殼方法可以繞過(guò)分析算法,直接將源程序dump下來(lái)。舉個(gè)例子,安卓在4.0版本以后提供openDexFile這個(gè)函數(shù)來(lái)從內(nèi)存中加載dex,所需要提供的參數(shù)是源dex在內(nèi)存中的地址,所以只要對(duì)這個(gè)函數(shù)下斷,然后從寄存器里找到內(nèi)存地址,就能將解密后的源dex從內(nèi)存中dump下來(lái),直接對(duì)其反編譯就能獲得源代碼了。更進(jìn)一步,關(guān)于openDexFile這個(gè)函數(shù),其實(shí)它與libdvm.so這個(gè)庫(kù)有密不可分的關(guān)系,這個(gè)庫(kù)里提供大量操作dex文件的函數(shù),如果對(duì)這個(gè)庫(kù)里的相關(guān)函數(shù)下斷,然后從內(nèi)存中暴力dump一大塊內(nèi)存區(qū)域,經(jīng)常能直接將內(nèi)存中的源dex給抓下來(lái)。
分享名稱:android加殼,安卓加殼加密軟件
分享地址:http://aaarwkj.com/article26/dsishjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、外貿(mào)建站、微信小程序、Google、網(wǎng)站設(shè)計(jì)、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)