Frida - Hook 快速开始

前言

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

官网:frida.re

frida 是我用过最好用的hook框架没有之一,最喜欢的就是不需要重启手机,而且不会造成想xp框架那样手机开机很慢,因为frida在你手机上只运行了一个服务

屁话就少说点吧,进入正题

E-mail:zckuna@163.com

正文

一、安装Frida

1、这是官网给的快速开始教程,就像安装一个python模块一样安装就好,安装就不多说了,这个没法自己解决不需要看下去了。

2、然后你还需要去Frida Github官方开源项目处下载最新的 frida-server,这个玩意儿是关键,用来连接手机的一个服务,点我下载,打开页面有很多包,目前我看到的最新版本是12.6.5的版本

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

  • system 是指你手机的系统,比如Android、IOS,没错,frida支持ios,这个以后等我有ios手机再说(逃;、linux、windows。
  • version 代表你手机处理器架构:
    • IOS有 armarm64
    • Android有 x86x86_64armarm64
    • Linux有 8686_64
    • Windows有 8686_64

3、下载好了后用adb或者其他方式弄到手机的 /data/local/tmp/ 目录下,然后运行(别说你不解压直接运行)

二、运行

​ 下载好了,也运行了后打开终端使用命令 frida-ps -U 获取手机进程来测试是否正常,这一切的前提都是你运行了frida-server并且手机打开了开发者模式连接上了电脑,如果输出了进程信息就说明成功了,如果提示说frida没有连接(英文大概这么说:not connected,大概就这样,自己翻译吧)那就说明你下载的架构与你的手机不相符,或者你没有用数据线连接手机,再或者就是你没有打开开发者模式等等,实在没法解决可以百度、google,当然你也可以把问题已邮件的方式发给我(小声逼逼:我大概能帮你解决)。

​ frida命令行有很多工具可以用,这些我都不会,因为我用不到。。。给你们个网站吧: www.frida.re,自己看文档,虽然文档不咋地

三、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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// 这个方法是为了辅助我输出用的,和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);
}
});

运行

1
2
3
4
5
6
7
8
9
10
➜  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使用技巧