请选择 进入手机版 | 继续访问电脑版
微信扫一扫 分享朋友圈

已有 724 人浏览分享

开启左侧

VEH 硬断HOOK DR0 DR7

[复制链接]
724 0
源码作者:郁金香
[mw_shl_code=c,true]#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;
}

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

本版积分规则

0

关注

37

粉丝

1150

主题
热门资讯
网友晒图
图文推荐
  • 联系我们
  • 邮箱:admin@c0ks.com(请把#改成@)
  • 电话:18530790808
  • QQ客服 1031180668
  • 工作时间:周一至周五(早上9点至下午5点)
  • 微信二维码

  • 扫描访问手机版

Archiver|手机版|小黑屋|从零开始

GMT+8, 2020-5-26 01:25 , Processed in 0.098932 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

  • QQ: 1031180668

    客服电话

    18530790808

    电子邮件

    admin@c0ks.com

    在线时间:8:00-16:00