逆向实用干货分享,Hook技术第二讲,之虚表HOOK

iBinary 2017-12-09 原文

逆向实用干货分享,Hook技术第二讲,之虚表HOOK

               逆向实用干货分享,Hook技术第二讲,之虚表HOOK

正好昨天讲到认识C++中虚表指针,以及虚表位置在反汇编中的表达方式,这里就说一下我们的新技术,虚表HOOK

昨天的博客链接: http://www.cnblogs.com/iBinary/p/8001749.html

 

PS: 今天所讲内容和昨天没有管理,不过理解了昨天的帖子结合今天的知识,你就可以找东西练手了,比如你可以结合的知识,随便找一款C++写的游戏,将它的虚表HOOK了,这样你想干啥就干啥 ^_^

 

一丶认识虚表指针以及虚表

讲解之前我们要认识一下类在内存中的表现形式,以及认识虚表指针.

1.首先我们知道,当类中有虚函数的时候,则会生成虚表指针,虚表指针指向了虚表,虚表中保存的则是当前类中所有虚函数的函数地址.

内存结构图:

  

第一个是类的内存结构,第二个是虚表.

那么我们就有想法了,当我们调用虚函数的时候,会通过虚表指针,找到虚表,而后找到虚函数地址

那么现在我们是否可以将虚函数的地址改为我们的函数地址.

聪明: 其实就是很简单,理解了内存结构,理解了虚表指针,虚表那么就可以进行操作了.

我们只需要将虚表中的虚函数地址更改成我们的即可.

上面都是原理,下面说一下步骤

总共分为三个步骤

1.获得虚表指针
2.修改虚表的内存保护属性
3.修改虚表中的虚函数地址为我们的函数地址.

很简单三步

高级代码:

  

#include "stdafx.h"
#include <windows.h>
class MyTest
{
public:
    MyTest();
    ~MyTest();
    void print();
    virtual void ShowHelloWorld();
    int m_Number;
};

MyTest::MyTest()
{
    printf("MyTest::MyTest()\r\n");
    
}

MyTest::~MyTest()
{
    printf("MyTest::~MyTest()\r\n");
}

void MyTest::ShowHelloWorld()
{
   printf("Hello World!\n");
}

void ShowData()                                //我们将虚表中的函数地址换为我们的函数地址
{
    printf("有木有被坑的感觉\r\n");
}

void MyTest::print()
{
     printf("void MyTest::print()\r\n");
}


int main(int argc, char* argv[])
{
    MyTest test;
    MyTest &obj = test;     //可以虚调用
   
    int DwAddress = *(int *)&test;        //第一步,获取自己的虚表指针
    
    obj.ShowHelloWorld();                //虚函数调用,测试作用

    DWORD dwOld = 0;                    //第二步修改虚表指针的内存保护属性,下方更改虚表
    VirtualProtect((void *)DwAddress,0x1000,PAGE_EXECUTE_READWRITE,&dwOld);//修改内存保护属性,其地址是虚表指针地址

    (*(int *)DwAddress) = (int)ShowData;//第三步,HOOK,也就是将我们的函数地址,写入到虚表中.
    
    obj.ShowHelloWorld();                    //重新调用,看看是否被HOOK
    return 0;
}

上面代码可以直接拷贝粘贴, VS2013测试成功.

贴上测试图:

这里只是简单的HOOK了一下自己类的虚表,你可以通过自己的分析,找到别的进程中的虚表,然后更改.

当然这个HOOK很简单,也有自己的适用场合,俗话说,各种HOOK,注入等等一系列的操作,都在最适合自己的场合能发挥出最大的作用.

 

发表于 2017-12-09 19:03 iBinary 阅读() 评论() 编辑 收藏

 

版权声明:本文为iBinary原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:http://www.cnblogs.com/iBinary/p/8012394.html

逆向实用干货分享,Hook技术第二讲,之虚表HOOK的更多相关文章

  1. x64内核HOOK技术之拦截进程.拦截线程.拦截模块

    x64内核HOOK技术之拦截进程.拦截线程.拦截模块             x64内核HOOK技术之拦截进程 […]...

  2. IAT Hook

    目录 IAT hook 一丶IAT 1.什么是 IAT表. 2.怎么进行HOOK IAT hook 一丶IAT […]...

随机推荐

  1. 强化学习(十六) 深度确定性策略梯度(DDPG)

        在强化学习(十五) A3C中,我们讨论了使用多线程的方法来解决Actor-Critic难收敛的问题,今 […]...

  2. 无需QQ密保直接修改QQ密码

    这个有两个限制 一是:QQ要在常用地区登录 二是密保只绑定手机号、密保问题  QQ绑定了手机令牌之类的不行 小 […]...

  3. 免费的文档管理软件,就在哪,就看自己是否能运用好

    摘要:如何利用好免费的Word文档管理软件,将自己的文档管理清楚?  PinPKM的单个知识库,200个文档完 […]...

  4. javascript 实现数据结构 – 队列

    队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序的项。队列 […]...

  5. 单片机实现寄存器点亮LED实验

    为了顺利过渡到库开发,在STM32编程的开始,我们对照51点亮一个LED的方法,给大家演示一下STM32如何用 […]...

  6. gRPC-微服务间通信实践

    微服务间通信常见的两种方式 由于微服务架构慢慢被更多人使用后,迎面而来的问题是如何做好微服务间通信的方案。我们 […]...

  7. 如何保证消息的顺序性?

    如何保证消息的顺序性? 面试题 如何保证消息的顺序性? 面试官心理分析 其实这个也是用 MQ 的时候必问的话题 […]...

  8. 记录一次fat32格式U盘不识别问题

    记录一次fat32格式U盘不识别问题 升级了4.1.15内核发现U盘不识别了,考虑到内核编译前的配置是通过lo […]...

展开目录

目录导航