首页
课程
问答
CTF
社区
招聘
看雪峰会
发现
企服
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
企服
专栏
CTF
排行榜
知识库
工具下载
看雪峰会
看雪20年
看雪商城
证书查询
专栏首页
安全鸟一起飞
文章详情
Frida官方手册 - 函数Hook
freakish
举报
2017-10-19 20:51
1747306
函数Hook
这一篇我们看下如何在目标进程中对程序中的函数进行调用监视、参数修改、以及函数的主动调用
准备环境
创建文件
hello.c
,内容如下:
使用如下命令进行编译:
启动程序,然后记下函数
f()
的地址(在这个例子中,值是
0x400544
):
函数Hook
下面这个脚本中,对目标进程的函数
f()
进行了Hook,并把拦截到的函数的参数汇报出来,创建文件
hook.py
包含如下内容:
使用上面记录下的函数地址
0x400544
启动脚本,命令如下:
正常情况,每隔1秒钟应该能看到一行输出,大致内容如下:
修改函数参数
这一次,我们还是利用上面的层序,但是这次我们是要修改函数调用的参数了,创建文件
modify.py
,大致内容如下:
使用如下命令执行这个脚本:
这次执行下来,在控制台里面可以看到控制台就一直输出
1337
,直到你按
Ctrl+D
停止程序运行,结果大致如下(
译者注:官方文档的这个显示结果有点蛋疼
):
函数调用
我们可以使用Frida在目标进程空间内进行函数调用,创建文件
call.py
,大致内容如下:
使用如下命令行执行:
注意观察输出结果,然后结合测试程序的逻辑,输出结果可以看出函数调用成功了:
第二个实验:注入字符串并且执行函数调用
利用Frida你可以在目标进程中注入整形、字符串、甚至是任何你需要的类型。为了实验需要,创建如下文件
hi.c
,内容如下:
和上面的实验相似,接着创建一个脚本文件
stringhook.py
,使用Frida把字符串注入内存,然后调用函数
f()
,大致内容如下:
注意观察程序
hi
的输出结果,应该能看到大致如下的输出结果:
使用类似的方法,比如
Memory.alloc()
和
Memory.protect()
很容就能操作目标进程的内存,可以创建Python的
ctypes
和其他内存结构比如
structs
,然后以字节数组的方式传递给目标函数。
注入指定格式的内存对象 - 例子:sockaddr_in结构
有过网络编程经验的人应该都熟悉这个最常见的C结构。下面给出一个示例程序,程序中创建了一个socket,然后通过5000端口连接上服务器,然后通过这条连接发送了一个字符串
“Hello there!”
,代码如下:
这基本上是一个比较标准的网络程序,使用第一个参数作为目标IP地址进行连接。打开一个命令,执行
nc -l 5000
这条命令,然后再打开另外一个命令行,执行如下命令:
./client 127.0.0.1
,这个时候你应该就能看到执行
nc
命令的那个窗口开始显示消息了,你也可以在
nc
窗口里面发送字符串到
client
程序去。
现在我们来玩点好玩的吧,根据前面的描述,我们可以往目标进程中注入字符串以及内存指针,我们也可以用同样的方式来操作
sockaddr_in
来达到我们的目的,现在我们来运行程序,看到如下输出:
如果你还不熟悉
sockaddr_in
这个结构,可以到网上去查找相关的资料,相关资料还是很多的。这里我们重点关注
0x1388
,也就是10进制的5000,这个就是我们的端口号,如果我们把这个数据改成
0x1389
,我们就能把客户端的连接
重定向
到另外一个端口去了,如果我们把接下来的4字节数据也修改的话,那就能把客户端
重定向
到另外一个IP去了!
下面我们来看这个脚本,这个脚本注入了一个指定格式的内存结构,然后劫持了libc.so中的
connect()
函数,在劫持的函数中用我们构造的结构体,替换
connect()
函数的第一个参数。创建文件
struct_mod.py
,内容如下:
这个脚本里同时还提到,我们可以使用
Module.findExportByName()
这个API来在目标进程中的指定模块中查找指定的导出函数,尤其是在比较大的可执行文件里面,但是在我们的这里例子中,这不是重点。
现在使用命令
./client 127.0.0.1
把程序执行起来,然后在另外一个命令行中执行
nc -l 5001
,在第三个命令行中执行
./struct_mod.py
,一旦我们的脚本执行起来,在
client
的那个命令行窗口里面和
nc
命令行窗口里面就能看到字符串消息了。
通过上面这个实验,我们成功的劫持了网络应用程序,并且通过Frida修改了程序的原始行为达到了我们不可告人的目的。
这个实验证明了Frida的真正强大之处,那就是:
无代码修改
不需要复杂的逆向
不需要花大量的时间去反汇编(
译者注:感觉跟第2点是同一个东西呢
)
这里再给出一个关于这篇文章内容的视频演示地址:
https://www.youtube.com/watch?v=cTcM7R872Ls
(得翻墙看)
收藏
分享
分享到微信
分享到QQ
分享到微博
声明:该文观点仅代表作者本人,转载请注明来自看雪专栏
最新评论
(
0
)
举报原因
×
广告灌水
涉黄涉暴
反动语言
其他
50
/50
登录后即可评论
安全鸟一起飞
创建者:
freakish
持续关注Windows安全、Andorid安全
215
关注数
31
文章数
关注
该专栏热门文章
1
Frida官方手册 - JavaScript API(篇二)
JavaScript API Int64 new Int64(v): 以v为参数,创建一个Int64对象,v可以是一个数值,也可以是一个字符串形式的数值表示,也可以使用 Int64(v) 这种简单的方式。 a...
2
Frida官方手册 - JavaScript API(篇一)
JavaScript API 目录 Global console rpc Frida Process Module ModuleMap Memory MemoryAccessMonitor Thread Int64 UInt64 NativePoint...
3
Frida官方手册 - 在iOS上使用Frida
在iOS上使用Frida 在iOS设备上,Frida支持两种使用模式,具体使用哪种模式要看你的iOS设备是否已经越狱。 使用场景 已越狱机器 未越狱机器 已越狱机器 在越狱的环境下,是用户权限最大的场景,在这样的环境下你可以很轻松的调用系统服务和基础组件...
4
Frida官方手册 - 函数Hook
函数Hook 这一篇我们看下如何在目标进程中对程序中的函数进行调用监视、参数修改、以及函数的主动调用 准备环境 创建文件 hello.c,内容如下: 使用如下命令进行编译: 启动程序,然后记下函数 f() 的地址(在这个例子中,值是0x400544):...
5
Frida官方手册 - 安装Frida
安装Frida 从零开始安装使用Frida大概只需要几分钟的时间就可以搞定。如果你安装的过程中发现什么问题,可以告诉我们(请参考原文链接https://www.frida.re/docs/installation),看看我们是否有比较好的解决方案。 安装环境...
6
[开源]Android逆向中So模块自动化修复工具+实战一发
前言 Android加固方案经过这么长时间的发展,从开始的整体dex加密压缩方案逐步开始往native层发展,市面上知名的几款商业级加固方案中很容易发现这种方案的身影。这样看来,在今后相当长的一段时间内,Android逆向中不可避免的会频繁接触到与So加固的...