首页
社区
课程
招聘
[原创]一个猥琐的SEH’S HOOK[可扩展的]
发表于: 2009-2-6 12:42 8818

[原创]一个猥琐的SEH’S HOOK[可扩展的]

2009-2-6 12:42
8818

SEH机制大家都很熟悉,但TRY-EXCEPT的CODE与SEH的组合可能不是很了解,都是未公开的,说得再细也不如,运行调试一下代码便知。全球没有第二家!!!

希望能抛砖引玉。

源码如下:

#include <windows.h>
#include <stdio.h>

//该结构是try except 块的向量表(一数组),是未公开的
typedef struct __vect_handler
{
        DWORD vFlag;
        PVOID TryHandler;/*try-except{code}*/
        PVOID NextContiueCode;/*异常处理后的下一条指令地址*/

}vect_handler;

typedef struct __EXCEPTION_LIST
{
        __EXCEPTION_LIST* next;//next一个SEH链
        PVOID             handler;//异常处理程序
        vect_handler*     vecthandler;
        DWORD             IndexVechandler;/*当前处理的try-except块号,抛出异常(在try-except里) 都会修改它*/
       
}EXCEPTION_LIST;

char* ff = "try";

DWORD WINAPI handler()
{
        /*突破except{}里不能定义局部变量,增加局部变量*/
        /*调试器监测*/
        /*加解密TRY 块代码*/
            __asm pushad
               
                __asm push 0
                __asm push 0
                __asm push ff
                __asm push 0
                __asm mov eax,MessageBoxA
                __asm call eax
                __asm popad
        //        __asm jmp OldExceptCode实现该行才算完美hook
                return EXCEPTION_EXECUTE_HANDLER/*jmp Contiue函数*/;
};

void   Contiue()
{
        MessageBoxA( 0,"contiue",0,0);
                ExitProcess( 0 );
};

int main( int argn, char** argv )
{
        char k;
        char* v = 0;//&k;
        DWORD prepageprotect;

        DWORD ntry = 0;
        EXCEPTION_LIST* pe;
        EXCEPTION_LIST* currentpe;

        __asm mov eax, fs:[0]
    __asm mov pe, eax
   
        currentpe = pe;

        BOOL ok = VirtualProtect( &currentpe->vecthandler[0].TryHandler, 8, PAGE_EXECUTE_READWRITE, &prepageprotect );
        currentpe->vecthandler[0].TryHandler = handler;//hook try-except 【0 】block
        currentpe->vecthandler[0].NextContiueCode = Contiue;/*hook try-except 【0】 block 可以调到任何IP,可自己扩展功能*/
//以下do-while为显示SEH-try链没啥作用
    do
        {
                printf( "Next:%08x,handler:%08x\n", pe->next, pe->handler );
                if( pe->vecthandler )
                {
                        vect_handler* v = pe->vecthandler;

                        while( v->vFlag == 0xffffffff )
                        {
                                printf( "------try:%d,handler:%08x,NextCode:%08x\n", ntry, v->TryHandler, v->NextContiueCode );
                                v++;
                                ntry++;
                        };
                };
                pe = pe->next;

        }while( pe!=(EXCEPTION_LIST*)0xffffffff );
       
        __try{
                /*ASM 这里会有mov [ebp-4],0*///try-except 【0】对应vecthandler[0]
                *v = 0;//将抛出异常,它已hooked
               
        }__except(EXCEPTION_EXECUTE_HANDLER)
        {
                          // 该异常处理将变化为调用handler函数
                 //异常处理完好后将调用Contiue函数;
               
        };
       
        __try{
                /*ASM 这里会有mov [ebp-4],1*///try-except 【1】对应vecthandler[1]
                *v = 0;
               
        }__except(EXCEPTION_CONTINUE_EXECUTION)
        {
               
        };
        getchar();
        return 0;
}


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (9)
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
全球没有第二家,太牛B了,顶一个
2009-2-6 18:25
0
雪    币: 7325
活跃值: (3803)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
3
LZ应该说一下你的编译器选项
不是所有编译器选项都能这么用的
2009-2-7 12:13
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
4
楼上点名我就说一下
VC6下可以通过
vmp在处理有seh的函数时也是替换了
struct __vect_handler 的 TryHandler 和NextContiueCode

2005是不行的
因为2005这两个值是简单加密的,并且每次进程都不同
原因是为了防止溢出
2009-2-7 12:21
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
5
学习学习~~
2009-2-8 11:07
0
雪    币: 224
活跃值: (15)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
shoooo和bughoho的讲座让我长见识了,海风月影提的编译选项还真没注意,VMP还一直没学习过,哈哈
2009-2-8 13:12
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
7
bughoho的讲座在哪?
2009-2-8 18:03
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
8
咋就没有你不知道的,太崇拜了
2009-2-8 18:39
0
雪    币: 7325
活跃值: (3803)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
9
在加密与解密III上
2009-2-8 20:19
0
雪    币: 224
活跃值: (15)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
没看加密与解密III呢,看了就不出来现眼了.
2009-2-9 09:39
0
游客
登录 | 注册 方可回帖
返回
//