我也不知道我多久沒更新博客了javascript
官網:frida.rejava
frida 是我用過最好用的hook框架沒有之一,最喜歡的就是不須要重啓手機,並且不會形成想xp框架那樣手機開機很慢,由於frida在你手機上只運行了一個服務python
屁話就少說點吧,進入正題linux
E-mail:zckuna@163.comandroid
一、這是官網給的快速開始教程,就像安裝一個python模塊同樣安裝就好,安裝就很少說了,這個無法本身解決不須要看下去了。ios
二、而後你還須要去Frida Github官方開源項目處下載最新的 frida-server,這個玩意兒是關鍵,用來鏈接手機的一個服務,點我下載,打開頁面有不少包,目前我看到的最新版本是12.6.5的版本git
你須要找到 frida-server-2.6.5--.xz,其中github
三、下載好了後用adb或者其餘方式弄到手機的 /data/local/tmp/ 目錄下,而後運行(別說你不解壓直接運行)shell
下載好了,也運行了後打開終端使用命令 frida-ps -U 獲取手機進程來測試是否正常,這一切的前提都是你運行了frida-server而且手機打開了開發者模式鏈接上了電腦,若是輸出了進程信息就說明成功了,若是提示說frida沒有鏈接(英文大概這麼說:not connected,大概就這樣,本身翻譯吧)那就說明你下載的架構與你的手機不相符,或者你沒有用數據線鏈接手機,再或者就是你沒有打開開發者模式等等,實在無法解決能夠百度、google,固然你也能夠把問題已郵件的方式發給我(小聲逼逼:我大概能幫你解決)。windows
frida命令行有不少工具能夠用,這些我都不會,由於我用不到。。。給大家個網站吧: www.frida.re,本身看文檔,雖然文檔不咋地
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軟件給打開,否則又要報錯,我就不演示了,正常運行:
若是沒東西輸出,就檢查代碼,百分之99是你的問題
總結就算了,就到這吧,餓死我了
下篇預約:frida使用技巧