Frida Hook 快速開(kāi)始

前言

我也不知道我多久沒(méi)更新博客了

官網(wǎng):frida.re

frida 是我用過(guò)最好用的hook框架沒(méi)有之一,最喜歡的就是不需要重啟手機(jī),而且不會(huì)造成想xp框架那樣手機(jī)開(kāi)機(jī)很慢,因?yàn)閒rida在你手機(jī)上只運(yùn)行了一個(gè)服務(wù)

屁話(huà)就少說(shuō)點(diǎn)吧,進(jìn)入正題

E-mail:zckuna@163.com

正文

一、安裝Frida

install.png

1、這是官網(wǎng)給的快速開(kāi)始教程,就像安裝一個(gè)python模塊一樣安裝就好,安裝就不多說(shuō)了,這個(gè)沒(méi)法自己解決不需要看下去了。

2、然后你還需要去Frida Github官方開(kāi)源項(xiàng)目處下載最新的 frida-server,這個(gè)玩意兒是關(guān)鍵,用來(lái)連接手機(jī)的一個(gè)服務(wù),點(diǎn)我下載,打開(kāi)頁(yè)面有很多包,目前我看到的最新版本是12.6.5的版本

frida-server-install.png

你需要找到 frida-server-2.6.5-<system>-<version>.xz,其中

  • system 是指你手機(jī)的系統(tǒng),比如Android、IOS,沒(méi)錯(cuò),frida支持ios,這個(gè)以后等我有ios手機(jī)再說(shuō)(逃;、linux、windows。

  • version 代表你手機(jī)處理器架構(gòu):

    • IOS有 armarm64

    • Android有 x86、x86_64、arm、arm64

    • Linux有 8686_64

    • Windows有 8686_64

3、下載好了后用adb或者其他方式弄到手機(jī)的 /data/local/tmp/ 目錄下,然后運(yùn)行(別說(shuō)你不解壓直接運(yùn)行)

二、運(yùn)行

下載好了,也運(yùn)行了后打開(kāi)終端使用命令 frida-ps -U 獲取手機(jī)進(jìn)程來(lái)測(cè)試是否正常,這一切的前提都是你運(yùn)行了frida-server并且手機(jī)打開(kāi)了開(kāi)發(fā)者模式連接上了電腦,如果輸出了進(jìn)程信息就說(shuō)明成功了,如果提示說(shuō)frida沒(méi)有連接(英文大概這么說(shuō):not connected,大概就這樣,自己翻譯吧)那就說(shuō)明你下載的架構(gòu)與你的手機(jī)不相符,或者你沒(méi)有用數(shù)據(jù)線(xiàn)連接手機(jī),再或者就是你沒(méi)有打開(kāi)開(kāi)發(fā)者模式等等,實(shí)在沒(méi)法解決可以百度、google,當(dāng)然你也可以把問(wèn)題已郵件的方式發(fā)給我(小聲逼逼:我大概能幫你解決)。

frida命令行有很多工具可以用,這些我都不會(huì),因?yàn)槲矣貌坏?。。。給你們個(gè)網(wǎng)站吧: www.frida.re,自己看文檔,雖然文檔不咋地

三、Example

bb了那么多賊雞兒聊,不弄點(diǎn)東西說(shuō)的那些跟放屁一樣,首先獻(xiàn)上官網(wǎng)的一個(gè)例子:我是例子,直接 Ctrl C-V 完事...

我這里用mt管理器來(lái)示范一下,我來(lái)告訴你們?yōu)槭裁匆胢t,因?yàn)閙t的混淆看得我特么要把bin拖出來(lái)打一頓,mt目前就我所知,用了代碼混淆、res混淆、字符串加密、id加密(這就是字符串加密),而且其中的字符串加密還特么用了好幾種方式,我***。既然你要加密字符串,那我就非要把你字符串hook出來(lái),雖然hook了也沒(méi)什么屌用,因?yàn)槟氵€是找不到是哪里加密的。

不管你怎么加密,你總得用到 Stirng、StringBuilder、getString 等這些方法,怎么干,直接hook,新建一個(gè)py腳本,如下是我的項(xiàng)目結(jié)構(gòu):

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

0 directories, 2 files
? Mt

輸入如下代碼(我有注釋來(lái)解釋每一句代碼的作用):

mt.py

import frida
import sys
?
?
PACKAGE = 'bin.mt.plus'
?
?
if __name__ == '__main__':
 jscode = open('script.js', 'r').read() # 獲取js腳本內(nèi)容
 # get_usb_device獲取設(shè)備(就是你手機(jī))
 # attach(翻譯:鏈接)我所理解是連接給定包名的app的進(jìn)程,為什么是我所理解,因?yàn)楣倬W(wǎng)沒(méi)有寫(xiě)
 process = frida.get_usb_device().attach(PACKAGE) # 獲取給定包名的app進(jìn)程
 print(process) # 打印看看是嘛玩意兒
 script = process.create_script(jscode) # 這里是把你的js腳本給塞進(jìn)了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

// 這個(gè)方法是為了輔助我輸出用的,和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 類(lèi)hook
Java.perform(function() {
 var Resources = Java.use('android.content.res.Resources'); // 獲取Resources類(lèi)
 // 因?yàn)間etString方法重載,有幾個(gè)我也沒(méi)數(shù),我只知道我需要用到的是接收一個(gè)id作為參數(shù)的方法
 //.overload填上你要hook的方法的參數(shù)類(lèi)型,如果不知道直接不寫(xiě),frida會(huì)報(bào)錯(cuò)提示你
 Resources['getString'].overload('int').implementation = function(id) { // id是接收到的參數(shù)
 console.log('\n----- [Resources.getString] -----');
 var str = this.getText(id); // 這里通過(guò)this調(diào)用了Resources類(lèi)中的getText方法
 console.log('resId:{0} => string:{1}'.format(id,str)); // 輸出
 return str // 返回
 }
});
?
?
// Toast 類(lèi)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) { // 三個(gè)參數(shù)
 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);
 }
});

運(yùn)行

?  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

報(bào)錯(cuò),沒(méi)找到設(shè)備,數(shù)據(jù)線(xiàn)連上電腦后把mt軟件給打開(kāi),不然又要報(bào)錯(cuò),我就不演示了,正常運(yùn)行:

run.jpg

如果沒(méi)東西輸出,就檢查代碼,百分之99是你的問(wèn)題

總結(jié)

總結(jié)就算了,就到這吧,餓死我了

下篇預(yù)定:frida使用技巧

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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