愛加密Android APk 原理解析


轉載請標明出處:http://blog.csdn.net/u011546655/article/details/45921025


愛加密Android APK加殼原理解析

一、什么是加殼?
加殼是在二進制的程序中植入一段代碼,在執行的時候優先取得程序的控制權。做一些額外的工作。大多數病毒就是基於此原理。

二、加殼作用
加殼的程序能夠有效阻止對程序的反匯編分析,以達到它不可告人的目的。這樣的技術也經常使用來保護軟件版權。防止被軟件破解。



三、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層。這樣的保護方法保護的意義並不大,由於反編譯出源代碼后通過keyword搜索非常快就行找到驗證的代碼塊。略微一改動這驗證保護就全然無效了。


2) server驗證
       在android 的java層獲取簽名信息。上傳server在服務端進行簽名然后返回驗證結果。

這樣的保護還不如在純java層驗證實用,一旦沒有網絡驗證保護就無效了。

用android方法獲取的簽名信息用java方法也能夠獲取。驗證存放在server上也是為了把保護正確的簽名信息值,可是保護的意義事實上沒有不論什么作用,相同破解后全局搜索keyword然后偽造一個正確的簽名信息就可完美破解了。


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我們反編譯依稀看看是否有效果!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM