C++:虚函数表Hook

Hook

在计算机编程中,"Hook"(钩子)是一种技术,用于拦截并修改特定事件或函数的执行流程。它允许程序员在特定的代码点插入自定义的代码,以实现对程序行为的修改、监视或增强。

虚函数表Hook

虚函数表(Virtual Function Table,简称VTable)Hook是一种利用C++的动态多态性机制来修改类行为的技术。在C++中,虚函数表是用于实现动态多态性的重要机制,每个对象都有一个指向虚函数表的指针,该表中存储了虚函数的地址,通过修改这个虚函数表(即替换虚函数表中存储的函数指针),我们可以改变类的行为,使其调用不同的函数。

虚函数表Hook使用

由于在内存中虚函数表具有保护属性,是不可写的,所以在Windows环境中我们要进行虚函数表Hook需要通过调用Windows API中的一个函数VirtualProtect来进行,这个函数可以帮助我们修改内存页面的保护属性,让我们可以对其进行写入操作。函数原型:

BOOL VirtualProtect(
  LPVOID lpAddress,
  SIZE_T dwSize,
  DWORD  flNewProtect,
  PDWORD lpflOldProtect
);
  • lpAddress:指向要修改保护属性的内存地址的指针。

  • dwSize:要修改的内存区域的大小(以字节为单位)。

  • flNewProtect

    :新的保护属性,可以是下列常量之一:

    • PAGE_READONLY:页面为只读。

    • PAGE_READWRITE:页面为可读写。

    • PAGE_EXECUTE:页面为可执行。

    • PAGE_EXECUTE_READ:页面为可执行和可读。

    • PAGE_EXECUTE_READWRITE:页面为可执行和可读写。

  • lpflOldProtect:指向保存原始保护属性的变量的指针。如果不需要原始保护属性,则可以将其设置为 nullptr

接着我们来看一个简单的示例:首先,定义了一个父类 Animal 和一个派生类 Cat。在 Animal 类中,定义了一个虚函数 eat(),并在派生类 Cat 中进行了重写。然后,定义了一个自定义的函数 MyFunc(),用于替换虚函数的实现。

//父类
class Animal
{
public:
    Animal(){};
    
    ~Animal(){};
    
    //虚函数
    virtual void eat(){
        std::cout << "Animal Eat 函数" << std::endl;
    };
};
​
//派生类
class Cat : public Animal
{
public:
    Cat(){};
    
    ~Cat(){};
    
    void eat(){
        std::cout << "cat Eat 函数" << std::endl;
    };
}
​
//Hook函数用于替换虚函数
void MyFunc() {
    std::cout << "this is My Hook" << std::endl;
}

接着在main函数中进行虚函数表Hook操作:

int main() {
​
    Animal * catObj = new Cat;
​
    int  nVfptr = *(int*)catObj;    //虚函数表地址
    
    DWORD oldFunAddress = 0;  //定义变量接收保存原始保护属性的变量的指针
    BOOL bFlag = VirtualProtect((void*)nVfptr,0x1000, PAGE_EXECUTE_READWRITE, &oldFunAddress);
​
    if (bFlag) {
        *(int*)nVfptr = (int)MyFunc;
        catObj->run();
    }
    
    delete catObj;
    system("pause");
    return 0;
}
​

先创建了一个指向 Cat 对象的 Animal 类指针 catObj

int nVfptr = *(int*)catObj;获取指向虚函数表的指针 nVfptr的地址,

VirtualProtect((void*)nVfptr,0x1000, PAGE_EXECUTE_READWRITE, &oldFunAddress);使用 VirtualProtect 将其对应的内存页属性设置为可读写。

