移動安全-第四天 移動安全 程序防護

代碼級防護

應用加固技術

這是一張加固方法的發展史

https://blog.csdn.net/earbao/article/details/82379117

 

dex文件加密方法

對App dex進行加固的基本步驟如下: 

1. 從App原始apk文件裏獲取到原始dex文件 

2. 對原始dex文件進行加密,並將加密後的dex文件和相關的存放到assert目錄裏 

3. 用脫殼dex文件替換原始apk文件裏的dex文件;脫殼dex文件的作用主要有兩個,一個是解密加密後的dex文件;二是基於dexclassloader動態加載解密後的dex文件 

4. 因爲原始apk文件已經被修改,所以需要刪除原始apk的簽名信息,即刪除META-INF目錄下的.RSA、.SF 和MANIFEST.MF文件 

5. 生成加固後的apk文件 

6. 對加固後的apk文件進行簽名,apk加固完成。

1.爲什麼要對原始dex進行加密,同時用脫殼dex文件替換原始dex文件?大部分的apk反編譯工具(dex2jar、apktools、jui等)都是對dex文件進行反編譯,將dex文件反編譯成smail,然後再轉化成class文件進行閱讀和修改。用脫殼dex替換原始dex文件之後,用上面的反編譯工具反編譯apk文件,只能看到脫殼程序的class文件,看不到apk本身的class文件。對dex文件進行加密,這樣即使第三方拿到了dex文件,以爲無法解密,也就無法對其進行解析和分析。 

2.怎麼確保apk功能正常運行?加固後的apk啓動之後,脫殼dex文件會對加密後的dex文件進行解密,然後機遇dexclassload動態加載解密後的dex文件。從用戶的角度,加固前後App的功能和體驗基本是一樣的。

3.dex加固主要是防止被靜態反編譯,進而獲取源碼並修改

https://blog.csdn.net/qq309909897/article/details/73273964 

 

類抽取加密技術

 

VMP加殼:VMP加殼在三代基礎上,抽取代碼後,並沒有對代碼進行還原,而是通過廠商自研的“虛擬機”來進行解析opcode,然後通過JNI 接口反射執行各個方法。VMP加殼對於對代碼保護的效果、加殼後的運用價值相對於歷代加殼技術就高出不止一個臺階了。

虛擬機保護技術就是將基於x86彙編系統的可執行代碼轉換爲字節碼指令系統的代碼,以達到保護原有指令不被輕易逆向和修改的目的,這種指令也可以叫僞指令,和VB的pcode有點類似。從本質上講,虛擬指令系統就是對原本的x86彙編指令系統進行一次封裝,將原本的彙編指令轉換爲另一種表現形式。

 


 

push uType
push lpCaption
push lpText
push hWnd,
call MessageBox
這是一段x86的彙編指令,編譯器在翻譯的時候會產生一個固定模式的彙編代碼(在同一個CPU指令集下)。
但如果我們對原本的C代碼使用VMP SDK進行虛擬化,那麼在編譯這段代碼的時候就會使用等效的VM虛擬指令來達到同樣的功能。

vPushMem uType
vPushMem lpCaption
vPushMem lpText
vPushMem hWnd,
vCall vCode
注意,虛擬指令的也有自己的機器碼,但和原本的x86彙編機器碼完全不一樣,而且常常是一堆無意義的代碼,它們只能由VM虛擬解釋器(Dispatcher)來解釋並執行。


https://blog.csdn.net/liutianshx2012/article/details/48466327
http://baijiahao.baidu.com/s?id=1586743591867534431&wfr=spider&for=pc









 

控制流平坦化概念和思路

控制流平坦化,就是在不改變源代碼的功能前提下,將C或C++代碼中的if、while、for、do等控制語句轉換成switch分支語句。這樣做的好處是可以模糊switch中case代碼塊之間的關係,從而增加分析難度。

這種技術的思想是,首先將要實現平坦化的方法分成多個基本塊(就是case代碼塊)和一個入口塊,爲每個基本快編號,並讓這些基本塊都有共同的前驅模塊和後繼模塊。前驅模塊主要是進行基本塊的分發,分發通過改變switch變量來實現。後繼模塊也可用於更新switch變量的值,並跳轉到switch開始處。

花指令概念和思路

 

花指令也叫垃圾指令,是指在原始程序中插入一組無用的字節,但又不會改變程序的原始邏輯,程序仍然可以正常運行,然而反彙編工具在反彙編這些字節時會出錯,由此造成反彙編工具失效,提高破解難度。

花指令的主要思想是,當花指令跟正常指令的開始幾個字節被反彙編工具識別成一條指令的時候,纔可以使得反彙編工具報錯。因此插入的花指令都是一些隨機的但是不完整的指令。但是這些花指令必須要滿足兩個條件:

在程序運行時,花指令是位於一個永遠也不會被執行的路徑中。

這些花指令也是合法指令的一部分,只不過它們是不完整指令而已。

標識符混淆概念和思路

標識符混淆就是對源程序中的包名、類名、方法名和變量名進行重命名,用無意義的標識符來替換,使得破解這分析起來更困難。最常用的就是ProGua

 

字符串混淆概念和思路

 

很多時候,爲了避免反彙編後的代碼容易被破解者分析讀懂,往往會源程序中一些比較關鍵的字符串變量進行混淆,使得破解者分析成本提高。這裏的字符串混淆有兩種,一種是Java層的字符串混淆,另一種是native層的字符串混淆,也就是so文件中的字符串混淆。上面我們介紹了Proguard免費混淆工具,它可以混淆類名、方法名和變量名,但是不支持字符串混淆,要使用字符串混淆就需要使用DexGuard商業版混淆器。

編碼混淆:

加密處理:

還有一種方式是我們可以修改dex文件。對於Java層的字符串加密,我們可以在dex文件中,找到要加密的字符串在字符串常量表中的位置,然後對它用加密算法加密。然後在自定義Application的attachBaseContext方法中在運行時對密文進行解密,或者可以在native層加密,提高破解難度。

 

代碼混淆技術總結 可以看下面的這個 還是不錯的 引用了一部分

https://blog.csdn.net/github_30662571/article/details/70921710

具體的加固算法分析

https://blog.csdn.net/justfwd/article/details/50073363

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章