zoukankan      html  css  js  c++  java
  • 逆向实用干货分享,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()
    ");
        
    }
    
    MyTest::~MyTest()
    {
        printf("MyTest::~MyTest()
    ");
    }
    
    void MyTest::ShowHelloWorld()
    {
       printf("Hello World!
    ");
    }
    
    void ShowData()                                //我们将虚表中的函数地址换为我们的函数地址
    {
        printf("有木有被坑的感觉
    ");
    }
    
    void MyTest::print()
    {
         printf("void MyTest::print()
    ");
    }
    
    
    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,注入等等一系列的操作,都在最适合自己的场合能发挥出最大的作用.

  • 相关阅读:
    jvm.option是什么,它是如何加载的
    适配器模式--想象一下转换插头
    Android gradle 配置
    Android全面屏适配
    github控件地址
    TextView 链接显示及跳转
    解决java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class org.robolectric.annotation.Config.application()
    解决Android中,禁止ScrollView内的控件改变之后自动滚动
    Android跳转到应用商店的APP详情页面,以及 Google GMS 各个apk的包
    EditText小记
  • 原文地址:https://www.cnblogs.com/iBinary/p/8012394.html
Copyright © 2011-2022 走看看