zoukankan      html  css  js  c++  java
  • SEH hook 的一种方法

     Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html

    技术学习来源:火哥(QQ:471194425)

    该方法的一些原理暂时还不太了解,整理之后一定会补充的。

    SEH hook 的一种方法

    一、当函数中有try语句时编译器的处理

      首先,我们必须知道,当一个函数中有try时,编译器对其的函数头部分的处里和平常有些不一样的,如下图。

      

      1)关键是压入的第二个参数 0A65E00h,其通过 (test+6) 可以拿到该值。

        1> 这个值指向一个数据结构,其第五个成员代表指向except的语句。

        2> 因此,我们只要修改这个地址来到我们的函数,这很容易就执行了。

        

    二、实现代码

      1)采用Debug模式下,则必须关闭增量链接。

        关闭方法:[debug] 关闭vs的增量链接

      2)实现代码:

    // SEH.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include "pch.h"
    #include <windows.h>    
    #include <stdio.h>
    
    
    
    int test3(ULONG ecode, PEXCEPTION_POINTERS p)
    {
        if (ecode == 0xc0000094)
        {
            p->ContextRecord->Eip += 3;
            return EXCEPTION_CONTINUE_EXECUTION;
    
        }
        return EXCEPTION_EXECUTE_HANDLER;
    }
    
    
    void test2()
    {
        
        __try
        {
    
            __asm
            {
                xor edx, edx;
                xor eax, eax;
                mov ecx, 0;
                div ecx;
            }
        }
        __except (1)
        {
            printf("exception语句也被执行了!");
        }
        
    
    
    
    }
    
    int WINAPI ExcepFilter(PEXCEPTION_POINTERS p)
    {
        printf("HOOK上的函数执行了!
    ");
        return 1;
    }
    
    
    int __declspec(naked) catchExcepFilter()
    {
        __asm
        {
            mov eax, [ebp - 0x14];
            push eax;
            call ExcepFilter;
            ret;
        }
    }
    
    
    int main(int argc, char* argv[])
    {
    
        
        ULONG hookAddress = *(PULONG)((ULONG)test2 + 6);
        ULONG pro = 0;
        //exceptionInfoAddr = (ULONG)_exception_info;
        if (VirtualProtect((PVOID)hookAddress, 0x1000, PAGE_READWRITE, &pro))
        {
            *((PULONG)hookAddress + 5) = (ULONG)(catchExcepFilter);
            //修复回去
            VirtualProtect((PVOID)hookAddress, 0x1000, pro, &pro);
        }
        
        
    
        test2();
    
        //TestException();
        getchar();
        return 0;
    }

       3)执行结果

        

     

  • 相关阅读:
    oralce数据库创建同义词
    Oracle数据库最小脚本
    oracle数据库SQL收集整理
    文件各种上传,离不开的表单
    Apache OFBiz 研究记录01
    无IDE时编译和运行Java
    解决VM虚拟机MAC OS X 10.10.x的卡顿问题
    在java项目中使用AES256 CBC加密
    Spring4 与 Hibernate4 整合过程中的问题记录
    WIZnet官方网盘
  • 原文地址:https://www.cnblogs.com/onetrainee/p/11829030.html
Copyright © 2011-2022 走看看