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上的函数执行了!\r\n");
    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)执行结果

    

 

 

 

 

 

posted @ 2019-11-10 10:08  OneTrainee  阅读(821)  评论(0编辑  收藏  举报