1、Frida技術原理python
Android脫殼的目的是從內存中dump下解密的應用dex文件,爲了實現這個目的咱們須要知道dex文件在內存中dex地址與dex文件大小。Android系統的libart.so庫文件中提供了一個導出的OpenMemory函數用來加載dex文件。linux
這個函數的第一個參數指向了內存中的dex文件,若是咱們能夠Hook 這個函數,就能夠獲得dex文件加載進內存時的起始地址,再根據dex文件格式計算獲得文件頭保存的dex文件的長度fileSize。android
2、獲取函數簽名git
在編寫Frida腳本以前咱們須要在libart.so文件中找到OpenMemory的函數簽名,這個簽名根據android版本或者架構的不一樣會有些許差別,下面介紹如何從運行待脫殼應用的設備中提取libart.so文件:github
$ adb pull /system/lib/libart.so /本地目錄 $ adb pull /system/lib64/libart.so /本地目錄
獲取libart.so文件後有兩個方法能夠得到函數簽名,第一種是利用IDA pro 分析so文件,搜索OpenMemory函數:安全
第二種方法實在linux系統下使用nm命令直接查看libart.so文件的函數簽名:bash
$ nm libart.so | grep OpenMemory
3、編寫腳本架構
Frida能夠執行js腳本也能夠執行python腳本:app
· JS腳本:ide
· Python腳本:
代碼參考 https://github.com/dstmath/frida-unpack
4、準備Frida 環境
安裝 frida客戶端與服務端,建議使用Python的pip命令安裝frida客戶端:
$ pip install frida $ pip install frida-tools
下載完畢後查看下載的客戶端版本:
$ frida –version
客戶端與服務端都下載完畢後,先把frida-server推送到設備中:
$ adb push frida-server /data/local/tmp
設置frida-server的權限並運行:
$ su # cd /data/local/tmp # chmod 777 frida-server # ./frida-server
若是運行失敗,能夠嘗試關閉android系統的SELinux:
# setenforce 0
咱們打開另外一個控制檯,運行客戶端命令查看與服務端的交互:
$ frida-ps -U
出現如下信息,則說明交互成功:
5、執行脫殼腳本
咱們先將一個簡單的測試程序丟到騰訊樂固上去加固,咱們能夠看到加固完成後的結果:
能夠看到加固事後程序的本來代碼被隱藏了,被替換成樂固的殼程序代碼,將加固後的應用安裝到手機上,賦予該應用讀寫sd卡權限:
在sd卡中建立unpack目錄,執行命令運行JS腳本:
$ frida -U -f <被脫殼應用的包名> -l <js腳本名> –no-pause
-U參數表示咱們使用了USB server進行連接,-f 參數表示在設備中啓動一個指定的android程序,須要配合 –no-pause參數來使進程恢復。-l參數表示須要注入的js腳本。
Python腳本的運行就簡單得多了:
$ python unpack.py <應用包名>
另外注意一個問題,若是應用運行過程當中使用了64位的libart.so,腳本的這個地方須要進行一些小修改:
//dex起始位置 var begin = args[1]
獲取dex起始位置的語句須要改爲:
var begin = this.context.x0
否則可能會出現這樣的問題:
脫殼完成後從sd卡中將unpack文件夾pull到本地:
$ adb pull /sdcard/unpack .
能夠看到脫殼成功了。因爲這一類脫殼法是將內存中的dex文件直接dump下來的,對於指令抽取等針對方法體進行處理的加固方式並無作對應的修復工做。若是應用通過了指令抽取或者dex2c處理,這種方法拿到的dex文件就是殘缺不全的,對於那些加固就須要經過對Android源碼進行修改的脫殼方法好比dexhunter或者是比較新的FART脫殼機。
做者簡介:葉紹琛,Unix/Linux/Android操做系統內核技術專家,大中華區前50位RHCA系統架構師,曾任網易互娛雲計算平臺技術負責人。
《Android安全指南》系列文章,未完待續。