RTTI(Runtime Type Identification,运行时类型识别)由c++编译器将对象的类型信息嵌入程序的只读数据段,以 支持C++的各种操作符在运行时确定(typeid)和检查(dynamic_cast)一个对象的数据类型。
对微软的编译器而言,RTTI和虚表位置在-4的地址构建。

#include <stdio.h>
#include <Windows.h>
#define VTSIZE  6
#pragma pack(1)
class Parent
{
public:virtual void Fun1() = 0;virtual void Fun2() = 0;virtual void Fun3() = 0;virtual void Fun4() = 0;virtual void Fun5() = 0;
};class Child: public Parent
{
public:void Fun1(){printf("11111\n");}void Fun2(){printf("22222\n");}void Fun3(){printf("33333\n");}void Fun4(){printf("44444\n");}void Fun5(){printf("55555\n");}};typedef struct _JMP_TABLE_ITEM{//UCHAR uPushesi;  //backup esi for checkesp   push esi, pop esiUCHAR uMoveEaxForFactAddr;DWORD dwFactAddr;UCHAR uPashEaxForFactAddr;//UCHAR uPushad;  //0x60//UCHAR uPushfd;  //0x9c//UCHAR uJmp;//DWORD dwCheckAddr;//jmp to check function//simulate messagebox exist issue
#ifdef DEBUGUCHAR push0;UCHAR zero0;UCHAR push1;UCHAR zero1;UCHAR push2;UCHAR zero2;UCHAR push3;UCHAR zero3;UCHAR tempmoveax;DWORD dwmsgAddr;UCHAR uJmpmsg; //FFDWORD uJmpeaxaddr;  UCHAR add;UCHAR esp;UCHAR four;
#endif//UCHAR uPopad;   //61//UCHAR uPopfd; //9dUCHAR uPopeax; //58UCHAR uJmp22;    //FFUCHAR uJmpEax;  //EO}JMP_TABLE_ITEM;void CheckFunc(DWORD checkNum)
{}void InitFakeVirtualTable(DWORD *pfakevt,JMP_TABLE_ITEM *pJMPTable, DWORD pFactvt, DWORD msgaddr)
{DWORD *pvt = (DWORD*)*(DWORD*)pFactvt;for(int i = 0; i < VTSIZE; ++i){*pfakevt = (DWORD)pJMPTable;pJMPTable->uMoveEaxForFactAddr = 0xB8;pJMPTable->dwFactAddr = *(DWORD*)(pvt+i);pJMPTable->uPashEaxForFactAddr = 0x50;   //push fact virtual function address//pJMPTable->uPushad = 0x60;//pJMPTable->uPushfd = 0x9C;//pJMPTable->uJmp = 0xE9;//pJMPTable->dwCheckAddr = (DWORD)CheckFunc;
#ifdef DEBUGpJMPTable->push0 = 0x6A;pJMPTable->zero0 = 0x0;pJMPTable->push1 = 0x6A;pJMPTable->zero1 = 0x0;pJMPTable->push2 = 0x6A;pJMPTable->zero2 = 0x0;pJMPTable->push3 = 0x6A;pJMPTable->zero3 = 0x0;pJMPTable->tempmoveax = 0xB8;pJMPTable->dwmsgAddr = msgaddr;pJMPTable->uJmpmsg = 0xFF;  //FFpJMPTable->uJmpeaxaddr = 0xE0;pJMPTable->add = 0x83;pJMPTable->esp = 0xC4; pJMPTable->four = 0x10;
#endif//pJMPTable->uPopad = 0x61;//pJMPTable->uPopfd = 0x9d;pJMPTable->uPopeax = 0x58;pJMPTable->uJmp22 = 0xFF;pJMPTable->uJmpEax = 0xE0;pfakevt++;pJMPTable++;}
}void main()
{//Fake virtual tableDWORD *pfakeVirtualTable = new DWORD[VTSIZE]();JMP_TABLE_ITEM *pJMPTable = new JMP_TABLE_ITEM[VTSIZE]();DWORD oldprotect = 0;VirtualProtect(pfakeVirtualTable,1024,PAGE_EXECUTE_READWRITE,&oldprotect);//VirtualProtect(pJMPTable,1024,PAGE_EXECUTE_READWRITE,&oldprotect);Parent *pChild = new Child();DWORD ptemp = (DWORD)pChild;//simulate checkfuncHMODULE hNtdll = GetModuleHandleA("user32.dll");DWORD addr = (DWORD)GetProcAddress(hNtdll,"MessageBoxA");InitFakeVirtualTable(pfakeVirtualTable,pJMPTable,ptemp,addr);*(DWORD*)pChild = (DWORD)pfakeVirtualTable;pChild->Fun1();pChild->Fun2();pChild->Fun3();pChild->Fun4();pChild->Fun5();VirtualProtect(pfakeVirtualTable,1024,oldprotect,&oldprotect);//VirtualProtect(pJMPTable,1024,oldprotect,&oldprotect);
}

hook虚表监控虚表相关推荐

  1. 内核编程之SSDTHook(3)Hook NtCreateSection监控所有可执行模块加载

    本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/d ...

  2. C++中虚函数、虚指针和虚表详解

    关于虚函数的背景知识 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数. 存在虚函数的类都有一个一维的虚函数表叫做虚表.每一个类的对象都有一个指向虚表开始的虚指针.虚表是和类对应的 ...

  3. 虚函数、虚指针和虚表

    虚函数.虚指针和虚表 http://eriol.iteye.com/blog/1167737 关于虚函数的背景知识 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数. 存在虚函数的 ...

  4. 你了解C++中的虚表吗

    虚表 一.什么是虚表 二.虚表是干什么的 一.什么是虚表 在面试中,面试官会问到一个问题,影响一个类大小的因素有哪些? 这是我们就需要知道,影响一个类大小的因素首先就有成员变量,以及继承,以及最重要的 ...

  5. C++虚函数的实现方式(虚表+虚指针)

    虚函数表实现原理 虚函数的实现是由两个部分组成的,虚函数指针与虚函数表. 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数. 存在虚函数的类都有一个一维的虚函数表叫做虚表.每一个类 ...

  6. 虚函数,虚表深度剖析

    面向对象,从单一的类开始说起. class A { private:int m_a;int m_b; }; 这个类中有两个成员变量,都是int类型,所以这个类在内存中占用多大的内存空间呢? sizeo ...

  7. c++关于虚表的一些笔记

    文章目录 1.虚函数表指针 2.多态构成的条件 3.重载.重写.重定义 三者区别 4.继承与虚函数 5.单继承中的虚函数表 无虚函数覆盖 有虚函数覆盖 6.单继承中的虚函数表 无虚函数覆盖 有虚函数覆 ...

  8. Windows xp下IDT Hook和GDT的学习

    一.前言   对于IDT第一次的认知是int 2e ,在系统调用的时候原来R3进入R0的方式就是通过int 2e自陷进入内核,然后进入KiSystemService函数,在根据系统服务调用号调用系统服 ...

  9. 19 | 耗电优化(下):耗电的优化方法与线上监控

    相比启动.卡顿.内存和网络的优化来说,可能大多数应用对耗电优化的关注不是太多.当然并不是我们不想做耗电优化,更多时候是感觉有些无从下手. 不同于启动时间.卡顿率,耗电在线上一直缺乏一个可以量化的指标. ...

最新文章

  1. 通向高可扩展性之路(谷歌篇)
  2. php 整数转换为32 位,PHP哈希函数返回一个整数(32位int)(PHP hashing function that returns an integer (32bit int))...
  3. 索尼a5100_索尼相机分类,买相机不再发愁
  4. 【BLOCK】Oracle 块管理常用SQL
  5. java理念_java温故而知新(9)OOP(面向对象编程)理念
  6. 2017西安交大ACM小学期数据结构 [又是树状数组、异或]
  7. codeforces 705A-C语言解题报告
  8. PyTorch多GPU并行训练方法及问题整理
  9. Linux(三):VMware Tools安装
  10. php裁剪图片白边,php生成缩略图自动填充白边例子
  11. 《区块链技术指南》笔记
  12. 计算机表格应用试卷,计算机应用基础Excel试题库.doc
  13. sql 触发器(Insert,update,delete)
  14. VS2017离线安装
  15. 权威发布|2020年11月份全国铝合金模板PMI指数出炉,请查收!
  16. 15亿参数的NLP模型究竟有多强大?有人用它生成了一部《哈利·波特》
  17. 远程桌面计算机没有密码设置,如果对方电脑没有设置密码,如何使用远程桌面连接?...
  18. 猫咪藏在哪个房间python_盘点:猫咪玩“躲猫猫”喜欢藏的几个地方,这下再也不愁找不到了...
  19. 【DB宝42】MySQL高可用架构MHA+ProxySQL实现读写分离和负载均衡
  20. 计算机公司经营范围安防监控,监控安防在个体经营范围怎么写?

热门文章

  1. 成功解决FileNotFoundError: [Errno 2] No such file or directory: '/home/bai/Myprojects/Tfexamples/data/kn
  2. Py之tkinter:python最简单的猜字小游戏带你进入python的GUI世界
  3. DL之LSTM:LSTM算法论文简介(原理、关键步骤、RNN/LSTM/GRU比较、单层和多层的LSTM)、案例应用之详细攻略
  4. java-IO-基本输出输入流
  5. VS打开文件,解决方案资源管理器自动定位到文件位置
  6. Foreman安装配置
  7. IOS横竖屏控制与事件处理
  8. LeetCode 117. Populating Next Right Pointers in Each Node II
  9. Java网络编程及安全
  10. Counting power sets