天天看點

安卓逆向,frida逆向架構介紹

####

frida架構介紹:

frida是一個逆向架構,

目前逆向架構比較知名的有兩個,Xposed,frida

Xposed,是java開發的,要會java

frida,是python和js,開發的,這個比較适合我,

兩個工具對比,

frida比Xposed的适用性更廣一些,Xposed隻能hook安卓,java層,

而frida可以hook,安卓,ios,windows,還可以hook,安卓的native層,

frida是一個js注入技術,

###

frida中python隻是調用,主要是寫js,做js注入,

使用frida開發的前提是裝置要root

使用frida開發hook 的前提條件,

你首先要知道hook哪一個方法,是以你要先解決脫殼的問題,擷取到源代碼,

frida組成部分,

1,frida-server,這個是一個包,需要放到手機裝置上,

2,frida,python子產品

3,frida-tools,提供cli指令,和frida-server做互動,

第二個和第三個是可以隻用一個的,你可以用python,直接調用js,也可以用用戶端cli指令,調用js,

有空經常去看官方文檔,

 很多時候,有很多問題,你解決不了,你去百度不到的,必須要養成看官方文檔的習慣,

對于這些先進的東西,生态還不是很豐富的,你必須要要看官方文檔,

Frida安裝配置

第一步:電腦安裝frida和frida-tools

pip install frida

pip install frida-tools

mac安裝本來是兩個指令的事情,但是安裝的時候總是報錯,

sudo pip install --upgrade certifi

open /Applications/Python\ 3.7/Install\ Certificates.command

如果是證書問題,就執行這兩句,然後重新啟動電腦,我的就是這樣好的,

第二步,手機執行frida server

frida server 放在手機上執行 要注意手機CPU型号

https://github.com/frida/frida/releases

安卓逆向,frida逆向架構介紹

下載下傳的時候,注意是x86,還是x86_64,還是arm,

手機基本都是arm

模拟器一般都是x86的,而且是32位的,但是這不是決定的,需要檢視一下,

adb shell getprop ro.product.cpu.abi

使用這個指令來檢視,

在手機上執行:

首先下載下傳的frida-server解壓,

推入手機裡,adb push frida-server-15.0.18-android-x86_64 /data/local/temp/frida-server

adb shell

cd /data/local/temp

确定手機目前使用者是root使用者或擁有root權限

chmod 777 frida-server

./frida-server

執行完畢後為運作狀态。

保留此視窗 shell,以保證服務運作,關閉該shell 或者停止ctrl+c 則服務關閉。接下來的操作可另起shell 或該步驟指令另起 shell 執行。

第三步,端口轉發:

adb forward tcp:27042 tcp:27042

adb forward tcp:27043 tcp:27043

27042 用于與frida-server通信的預設端口号,之後的每個端口對應每個注入的程序,檢查27042端口可檢測 Frida 是否存在。

你想要開發還要做端口轉發,

不然,你python做開發,是會報錯,告訴你沒有連接配接上,

第四步,檢查是否成功

電腦上運作

frida-ps -U 電腦上運作 android.process.acore 字樣表示成功

這個指令是驗證一下,在手機端的frida-server是否運作起來了,

注意這一句要進入你安裝frida的虛拟環境裡面執行,

### 

經過上面的配置,你就可以做frida開發了,

frida基礎開發示例:

安卓逆向,frida逆向架構介紹

frida開發的固定套路:三段論

第一段:有一個列印的python函數,用來列印日志,

第二段:有一段js腳本,

第三段:下面有一段python代碼,

主要是做了,擷取裝置,擷取裝置裡面的app包名,執行js腳本,注入到app裡面取,調用第一段的列印方法,最後一句是不要讓程式斷掉,

第一段和第二段,基本不用動,主要是動中間的js腳本,

可以操作記憶體,

要先在模拟器把app運作起來然後再hook

運作這個py檔案,可以列印出來安卓系統的版本,列印所有調用的方法

frida提供了什麼方法,可以看官方文檔,

https://www.frida.re/docs/javascript-api

具體的js腳本的api,看這個官方文檔,

python代碼:

import frida
import sys


def on_message(message,data):
    if message["type"] == "send":
        print("[*]{0}".format(message["payload"]))
    else:
        print(message)


jscode = """
// 擷取安卓版本
var v = Java.androidVersion;
send("version: "+v)

//擷取該應用的加載的類
var classnames = Java.enumerateLoadedClassesSync();

// for循環
for(var i = 0; i<classnames.length; i++){
     send("class name :" + classnames[i]);
}
 """


process = frida.get_usb_device().attach("自毀程式密碼")
script = process.create_script(jscode)
script.on("message",on_message)
print("[*] running CIF")
script.load()
sys.stdin.read()