百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

使用Frida实现Hook,修改接口调用

myzbx 2025-09-03 05:28 7 浏览

背景

我们经常想要监控接口调用或者修改接口的行为以及返回值,通过监控系统接口的调用我们可以了解目标程序的行为,通过修改接口的实现或修改接口的返回值我们可以控制程序的逻辑,比如我们可以通过此方式绕过程序对于授权的检查行为,当然我们也可以通过调试器实现这些功能,但是通过调试器一旦使用 Virbox Protector 进行加壳保护,使其具有反调试的功能我们将无法通过调试器实现这一目的。

这时我们可以通过对目标接口进行Hook,这样我们就能够实现上述的功能了,本篇文章我们将要进行介绍的是使用Frida实现这一功能。

步骤

环境准备

要想使用 Frida 我们首先当然是需要安装 Frida 了,Frida 基于Python,我们首先需要安装Python3,安装Python3后我们就可以使用命令行安装Frida了

pip install frida frida-tools

当然,我们如果想要实现远程 Hook,比如Hook Android上的应用我们也可以安装 frida-server

安装完成后我们可以使用下面的命令来验证一下 frida 是否安装成功

frida --version

Hook Windows 接口 MessageBox

编写示例程序

我们首先需要编写一个示例程序,用于一会在进行监测使用,我们这里使用C++语言简单实现一个示例程序

#include <iostream>
#include <Windows.h>

int main()
{
    printf("MessageBoxW address: 0x%p\n", MessageBox);
    fflush(stdout);

    MessageBox(NULL, L"Step.1", L"Debug", MB_OK);
    MessageBox(NULL, L"Step.2", L"Debug", MB_OK);
    MessageBox(NULL, L"Step.3", L"Debug", MB_OK);
    MessageBox(NULL, L"Step.4", L"Debug", MB_OK);
    MessageBox(NULL, L"Step.5", L"Debug", MB_OK);
    MessageBox(NULL, L"Step.6", L"Debug", MB_OK);

    std::cout << "Hello World!\n";
}

现在这个程序就已经足够我们使用了,为了方便我们这里直接打印了MessageBox接口的地址,当然我们也可以直接在Frida脚本中获取接口的地址

这个程序首先会打印 MessageBox 的接口地址,然后会依次弹出窗口,我们要做的就是监视接口的调用

Frida 脚本准备

这里我们直接使用 Python 进行编写,当然也可以直接使用 JS 进行编写。脚本如下

import frida
import sys

# 如果需要进行远程调试,可以使用如下的方式进行编写
# device = frida.get_device_manager().add_remote_device("127.0.0.1")
# session = device.attach('test_sdk')

session = frida.attach('hookTest.exe')

script = session.create_script("""
                               
Interceptor.attach(ptr(%s), {
    onEnter(args) {
        // 参数说明:
        // args[0] - hWnd (窗口句柄)
        // args[1] - lpText (消息内容)
        // args[2] - lpCaption (标题)
        // args[3] - uType (按钮/图标类型)
        
        const hWnd = args[0];
        const text = args[1].isNull() ? null : args[1].readUtf16String();
        const caption = args[2].isNull() ? null : args[2].readUtf16String();
        const type = args[3].toInt32();
        
        console.log(`[+] MessageBoxW called:`);
        console.log(`    hWnd: ${hWnd}`);
        console.log(`    Text: ${text}`);
        console.log(`    Caption: ${caption}`);
        console.log(`    Type: 0x${type.toString(16)}`);
        
        // 可以在这里修改参数
        // args[1] = Memory.allocAnsiString("Frida Hook");
    },
    onLeave: function (retval) {
        // 返回值是用户点击的按钮ID
        console.log(`[-] write returned: ${retval.toInt32()}`);
    }
});
""" % int(sys.argv[1], 16))

def on_message(message, data):
    print(message)

script.on('message', on_message)
script.load()
sys.stdin.read()

好了,现在我们有了python脚本我们就可以把它保存为 .py 文件了,比如我将其保存为 frida_test.py

Hook 测试

首先我们运行我们的目标程序,目标程序运行起来了以后会打印接口地址,我们使用如下的命令行运行我们的frida脚本

python frida_test.py 0x00007FFDD3FA8900

注意,命令行中的地址需要改为你自己的

现在我们点击目标程序的弹窗按钮就可以看到实际上已经监测到了接口的调用了,包括参数也一同打印了出来,当然我们还可以修改接口的返回值,参数,等等,这里我就不再赘述了

防范

俗话说能破就能立,我们知道了如何使用frida进行hook接口,为了防止有人使用该功能hook我们的程序,对我们造成损失,我们应该怎么办呢?

在即将发版的 Virbox Protector 中将发布Hook检测功能,我们可以调用SDK对接口进行检测,如果有人对我们的接口进行了Hook,我们的SDK接口就会返回非0值,我们就可以根据返回值做出相关动作,是退出程序还是提示用户或者上报信息都随你意啦,总而言之,软件安全不容小觑啊

相关推荐

重庆机场T3B航站楼正式启用!乘机全流程,看这篇就够了→

4月9日重庆江北国际机场T3B航站楼正式投用T3B全景图。怎样办理值机?哪些旅客需要在T3B登机?如何到达T3B?小布丁为你梳理乘机全流程快来看↓↓↓在哪儿值机?依然在T3A航站楼L4层和B1层可以值...

为什么猫咪会对着空气踩奶?_猫咪对着空气乱叫

你见过你家猫咪前爪有节奏的揉踏吗?按摩揉捏,一开一合。这个动作俗称”踩奶“...图自:猫研所@疯车车摆拍那你又是否见过,你家猫咪对着空气一顿“猛踩”?TA们可能眼神迷离,但动作却无比专注...图自:油...

Blender 入门教程(三):骨骼绑定_blender骨架绑定

一、前言不知道大家有没有玩过一些单机游戏的Mod,比如《侠盗猎车》里主角变成奥特曼,各种新能源汽车乱入等等。这些都是别人对原有模型就行修改换皮,并重新绑定骨骼完成的,所以如果会了骨骼绑定后,你也就可...

新手做公众号,20个常见问题汇总_做公众号的问题

新手运营公众号常遇诸多困惑,从账号注册、流量获取到内容创作、变现等方面均有挑战,明确平台规则、聚焦内容价值、持续优化运营策略,是突破困境的关键。你好,我是成哥,专注公众号运营和AI写作,希望每一次的分...

Vue 3 运行机制_vue程序运行过程

当你写下<div>{{msg}}</div>,浏览器最终看到的却是一连串精确到像素的绘制指令。Vue3在这条链路里扮演了「翻译官+调度者」的双重角色:把声明式模板...

如何给网站添加 https_如何给网站添加图片

一、简介相信大家都知道https是更加安全的,特别是一些网站,有https的网站更能够让用户信任访问接下来以我的个人网站五岁小孩为例子,带大家一起从0到1配置网站https本次配置的...

前端高效开发必备的 JS 库梳理_前端函数库

来源:前端大全之前有很多人问学好前端需要学习哪些js库,主流框架应该学vue还是react?针对这些问题,笔者来说说自己的看法和学习总结.首先我觉得在学习任何知识之前必须要有一个明...

微信小程序双向数据绑定,父子传参

双向数据绑定微信小程序本身并不直接支持像Vue或Angular这样的框架中的双向数据绑定。但是可以通过一些技巧来模拟实现双向数据绑定的效果。使用input组件的bindinput事件:当输入框...

Linux下C++程序符号延迟绑定_linux c 延时

动态库使用方式分为:隐式链接(隐式加载),编译时通过编译选项指定动态库显式链接(显式加载),通过代码调用dlopen、dlsym、dlclose指定动态库动态库的符号解析分为:立即绑定延迟绑定使用方法...

50 道高频 JavaScript 面试题,从基础到进阶 (附答案)

在前端面试中,JavaScript一直是重中之重。它不仅是一门脚本语言,更是现代Web开发的核心技术。无论是页面交互、异步处理,还是框架与库的运行机制,几乎都离不开对JavaScript的深...

前端必学——函数式编程(一)_前端函数库

重要性函数式编程(FP),不是一个新的概念,它几乎贯穿了整个编程史。直到最近几年,函数式编程才成为整个开发界的主流观念。函数式编程有完善且清晰的原则,一旦我们知道这些原则,我们将能更加快速地读懂代码,...

Rust + wasm 简单游戏尝试_rust ?

1.创建一个Rust+WASM项目新建一个项目:cargonewwasm-game--libcdwasm-game编辑Cargo.toml,加上依赖:[package]nam...

python入门到脱坑函数—定义函数_如何定义函数python

Python函数定义:从入门到精通一、函数的基本概念函数是组织好的、可重复使用的代码块,用于执行特定任务。在Python中,函数可以提高代码的模块性和重复利用率。二、定义函数的基本语法def函数名(...

js基础篇之——JavaScript的柯里化函数详解

柯里化,或者说部分应用,是一种函数式编程的技术,对于熟悉以传统方式编写JavaScript代码的人来说可能会很费解。但如果使用得当,它可以使你的JavaScript函数更具可读性。更具可读性和...

转载--HART 475手操器调试EJA变送器步骤

来源:热控圈HART475手操器进行变送器调试一、准备工具1.475手操器2.变送器3.DC24V供电电源,4.250欧电阻。二、用24V电源与变送器供电连接后并串行电阻后。把手操器的两个挂勾,...