WIN10使用VEH+硬件断点实现不修改代码完成破解

为什么要使用硬件断点?
有些程序会启动一个线程,实时检测代码节是否被修改,这样可以防止作弊者使用OD调试程序时下CC断点,这种技术叫全代码检测或CRC检测。为了绕过这种检测,大佬们想出了很多办法:

  • 干掉CRC线程
  • 干掉CRC函数的判断
  • 绕过CRC检测的位置,到更底层去修改
  • 硬件HOOK
  • 其他HOOK,欺骗CRC检测函数(虚表HOOK)
  • 干掉退出函数(ExitProcess)

本文介绍的是硬件断点(硬件HOOK)。

硬件断点原理

当执行到某个指令,DR0寄存器中存储了这条指令的地址,就会触发异常。如果使用 AddVectoredExceptionHandler 函数注册了全局异常处理,则程序会跳转到异常处理函数。在异常处理函数内,做相应的操作(或者什么也不做),最后JMP到触发异常的下一条指令,就完成了HOOK破解。
在异常处理函数内,可以通过 PEXCEPTION_POINTERS 参数判断触发异常的指令是不是我们定位的关键指令,如果是,才执行上述操作。

WIN7示例代码
本例使用DLL劫持技术,劫持winspool.drv。您也可以使用其他DLL注入技术,无所谓的。

winspool.drv VEH+硬件断点部分代码
注意,这段代码只能在WIN7上运行,在WIN10则无法断下,在WIN10中设置硬件断点必须先挂起线程,因此我们需要创建一个子线程,将主线程挂起后,再在主线程中设置硬件断点。可以参考这篇文章:https://bbs.pediy.com/thread-258083.htm

DWORD g_dwBreakpoint = 0x401053; // 关键指令,希望跳过这条指令

// 设置硬件断点函数
void SetHardwareBreakPoint()
{
   
	CONTEXT ctx;
	ctx.ContextFlags = CONTEXT_ALL;
	GetThreadContext(GetCurrentThread(), &ctx);
	ctx.Dr7 = (DWORD)1; // 启用Dr0
	ctx.Dr0 = g_dwBreakpoint; // 设置硬件断点	
	SetThreadContext(GetCurrentThread(), &ctx);
}

// 异常处理
  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
VEH机制中使用硬件断点可以帮助我们在特定的内存地址上设置断点,当程序执行到该地址时触发断点异常。以下是一个使用硬件断点VEH例子: ```c++ #include <Windows.h> // Vectored Exception Handler函数 LONG WINAPI VehHandler(PEXCEPTION_POINTERS pExceptionInfo) { // 判断是否是硬件断点异常 if (pExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP) { // 处理硬件断点触发逻辑 // ... // 取消硬件断点,恢复程序执行 CONTEXT* pContext = pExceptionInfo->ContextRecord; pContext->Dr0 = 0; pContext->Dr7 &= ~0x00000001; // 返回处理结果,终止异常处理链 return EXCEPTION_EXECUTE_HANDLER; } // 返回继续搜索异常处理链 return EXCEPTION_CONTINUE_SEARCH; } int main() { // 注册Vectored Exception Handler PVOID pHandler = AddVectoredExceptionHandler(1, VehHandler); if (pHandler == NULL) { // 处理注册失败情况 // ... return 1; } // 设置硬件断点 CONTEXT context; memset(&context, 0, sizeof(CONTEXT)); context.ContextFlags = CONTEXT_DEBUG_REGISTERS; context.Dr0 = 0x12345678; // 设置断点地址 context.Dr7 = 0x00000001; // 设置断点条件和长度 if (!SetThreadContext(GetCurrentThread(), &context)) { // 处理设置硬件断点失败情况 // ... RemoveVectoredExceptionHandler(pHandler); return 1; } // 触发硬件断点 int* p = reinterpret_cast<int*>(0x12345678); *p = 42; // 移除Vectored Exception Handler RemoveVectoredExceptionHandler(pHandler); return 0; } ``` 在上述代码中,我们首先定义了一个VEH处理函数`VehHandler`,当异常发生时会被调用。在该函数中,我们判断异常类型是否为硬件断点异常(EXCEPTION_SINGLE_STEP),如果是,则执行我们定义的硬件断点触发逻辑。在本例中,我们取消硬件断点(清除Dr0和Dr7寄存器的相应位),并返回`EXCEPTION_EXECUTE_HANDLER`来终止异常处理链。 在`main`函数中,我们首先注册VEH处理函数,然后使用`SetThreadContext`函数设置硬件断点。通过设置`Dr0`寄存器为要设置断点的地址,设置`Dr7`寄存器来指定断点条件和长度。如果设置成功,则触发硬件断点,程序会在指定地址处触发断点异常。最后,移除VEH处理函数并结束程序。 请注意,硬件断点使用需要注意调试器的干扰,因为调试器可能会使用硬件断点进行调试操作。因此,在实际应用中需要谨慎使用硬件断点,并根据具体需求进行详细的异常处理和错误处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值