我也不知道我多久没更新博客了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使用技巧