日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

frida框架

發(fā)布時(shí)間:2025/3/21 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 frida框架 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 簡(jiǎn)介
    • 環(huán)境搭建
      • 注意點(diǎn)1:
      • 注意點(diǎn)2:
        • 錯(cuò)誤寫(xiě)法:
        • 正確寫(xiě)法:
    • 疑問(wèn)點(diǎn)
    • 脫殼已解決
      • 沒(méi)有SDK環(huán)境的報(bào)錯(cuò)
    • 工具
    • Python綁定
    • 使用
    • 個(gè)人誤區(qū)
    • python綁定解決

簡(jiǎn)介

Frida是一款基于python + javascript 的hook框架,適用于android/ios/linux/win/osx等平臺(tái)。Frida的動(dòng)態(tài)代碼執(zhí)行功能,主要是在它的核心引擎Gum中用C語(yǔ)言來(lái)實(shí)現(xiàn)的。

  • 注入模式:大部分情況下,我們都是附加到一個(gè)已經(jīng)運(yùn)行到進(jìn)程,或者是在程序啟動(dòng)到時(shí)候進(jìn)行劫持,然后再在目標(biāo)進(jìn)程中運(yùn)行我們的代碼邏輯。這種方式是Frida最常用的使用方式。注入模式的大致實(shí)現(xiàn)思路是這樣的,帶有GumJS的Frida核心引擎被打包成一個(gè)動(dòng)態(tài)連接庫(kù),然后把這個(gè)動(dòng)態(tài)連接庫(kù)注入到目標(biāo)進(jìn)程中,同時(shí)提供了一個(gè)雙向通信通道,這樣控制端就可以和注入的模塊進(jìn)行通信了,在不需要的時(shí)候,還可以在目標(biāo)進(jìn)程中把這個(gè)注入的模塊給卸載掉。
  • 嵌入模式:針對(duì)沒(méi)root過(guò)的設(shè)備Frida提供了一個(gè)動(dòng)態(tài)連接庫(kù)組件 frida-gadget, 可以把這個(gè)動(dòng)態(tài)庫(kù)集成到程序里面來(lái)使用Frida的動(dòng)態(tài)執(zhí)行功能。一旦集成了gadget,就可以和程序使用Frida進(jìn)行交互。
  • 預(yù)加載模式:自動(dòng)加載Js文件。
  • 環(huán)境搭建

  • 下載FRIDA
    直接安裝frida和frida-tools的最新版本
  • pip install frida pip install frida-tools緊接著查看自己frida版本: frida --version然后查看自己的目標(biāo)機(jī)架構(gòu)版本,但有些可能不能顯示出目標(biāo)機(jī)架構(gòu)版本,所以我直接到客戶端:


    模擬器版本: 7.0.1.0005-7.1.2700210226
    系統(tǒng)版本: Windows10-64bit-8cpu
    電腦型號(hào): ASUSTeK COMPUTER INC.-TUF Gaming FX505DT_FX95DT
    CPU: AMD Ryzen 7 3750H with Radeon Vega Mobile Gfx
    總內(nèi)存: 15809MB
    可用內(nèi)存: 8615MB
    是否開(kāi)啟VT: 開(kāi)啟
    渲染模式: OpenGL+
    OpenGL版本: 4.6.0 NVIDIA 431.87
    OpenGL渲染: GeForce GTX 1650/PCIe/SSE2
    是否獨(dú)顯: 開(kāi)啟
    顯卡1: NVIDIA GeForce GTX 1650
    顯卡2: AMD Radeon? RX Vega 10 Graphics
    防火墻: 開(kāi)啟(推薦關(guān)閉)
    安裝路徑: D:\夜神模擬器\Nox\bin
    日志文件路徑: C:\Users\ASUS\AppData\Local\Nox
    模擬器磁盤(pán)大小: 總共 64G, 剩余 61G


    64位程序執(zhí)行不起來(lái),所以的話frida-server下載32位

  • 下載frida-server
    去github上下載frida-server,網(wǎng)址為 https://github.com/frida/frida/releases,frida-server 是一個(gè)守護(hù)進(jìn)程,通過(guò)TCP和Frida核心引擎通信,默認(rèn)的監(jiān)聽(tīng)端口是27042



  • adb devices

  • 解壓后,使用adb將frida-server放到手機(jī)目錄/data/local/tmp,然后修改屬性為可執(zhí)行
  • adb push G:\buuctf\frida-server-14.2.2-android-x86\fs data/local/tmp/frida-server_test

    注意點(diǎn)1:

    使用push指令,這里注意點(diǎn),如果是新安裝的夜神模擬器,那么會(huì)遇到這個(gè)報(bào)錯(cuò):

    adb: error: failed to copy 'G:\buuctf\frida-server-14.2.14-android-x86_64\fs_Rui' to 'data\local\tmp\fs_Rui': couldn't create file: Read-only file system


    文件系統(tǒng)僅僅可讀。

  • 在夜神模擬器中查看/proc/mounts文件里面的目錄的權(quán)限,確定是否缺少w權(quán)限,如果是的話,那么在proc目錄下執(zhí)行以下代碼:
  • mount -o remount,rw /

    (一般到這里就可以試試push指令能不能用了,因?yàn)閳?bào)錯(cuò)是文件系統(tǒng)的原因)

  • 執(zhí)行以下命令
  • adb remount adb root

    注意點(diǎn)2:

    linux下的目錄(后者是linux目錄)都是反斜杠,寫(xiě)正的沒(méi)用。

    錯(cuò)誤寫(xiě)法:

    adb push G:\buuctf\frida-server-14.2.14-android-x86_64\fs_Rui data\local\tmp\fs_Rui

    正確寫(xiě)法:

    adb push G:\buuctf\frida-server-14.2.2-android-x86\fs data/local/tmp/frida-server_test adb shell //進(jìn)入模擬器 exit//退出模擬器//以下均為linux命令行 su cd data/local/tmp chmod 777 frida-server_test

  • 啟動(dòng)手機(jī)上的frida服務(wù)器,記得要以root權(quán)限啟動(dòng),
  • ./frida-server_test

  • 在windows主機(jī)上另外開(kāi)啟一個(gè)cmd,輸入命令 frida-ps -U ,這行命令是列出手機(jī)上所有的進(jìn)程信息,如果出現(xiàn)進(jìn)程信息則說(shuō)明環(huán)境搭配成功:
  • frida-ps -U

    疑問(wèn)點(diǎn)

    但是我這里利用脫殼腳本,去連接frida-server,直接連接不上

    求救

    脫殼已解決

  • 第一個(gè)問(wèn)題:未進(jìn)行端口轉(zhuǎn)發(fā)
  • adb forward tcp:27042 tcp:27042 adb forward tcp:27043 tcp:27043
  • 第二個(gè)問(wèn)題:sdk中的adb和夜神中的abd版本不合。。adb server version (31) doesn’t match this client (36),以至于每次一使用腳本連接,然后frida-server就會(huì)掛掉,然后就出現(xiàn)了上方的報(bào)錯(cuò),只需要把sdk的adb復(fù)制一份放在夜神里面就行嘍
  • 沒(méi)有SDK環(huán)境的報(bào)錯(cuò)

  • 解碼
  • D:\桌面\apktool.jar d D:\桌面\02.apk -o targetappFolder
  • 將apk重新打包
  • D:\桌面\apktool.jar b -o repackaged.apk targetappFolder/
  • 創(chuàng)建keystore(如果沒(méi)有的話)
  • keytool -genkey -v -keystore custom.keystore -alias mykeyaliasname -keyalg RSA -keysize 2048 -validity 10000
  • 簽名
  • jarsigner -sigalg SHA256withRSA -digestalg SHA1 -keystore custom.keystore -storepass 你的密碼 repackaged.apk mykeyaliasname

    這個(gè)custom.keystore也就是前面所生成的keystore,注意路徑問(wèn)題就行

  • 驗(yàn)證
  • jarsigner -verify repackaged.apk




    D:\桌面>D:\桌面\apktool.jar d targetapp.apk -o targetappFolderD:\桌面>D:\桌面\apktool.jar d targetapp.apk -o targetappFolderD:\桌面>D:\桌面\apktool.jar d D:\桌面\02.apk -o targetappFolderD:\桌面>apktool b -o repackaged.apk targetappFolder/ 'apktool' 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序 或批處理文件。D:\桌面>apktool b -o repackaged.apk targetappFolder/ 'apktool' 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序 或批處理文件。D:\桌面>D:\桌面\apktool.jar apktool b -o repackaged.apk targetappFolder/D:\桌面>D:\桌面\apktool.jar b -o repackaged.apk targetappFolder/D:\桌面>keytool -genkey -v -keystore custom.keystore -alias mykeyaliasname -keyalg RSA -keysize 2048 -validity 10000 輸入密鑰庫(kù)口令: 再次輸入新口令: 您的名字與姓氏是什么?[Unknown]: 張瑞彪 您的組織單位名稱(chēng)是什么?[Unknown]: 江科大 您的組織名稱(chēng)是什么?[Unknown]: 江科大 您所在的城市或區(qū)域名稱(chēng)是什么?[Unknown]: 江科大 您所在的省//自治區(qū)名稱(chēng)是什么?[Unknown]: 江科大 該單位的雙字母國(guó)家/地區(qū)代碼是什么?[Unknown]: 江科大 CN=張瑞彪, OU=江科大, O=江科大, L=江科大, ST=江科大, C=江科大是否正確?[]: 是正在為以下對(duì)象生成 2,048 位RSA密鑰對(duì)和自簽名證書(shū) (SHA256withRSA) (有效期為 10,000):CN=張瑞彪, OU=江科大, O=江科大, L=江科大, ST=江科大, C=江科大 [正在存儲(chǔ)custom.keystore]D:\桌面>jarsigner -sigalg SHA256withRSA -digestalg SHA1 -keystore custom.keystore -storepass 你的密碼 repackaged.apk mykeyaliasname jarsigner 錯(cuò)誤: java.lang.RuntimeException: 密鑰庫(kù)加載: keystore password was incorrectD:\桌面>jarsigner -sigalg SHA256withRSA -digestalg SHA1 -keystore custom.keystore -storepass 123456 repackaged.apk mykeyaliasname jarsigner 錯(cuò)誤: java.lang.RuntimeException: 密鑰庫(kù)加載: D:\桌面\custom.keystore (系統(tǒng)找不到指定的文件。)D:\桌面>jarsigner -sigalg SHA256withRSA -digestalg SHA1 -keystore D:\桌面\custom.keystore -storepass 123456 repackaged.apk mykeyaliasname jar 已簽名。警告: 簽名者證書(shū)為自簽名證書(shū)。 為 -digestalg 選項(xiàng)指定的 SHA1 算法被視為存在安全風(fēng)險(xiǎn)。此算法將在未來(lái)的更新中被禁用。D:\桌面>zipalign 4 repackaged.apk final.apk 'zipalign' 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序 或批處理文件。D:\桌面>jarsigner -verify repackaged.apkjar 已驗(yàn)證。警告: 此 jar 包含其證書(shū)鏈無(wú)效的條目。原因: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 此 jar 包含其簽名者證書(shū)為自簽名證書(shū)的條目。 SHA1 摘要算法被視為存在安全風(fēng)險(xiǎn)。此算法將在未來(lái)的更新中被禁用。 此 jar 包含的簽名沒(méi)有時(shí)間戳。如果沒(méi)有時(shí)間戳, 則在其中任一簽名者證書(shū)到期 (最早為 2048-08-30) 之后, 用戶可能無(wú)法驗(yàn)證此 jar。有關(guān)詳細(xì)信息, 請(qǐng)使用 -verbose 和 -certs 選項(xiàng)重新運(yùn)行。

    工具

  • frida-ps
  • --version show program's version number and exit -h, --help show this help message and exit -D ID, --device=ID connect to device with the given ID -U, --usb connect to USB device -R, --remote connect to remote frida-server -H HOST, --host=HOST connect to remote frida-server on HOST -a, --applications list only applications -i, --installed include all installed applications


    2. frida-trace 動(dòng)態(tài)跟蹤

    --version show program's version number and exit -h, --help show this help message and exit -D ID, --device=ID connect to device with the given ID -U, --usb connect to USB device -R, --remote connect to remote frida-server -H HOST, --host=HOST connect to remote frida-server on HOST -f FILE, --file=FILE spawn FILE -n NAME, --attach-name=NAME attach to NAME -p PID, --attach-pid=PID attach to PID --debug enable the Node.js compatible script debugger --disable-jit disable JIT -I MODULE, --include-module=MODULE include MODULE -X MODULE, --exclude-module=MODULE exclude MODULE -i FUNCTION, --include=FUNCTION include FUNCTION -x FUNCTION, --exclude=FUNCTION exclude FUNCTION -a MODULE!OFFSET, --add=MODULE!OFFSET add MODULE!OFFSET -T, --include-imports include program's imports -t MODULE, --include-module-imports=MODULE include MODULE imports -m OBJC_METHOD, --include-objc-method=OBJC_METHOD include OBJC_METHOD

    示例:
    注意:使用frida-trace時(shí),Android端一定要打開(kāi)frida-server,否則就會(huì)出現(xiàn)這樣
    啟動(dòng)手機(jī)中的Chrome瀏覽器

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


    可以看到終端中出現(xiàn):open:Loaded handler at :”/用戶名/__handlers__/libc.so/open.js”
    frida-trace會(huì)生成一個(gè)javascript文件,然后Frida會(huì)將其注入到進(jìn)程中,并跟蹤特定的調(diào)用。生成的open.js腳本將鉤住libc.so中的open函數(shù)并輸出參數(shù).
    默認(rèn)的open.js:

    /** Auto-generated by Frida. Please modify to match the signature of open.* This stub is currently auto-generated from manpages when available.** For full API reference, see: https://frida.re/docs/javascript-api/*/{/*** Called synchronously when about to call open.** @this {object} - Object allowing you to store state for use in onLeave.* @param {function} log - Call this function with a string to be presented to the user.* @param {array} args - Function arguments represented as an array of NativePointer objects.* For example use args[0].readUtf8String() if the first argument is a pointer to a C string encoded as UTF-8.* It is also possible to modify arguments by assigning a NativePointer object to an element of this array.* @param {object} state - Object allowing you to keep state across function calls.* Only one JavaScript function will execute at a time, so do not worry about race-conditions.* However, do not use this to store function arguments across onEnter/onLeave, but instead* use "this" which is an object for keeping state local to an invocation.*/onEnter(log, args, state) {log('open()');},/*** Called synchronously when about to return from open.** See onEnter for details.** @this {object} - Object allowing you to access state stored in onEnter.* @param {function} log - Call this function with a string to be presented to the user.* @param {NativePointer} retval - Return value represented as a NativePointer object.* @param {object} state - Object allowing you to keep state across function calls.*/onLeave(log, retval, state) {} }



    可以修改open.js進(jìn)行操作,然后進(jìn)行終端輸出:

    /* * Auto-generated by Frida. Please modify to match the signature of open. * This stub is currently auto-generated from manpages when available. * * For full API reference, see: http://www.frida.re/docs/javascript-api/ */ { /** * Called synchronously when about to call open. * * @this {object} - Object allowing you to store state for use in onLeave. * @param {function} log - Call this function with a string to be presented to the user. * @param {array} args - Function arguments represented as an array of NativePointer objects. * For example use Memory.readUtf8String(args[0]) if the first argument is a pointer to a C string encoded as UTF-8. * It is also possible to modify arguments by assigning a NativePointer object to an element of this array. * @param {object} state - Object allowing you to keep state across function calls. * Only one JavaScript function will execute at a time, so do not worry about race-conditions. * However, do not use this to store function arguments across onEnter/ onLeave, but instead * use "this" which is an object for keeping state local to an invocation. */ onEnter: function (log, args, state) { log("open(" + "path=\"" + Memory.readUtf8String(args[0]) + "\"" + ", oflag=" + args[1] + ")"); }, /** * Called synchronously when about to return from open. * * See onEnter for details. * * @this {object} - Object allowing you to access state stored in onEnter. * @param {function} log - Call this function with a string to be presented to the user. * @param {NativePointer} retval - Return value represented as a NativePointer object. * @param {object} state - Object allowing you to keep state across function calls. */ onLeave: function (log, retval, state) { } }

    Python綁定

    示例:
    從Python注入chrome.js腳本
    注意:從命令行加載腳本然后生成一個(gè)命令的進(jìn)程時(shí),Frida容易崩潰。所以先生成進(jìn)程,再讓Frida注入腳本

    #!/usr/bin/python import frida # js jscode= """ console.log("[*] Starting script"); Java.perform(function() { var Activity = Java.use("android.app.Activity"); Activity.onResume.implementation = function () { console.log("[*] onResume() got called!"); this.onResume(); }; }); """ # startup frida and attach to com.android.chrome process on a usb device process = frida.get_remote_device().attach("com.android.chrome") # create a script for frida of jsccode script = process.create_script(jscode) # and load the script script.load()

    注意點(diǎn):

  • 記得端口轉(zhuǎn)發(fā)
  • adb forward tcp:27042 tcp:27042 adb forward tcp:27043 tcp:27043

    否則如下報(bào)錯(cuò)

  • 別用frida.get_usb_device().attach(),改用frida.get_remote_device().attach(),否則如下報(bào)錯(cuò):
  • 使用

    學(xué)習(xí)Frida的magic,并通過(guò)Frida覆蓋一個(gè)函數(shù)。此外,我們還將介紹如何從外部腳本加載代碼,而不是將代碼鍵入cli,因?yàn)檫@種方式更方便。首先,將下面的代碼保存到一個(gè)腳本文件中,例如chrome.js:
    1.

    Java.perform(function () {var Activity = Java.use("android.app.Activity");Activity.onResume.implementation = function () {console.log("[*] onResume() got called!");this.onResume();}; });

    上面的代碼將會(huì)覆蓋android.app.Activity類(lèi)的onResume函數(shù)。它會(huì)調(diào)用Java.use來(lái)接收這個(gè)類(lèi)的包裝對(duì)象,并訪問(wèn)其onResume函數(shù)的implementation屬性,以提供一個(gè)新的實(shí)現(xiàn)。在新的函數(shù)體中,它將通過(guò)this.onResume()調(diào)用原始的onResume實(shí)現(xiàn),所以應(yīng)用程序依然可以繼續(xù)正常運(yùn)行。

    通過(guò)命令行注入:

    frida -U -l chrome.js com.android.chrome

    一旦觸發(fā)了onResume——例如切換到另一個(gè)應(yīng)用程序并返回到模擬器中的Chrome——您將收到下列輸出:[*] onResume() got called!


    如上圖所示。

    個(gè)人誤區(qū)

    但是我使用python綁定進(jìn)行注入,直接沒(méi)用。。。搞不懂為什么

    #!/usr/bin/python import frida # put your javascript-code here jscode= """ console.log("[*] Starting script"); Java.perform(function() {var Activity = Java.use("android.app.Activity");Activity.onResume.implementation = function () {console.log("[*] onResume() got called!");this.onResume();}; }); """ # startup frida and attach to com.android.chrome process on a usb device process = frida.get_usb_device().attach("com.android.chrome") # create a script for frida of jsccode script = process.create_script(jscode) # and load the script script.load()



    這里呢,是我誤會(huì)了這行命令行的作用:

    frida -U -f com.android.xxxxx —no-pause

    它的作用也就是:—no-pause不會(huì)中斷應(yīng)用程序,并將生成的進(jìn)程的任務(wù)留給FRIDA,這會(huì)打開(kāi)一個(gè)shell,在里邊使用Javascript API向Frida寫(xiě)命令,至于用

    frida -U -l chrome.js com.android.chrome

    它僅僅只是注入js腳本,然后進(jìn)行阻塞,回傳log

    python綁定和它并沒(méi)有任何關(guān)系。python綁定的log回傳是在Python腳本里面的。

    使用命令的時(shí)候,建議使用如下這個(gè):

    frida -U -f com.android.chrome --no-pause

    如果不加--no-pause的話,那么需要手動(dòng)啟動(dòng)主線程函數(shù)

    輸入%resume來(lái)進(jìn)行線程的啟動(dòng)

    python綁定解決

    這里的話請(qǐng)教了夜影學(xué)長(zhǎng),然后他說(shuō)Python腳本注入的話,顯示log是在python里面顯示的

    顯示的東西是由frida里執(zhí)行的js發(fā)給py的,所以的話,py要自己負(fù)責(zé)阻塞,需要input阻塞,在最后加上sys.stdin.read(),最后也就變成這樣:

    #!/usr/bin/python import frida import sys # put your javascript-code here jscode= """ console.log("[*] Starting script"); Java.perform(function() {var Activity = Java.use("android.app.Activity");Activity.onResume.implementation = function () {console.log("[*] onResume() got called!");this.onResume();}; }); """ # startup frida and attach to com.android.chrome process on a usb device process = frida.get_usb_device().attach("com.android.chrome") # create a script for frida of jsccode script = process.create_script(jscode) # and load the script script.load() sys.stdin.read()

    總結(jié)

    以上是生活随笔為你收集整理的frida框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。