逆向实用干货分享,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. 2017年11月Dyn365/CRM用户社区活动报名

    UG是全球最大Dynamics的用户组织,由最终用户自发组织,由行业有经验的专家自愿贡献知识和经验的非营利机构,与会人员本着务实中立的态度,不进行推介产品,服务以及其他营销行为.在美国,微软Dynam ...

  2. LeetCode 56. Merge Intervals (合并区间)

    Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...

  3. 解决执行sql脚本报错:没有足够的内存继续执行程序。

    出现执行sql脚本报错:没有足够的内存继续执行程序.是因为sql脚本过大,大家可能分为多个文件多次执行,这种笨方法可行,不过比较麻烦,大家可以用下面的方式,利用sqlcmd一次就行了:   执行cmd ...

  4. ArrayList 源码(基于Java1.8)

    ArrayList 源码 ArrayList 基于数组实现,也就是类对变量 Object[]系列操作,封装为常用的add,remove,indexOf, contains本质是通过 size 计数器对 ...

  5. [Scikit-learn] 4.4 Dimensionality reduction - PCA

    2.5. Decomposing signals in components (matrix factorization problems) 2.5.1. Principal component an ...

  6. THINKPHP中几个缓存的问题

    1.字段缓存. THINKPHP是默认开启字段缓存的.如果关闭了APPDEBUG(即在index.php中设置了这样一句话:define("APP_DEBUG","FAL ...

  7. 安装Windows Azure Powershell

    本文将介绍如何安装Windows Azure Powershell 1.打开Azure官方链接:https://www.azure.cn/downloads/ 2.按照向导进行安装 3.打开系统自带的 ...

  8. 安装MongoDB启动时报错‘发生系统错误2’的解决办法

    安装数据库mongodb启动时报"发生系统错误2". 这个问题是如果你之前已经装过一次,并且两次安装目录不同,就绝对会碰到的,因为你之前安装的路径已经在注册表中生成了,并没有随着你 ...

  9. javascript 中parseInt 的用法

    <!DOCTYPE html> <html> <head lang="en">     <meta charset="UTF-8 ...

  10. windows服务启动有界面的程序

    大家写windows服务守护进程的时候,肯定会遇到启动的程序看不到界面,只能在任务管理器里面看到xxx.exe问题. 发现可能有如下情况 a.无论是开机,还是程序被关掉后,守护服务启动的程序只能看到任 ...