前言
我也不知道我多久沒(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

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-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有 arm 和 arm64
Android有 x86、x86_64、arm、arm64
Linux有 86 和 86_64
Windows有 86 和 86_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)行:

如果沒(méi)東西輸出,就檢查代碼,百分之99是你的問(wèn)題
總結(jié)
總結(jié)就算了,就到這吧,餓死我了
下篇預(yù)定:frida使用技巧