frida(hook工具)的環境搭建


一.簡介

  frida 是一款基於 python+javascript 的 hook 框架,可運行在 android、ios、linux、win等各個平台,主要使用的動態二進制插樁技術。

  Frida官網:https://www.frida.re/

  Frida源碼:https://github.com/frida

二、環境基礎

windows7 X64
python 3.7
逍遙模擬器 anroid5.1

三.安裝

   Frida的安裝很簡單,需要在windows安裝frida客戶端和在安卓安裝frida服務端。

   1)在windows安裝客戶端

     安裝python和pip這里就不說了,記得添加環境變量,安裝完python和pip之后,打開CMD,使用命令 pip install frida,我這里因為已經安裝過了,所以下面顯示的信息不同。

 pip install frida
pip install frida-tools

  

  注意:

  安裝的python版本選擇這里要說明下,之前因為下載的python版本不對導致frida一直運行不起來,網上搜索很多資料都沒有結果,我們下載安裝完python后,
輸入命令安裝frida時會自動到https://pypi.org/project/frida/

#files下載最新的frida安裝,比如現在frida最新版本是12.6.12,輸入pip install frida后會自動下載12.6.12版本的frida,這個我們無法更改。我們需要手動進去這個網頁,找到frida對應windows版本egg文件,

如我是windows64位,python最好選擇3.x以上版本下載,所以需要下載frida-12.4.0-py3.x-win-amd64.egg,發現只有frida-12.4.0-py3.7-win-amd64.egg 符合我們的要求,
這里windows版本、python版本和frida版本要都匹配才行,所以我們需要安裝python3.7版本,並且把frida-12.4.0-py3.7-win-amd64.egg 這個文件下載下來,后面會用到。

  

  不知是否是frida安裝的bug,我發現提示frida安裝成功后,運行frida-ps會報錯提示找不到對應模塊

這個問題網上搜索了很久沒有找到解決方案,大都是說安裝版本不對,沒有告訴應該安裝哪個版本,最后當我打開https://pypi.org/project/frida/

#files這個網頁就明白了,我在python安裝目錄C:\Program Files\Python37\Lib\site-packages西面沒有找到frida-12.4.0-py3.7-win-amd64.egg文件,
這個是運行frida所需的文件,執行pip install frida和pip install frida-tools后並沒有把這個文件下載下來,所以我們需要手動下載這個文件,
拷貝到python安裝目錄C:\Program Files\Python37\Lib\site-packages,最后執行frida-ps,成功顯示電腦當前進程
  • 查看連接到的設備
frida-ls-devices

   2) 在手機中安裝服務端

      首先到github上下載frida-server,網址為https://github.com/frida/frida/releases,從網址可以看到,frida提供了各種系統平台的server,我的模擬器為小米5,是64 arm,所以我下載的為arm64

  查詢手機對應的cpu

adb shell getprop ro.product.cpu.abi

 

 

  

   解壓后,使用adb將frida-server放到手機目錄/data/local/,然后修改屬性為可執行

#查看設備連接狀態
adb devices -l

#把服務端推送到手機的指定目錄(記得先解壓再推送)
adb  push  C:\Users\1003441\Downloads\frida-server-12.6.12-android-arm64  /data/loacl

#進入手機終端,修改文件權限並運行
adb shelll

cd /data/local
chmod 777 frida-server-12.4.0-android-arm
./frida-server-12.4.0-android-arm &

  在后台指定前最好先測試一下

  

  電腦端再起一個終端

  

    然后在windows主機上另外開啟一個cmd,輸入命令 frida-ps -U ,這行命令是列出手機上所有的進程信息,如果出現進程信息則說明環境搭配成功:

  如果需要調試的,一點要設置端口轉發到pc端

  adb forward tcp:27042 tcp:27042

  adb forward tcp:27043 tcp:27043

  現在在命令行輸入frida-ps -R,就可以看到android機器的進程列表了,至此,運行環境就搭建好了。

  

  查看android手機當前最前端Activity所在的進程

λ python37
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 19:29:22) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import frida
>>> remote_dev=frida.get_remote_device()
>>> print(remote_dev)
Device(id="tcp", name="Local TCP", type='remote')
>>> front_app=remote_dev.get_frontmost_application()
>>> print(front_app)
Application(identifier="com.microvirt.launcher2", name="逍遙桌面", pid=647)
>>>

  枚舉android所有運行的process

