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

背景

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

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

步骤

环境准备

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

base 复制代码
pip install frida frida-tools

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

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

base 复制代码
frida --version

Hook Windows 接口 MessageBox

编写示例程序

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

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 进行编写。脚本如下

python 复制代码
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脚本

bash 复制代码
python frida_test.py 0x00007FFDD3FA8900

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

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

防范

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

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

相关推荐
天天进步20156 小时前
UI-TARS 源码解析 #10:parse_action 源码解析:如何用 AST 安全解析模型生成的函数调用?
安全·ui
大耳朵-小飞象8 小时前
电力安全运维的智能密码:BACS如何破解设备全生命周期管理难题,让电网安全“看得见、管得住”?
运维·安全·智慧城市·能耗系统·楼宇智控·未来生活
wuhanzhanhui10 小时前
视觉革命与主动安全:2026武汉汽车电子展会定档,看芯片如何定义驾驶
安全·汽车
王维同学12 小时前
[原创][Windows C++]LSA 认证、安全与通知包的注册表枚举
c++·windows·安全
国科安芯14 小时前
星间光链路:AS32S601型抗辐射MCU在空间激光通信终端控制中的技术实现
服务器·网络·单片机·嵌入式硬件·物联网·安全·信息与通信
栩栩云生15 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
huijingjituan16 小时前
新一代IM聊天软件|构建企业专属智能通讯生态
安全·实时互动·即时通讯·极光鸟·灰鲸
其实防守也摸鱼16 小时前
补天SRC新手入门指南:从0到1的漏洞挖掘之路
网络·python·学习·安全·web安全·数据挖掘·挖洞
●VON17 小时前
鸿蒙 PC Markdown 编辑器内部隐私与安全评审
安全·华为·编辑器·harmonyos·鸿蒙
我不是QI17 小时前
一、主持人信息(域名 网站资产情报搜集)原理解析
安全·网络安全