`(void*)nVfptr 是将整数 nVfptr 转换为指针类型的操作。在这里,nVfptr 存储着指向虚函数表的指针的地址,但它的类型是 int。为了能够将其传递给 VirtualProtect 函数,我们需要将其转换为指针类型。

if (bFlag) {
    *(int*)nVfptr = (int)MyFunc;
    catObj->eat();
}

如果成功内存页属性设置为可读写,则将虚函数表中第一个函数指针(对应于 eat() 函数)修改为 MyFunc() 函数的地址。最后,调用 catObj->eat(),实际上会执行 MyFunc() 函数,而不是原本的 Cat 类中的 eat() 函数,最后执行结果如下:

虚函数表Hook是一种强大而灵活的技术,可以用于实现各种高级功能,但需要谨慎使用,并且要对目标程序的内部结构有深入的了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/612426.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

控制台打印空数组展开有数据

控制台打印空数组展开有数据 控制台显示&#xff1a; 代码如下&#xff1a; export const getDict1 (dictCode) > {let list []queryDict({ dictCode }).then(({data}) > {list.push( ...data.map(item > ({ label: item.itemText, value: item.itemValue })))})c…

目标检测算法YOLOv7简介

YOLOv7由Chien-Yao Wang等人于2022年提出&#xff0c;论文名为&#xff1a;《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors》&#xff0c;论文见&#xff1a;https://arxiv.org/pdf/2207.02696 &#xff0c;项目网页&#xff…

解决 git 因输入密码错误而导致的报错无法推送问题

报错内容如下&#xff1a; > git push origin master:master fatal: unable to access https://gitee.com/spring-in-huangxian-county/web-tts-vue.git/: OpenSSL SSL_connect: Connection was reset in connection to gitee.com:443 出错原因 根本原因是本机存储的 账户…

大型动作模型 (LAM):AI 驱动的交互的下一个前沿

1.概述 现在人工智能中几个关键的领域&#xff0c;包括生成式人工智能&#xff08;Generative AI&#xff09;、大型动作模型&#xff08;Large Action Models, LAM&#xff09;、以及交互式人工智能&#xff08;Interactive AI&#xff09;。以下是对这些概念的简要解释和它们…

数据库管理-第187期 23ai:怎么用SQL创建图(20240510)

数据库管理187期 2024-05-10 数据库管理-第187期 23ai:怎么用SQL创建图&#xff08;20240510&#xff09;1 安装PGX1.1 数据库配置对应用户1.2 使用RPM包安装Graph Server1.3 安装Oracle Graph Client1.4 访问PGX页面 2 SQL Property Graph2.1 创建SQL属性图2.2 关于点和边图元…

c++11 标准模板(STL)本地化库 - 平面类别(std::money_put) - 格式化货币值为字符序列以输出

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析&#xff0c;以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 平面类别 格式化货币值为字符序列以输出 std::money_put template< …

聊聊ChatGPT:智能语言模型背后的原理

目录 1. ChatGPT的基础&#xff1a;GPT模型 2. 预训练与微调&#xff1a;让模型更加智能 2.1 预训练 2.2 微调 3. 多样化的应用场景 4. 未来的展望 5. 结语 在当今的人工智能领域&#xff0c;OpenAI的ChatGPT无疑是一个炙手可热的话题。它不仅能流畅地进行对话&#xff…

【ArcGISProSDK】condition属性

示例 通过caption属性可以看出esri_mapping_openProjectCondition的条件是一个工程被打开 condition的作用 由此可知示例中的Tab实在工程被打开才能使用&#xff0c;否则他禁用显示灰色&#xff0c;在未禁用的时候说明条件满足。 参考文档 insertCondition 元素 (arcgis.com…

局域网手机端远程控制手机

局域网手机端远程控制手机 随着科技的进步和智能设备的普及&#xff0c;远程控制技术在日常生活与工作中的应用越来越广泛。其中&#xff0c;局域网内的手机端远程控制手机技术&#xff0c;因其便捷性和实用性&#xff0c;受到了众多用户的关注。本文将简要介绍该技术及其应用…

#兼职副业赚钱吗?# 宝妈与上班族在水牛社的财富探索

在这个繁忙的都市节奏中&#xff0c;宝妈与上班族都面临着平衡家庭与经济的挑战。那么&#xff0c;兼职副业真的能为他们带来额外的收入吗&#xff1f;接下来&#xff0c;让我们通过两个实例&#xff0c;揭示宝妈和上班族是如何在水牛社找到兼职副业赚钱的契机的。 ✨ 宝妈的故…

Prompt|Kimi高阶技巧,99%的人都不知道

大家好&#xff0c;我是无界生长。 今天分享一条咒语&#xff0c;轻松让Kimi帮你生成流程图&#xff0c;学会了的话&#xff0c;点赞收藏起来吧&#xff01; 效果展示 我们演示一下让kimi帮忙绘制 关注微信公众号“无界生长”的流程图&#xff0c;最终效果图如下所示 效果还不…

Dijkstra求最短路 I:图解 详细代码(图解)

文章目录 题目&#xff1a;Dijkstra求最短路思路伪代码&#xff1a;代码优化优化代码&#xff1a;Java代码 总结 题目&#xff1a;Dijkstra求最短路 给定一个 n个点 m条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为正值。 请你求出 1号点到 n号点的…

权限束缚术--权限提升你需要知道这些

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要对渗透测试中权限提升的一些基础知识进行整理 并不包含权限提升的具体操作 适合要入门权限提升的朋友 提权的重要性 我们在渗透网站时&#xff0c;我们往往会拿到一些权限&#xff0c;但是我们的权限有…

视频批量剪辑指南:一键合并视频并添加背景音乐,高效便捷

在数字化时代&#xff0c;视频剪辑已经成为了一项常见且重要的技能。无论是制作家庭影片、工作展示还是社交媒体内容&#xff0c;掌握高效的视频剪辑技巧都能极大地提升我们的工作效率和创作质量。本文将为您介绍云炫AI智剪中高效的视频批量剪辑方法&#xff0c;让您能够一键合…

ubantu安装docker以及docker-compose

ubantu安装docker以及docker-compose 安装docker1、从官方存储库中安装Docker2、启动Docker服务3、验证 安装docker compose使用docker部署服务1、需要再opt文件夹下创建以下文件夹&#xff0c;/opt文件夹目录说明2、可将已备份对应文件夹拷至对应文件夹下3、在/opt/compose目录…

linux打包流程

因为linux有俩个python版本&#xff0c;我们需要切换到python3这个版本&#xff0c;默认是python 2.7 alias pythonpython3 切换到python3 再次执行&#xff1a;python -V 显示出python的版本了&#xff0c;然后查看pip的配置&#xff0c;我们打包里面需要的第三方需要放到pip…

Gradient发布支持100万token的Lllama3,上下文长度从8K扩展到1048K

前言 近日Gradient公司在Crusoe Energy公司的算力支持下&#xff0c;开发了一款基于Llama-3的大型语言模型。这款新模型在原Llama-3 8B的基础上&#xff0c;将上下文长度从8000 token大幅扩展到超过104万token。 这一创新性突破&#xff0c;展现了当前SOTA大语言模型在长上下…

OC foudation框架(上)学习

foundation框架 文章目录 foundation框架字符串&#xff08;NSString && NSMutableString&#xff09;NSString的其他功能NSMutableString 日期与时间 &#xff08;NSDate&#xff09;2.1 日期与时间&#xff08;NSDate&#xff09;2.2日期格式器日历与日期组件定时器&…

霍金《时间简史 A Brief History of Time》书后索引(A--D)

图源&#xff1a;Wikipedia INDEX A Abacus Absolute position Absolute time Absolute zero Acceleration Age of the universe Air resistance Albrecht, Andreas Alpha Centauri Alpher, Ralph Anthropic principle Antigravity Antiparticles Aristotle Arrows of time …

【spring】Security 密码加密算法

Spring Security 提供了多种密码加密算法&#xff0c;用于在存储用户密码时进行加密&#xff0c;以增强安全性。 查看org.springframework.security.crypto.factory.PasswordEncoderFactories 以下是一些常用的密码加密算法&#xff1a; BCryptPasswordEncoder&#xff1a; 这…