鑫郁飞网络技术-郁金香灬老师

 找回密码
 立即注册

QQ登录

只需一步,快速开始

郁金香 外挂开发(实战)郁金香 终身VIP 尊贵特权郁金香 VIP学员办理任鸟飞2015外挂教程
◆招传奇霸业辅助作者◆论坛VIP会员账号郁金香游戏外挂制作 终极教程   ◆招传奇霸业辅助作者◆
查看: 52|回复: 0

VEH 硬断HOOK DR0 DR7

[复制链接]
发表于 2018-7-9 22:36:54 | 显示全部楼层 |阅读模式

#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;
}


郁金香外挂教程,学习中...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


QQ|小黑屋|手机版|鑫郁飞网络技术-郁金香灬老师 ( 苏ICP备10059359号 )

GMT+8, 2018-7-18 14:52 , Processed in 0.069257 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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