1.什么是Frida ?
它是一个将JavaScript注入到目标进程的工具,适用于Windows、macOS、Linux、iOS、Android和QNX。JavaScript采用的Google开源的JavaScript V8引擎。 通过JavaScript脚本可以注入到目标进程执行自定义代码。Hook任意函数、监控加密API或者跟踪应用程序代码。依赖于任何软件或硬件断点的代码追踪。有很多种方式来使用Frida。Python、Swift、.NET、Qt/Qml、C和Node.js。本文主要讨论Python和C方式使用Frida。
这里我们只尝试 [windows平台] [python调用] [HOOK安卓代码]
2.在Windows下安装Frida
首先你必须有python环境, 最好是python3环境
安装setuptools: 下载地址
在setuptools目录下:
1
setup.py install
安装pip.zip: 下载地址
在pip目录下:
1
setup.py install
或者进入python的/Scripts目录
1
easy_install.exe pip
验证pip
1
2> Python\Scripts\pip.exe --version
pip 9.0.1 from C:\Python27\lib\site-packages\pip-9.0.1-py2.7.egg (python 2.7)
使用pip安装Frida
安装
1
Python\Scripts\pip.exe install frida
测试
1
2
3
4
5
6
7> Python\Scripts\frida-ps.exe
PID Name
---- --------------------------
6788 EXCEL.EXE
2580 WXWork.exe
2588 WeChat.exe
......- 安装完成
3. 使用Frida的简单功能
得到Android设备当前最前端Activity所在的进程信息
- 使用python编写以下代码:
[] 1
2
3
4
5import frida
rdev = frida.get_remote_device()
front_app = rdev.get_frontmost_application()
print front_app
运行结果:
1
2> python.exe get_front_activity.py
Application(identifier="com.android.dialer", name="鎷ㄥ彿", pid=1203)
枚举Android设备的所有进程信息
使用python编写以下代码:
[] 1
2
3
4
5
6
7
8
9
10import frida
rdev = frida.get_remote_device()
session = rdev.attach("com.android.phone")
modules = session.enumerate_modules()
for module in modules:
print module
export_funcs = module.enumerate_exports()
print "\tfunc_name \tRVA"
for export_func in export_funcs:
print "\t%s\t%20s"%(export_func.name,hex(export_func.relative_address))
Hook Android设备某一进程的C库函数
使用python编写以下代码:
[] 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20import frida
import sys
rdev = frida.get_remote_device()
session = rdev.attach("com.android.phone")
scr = """
Interceptor.attach(Module.findExportByName("libc.so" , "open"), {
onEnter: function(args) {
send("open("+Memory.readCString(args[0])+","+args[1]+")");
},
onLeave:function(retval){
}
});
"""
script = session.create_script(scr)
def on_message(message ,data):
print message
script.on(message" , on_message)
script.load()
sys.stdin.read()把frida调试服务器传入手机运行
[] 1
2
3
4
5
6
7
8
9
10FRIDA_PATH = D:\笔记\Frida\frida-server-10.6.44-android-arm
FRIDA_SERVERNAME = frida86
fdbg:
#上传调试服务器
adb push $(FRIDA_PATH)\$(FRIDA_SERVERNAME) /data/local/tmp/$(FRIDA_SERVERNAME)
#修改权限
adb shell chmod 777 /data/local/tmp/$(FRIDA_SERVERNAME)
#执行调试服务器
adb shell /data/local/tmp/$(FRIDA_SERVERNAME)
转发端口
1
2adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043运行后结果:
1
2
3
4
5
6
7
8> python.exe hook_func.py
{u'type': u'send', u'payload': u'open(/proc/net/xt_qtaguid/iface_stat_fmt,0x0)'}
{u'type': u'send', u'payload': u'open(/proc/net/xt_qtaguid/iface_stat_fmt,0x0)'}
{u'type': u'send', u'payload': u'open(/proc/net/xt_qtaguid/iface_stat_fmt,0x0)'}
{u'type': u'send', u'payload': u'open(/proc/net/xt_qtaguid/iface_stat_fmt,0x0)'}
{u'type': u'send', u'payload': u'open(/proc/net/xt_qtaguid/iface_stat_fmt,0x0)'}
{u'type': u'send', u'payload': u'open(/proc/net/xt_qtaguid/iface_stat_fmt,0x0)'}
......
Hook Android设备某一进程的Java层函数
使用python编写以下代码:
#hook onCreate函数[] 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25import frida
import sys
jscode = """
Java.perform(function()
{
var Activity = Java.use('android.app.Activity');
var Toast = Java.use('android.widget.Toast');
var Bundle = Java.use('android.os.Bundle');
var PackageInfo = Java.use('android.content.pm.PackageInfo');
//得到context
var currentApplication = Java.use('android.app.ActivityThread').currentApplication();
var context = currentApplication.getApplicationContext();
Activity.onCreate.overload('android.os.Bundle').implementation = function (c) {
console.log('onCreate --> '+this);
this.onCreate(c);};
});
"""
script = session.create_script(scr)
def on_message(message ,data):
print message
script.on(message" , on_message)
script.load()
sys.stdin.read()
把frida调试服务器传入手机运行(参考上一条)
- 转发端口(参考上一条)
- 运行结果:
1
结果忘保存, hook代码的功能就是执行OnCreate时, 就会打印该类名