VEH +硬件断点 HOOK



// dllmain.cpp : 定义 DLL 应用程序的入口点。

#include "stdafx.h"

#include "windows.h"

#include <d3d9.h>

#include <d3dx9.h>

#include <D3dx9tex.h>

#pragma comment(lib, "d3d9.lib")

#pragma comment (lib,"d3dx9.lib")

#pragma comment (lib,"winmm.lib")


HANDLE hbase;

DWORD oldprotect;

 DWORD index;



 __declspec(naked) void DrawIndexedPrimitive( LPDIRECT3DDEVICE9 pdev, D3DPRIMITIVETYPE type,INT BaseVertexIndex,UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount){

//设置一个空函数就是编译后没有函数头



_asm{

mov eax,dword ptr [index]

add eax,2//+2是因为头部指令是MOV EDI,EDI 又没有除法操作所以不会溢出这样我就+2 来跳过我们的硬件HOOK不让她重复执行~~~

jmp eax

 

}

}


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 Windows VEH(Vectored Exception Handling)实现硬件断点的示例: ```cpp #include <windows.h> // 全局变量用于保存旧的异常处理器 PVECTORED_EXCEPTION_HANDLER g_pPrevExceptionHandler = nullptr; // Vectored Exception Handler 回调函数 LONG CALLBACK VehHandler(EXCEPTION_POINTERS* pExceptionPointers) { // 检查是否是硬件断点异常(EXCEPTION_SINGLE_STEP) if (pExceptionPointers->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP) { // 处理硬件断点异常的逻辑 // ... // 可以在这里进行一些自定义的操作,如记录断点发生的位置、执行特定的代码等 // 恢复标志寄存器,以便继续执行 pExceptionPointers->ContextRecord->EFlags &= ~0x100; // 通过清除 TF(Trap Flag)位恢复标志寄存器 // 返回处理完成的标志 return EXCEPTION_CONTINUE_EXECUTION; } // 如果不是硬件断点异常,交给之前的异常处理器继续处理 if (g_pPrevExceptionHandler) { return g_pPrevExceptionHandler(pExceptionPointers); } // 如果没有之前的异常处理器,则返回异常处理完成的标志 return EXCEPTION_CONTINUE_SEARCH; } // 设置硬件断点 bool SetHardwareBreakpoint(void* address) { // 注册 Vectored Exception Handler g_pPrevExceptionHandler = AddVectoredExceptionHandler(1, VehHandler); if (!g_pPrevExceptionHandler) { // 注册失败 return false; } // 设置硬件断点 CONTEXT context; memset(&context, 0, sizeof(CONTEXT)); context.ContextFlags = CONTEXT_DEBUG_REGISTERS; // 获取当前线程的上下文 if (!GetThreadContext(GetCurrentThread(), &context)) { // 获取上下文失败 return false; } // 设置硬件断点 context.Dr0 = (DWORD_PTR)address; context.Dr7 |= 1; // 启用第一个硬件断点 // 设置上下文 if (!SetThreadContext(GetCurrentThread(), &context)) { // 设置上下文失败 return false; } // 设置成功 return true; } int main() { void* breakpointAddress = nullptr; // 设置硬件断点的地址 if (SetHardwareBreakpoint(breakpointAddress)) { // 成功设置硬件断点 // ... } else { // 设置硬件断点失败 // ... } return 0; } ``` 这个示例代码中,我们首先定义了一个全局变量 `g_pPrevExceptionHandler`,用于保存旧的异常处理器。然后,在 `VehHandler` 函数中,我们判断是否是硬件断点异常(EXCEPTION_SINGLE_STEP),如果是,则执行自定义的处理逻辑,并恢复标志寄存器以便继续执行。如果不是硬件断点异常,则将其交给之前的异常处理器继续处理。 在 `SetHardwareBreakpoint` 函数中,我们首先注册 Vectored Exception Handler,并保存旧的异常处理器。然后,获取当前线程的上下文,设置硬件断点的地址和相关的标志,最后将上下文设置回线程中。如果所有步骤都成功,则表示成功设置了硬件断点。 请注意,硬件断点的设置和使用可能会受到操作系统和硬件平台的限制,具体实现可能会有所不同。确保在实际使用时参考相关的文档和API参考以获取更详细和准确的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值