编程论坛

 找回密码
 立即注册
广告联系qq1031180668广告位
查看: 80|回复: 0

[windows综合] VEH 硬断HOOK DR0 DR7

[复制链接]
  • ta_mind

    2018-8-17 21:57
  • classn_01: 71 classn_02

    [LV.6]常住居民II

    981

    主题

    1702

    帖子

    3331

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    3331

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

    发表于 2018-7-10 18:10:40 | 显示全部楼层 |阅读模式
    源码作者:郁金香
    [C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    #include "stdafx.h"
    #include "windows.h"
    
    #pragma comment (lib,"winmm.lib")
    
    //CALL_FIRST means call this exception handler first;
    //CALL_LAST means call this exception handler last
    #define CALL_FIRST 1  
    #define CALL_LAST 0
    
    
    
    DWORD g_HookAddress; //断点地址
    
    void __declspec(naked)  NewHookCall()
    {
            //设置一个裸函数就是编译后没有函数头
    
            _asm{
                        mov eax, g_HookAddress 
                            add eax,1//+1是用来跳过我们的硬件HOOK不让她重复执行~~~ 因为头部有push ebp  
                            //恢复跳过的3字节 指令
                            push ebp
    
                            jmp eax //跳转到g_HookAddress+3处 执行
    
            }
    }
    
    //-------------- 
    int WINAPI filter_SendCall(
            char* pbuf,         // 包地址
            DWORD nSize  //大小
    )    //保留 一般为0 
    {
    
            //把字节集数据 转换成 16进制可读字符串
        DbgPrintf_("yjx:filter_SendCall (%08X,%d)",pbuf,nSize);
            //注意 释放数组空间 不要用delete而要用delete[]
    
            return 1;
    };
    
    
    //SetUnhandledExceptionFilter
    DWORD NTAPI yjx_VEH_NODE(EXCEPTION_POINTERS * exceptioninfo)
    {//异常处理函数
            static DWORD dwIndex=0;
            //DbgPrintf_("enter excepttion handler %08X==%08X ?.\n",exceptioninfo->ExceptionRecord->ExceptionAddress,g_HookAddress);
            if (exceptioninfo->ExceptionRecord->ExceptionAddress==(PVOID)g_HookAddress)//比较异常地址是不是我们设置的地方
            {
    
                    DWORD *dwESP=(DWORD*)exceptioninfo->ContextRecord->Esp;
    
                    DbgPrintf_("[%08d:]%08X,%08X,%08X,%08X \n",dwIndex++,dwESP[1],dwESP[2],dwESP[3],dwESP[4]);
                    filter_SendCall((char*)dwESP[1],dwESP[2]);  //过滤函数
                    exceptioninfo->ContextRecord->Eip=(DWORD)NewHookCall;//是就设置EIP跳转到我们用来处理的函数
    
                    return EXCEPTION_CONTINUE_EXECUTION;//返回 这个函数我们处理了 你不用管了,管了也白搭~~
            }else{
                    exceptioninfo->ContextRecord->Dr0=g_HookAddress;//不是就重新设置断点 //防止反硬断
                    exceptioninfo->ContextRecord->Dr7=0x405;
                    //0x405=0010000000101
                    //001 //12-10位是 001 保留
                    //L0与L1 被置1 G0与G1被置0了
                    //101表示 L0与L1 局部线程硬断 线性地址是DR0与DR1
                    return EXCEPTION_CONTINUE_SEARCH;//返回 继续搜索 异常处理
            }
            return EXCEPTION_CONTINUE_SEARCH;//返回 交由其它VEH处理
    
    }
    
    
    
    
    
    BOOL SetHookhd( DWORD dwTid,DWORD hookAddress)
    {//设置硬断
            HANDLE hthrad;
            CONTEXT pThreadConText;
            g_HookAddress=hookAddress;
    
            memset(&pThreadConText,0,sizeof(CONTEXT));//清零结构内存
            pThreadConText.ContextFlags=CONTEXT_ALL;//设置flag
            //关键在于  这个线程ID
            hthrad=OpenThread(THREAD_ALL_ACCESS,FALSE,dwTid);//这里我直接用的硬编码 实际作用需要全局线程HOOK 我记得DRX可以不用XX每个线程达到目的的=//打开线程
            DbgPrintf_("hthrad=%08X  tid=\n",hthrad,dwTid);
            if (hthrad==NULL)
            {
                    return FALSE;
            }
            SuspendThread(hthrad);//暂停线程
            BOOL br=GetThreadContext(hthrad,&pThreadConText);//获取线程环境(上下文)
            if (br==FALSE)
            {
                    DbgPrintf_("获取上下文失败...");
            }
            pThreadConText.Dr0=g_HookAddress;//这里是HOOK地址
            pThreadConText.Dr1=0;//这里是HOOK地址
            pThreadConText.Dr2=0;//这里是HOOK地址
            pThreadConText.Dr3=0;//这里是HOOK地址
    
            pThreadConText.Dr7=0x405;//10000000101 //dr0 dr1有效  // 10001010101 //4个硬断都有效
            //0x405=0010000000101
            //001 //12-10位是 001 保留
            //L0与L1 被置1 G0与G1被置0了
            //101表示 L0与L1 局部线程硬断 线性地址是DR0与DR1
    
            br=SetThreadContext(hthrad,&pThreadConText);//设置上下文
            ResumeThread(hthrad);//线程跑起来吧~~~
            CloseHandle(hthrad);//防止句柄泄露 关句柄好习惯~~~
            //DbgPrintf_("setHwBreakPoint ..");
            if (br)
            {
                    AddVectoredExceptionHandler(CALL_FIRST,(PVECTORED_EXCEPTION_HANDLER)yjx_VEH_NODE);//添加VEH异常处理
            }
            return br;
    }
    
    

    不积跬步,无以至千里
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|Archiver|小黑屋|sitemap|编程论坛 - 一个单纯的编程学习交流论坛 ( 豫ICP备15032706号 )

    GMT+8, 2018-9-26 12:49 , Processed in 1.115010 second(s), 24 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表