殼對於有過pc端加解密經驗的同學來說並不陌生,android世界中的殼也是相同的存在。看下圖(exe = dex):
概念清楚羅,我們就說下:殼最本質的功能就是實現加載器。你看加殼后,系統是先執行殼代碼的。但我們想要的是執行原dex,可是系統此時是不會自動來執行的需要殼去將原dex加載到系統中。ok,殼就說到這里,看android apk殼:
在看完上述的幾篇文章后,相信對apk 殼應該有一定的了解(其實apk殼和pc端的都差不多,只是在處理不同的文件格式:dex和exe中會有差別;導致不同的加殼、解殼步驟。當然我們需要了解文件的格式,才能有的放矢哦)。來看下android apk加殼中處理方法:
1 :編寫解殼apk,得到殼的文件:UnShelldex;
2:編寫腳本或代碼(你開心就好),對原dex進行encode變成encodeDex,並將其插入(這里有幾種姿勢哦,看你喜歡咯)到UnShelldex文件中;注意被修改后的UnShelldex必須要符合dex格式,否則android不執行艾(在上述的文章里就對修改后的UnShelldex的checksum、signature 和file_size值進行修正);
解殼步驟:
1 執行解殼apk的代碼,decode endcodeDex為原來的dex;
2 模擬android系統把dex裝載,讓其順利執行;
這里需要提及一點:殼絕對不能改變原來代碼的執行流程;又不是hook,你改是算什么意思啊!apk殼的思路講完啦,但這只是紙上談兵,還有很多細節需要我們考慮。加殼的步驟沒什么好考慮的,無非是跟文件格式打交道(當然你要做高精尖的encode是另說啦)。在解殼步驟里,decode也沒什么好分析的(主要是跟encode對應,且每個人的處理方式也不一樣);把dex裝載才是關鍵,前面說了殼本質就是裝載器。上面的文章的思路是在解殼過程中,調用dexclassloader把dex載入內存,dexclassloader需要dex文件路徑,故decode后的dex直接存在目錄下。(dalvik淺析三:類加載 ClassLoader)。什么!dex直接放在目錄下,別人不是可以直接獲取了嗎,那加殼干什么啊。是不是覺得加殼然並卵。ok,那我不把dex提取出來放在目錄下,直接在內存里裝載:
android4.0后有DalvikNativeFunc函數Dalvik_dalvik_system_DexFile_openDexFile_bytearray可以直接把dex對應的字節流裝載到系統中(其中相關聯到很多的知識點,已另寫文章注釋,看這里)。剛好我們在上面的解殼過程中不是得到dex嘛,這個時候不要再把dex存在目錄下了,用Dalvik_dalvik_system_DexFile_openDexFile_bytearray加載。wow,別人不就看不到dex了嘛(真的看不到了嘛;看后續脫殼文章)。
上面是apk加殼的一些基本概念,加殼的實質是反編譯軟件無法得到dex代碼(即dex代碼不會靜態暴露)。一些加殼思路:
1 java解密dex代碼,難度系數不高
2 C++解密dex代碼,so加固+apk加殼
3 不使用系統提供的加載dex方法,自己寫效果佳
加殼的基本知識就先到了,在后面脫殼中有新的知識點再補充上來。
資料: