frida hook調(diào)試安卓app環(huán)境安裝

1. 安裝frida-tools

  • 這里給出的是python的安裝指令: pip install frida-tools

2. 安裝adb

mac中adb的安裝推薦使用Homebrew指令安裝, 安裝Homebrew中遇到問題可以參考另一篇

  • 在終端中執(zhí)行指令: brew cask install android-platform-tools

windows中則推薦到http://adbshell.com/downloads下載ADB Kits,解壓后得到adb.exe、AdbWinApi.dll、AdbWinUsbApi.dll三個文件,然后將這三個文件拷貝到C:\Windows\System32\目錄下,保險起見,同時拷貝這三個文件到C盤中的Windows/System/目錄下 及Windows/SysWOW64/
如果不拷貝到System/目錄下有可能執(zhí)行adb時會出錯:"找不到AdbWinApi.dll文件" 如果不拷貝到Windows/SysWOW64/有可能執(zhí)行adb時會出錯"CreateProcess failure. error 2"
Windows安裝方法參考: windows安裝adb方法及問題解決

  • 然后測試是否安裝成功: adb devices, 出現(xiàn)以下形式內(nèi)容則說明安裝成功
List of devices attached
e312073d    device

3. 安裝frida-server

  • github/frida下載frida-server, 選擇自己所要操作的對應(yīng)版本的server就可以了, 安卓設(shè)備注意對應(yīng)自己設(shè)備的架構(gòu)(例如arm, arm64, x86等等, 安裝了xposed可以在xposed中看到自己設(shè)備對應(yīng)的架構(gòu))
  • 下載完成后將文件名改為frida-server(改成自己想要的名稱都可以, 不用解壓), 然后放到指定目錄下, 一般安卓手機放在/data/local/tmp/目錄下

4. 啟動frida-server

  • 首先連接安裝有frida的設(shè)備(需打開USB調(diào)試), 終端運行指令: adb root以root運行adb
  • 查看設(shè)備是否連接: adb devices
  • 進入adb shell: adb shell
  • 在adb shell中執(zhí)行frida-server運行指令: /data/local/tmp/frida-server &(后面加上&使其在后臺執(zhí)行, 目錄即為frida-server的存放目錄, 首次執(zhí)行前最好先修改frida-server文件的權(quán)限: chmod 755 /data/local/tmp/frida-server)
  • 運行完成后可通過exit;退出adb shell

5. 調(diào)試安卓app

frida hook調(diào)試app首先需要該app的源碼, 找到自己想要調(diào)試的函數(shù)的位置
一切準(zhǔn)備就緒后,就可以開始調(diào)試安卓程序了,參考以下步驟

  • 在運行有frida-server的設(shè)備上安裝需要調(diào)試的app
  • 運行app然后在終端里運行指令: adb shell dumpsys activity top即可查看該app的包名, 這里假設(shè)我們找到的是com.xxx.xxx
  • 然后使用python編寫hook腳本
# -*- coding:utf-8 -*-

import frida, sys

# frida -U --no-pause -f "com.xxx.xxx"


package_name = "com.xxx.xxx" # 該app的包名


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

# hook腳本
jscode = """
Java.perform(function () {
 console.log("start hook")
 var userLogin = Java.use("com.a.b.c"); //com.a.b.c中c是需要調(diào)試函數(shù)所在的類名, com.a.b是c類所在的包名
 send("userLogin: " + userLogin);
 userLogin.Encrypt.overload("java.lang.String", "java.lang.String").implementation = function(a1, a2){
     console.log(a1);
     var result = this.Encrypt(a1, a2);
     console.log(result);
     return result;
 }// Encrypt是我們想要hook的函數(shù),"java.lang.String"則為相應(yīng)位置的參數(shù)類型占位, a1,a2即為該函數(shù)的兩個參數(shù)
});
"""

device = frida.get_usb_device()
print("[*] 找到設(shè)備")
# pid = device.spawn([package_name])
# print(pid)
process = device.attach(package_name)
print("[*] 找到進程")
# device.resume(pid)
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Running CTF')
script.load()
sys.stdin.read()
process.detach()
  • 由于進程過多,可能導(dǎo)致上述代碼不能成功執(zhí)行hook功能,此時可通過在終端中執(zhí)行frida -U --no-pause -f "com.xxx.xxx"來打開app(需將設(shè)備中待調(diào)試的app退出), 然后再將hook腳本代碼貼到終端中即可實現(xiàn)hook功能
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容