移动安全-Frida脱壳脚本与加固迭代
文章目錄
- 前言
- 加固迭代
- 代碼混淆保護
- Dex整體加密
- Dex函數抽取
- Dex混合加密
- VPM保護技術
- Frida 脫殼
- Dexdump腳本
- 手機銀行APP
- 航旅縱橫APP
- 失敗案例APP
- More
前言
隨著移動互聯網和智能手機的普及,加之移動應用體驗的不斷提升,各類 APP 迅速覆蓋了人們日常出行、購物娛樂、金融理財等各個領域,一邊是移動應用帶來的方便快捷的生活,一邊是系統漏洞、病毒木馬、山寨 APP 帶來的隱私侵犯,現如今 APP 安全備受爭議。
加固迭代
移動應用加固的主要從技術層面對 DEX 文件、SO 文件、資源文件等進行保護。為應對不斷出現的新型黑客攻擊手段,Android 加固技術也經歷了代碼混淆保護技術、Dex 整體加密保護技術、Dex 函數抽取加密保護技術、混合加密保護技術、虛擬機保護技術等五代技術更新與迭代。
代碼混淆保護
Android 平臺采用使用 Java 作為原生語言進行開發,Java 字節碼中包括了很多源代碼信息,如變量名、方法名,并且通過這些名稱來訪問變量和方法,這些符號帶有許多語義信息,很容易被反編譯成 Java 源代碼。為了防止這種現象,需要對 Java 字節碼進行混淆,比較常見的代碼混淆有 proguard 和 dexguard,其中包括了名稱混淆、字符串加密、反射替換、日志清除、花指令等。
第一代加固保護技術的優缺點:
Dex整體加密
DEX 整體加密保護技術是基于類加載的方式來實現的,整個加殼的過程涉及到三個程序:源程序,加殼程序,解殼程序。基本原理是對 Dex 文件進行整體加密后存放在 APK 的資源中,運行時將加密后的 Dex 文件在內存中解密,并讓 Dalvik 虛擬機動態加載執行。
第二代加固保護技術的優缺點:
Dex函數抽取
第三代保護技術——Dex 函數抽取加密保護技術
針對 DEX 文件整體加固可以被內存 Dump 的弱點,第三代保護技術對代碼中的每個方法抽出并進行單獨加密,基本原理是利用 Java 虛擬機執行方法的機制來實現。利用這個機制將解密操作延遲到某個方法在執行之前才開始加載該方法的代碼,同時解密后的代碼在內存是不連續存放的。例如通過抽取 Dalvik 虛擬機運行一個 DEX 必不可缺少 DEXCode 中的部分,然后對字節碼指令添加 nop,這種方式極大的提高了代碼安全性。
DEX 函數抽取加密保護技術的執行流程如下:
第三代加固保護技術的優缺點:
Dex混合加密
Dex 混淆加密主要是為了隱藏 dex 文件中關鍵的代碼,力度從輕到重包括:靜態變量的隱藏、函數的重復定義、函數的隱藏、以及整個類的隱藏。混淆后的 dex 文件依舊可以通過 dex2jar、jade 等工具反編譯成 Java 源碼,但是里面關鍵的代碼已經看不到了。
第四代加固保護技術的優缺點:
VPM保護技術
VMP(虛擬機) 保護技術是當下最前沿移動應用安全加固技術,虛擬機軟件保護技術是被動型軟件保護技術的分支,具體來說是添加有意義的混淆代碼的一種變型使用。根據應用層級不同,基本可分為硬件抽象層虛擬機、操作系統層虛擬機和軟件應用層虛擬機。用于保護軟件安全的虛擬機屬于軟件應用層虛擬機,是對被保護的目標程序的核心代碼進行“編譯”,這里被編譯的不是源文件,而是二進制文件,將由編譯器生成的本機代碼(Native code)轉換成效果等價的 byte-code,然后為軟件添加虛擬機解釋引擎。用戶最終使用軟件時,虛擬機解釋引擎會讀取 byte-code,并進行解釋執行,從而實現用戶體驗完全一致的執行效果。
一套高質量的自定義指令集和解釋器是判斷 VMP 技術真偽的唯一標準。目前國內多數廠商都推出了移動應用 VMP 保護技術,經研究多采用的是代碼抽取和隱藏、代碼混淆等技術,大多數技術方案并不成熟,有的方案甚至和 VMP 的核心思想有本質上的區別。
Frida 脫殼
Android 應用開發完成后,為了防止反編譯和逆向分析,經常會使用一些第三方的安全軟件的加殼處理,比較出名的有騰訊樂固、360 加固、梆梆加固和愛加密等。經過加固后的 APK,通過 dex2jar 反編譯后是看不到 APP 源碼的,比如騰訊樂固加殼的 APP:
再比如 360 加固的 APP:
簡單的加殼程序演示:
殼的種類非常多,依據上面介紹的 Android 加固技術的演變,可以將 APK 加殼簡單劃分為以下三代:
| 第一代:DEX 整體加密型殼 | 采用 Dex 整體加密,動態加載運行的機制 | 較容易被還原,通過自動化脫殼工具或腳本即可從內存中 dump 出 dex 文件 |
| 第二代:DEX 函數抽取型殼 | 粒度更細,將方法單獨抽取出來,加密保存,解密執行 | 可以從根本上進行還原的,dump 出所有的運行時的方法體,填充到 dump 下來的 dex 中去的,這也是 fart 的核心原理 |
| 第三代:VMP、Dex2C 殼 | 獨立虛擬機解釋執行、語義等價語法遷移,強度最高 | Dex2C 目前是沒有辦法還原的,只能跟蹤進行分析; VMP 虛擬機解釋執行保護的是映射表,只要心思細、功夫深,是可以將映射表還原的 |
Dexdump腳本
從上面可以看到,APP 加固發展到現在已經好幾代了,從整體加固到代碼抽取再到虛擬機保護,加固和脫殼的方案也逐漸趨于穩定。隨著保護越來越強,脫殼機們也變得越來越費勁,繁瑣。但是畢竟道高一尺,魔高一丈,市面上有很多手段可以進行脫殼操作,下文將介紹的是使用 Frida 的一個腳本來從內存中 Dump 已加殼 APK 的 Dex。
Github 項目地址:FRIDA-DEXDump(作者:葫蘆娃)。
腳本原理
得益于 Frida,在 PC 上面進行內存搜索、轉儲都變得十分方便,再也不需要考慮什么 Xposed、什么 Android 開發、什么代碼注入,只需要關注如何去搜索想要的東西,于是依賴一個幾十行代碼的小腳本,就可以將大部分內存中的 dex 脫下來。對于完整的 dex,采用暴力搜索 dex035 即可找到。而對于抹頭的 dex,通過匹配一些特征來找到。
【More】FRIDA-DEXDump 腳本的原理深入分析可以參考作者葫蘆娃的文章:深入 FRIDA-DEXDump 中的矛與盾 ;或者另一位大佬的源碼解讀:安卓逆向:某錄屏軟件脫殼重打包,附對幾種frida脫殼腳本的分析。
手機銀行APP
下面以某手機銀行 APP 為例進行腳本脫殼示范:
1、首先使用 jadx-gui 反編譯查看該已加固的 APK,可以看到已經無法讀到 APP 源碼:
2、運行模擬器 Frida 服務端并轉發端口,隨后即可執行腳本python main.py并打開目標 APP,程序將自動識別目標 APP 進程并從內存中 Dump 出其原始的 Dex 文件:
3、此時再使用 jadx 反編譯查看 Dump 下來的 Dex 文件,就可以看到目標 APP 的源碼了:
航旅縱橫APP
1、使用查殼工具進行加殼情況的檢測:
2、使用 jadx 反編譯已加固 APK:
3、Frida DexDump 腳本一鍵脫殼:
4、最后使用 jadx 反編譯并查看 dump 下來的 Dex 文件:
【More案例】
1、對抖音短視頻 APP 進行脫殼也成功了:
2、對某騰訊加固的 APP 進行脫殼也成功了:
脫殼前反編譯:
一鍵脫殼:
脫殼后查看源碼:
失敗案例APP
以上所演示的案例可以看到, Frida Dexdump 脫殼腳本對使用第一代殼(Dex 整體加密型)進行加固的 APP 來說,脫殼效果很好,但是對于第二代殼( Dex 函數抽取型殼)則效果不明顯,脫殼后的 dex 文件中函數體為空,下面找個實例演示下。
1、查看一下已加固 APK 反編譯后的代碼:
2、查殼工具檢測發現是梆梆企業版的殼:
3、使用 Frida Dexdump 腳本嘗試一鍵脫殼:
4、反編譯查看 Dump 下來的 dex 文件,發現函數均為空,無法讀到有效源碼:
對于函數抽取型的殼,fart 可以解決,寒冰大佬也是寫出了 frida-fart,frida 版的 fart,安卓版本目前只適配于 Android 8.0,后續會持續學習到 fart 和 frida-fart 在安卓脫殼中的使用。
More
關于脫殼后的源碼實戰分析案例:
最后再附上兩篇進階資源文章:
總結
以上是生活随笔為你收集整理的移动安全-Frida脱壳脚本与加固迭代的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [VIP会员购]卖家报名
- 下一篇: JVM 类加载器与双亲委派模型