>>> processes=remote_dev.enumerate_processes()                                          
>>> for process in processes:                                                           
...     print(process)                                                                  
...                                                                                     
Process(pid=1, name="init")                                                             
Process(pid=62, name="ueventd")                                                         
Process(pid=72, name="flush-8:2")                                                       
Process(pid=73, name="flush-8:3")                                                       
Process(pid=74, name="logd")                                                            
Process(pid=75, name="healthd")                                                         
Process(pid=76, name="lmkd")                                                            
Process(pid=77, name="servicemanager")                                                  
Process(pid=78, name="vold")                                                            
Process(pid=79, name="surfaceflinger")                                                  
Process(pid=80, name="flush-8:0")                                                       
Process(pid=81, name="flush-8:4")                                                       
Process(pid=82, name="netd")                                                            
Process(pid=83, name="debuggerd")                                                       
Process(pid=84, name="rild")                                                            
Process(pid=85, name="drmserver")                                                       
Process(pid=86, name="mediaserver")                                                     
Process(pid=87, name="installd")                                                        
Process(pid=88, name="keystore")                                                        
Process(pid=89, name="zygote")                                                          
Process(pid=90, name="sdcard")                                                          
Process(pid=92, name="flush-8:1")                                                       
Process(pid=343, name="system_server")                                                  
Process(pid=523, name="com.android.systemui")                                           
Process(pid=557, name="com.android.ime")                                                
Process(pid=597, name="com.android.phone")                                              
Process(pid=636, name="wpa_supplicant")                                                 
Process(pid=647, name="com.android.launcher2")                                          
Process(pid=717, name="android.process.acore")                                          
Process(pid=773, name="dhcpcd")                                                         
Process(pid=823, name="com.android.tools")                                              
Process(pid=882, name="com.android.download")                                           
Process(pid=941, name="com.android.market")                                             
Process(pid=1301, name="com.android.defcontainer")                                      
Process(pid=2436, name="flush-8:4")                                                     
Process(pid=2478, name="frida-server-12.6.12-android-x86")                              
Process(pid=2480, name="logcat")                                                        
>>>                                                                                     

 

 

四.工具介紹

1) 工具總體概述

    Frida提供了四個工具,frida-trace,frida-ps,frida,frida-discover,這些工具都位於python的Scripts路徑下,

   

  

  比較遺憾的是,frida官網並未提供這些工具使用的詳細文檔,我沒有找到這些工具的命令行參數的詳細說明。這些工具實際都是基於frida的python接口實現的。所以,如果想深入了解這些工具的使用,需要借助frida的源碼。

    源碼的網址為https://github.com/frida/frida-python。其中,值得注意的是部分參數的解析位於文件frida-python /src/frida/application.py中的ConsoleApplication類中,這個類也是其它工具的實現類的父類,所以這個類中的參數也是可以用到這些工具中的,

  

  

  我看到這里其實是有幫助信息的,但是我這個python小菜真不知道怎么把它們打印出來。嗚嗚。。。

     上圖中的幾個選項需要注意一下,-U值得是usb設備,-R值得是網絡端口設備,-f可以指定進程文件名。

   2)frida-trace介紹

    這里簡單介紹個工具的使用,比如frida-trace,這個工具可以用來追蹤指定的函數的調用。這個工具的實現位於文件frida-python /src/frida/tracer.py中,下圖為參數:

 

  

  這個參數的解析位於類TraceApplication,而這個類又繼承自ConsoleApplication

  

 

    所以,之前的-U等參數在這個工具也是可以使用的。Frida-trace的參數這里就不特別翻譯了,需要注意的是,這些參數都是可以使用通配符的,這里我真覺得frida好厲害。

  3) frida-trace的使用例子

    使用下面的命令行來追蹤open函數,目標進程為我手機上的瀏覽器,其中com.android.browser是我瀏覽器的包名,-U是指使用usb設備,應為我的手機就是使用usb連接電腦的,-i 選項是指所要追蹤的函數的函數名,這里其實可以使用通配符,比如“*open”指的是以open結尾的函數。

    frida-trace -i "open" -U com.android.browser

    然后在瀏覽器上隨便點擊,可以得到下面的內容:

  

    當open函數被調用的時候則會打印日志到屏幕。在上圖中有個文件路徑,根據路徑打開文件可以看到下面的內容:

   

  

  這個文件其實是frida-trace產生js腳本文件,圖片中的注釋被我注釋掉了,這個腳本文件其實是產生了一個匿名對象(js語法規定,{}可以用來產生一個對象),這個對象有兩個成員onEnter和onLeave,而這兩個成員實際上都指向了js的函數。實際上,這個匿名對象是  js庫的回調對象(不知道這樣稱呼對不對),即當open函數被調用時這個對象的兩個函數會被調用。其中,onEnter是open函數即將被執行時會被調用,而onLeave是open函數執行完畢時會被調用。

   其它的工具的使用其實是類似的。我並沒有再去使用別的工具,應為工具提供的功能還是太簡單了。

