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

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

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

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

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

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

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

内存结构图:

  

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

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

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

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

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

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

总共分为三个步骤

.获得虚表指针
.修改虚表的内存保护属性
.修改虚表中的虚函数地址为我们的函数地址. 很简单三步

高级代码:

  

#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 = ; //第二步修改虚表指针的内存保护属性,下方更改虚表
VirtualProtect((void *)DwAddress,0x1000,PAGE_EXECUTE_READWRITE,&dwOld);//修改内存保护属性,其地址是虚表指针地址 (*(int *)DwAddress) = (int)ShowData;//第三步,HOOK,也就是将我们的函数地址,写入到虚表中. obj.ShowHelloWorld(); //重新调用,看看是否被HOOK
return ;
}

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

贴上测试图:

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

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

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

  1. 逆向实用干货分享,Hook技术第一讲,之Hook Windows API

    逆向实用干货分享,Hook技术第一讲,之Hook Windows API 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) ...

  2. PC逆向之代码还原技术,第二讲寻找程序入口点

    PC逆向之代码还原技术,第二讲寻找程序入口点 一丶简介 程序逆向的时候.我们需要知道程序入口点.动态分析的时候以便于看是什么程序编写的. 比如VC++6.0 我们可以写一个程序测试一下 我们写一段代码 ...

  3. Hook技术之API拦截(API Hook)

    一.实现过程 1.钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统. 2.在消息没有到达目的窗口前,钩子就捕获消息(即钩子函数先得到控制权). 3.钩子可以加工处理该消息,即钩子机制允许应 ...

  4. HOOK技术的一些简单总结

    好久没写博客了, 一个月一篇还是要尽量保证,今天谈下Hook技术. 在Window平台上开发任何稍微底层一点的东西,基本上都是Hook满天飞, 普通应用程序如此,安全软件更是如此, 这里简单记录一些常 ...

  5. Hook技术

    hook钩子: 使用技术手段在运行时动态的将额外代码依附现进程,从而实现替换现有处理逻辑或插入额外功能的目的. 它的技术实现要点有两个: 1)如何注入代码(如何将额外代码依附于现有代码中). 2)如何 ...

  6. 32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)

    32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议 ...

  7. 逆向课程第二讲,寻找main入口点

    逆向课程第二讲,寻找main入口点 一丶识别各个程序的入口点 入门知识,识别各个应用程序的入口点 (举例识别VC 编译器生成,以及VS编译生成的Debug版本以及Release版本) 1.识别VC6. ...

  8. 20145307陈俊达_安卓逆向分析_Xposed的hook技术研究

    20145307陈俊达_安卓逆向分析_Xposed的hook技术研究 引言 其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌 ...

  9. 最强最全干货分享:Android开发书籍、教程、工具等

    最全干货分享,本文收集整理了Android开发所需的书籍.教程.工具.资讯和周刊各种资源,它们能让你在Android开发之旅的各个阶段都受益. 入门<Learning Android(中文版)& ...

随机推荐

  1. 在C#中winform程序中应用nlog日志工具

    在C#中winform程序中应用nlog日志工具,配置文件简单应用. 文件名 nlog.config,请注意修改属性为"始终复制",发布时候容易遇到不存在文件的错误提示. 通过Nu ...

  2. LeetCode 581. Shortest Unsorted Continuous Subarray (最短无序连续子数组)

    Given an integer array, you need to find one continuous subarray that if you only sort this subarray ...

  3. 一次从0到1的java项目实践清单

    虽说工作就是简单的事情重复做,但不是所有简单的事你都能有机会做的. 我们平日工作里,大部分时候都是在做修修补补的工作,而这也是非常重要的.做好修补工作,做好优化工作,足够让你升职加薪! 但是如果有机会 ...

  4. asp.net在类库中使用EF 6.0时的相关配置

    前提:之前使用EF的配置都是直接使用NuGet安装在项目中,然后直接修改web.config中的connectionString,然后创建相关dbcontext直接使用就可以了.此次为直接将EF安装在 ...

  5. RestServer 2.0 正式版发布

    RestServer 2.0 正式版发布 使用许可&版权说明 在保持本软件完整的情况下可以将本软件用于任何商业用途. 本软件可以自由传播,但是请保持软件相关文件和说明文档完整. 未经许可不得将 ...

  6. Ionic3 一些命令

    ionic start --help E:\Projects\ionic>ionic start --help ionic start - Create a new project This c ...

  7. 原生JS实现Ajax及Ajax的跨域请求

      前  言          如今,从事前端方面的程序猿们,如果,不懂一些前后台的数据交互方面的知识的话,估计都不太好意思说自己是程序猿.当然,如今有着许多的框架,都有相对应的前后台数据交互的方法. ...

  8. C++11 static_assert

    C++11 static_assert C++0x中引入了static_assert这个关键字,用来做编译期间的断言,因此叫做静态断言. 其语法:static_assert(常量表达式,提示字符串). ...

  9. box-shadow + animation 实现loading

    .loading{ width:3px; height:3px; border-radius:100%; margin-left:20px; box-shadow:0 -10px 0 1px #333 ...

  10. 如何将一个div水平垂直居中?4种方法做推荐

    方案一: div绝对定位水平垂直居中[margin:auto实现绝对定位元素的居中], 兼容性:,IE7及之前版本不支持 div{ width: 200px; height: 200px; backg ...