Frida - Hook 快速開始

前言

我也不知道我多久沒更新博客了javascript

官網:frida.rejava

frida 是我用過最好用的hook框架沒有之一,最喜歡的就是不須要重啓手機,並且不會形成想xp框架那樣手機開機很慢,由於frida在你手機上只運行了一個服務python

屁話就少說點吧,進入正題linux

E-mail:zckuna@163.comandroid

正文

1、安裝Frida

一、這是官網給的快速開始教程,就像安裝一個python模塊同樣安裝就好,安裝就很少說了,這個無法本身解決不須要看下去了。ios

二、而後你還須要去Frida Github官方開源項目處下載最新的 frida-server,這個玩意兒是關鍵,用來鏈接手機的一個服務,點我下載,打開頁面有不少包,目前我看到的最新版本是12.6.5的版本git

你須要找到 frida-server-2.6.5--.xz,其中github

  • system 是指你手機的系統,好比Android、IOS,沒錯,frida支持ios,這個之後等我有ios手機再說(逃;、linux、windows。
  • version 表明你手機處理器架構:
    • IOS有 armarm64
    • Android有 x86x86_64armarm64
    • Linux有 8686_64
    • Windows有 8686_64

三、下載好了後用adb或者其餘方式弄到手機的 /data/local/tmp/ 目錄下,而後運行(別說你不解壓直接運行)shell

2、運行

​ 下載好了,也運行了後打開終端使用命令 frida-ps -U 獲取手機進程來測試是否正常,這一切的前提都是你運行了frida-server而且手機打開了開發者模式鏈接上了電腦,若是輸出了進程信息就說明成功了,若是提示說frida沒有鏈接(英文大概這麼說:not connected,大概就這樣,本身翻譯吧)那就說明你下載的架構與你的手機不相符,或者你沒有用數據線鏈接手機,再或者就是你沒有打開開發者模式等等,實在無法解決能夠百度、google,固然你也能夠把問題已郵件的方式發給我(小聲逼逼:我大概能幫你解決)。windows

​ frida命令行有不少工具能夠用,這些我都不會,由於我用不到。。。給大家個網站吧: www.frida.re,本身看文檔,雖然文檔不咋地

3、Example

​ bb了那麼多賊雞兒聊,不弄點東西說的那些跟放屁同樣,首先獻上官網的一個例子:我是例子,直接 Ctrl C-V 完事...

​ 我這裏用mt管理器來示範一下,我來告訴大家爲何要用mt,由於mt的混淆看得我特麼要把bin拖出來打一頓,mt目前就我所知,用了代碼混淆、res混淆、字符串加密、id加密(這就是字符串加密),並且其中的字符串加密還特麼用了好幾種方式,我***。既然你要加密字符串,那我就非要把你字符串hook出來,雖然hook了也沒什麼屌用,由於你仍是找不到是哪裏加密的。

​ 無論你怎麼加密,你總得用到 Stirng、StringBuilder、getString 等這些方法,怎麼幹,直接hook,新建一個py腳本,以下是個人項目結構:

➜ Mt tree . ├── mt.py # py腳本 └── script.js # js 腳本

0 directories, 2 files ➜ Mt

輸入以下代碼(我有註釋來解釋每一句代碼的做用):

mt.py

import frida
import sys


PACKAGE = 'bin.mt.plus'


if __name__ == '__main__':
    jscode = open('script.js', 'r').read() # 獲取js腳本內容
    # get_usb_device獲取設備(就是你手機)
    # attach(翻譯:連接)我所理解是鏈接給定包名的app的進程,爲何是我所理解,由於官網沒有寫
    process = frida.get_usb_device().attach(PACKAGE) # 獲取給定包名的app進程
    print(process) # 打印看看是嘛玩意兒
    script = process.create_script(jscode) # 這裏是把你的js腳本給塞進了process,源碼在這https://github.com/frida/frida-python/blob/master/frida/core.py#L147
    # script.on('message', on_message)
    print('[*] Running CTF')
    script.load() # 加載腳本,https://github.com/frida/frida-python/blob/master/frida/core.py#L191
    sys.stdin.read()
複製代碼

script.js

// 這個方法是爲了輔助我輸出用的,和python的字符串.format差很少的用法
String.prototype.format = function () {
    var values = arguments;
    return this.replace(/\{(\d+)\}/g, function (match, index) {
        if (values.length > index) {
            return values[index];
        } else {
            return "";
        }
    });
};


// Resources 類hook
Java.perform(function() {
    var Resources = Java.use('android.content.res.Resources'); // 獲取Resources類
    // 由於getString方法重載,有幾個我也沒數,我只知道我須要用到的是接收一個id做爲參數的方法
    //.overload填上你要hook的方法的參數類型,若是不知道直接不寫,frida會報錯提示你
    Resources['getString'].overload('int').implementation = function(id) { // id是接收到的參數
        console.log('\n----- [Resources.getString] -----');
        var str = this.getText(id); // 這裏經過this調用了Resources類中的getText方法
        console.log('resId:{0} => string:{1}'.format(id,str)); // 輸出
        return str // 返回
    }
});


// Toast 類hook,和上面同樣
Java.perform(function() {
    var Toast = Java.use('android.widget.Toast');
    Toast['makeText'].overload('android.content.Context', 'java.lang.CharSequence', 'int').implementation = function(context, text, duration) { // 三個參數
        console.log('\n----- [Toast.makeText] -----');
        console.log('[Context]');
        console.log('\n\tContext:', context);
        console.log('\n\tClass:', context.getClass());
        var clazz = String(context.getClass()).split('.');
        console.log('\n\t\tClass Package:', clazz[0]);
        console.log('\n\t\tClass Name:', clazz[1]);
        console.log('Text:', text);
        console.log('Duration:', duration);
        return this.makeText(context, null, text, duration);
    }
});

複製代碼

運行

➜  Mt python3 mt.py
Traceback (most recent call last):
  File "mt.py", line 10, in <module>
    process = frida.get_usb_device().attach(PACKAGE)
  File "/usr/local/lib/python3.7/site-packages/frida/__init__.py", line 83, in get_usb_device
    return get_device_matching(lambda device: device.type == 'usb', timeout)
  File "/usr/local/lib/python3.7/site-packages/frida/__init__.py", line 113, in get_device_matching
    raise InvalidArgumentError("device not found")
frida.InvalidArgumentError: device not found
➜  Mt
複製代碼

報錯,沒找到設備,數據線連上電腦後把mt軟件給打開,否則又要報錯,我就不演示了,正常運行:

run

若是沒東西輸出,就檢查代碼,百分之99是你的問題

總結

總結就算了,就到這吧,餓死我了

下篇預約:frida使用技巧

相關文章
相關標籤/搜索