爱加密Android APk 原理解析
生活随笔
收集整理的這篇文章主要介紹了
爱加密Android APk 原理解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載請標明出處:http://blog.csdn.net/u011546655/article/details/45921025
一、什么是加殼?
加殼是在二進制的程序中植入一段代碼,在運行的時候優先取得程序的控制權,做一些額外的工作。大多數病毒就是基于此原理。
二、加殼作用
加殼的程序可以有效阻止對程序的反匯編分析,以達到它不可告人的目的。這種技術也常用來保護軟件版權,防止被軟件破解。
三、Android Dex文件加殼原理
PC平臺現在已存在大量的標準的加殼和解殼工具,但是Android作為新興平臺還未出現APK加殼工具。Android Dex文件大量使用引用給加殼帶來了一定的難度,但是從理論上講,Android APK加殼也是可行的。
在這個過程中,牽扯到三個角色:
1、加殼程序:加密源程序為解殼數據、組裝解殼程序和解殼數據
2、解殼程序:解密解殼數據,并運行時通過DexClassLoader動態加載
3、源程序:需要加殼處理的被保護代碼根據解殼數據在解殼程序DEX文件中的不同分布,本文將提出兩種Android Dex加殼的實現方案。
(一)解殼數據位于解殼程序文件尾部
該種方式簡單實用,合并后的DEX文件結構如下。
加殼程序工作流程:
1、加密源程序APK文件為解殼數據2、把解殼數據寫入解殼程序Dex文件末尾,并在文件尾部添加解殼數據的大小。
3、修改解殼程序DEX頭中checksum、signature 和file_size頭信息。
4、修改源程序AndroidMainfest.xml文件并覆蓋解殼程序AndroidMainfest.xml文件。
(二)解殼數據位于解殼程序文件頭
該種方式相對比較復雜, 合并后DEX文件結構如下:
解殼DEX程序工作流程:
1、從0x70處讀取解殼數據長度。2、從DEX文件讀取解殼數據,解密解殼數據。以文件形式保存解密數據到a.APK
3、通過DexClassLoader動態加載a.APK。
?
?
愛加密實現步驟:
1.把原來的classex.dex 用未知的加密算法實現加密成assets/ijiami.dat
2.把事先寫好的jni代碼和相應的classex.dex替換到原有的位置
3.程序安裝完運行起來以后,先運行愛加密的加殼程序,在jni里面動態加載原 來的classex.dex代碼,從而達到加殼保護的目的.
4.源classex.dex 隱藏起來了,在靜態的時候就沒有辦法對其破解。
5.至于動態運行,最好還是在自己代碼里面下工夫了。比如內存加密啦。
?
?
APK高級保護的方法(一)
? ? ? ? 運行時驗證運行時驗證,主要是指在代碼啟動的時候本地獲取簽名信息,然后對簽名信息進行檢驗來判斷自己的應用是否是正版,如果簽名信息不是正版則提示盜版或者直接崩潰。
? ? ? ? 它的原理:APK的唯一識別是根據包名+簽名,包名信息是寫死在Android Manifest.xml里面的,但是簽名則是與APK綁定的,一旦APK被反編譯后簽名會自動消失。APK的簽名需要簽名文件,簽名文件的md5值基本上是無法偽造成一樣的。
簽名驗證的方法也可以細分為3種:
1) Java 層驗證
? ? ? ? 獲取簽名信息和驗證的方法都寫在android 的java層。這種保護方法保護的意義并不大,因為反編譯出源碼后通過關鍵字搜索很快就能夠找到驗證的代碼塊,稍微一修改這驗證保護就完全無效了。
2) 服務器驗證
? ? ? ?在android 的java層獲取簽名信息,上傳服務器在服務端進行簽名然后返回驗證結果。這種保護還不如在純java層驗證有用,一旦沒有網絡驗證保護就無效了。用android方法獲取的簽名信息用java方法也可以獲取,驗證存放在服務器上也是為了把保護正確的簽名信息值,但是保護的意義其實沒有任何作用,同樣破解后全局搜索關鍵字然后偽造一個正確的簽名信息就可完美破解了。
3) NDK技術底層獲取簽名和驗證
? ? ? ? 通過把Context,Activity,PackageManager,PackageInfo四個對象中的一個作為參數參入底層,在底層獲取簽名信息并驗證。因為獲取和驗證的方法都封閉在更安全的so庫里面,能夠起到一定意義上的保護作用。不過通過java層的hook技術一樣可以把這種保護完美破解。但是相比于前兩種,此保護的意義和價值就更大了。
4)愛加密APP安全保護
? ? ? ? 它采用指紋校驗保護APK中的文件,加密后APK中所有的文件都對應一個唯一的指紋。每次運行時,APK內部會再次進行指紋生成,如果生成的指紋和原本指紋不相同,則判斷為被二次打包過的APK,程序就會自動退出或直接崩潰。該方法可以防止資源文件、主配置文件被修改或刪除等操作,完全保證APK的安全。
?
?
APK高級保護的第二種方法——文件夾混淆(二)
? ? ? ? 文件夾混淆主要指的是利用Windows,Linux,Android 三個系統環境下的文件夾名的特殊性來對源碼文件夾進行混淆,讓混淆后的文件夾在Window看起來失去原有的邏輯性,但是完全不影響其在Android系統上的運行。
它的原理是:在Windows和Linux下文件夾的名字是不區分大小寫的,但是在Android環境下它卻要區分大小寫。.2在Linux算一個特殊符號,所以文件夾名字里面添加的.2會被忽略,但是windows下.2卻是一個很普通的字符串。
具體方法:反編譯開發完成的APK,找到包目錄下的最后一層文件夾(例如:包名是com.example.test2222,找到test2222所在的文件夾),修改test2222文件夾名字為test2222.2并創建文件夾Test2222,然后隨意存放一個有效的smali文件在Test2222里面,然后重新重寫打包成APK簽名。 如下圖:
這種方法可以達到不錯的保護效果,但是開發者一般都沒有額外的時間和精力做加固保護。基本時間、技術等原因,愛加密為APK開發者提供免費的技術支持,對APK加殼隱藏源代碼,從而防止反編譯。它可以對XML 主配文件進行二次簽名保護,保護SO文件不被破解和應用,同時可以保護APK不被二次打包!
?
?
第三種方式——花指令
? ? ? ? 花指令是程序中有一些指令,由設計者特別構思,希望使反匯編的時候出錯,讓破解者無法清楚正確地反匯編程序的內容,迷失方向。“花指令”這個詞來源于匯編語言,它的思想是非常不錯的,它的另一個目的就是利用反編譯工具漏洞,來使工具無法使用。
接下來,我們就在JAVA代碼處制“花指令”,讓反編譯工具(jd-gui)無法反編譯查詢你的JAVA代碼。jd-gui的bug其實挺多了,很多特殊代碼塊或者字段集都能夠讓其崩潰無法反編譯出源碼。
比如:
private static final char[] wJ = "0123456789abcdef".toCharArray();
public static String imsi = "204046330839890";
public static String p = "0";
public static String keyword = "電話";public static String tranlateKeyword = "%E7%94%B5%E8%AF%9D";
? ? ? ? 在每個類里面加入如上字段,你會發現反編譯的類通過jd-gui查看后的結果如下:
我們再來看一下愛加密的三層保護技術,即DEX加殼保護、DEX指令動態加載保護、高級混淆保護,可以保證APP的動態安全和靜態安全,黑客將沒有機會進行任何破解。
經過加密的APK我們反編譯依稀看看是否有效果!
總結
以上是生活随笔為你收集整理的爱加密Android APk 原理解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: APK加密方法:某社交类Android
- 下一篇: AndFix解析——(上)