为什么要使用硬件断点?
有些程序会启动一个线程,实时检测代码节是否被修改,这样可以防止作弊者使用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; // 启用Dr0ctx.Dr0 = g_dwBreakpoint; // 设置硬件断点   SetThreadContext(GetCurrentThread(), &ctx);
}// 异常处理函数
DWORD NTAPI ExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{if ((DWORD)pExceptionInfo->ExceptionRecord->ExceptionAddress == g_dwBreakpoint){pExceptionInfo->ContextRecord->Eip += 6;// 已经处理了异常,不需要调用下一个异常处理来处理该异常return EXCEPTION_CONTINUE_EXECUTION;}return EXCEPTION_CONTINUE_SEARCH;
}
// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{if (dwReason == DLL_PROCESS_ATTACH){ DisableThreadLibraryCalls(hModule);AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER) ExceptionHandler);SetHardwareBreakPoint(); // 关键跳,希望跳过这条指令return Load();}else if (dwReason == DLL_PROCESS_DETACH){Free();}return TRUE;
}

WIN10示例代码

DWORD g_dwBreakpoint = 0x401053; // 关键指令,希望跳过这条指令// 设置硬件断点函数
void SetHardwareBreakPoint()
{CONTEXT ctx;ctx.ContextFlags = CONTEXT_ALL;GetThreadContext(GetCurrentThread(), &ctx);ctx.Dr7 = (DWORD)0x1; // 启用Dr0ctx.Dr0 = g_dwBreakpoint; // 设置硬件断点 SetThreadContext(GetCurrentThread(), &ctx);
}// 异常处理函数
DWORD NTAPI ExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{if ((DWORD)pExceptionInfo->ExceptionRecord->ExceptionAddress == g_dwBreakpoint){pExceptionInfo->ContextRecord->Eip += 6;// 已经处理了异常,不需要调用下一个异常处理来处理该异常return EXCEPTION_CONTINUE_EXECUTION;}return EXCEPTION_CONTINUE_SEARCH;
}// 设置硬件断点WIN10版本:挂起主线程->设置硬件断点->恢复主线程
DWORD WINAPI SetHardwareBreakPointWIN10Version(LPVOID lpMainThreadId)
{HANDLE hMainThread = OpenThread(THREAD_ALL_ACCESS,TRUE,(DWORD)lpMainThreadId);SuspendThread(hMainThread);CONTEXT ctx;ctx.ContextFlags = CONTEXT_ALL;GetThreadContext(hMainThread, &ctx);ctx.Dr7 = (DWORD)0x1; // 启用Dr0ctx.Dr0 = g_dwBreakpoint; // 设置硬件断点  SetThreadContext(hMainThread, &ctx);ResumeThread(hMainThread);return 0;
}
// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{if (dwReason == DLL_PROCESS_ATTACH){ DisableThreadLibraryCalls(hModule);AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER) ExceptionHandler);//SetHardwareBreakPoint(); // 关键跳,希望跳过这条指令CreateThread(0, 0, SetHardwareBreakPointWIN10Version, (LPVOID)GetCurrentThreadId(), 0, 0);return Load();}else if (dwReason == DLL_PROCESS_DETACH){Free();}return TRUE;
}

