【安卓逆向】Frida入門與常用備忘-創(chuàng)新互聯(lián)

【安卓逆向】Frida入門與常用備忘
      • 前置知識
        • 什么是hook?
        • hook的作用
        • 常見的逆向工具
      • Frida使用入門
        • 簡介與資料參考備忘
        • 前置環(huán)境配置
        • 執(zhí)行hook
        • 常用hook腳本/API

成都創(chuàng)新互聯(lián)公司主營阜城網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,App定制開發(fā),阜城h5微信小程序搭建,阜城網(wǎng)站營銷推廣歡迎阜城等地區(qū)企業(yè)咨詢前置知識 什么是hook?

hook,譯為“鉤子”,是指將方法/函數(shù)勾住,勾住后我們可以做一些我們想做的事情。實際上我們可以通過一些工具,可以把我們java、native層面的方法/函數(shù)調(diào)用給“勾住了”,或者直接理解為監(jiān)聽,我們可以監(jiān)聽到調(diào)用方法,方法的傳參,以及修改方法的返回值等等

hook的作用

了解這些工具,可以幫助我們更好的去定位問題、進行debug,甚至可以對一些app進行破解修改

常見的逆向工具
工具/方法作用java層native層SDK集成是否需要root備注其他
JADX反編譯查看源碼支持不支持加固的apk需要先脫殼
apktool反編譯/回編 APK修改smail碼
epic/sandhookapp集成SDK進行代碼hook支持支持需要不需要xposed框架,不同的系統(tǒng)API不一致需要適配
xposed插件在集成了xposed框架的安卓環(huán)境上進行hook支持不支持不需要需要需要root,其他同上
frida在root的安卓環(huán)境下,對java/native 直接進行二進制hook支持支持需要需要需要root環(huán)境,python環(huán)境
Frida使用入門 簡介與資料參考備忘

frida是一款二進制hook框架,支持java/native層hook,需要root環(huán)境,因為是二進制內(nèi)存hook,可以實現(xiàn)直接hook當前進程,無需集成SDK甚至不需要重啟進程

  • Frida官網(wǎng)
  • github地址
  • Frida安裝教程
  • js腳本API文檔
前置環(huán)境配置
  • 安裝python3及pip環(huán)境
  • 使用pip安裝frida庫與工具
// 安裝特定版本 pip install frida==版本號
 pip install frida
 pip install frida-tools
 // 網(wǎng)絡不好使用鏡像庫
 pip install firda -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
 // 查看當前frida版本
 frida --version
  • 若使用模擬器,則進行端口轉(zhuǎn)發(fā)(默認端口)
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
  • 根據(jù)當前設備/模擬器架構(gòu),官網(wǎng)下載 對應的frida-server,push到于設備/模擬器上的目錄并授予可執(zhí)行權(quán)限
# 這里放于 /data/local/tmp
  adb push E:\frida-server /data/local/tmp/frida-server
  # 進入adb shell
  adb shell
  # 以管理員權(quán)限訪問
  su
  # 進入frida-server目錄
  cd /data/local/tmp
  # 提供權(quán)限
  chmod 777 frida-server
  # 運行frida-server
  ./frida-server
  • 運行frida-server后保持窗口 此時服務開啟,開啟新的窗口檢測是否成功
# 命令成功輸出進程列表
frida-ps -U

# 根據(jù)包名連接目標進程
frida -U -f com.xxx.xxx

在這里插入圖片描述

執(zhí)行hook
  • python腳本執(zhí)行hook,樣板代碼如下
import frida, sys

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

jscode = """
Java.perform(() =>{
  // Function to hook is defined here
  const MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity');

  // Whenever button is clicked
  const onClick = MainActivity.onClick;
  onClick.implementation = function (v) {
    // Show a message to know that the function got called
    send('onClick');

    // Call the original onClick handler
    onClick.call(this, v);

    // Set our values after running the original onClick handler
    this.m.value = 0;
    this.n.value = 1;
    this.cnt.value = 999;

    // Log to the console that it's done, and we should have the flag!
    console.log('Done:' + JSON.stringify(this.cnt));
  };
});
"""

#  pid or package name
process = frida.get_usb_device().attach(13347) 
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Running CTF')
script.load()
sys.stdin.read())
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Running CTF')
script.load()
sys.stdin.read()
  • 直接注入js腳本
frida -U [pid|packagename] -l test.js
常用hook腳本/API
  • 測試代碼類
public class TestStaticClass {public static int count = 0;
    private static String TAG = "TestStaticClass";

    public static String getCountString(){Log.i(TAG, "call testMethod");
        return "count:" + count;
    }

    public static void addCount(){count++;
    }

    public static String getCountString(int input){return "getCountString:" + input;
    }

    public static String getCountString(int[] input){return "getCountString:" + Arrays.toString(input);
    }

    public void testStack(){Log.i(TAG, "call testStack");
    }

}
  • 獲取java類并構(gòu)建新對象
方法含義其他
$new新建對象
$init構(gòu)造函數(shù)
const JavaString = Java.use('java.lang.String');
var exampleString1 = JavaString.$new('Hello World, this is an example string in Java.');
  • 獲取類與靜態(tài)函數(shù)方法調(diào)用

    Java.perform(() =>{const TestStaticClass = Java.use("com.hjl.nativetest.TestStaticClass");
     TestStaticClass.count.value = 1; //訪問靜態(tài)變量
     TestStaticClass.addCount();   //hook靜態(tài)函數(shù)直接調(diào)用
    });
  • hook方法打印方法值并修改返回值

    Java.perform(() =>{// 獲取類
     const TestStaticClass = Java.use("com.hjl.nativetest.TestStaticClass");
     // 獲取方法
     const getCountString = TestStaticClass.getCountString;  
     // hook方法
     getCountString.implementation = function () {// 當方法調(diào)用時 
      send('call getCountString');
    
      // 調(diào)用原方法獲取結(jié)果
      var result = getCountString.call(this);
    
      console.log("getCountString:" + result);
      // 返回自定義的結(jié)果 
      return "hook return String";
    };
    
    // 獲取重載方法
    // 基礎(chǔ)類型直接填,數(shù)組以類似JNI的簽名形式如[I ,類型填完整類
    const getCountString2 = TestStaticClass.getCountString.overload('int')
    getCountString2.implementation = function (data) {// 打印原始輸入?yún)?shù)
      send('call getCountString:' + data);
    
      // 調(diào)用原方法獲取結(jié)果
      var result = getCountString2.call(this,data);
      console.log("getCountString:" + result);
      // 返回自定義的結(jié)果
      return "hook return String";
    };
    });
  • 獲取調(diào)用棧

    Java.perform(() =>{const TestStaticClass = Java.use("com.hjl.nativetest.TestStaticClass");
    const Exception = Java.use('java.lang.Exception');
    const Log = Java.use('android.util.Log');
    
    const testStack = TestStaticClass.testStack
    testStack.implementation = function () {console.log(stackTraceHere());
    };
    
    function stackTraceHere() {return Log.getStackTraceString(Exception.$new());
    }
    });

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

分享標題:【安卓逆向】Frida入門與常用備忘-創(chuàng)新互聯(lián)
路徑分享:http://muchs.cn/article44/cddoee.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設計、標簽優(yōu)化外貿(mào)建站、做網(wǎng)站、響應式網(wǎng)站、App設計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設計