Android hook神器frida(一)
运行环境
● Python – latest 3.x is highly recommended
● Windows, macOS, or Linux
安装方法
使用命令 sudo pip install frida
或从https://build.frida.re/frida/下载
以cat命令为例,检查frida是否正确安装:
$ cp /bin/cat /tmp/cat
$ /tmp/cat
打开一个新的终端,创建example.py ,写入如下代码:
import frida
session = frida.attach("cat")
print([x.name for x in session.enumerate_modules()])
在linux系统下,还需执行如下命令确保开启调试非子进程:
$ sudo sysctl kernel.yama.ptrace_scope=
然后运行examp.py,应该得到类似如下结果:

基本使用方法
源码:frida/core.py 和frida/tracer.py
1.枚举模块
如果我们执行print(session.enumerate_modules())
就会得到类似如下的结果:
[Module(name="cat", base_address=0x400000, size=20480, path="/bin/cat"), ...]
其中base_address是模块的基地址
2.枚举内存范围
枚举当前目标进程映射的所有内存范围:enumerate_ranges(mask)
执行print s.enumerate_ranges('rw-'),会得到类似如下的结果:
[Range(base_address=0x2d4160a06000, size=1019904, protection='rwx'), ...]
base_address是这个范围的基址。
3.读写内存
read_bytes(address, n):从目标进程地址address中读取n字节数据。
write_bytes(address, data):将data以字节形式写入到address中。

操作模式
(1)注入模式
主要在root或者越狱的手机上使用
(2)嵌入模式
非root非越狱机上使用。通过嵌入一个叫frida-gadget的共享库到目标app中
(3)预加载模式
不涉及到任何TCP或者对外的通信,同意需要用到共享库frida-gadget。需要设置环境变量FRIDA_GADGET_SCRIPT用于指向一个js文件。
如linux环境下,可以创建一个包含以下内容的hook.js文件:
'use strict';
rpc.exports = {
init: function () {
Interceptor.attach(Module.findExportByName(null, 'open'), {
onEnter: function (args) {
var path = Memory.readUtf8String(args[0]);
console.log('open("' + path + '")');
}
});
}
};
最新的frida-gadget地址:https://github.com/frida/frida/releases/tag/10.2.1
然后设置两个环境变量
LD_PRELOAD=/path/to/frida-gadget.so
FRIDA_GADGET_SCRIPT=/path/to/hook.js
然后启动目标进程。
同样可以使用FRIDA_GADGET_ENV=development来开发自己的逻辑,以便于frida-gadget 监控文件更改,一旦发现文件更改后自动重新加载。
函数操作
首先我们来创建一个实验代码hello.c
#include <stdio.h>
#include <unistd.h> void
f (int n)
{
printf ("Number: %d\n", n);
} int
main (int argc,
char * argv[])
{
int i = ; printf ("f() is at %p\n", f); while ()
{
f (i++);
sleep ();
}
}
执行命令gcc -Wall hello.c -o hello进行编译,然后运行,记录f()函数的地址0x40057d

(1)hook函数
编写hook代码hook.py用于hook函数调用,返回函数参数,具体代码如下:
from __future__ import print_function
import frida
import sys session = frida.attach("hello")
script = session.create_script("""
Interceptor.attach(ptr("%s"), {
onEnter: function(args) {
send(args[0].toInt32());
}
});
""" % int(sys.argv[1], 16))
def on_message(message, data):
print(message)
script.on('message', on_message)
script.load()
sys.stdin.read()
执行 python hook.py 0x40057d
得到如下结果:

(2)修改函数参数
创建modify.py,代码如下:
import frida
import sys session = frida.attach("hello")
script = session.create_script("""
Interceptor.attach(ptr("%s"), {
onEnter: function(args) {
args[0] = ptr("1337");
}
});
""" % int(sys.argv[1], 16))
script.load()
sys.stdin.read()
执行python modify.py 0x400544后会发现输出的值变了

(3)函数调用
创建call.py
import frida
import sys session = frida.attach("hello")
script = session.create_script("""
var f = new NativeFunction(ptr("%s"), 'void', ['int']);
f(1911);
f(1911);
f(1911);
""" % int(sys.argv[1], 16))
script.load()
运行得到如下结果:

(4)注入字符串并调用函数
创建hello.c
#include <stdio.h>
#include <unistd.h> int
f (const char * s)
{
printf ("String: %s\n", s);
return ;
} int
main (int argc,
char * argv[])
{
const char * s = "Testing!"; printf ("f() is at %p\n", f);
printf ("s is at %p\n", s); while ()
{
f (s);
sleep ();
}
}
创建脚本stringhook.py,使用frida注入一段字符串到内存中,然后调用f()函数:
from __future__ import print_function
import frida
import sys session = frida.attach("hi")
script = session.create_script("""
var st = Memory.allocUtf8String(" I love you!");
var f = new NativeFunction(ptr("%s"), 'int', ['pointer']);
// In NativeFunction param 2 is the return value type,
// and param 3 is an array of input types
f(st);
""" % int(sys.argv[1], 16))
def on_message(message, data):
print(message)
script.on('message', on_message)
script.load()
运行python stringhook.py 0x40057d,得到如下结果:

