前言
我也不知道我多久没更新博客了
官网: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有 arm 和 arm64
Android有 x86 、x86_64 、arm 、arm64
Linux有 86 和 86_64
Windows有 86 和 86_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 fridaimport sysPACKAGE = 'bin.mt.plus' if __name__ == '__main__' : jscode = open ('script.js' , 'r' ).read() process = frida.get_usb_device().attach(PACKAGE) print (process) script = process.create_script(jscode) print ('[*] Running CTF' ) script.load() 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 String .prototype.format = function ( ) { var values = arguments ; return this .replace(/\{(\d+)\}/g , function (match, index ) { if (values.length > index) { return values[index]; } else { return "" ; } }); }; Java.perform(function ( ) { var Resources = Java.use('android.content.res.Resources' ); Resources['getString' ].overload('int' ).implementation = function (id ) { console .log('\n----- [Resources.getString] -----' ); var str = this .getText(id); console .log('resId:{0} => string:{1}' .format(id,str)); return str } }); 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软件给打开,不然又要报错,我就不演示了,正常运行:
如果没东西输出,就检查代码,百分之99是你的问题
总结 总结就算了,就到这吧,饿死我了
下篇预定:frida使用技巧