5. 主控端和目標進程的交互(message)

  Js腳本提供了向主控端發送數據的接口—send和從主控端接收數據的接口—recv,而在主控端是通過python腳本的回調來接收數據,並使用python提供的接口post來向目標進程發送數據。這里的數據需要是可以序列化成json字符串的。下面來看例子。

  Python腳本代碼如下:

  

  

 將這個代碼保存到文件modules.py,然后在cmd里面輸入python modules.py,正常會看到下面:

  

 

  在這段代碼中,第8行是調用python的接口Session.create_script,其功能是根據參數字符串創建一個Scritp對象,其參數便是js腳本代碼。這段js代碼只有一個功能,就是調用js提供的接口send,向主控端發送數值9527.

  后面最主要的是12-15行,12行代碼是定義了一個python函數,其功能便是將參數輸出到控制台。這兩個參數是python回調接口需要的。而15行代碼則是將這段腳本跟自己定義的python函數on_message聯系在一起,最后通過接口load來執行js腳本。

  然后,我們來看看python接口的源碼實現,首先是Script.on接口,Script的實現是在frida-python /src/frida/core.py中,

   

  

 這里可以到,最后是遍歷調用列表中的回調。

  換句話說,python的回調接口其實實現了了一個回調隊列,它支持對接收的數據的多種解析方式。

6. Python接口和js接口

  1)python接口

    python接口提供的功能很少,而且基本都是用來獲取進程、模塊、函數的信息的。

    python接口的實現都在frida-python里面了。

    Python提供了一些全局接口,在文件frida-python \scr\frida\_init_.py里面,

   

   其中Get_usb_device可以獲取當前連接到usb的設備,如果使用手機,一般使用這個函數獲取手機設備。

     而其他的接口都在frida-python /src/frida/core.py里面,比如進程、模塊、函數相關的操作:

   

  

    這里面Session可以理解為一次會話,比如附加到某個進程則算是啟動了一次會話,也可以理解為進程的抽象,Module則是模塊的抽象,Function則為函數的抽象。

    舉個使用的例子。在session中有個接口enumerate_modules,用來枚舉進程的模塊,下面為源碼:

  

  這里可以看到,函數最后把模塊的信息放到了一個列表中,所以我的接口使用代碼如下:

  

  

  這里需要注意的是,在使用frida的時候,首先第一步要做的是獲取設備,我這里使用get_usb_device來獲取手機設備,然后第二步要做的是指定要附加的進程,我這里附加的仍然是我手機上的瀏覽器。

    然后我的代碼其實很簡單,就枚舉進程模塊,然后遍歷列表,循環輸出模塊的名稱,然后下圖為輸出結果:

  

  

  然后python的其它的接口使用很類似,這里就不一一列舉了。

   2) js接口

    js接口就相當豐富了,接口功能包括但不限於進程操作、模塊操作、內存操作、函數操作、線程操作、網絡通信、數據流操作、文件操作、數據庫操作、寄存器操作,並且官網有着詳細的說明文檔https://www.frida.re/docs/javascript-api/,對於每個接口的功能和參數給出了詳細的解釋,並且一部分接口還給出了例子。

    下面來看一個遍歷進程模塊的簡單示例。

    Js接口中,Process.enumerateModules提供了模塊遍歷的功能,官方說明如下:

  

  這個接口需要一個回調對象,這個對象有兩個成員,onMatch和onComplete,而這兩個成員都是函數,當接口每遍歷到一個模塊時,便會調用回調對象的onMatch,此函數有個參數為module,它有四個成員,其意義見上圖。我的js腳本如下:

  

  腳本內容很簡單,就是將模塊的名字發送到主控端,此腳本內容被我保存到文件TestFrida.js中了,然后python腳本如下:

  

  這個腳本內容也很簡單,8-9行代碼是附加到進程,12-14行代碼是讀取TestFrida.js中js腳本內容,16行代碼則是關聯消息接收函數,17行代碼是執行腳本。然后,執行此python腳本,控制台會輸出進程的模塊名,如下:

  

7. 小結

    本來想寫一個深入淺出frida框架的文章,把frida的基本使用和框架原理都探索一遍,但是發現frida框架的內容太多,本身又是跨平台,完全超出了我的能力和精力,所以最后就得到了這么個算是frida科普的文章。所以就寫到這里吧,還好基本的用法已經講清楚了,在我看來,frida並非一個hook框架,而是一個非常方便和實用的分析工具。有機會我會再寫一篇深入探索的文章,也歡迎各位壇友對本文進行指正。

 

 轉自:https://bbs.pediy.com/thread-226846.htm

 


免責聲明!

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



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