Android hook神器frida(一)的更多相关文章
- Android hook神器frida(二)
1.关于使用frida遇到的一些问题 (1)如果出现以下错误: 可以通过以下方式关闭SELinux,在adb shell中执行: > /sys/fs/selinux/enforce 或者 set ...
- Android 安全研究 hook 神器frida学习(一)
在进行安卓安全研究时,hook技术是不可或缺的,常用的有Xposed:Java层的HOOK框架,由于要修改Zgote进程,需要Root,体验过Xposed,整个过程还是很繁琐的,并且无法hook,na ...
- Android Hook神器:XPosed入门与登陆劫持演示
前段时间写了一篇关于Cydia Substrate广告注入的文章,大家都直呼过瘾.但是,真正了解这一方面的同学应该知道,其实还有一个比Cydia Substrate更出名的工具:XPosed. 不是因 ...
- Android逆向之旅---Native层的Hook神器Cydia Substrate使用详解
一.前言 在之前已经介绍过了Android中一款hook神器Xposed,那个框架使用非常简单,方法也就那几个,其实最主要的是我们如何找到一个想要hook的应用的那个突破点.需要逆向分析app即可.不 ...
- Android Hook技术
原文:http://blog.csdn.net/u011068702/article/details/53208825 附:Android Hook 全面入侵监听器 第一步.先爆项目demo照片,代码 ...
- android hook getdeceiveid
很多手机软件使用了手机绑定.QQ,微信等.如果使用了不同的设备,则需要验证码. 要用一台手机来模拟与另一台手机一样环境,估计hook 系统的相关函数可以实现. 想着应该有现成的软件的,例如 smart ...
- android hook 框架 ADBI 如何实现dalvik函数挂钩
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
- android hook 框架 libinject 如何实现so注入
前面两篇 android hook 框架 libinject2 简介.编译.运行 android hook 框架 libinject2 如何实现so注入 实际运行并分析了 Android中的so注入( ...
- android hook 框架 libinject2 如何实现so注入
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
随机推荐
- Jedis-returnResource使用注意事项
遇到过这样一个严重问题: 发布的项目不知从什么时候开始,每月会出现一两次串号问题.串号现象指的是,用户用账号A登录系统,然后某个时间,登录账号自动变成了B. 串号出现的时间不定,测试平台难以重现,且后 ...
- JMeter-Eclipse添加自定义函数 MD5加密 32位和16位
最近公司的接口都是MD5 16位加密,所以要使用加密功能. 之前也做过加密,因为用的比较少,所以是写了一个加密方法,导出JAR包,调用的.用起来需要很多设置,并且换算效率也不高.听前同事说,jmet ...
- React学习小结(二)
一.组件的嵌套 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- C语言之变量和数据类型
常量:程序在运行过程中无法对值进行更改. 变量:是在计算机内存空间一种表示,声明变量将会向计算机内存申请存储空间,用于保存数据,计算机的CPU会从内存中加载数据. 声明变量: 数据类型 变量名[=值 ...
- socket.io搭配pm2(cluster)集群解决方案
socket.io与cluster 在线上系统中,需要使用node的多进程模型,我们可以自己实现简易的基于cluster模式的socket分发模型,也可以使用比较稳定的pm2这样进程管理工具.在常规的 ...
- Jenkins修改管理员密码
前言:Jenkins修改管理员密码,我看了网上所有的教程,竟然全都是拿着一串已经加密好的111111的密文去替代config.xml文件里面的密码,然后大家的密码都是111111!我觉得这种做法实在太 ...
- nodeJS实现简单网页爬虫功能
前面的话 本文将使用nodeJS实现一个简单的网页爬虫功能 网页源码 使用http.get()方法获取网页源码,以hao123网站的头条页面为例 http://tuijian.hao123.com/h ...
- 每天一个JS 小demo之韩雪冬轮播图。主要知识点:html,css布局,对于数组和对象的理解和运用
@charset "utf-8"; /* CSS Document */ ;; } li { list-style: none; } img { border: none; } b ...
- NLTK学习笔记(三):NLTK的一些工具
主要总结一下简单的工具:条件频率分布.正则表达式.词干提取器和归并器. 条件分布频率 <自然语言学习>很多地方都用到了条件分布频率,nltk提供了两种常用的接口:FreqDist 和 Co ...
- CoolBlog开发笔记第3课:创建Django应用
教程目录 1.1 CoolBlog开发笔记第1课:项目分析 1.2 CoolBlog开发笔记第2课:搭建开发环境 前言 经过上一节我们已经创建了CoolBlog工程,但是关于CoolBlog的功能代码 ...