在WIN10的运行结果

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

  1. 【Windows 逆向】OD 调试器工具 ( 分析 OD 硬件断点处的关键代码 | 添加硬件断点 | 关键代码 | MOV 指令 | EAX 寄存器值分析 | 使用命令查看 esi+0cc 地址 )

    文章目录 一.添加硬件断点 二.关键代码 三.MOV 汇编指令格式 四.EAX 寄存器值分析 五.使用命令查看 esi+0cc 地址 一.添加硬件断点 在上一篇博客中 , 在子弹个数数据内存地址 07 ...

  2. 【Windows 逆向】OD 调试器工具 ( OD 调试数据时硬件断点对应的关键代码 | 删除硬件端点恢复运行 )

    文章目录 前言 一.OD 调试数据时硬件断点对应的关键代码 二.删除硬件端点恢复运行 前言 在 [Windows 逆向]OD 调试器工具 ( CE 中获取子弹动态地址前置操作 | OD 中调试指定地址 ...

  3. 代码实战硬件断点hook

    见字如面,我是东北码农. 上文我们介绍了硬件断点,大家可以回顾一下.本文将介绍使用硬件断点+veh,实现硬件断点hook. 关注"东北码农"后,聊天框回复"硬件断点hoo ...

  4. 游戏逆向-2.2VEH+软件/硬件断点实现hook

    在上一篇文章中概述了几种常见的inline hook,这章将会讲述通过Windows异常机制实现hook的方法. 实现异常断点hook的步骤: 1.注册veh异常处理函数 2.设置硬件断点 3.通过v ...

  5. 软件调试学习笔记(六)—— 硬件断点

    软件调试学习笔记(六)-- 硬件断点 硬件断点 设置硬件断点 触发硬件断点 处理硬件断点 实验:硬件断点的设置与处理 硬件断点 描述: 与软件断点与内存断点不同,硬件断点不依赖被调试程序,而是依赖于C ...

  6. [系统安全] 二十四.逆向分析之OllyDbg调试INT3断点、反调试、硬件断点与内存断点

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  7. OD的 CC断点,内存访问断点,硬件断点 解析

    1.F2断点,API断点 1)本质CC断点 2)以API断点为例 xxxx=GetProcAddress//获得函数首 地址 VitualProtectEx()//修改函数首地址权限为 可写     ...

  8. X86逆向教程10:学会使用硬件断点

    本节课我们将学习硬件断点的使用技巧,硬件断点是由硬件提供给我们的一组寄存器,我们可以对这些硬件寄存器设置相应的值,然后让硬件帮我们断在需要下断点的地址上面,这就是硬件断点,硬件断点依赖于寄存器,这些寄 ...

  9. 如何对抗硬件断点--- 调试寄存器

    1.前言 在我跨入ollydbg的门的时候,就对ollydbg里面的各种断点充满了疑问,以前我总是不明白普通断点,内存断点,硬件断点有什么区别,他们为什么 有些时候不能混用,他们的原理是什么,在学习了 ...

  10. 硬件断点和软件断点的区别

    硬断点--break point 软断点--assert 简单的解释: 硬件断点:硬断点需要硬件寄存器提供支持,断点的数目受Embedded ICE中的Watchpoint数目的限制,但是可以在任何地 ...

最新文章

  1. GBDT家族:GBDT家族成员的演进路劲、xgboost模型、lightGBM、LightGBM 相对于 XGBoost 的优点、catboost、xgboost、catboost、lightGBM对
  2. MySQL 5.7 并行复制实现原理与调优
  3. 慢就是快的人生哲理_家里的防臭地漏下水慢怎么办?
  4. 李开复Bengio大咖对话:下一阶段AI最大机遇在这4个领域
  5. Sdk Manager.exe 闪退问题的解决
  6. python主循环方法mainloop_python gobject.mainloop吞噬信号事件
  7. QT5获取运行程序的工作目录与程序所在的目录
  8. struts过滤器和拦截器的区别
  9. C++/C--文件及函数注释【转载】
  10. getallheaders函数在服务器报500错误_「干货」服务器性能优化的8种常用方法
  11. 激光雷达厂商速腾聚创获3亿元融资,阿里菜鸟、上汽,北汽入股
  12. poj1789 最小生成树
  13. 华为牛人在华为工作十年的感悟!--总结[华为的10年工作]
  14. Linux 文件系统启动记录
  15. 国外问卷调查有哪几种类型?
  16. 网页打印问题-页面显示不全
  17. ORDER BY语句报错Out of sort memory, consider increasing server sort buffer size
  18. 怎样才算通用人工智能?
  19. Android 关于极光推送退出APP时清空通知的问题
  20. 【python办公自动化】如何在Excel表格里面插入对象

热门文章

  1. windows内核提权漏洞发现与利用
  2. python应用程序无法正常启动0xc0000142_电脑提示应用程序错误无法正常启动0xc0000142的解决办法...
  3. 游戏虚拟引擎自学_自学5个小时,如何做出一个游戏?
  4. 深层网络梯度消失-爆炸原因
  5. Python-Level2-day11:TCP客户端/服务端传输(循环模型之短连接与长连接形态);TCP粘包问题;与UDP对比;数据传输过程原理;
  6. 有关SoftICE的详细操作指导教程
  7. office2016显示已经激活,但每次打开都跳出激活页面
  8. 手机号码邮箱 验证规则(最新)
  9. 从零和到竞合 亚马逊为何联姻国美?
  10. 阿里研究员玄难:如何做电商业务中台