当前位置: 首页 > ds >正文

软件反调试(5)- 基于注册表实时调试器检测

反调原理

当程序发生异常崩溃的时候,如果设置了系统的调试器,那么就会启动调试器来调试该异常

这个信息是记录在注册表中的,win32 和 win64 版本分别是两个不同的路径,Debugger 表示调试器路径,Auto 为 1 表示启用自动附加调试

//32 位调试器的注册表路径
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug//64 位调试器的注册表路径
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

在调试器中也可以进行设置,设置后将会覆写注册表这里的配置项,在程序发生异常时将会启动新设置的调试器来调试异常

比如,下面是 x64dbg 的设置,勾选的话将会修改注册表中的调试器配置

安装 visual studio 默认会添加这里的配置项,当检测到用户机器配置了 vs 调试器,并不一定需要中止进程,大部分安装 vs 的用户也不一定需要反调试

但是可能会将该用户的行为进行重点监控,反调试的权重是肯定会比普通用户高的,对于注册表配置是 x64dbg 这种的,那么就可以直接中止进程并提示警告

实现代码

检测注册表实时调试器的完整的代码如下:

#include <iostream>
#include <thread>
#include <string>
#include <vector>
#include <windows.h>
#include <TlHelp32.h>bool CheckProcessIsDebugging()
{BOOL isx64 = FALSE;HKEY hKey = NULL;char key[] = "Debugger";char regValue[MAX_PATH] = { 0 };DWORD dwType = 0, dwLegth = MAX_PATH;char reg32[] = "SOFTWARE\\WOW6432Node\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug";char reg64[] = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug";//判断当前进程版本IsWow64Process(GetCurrentProcess(), &isx64);RegCreateKey(HKEY_LOCAL_MACHINE, isx64 ? reg64 : reg32, &hKey);RegQueryValueEx(hKey, key, NULL, &dwType, (LPBYTE)regValue, &dwLegth);return (strstr(regValue, "debugger") != NULL);
}void ThreadProc()
{while (true){if (CheckProcessIsDebugging()){std::cout << "Debugging..." << std::endl;}else{std::cout << "Running..." << std::endl;}std::this_thread::sleep_for(std::chrono::milliseconds(1000));}
}int main()
{std::thread thrd(ThreadProc);thrd.join();return 0;
}

逆向处理

逆向处理也很简单,调试前将这里的配置删除即可,可以使用一个 bat 脚本来实现

@echo offecho 正在删除 32 位 JIT 调试器配置...
reg delete "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug" /v Debugger /f
reg delete "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug" /v Auto /fecho 正在删除 64 位 JIT 调试器配置...
reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug" /v Debugger /f
reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug" /v Auto /fecho 已完成删除。
pause
http://www.xdnf.cn/news/16007.html

相关文章:

  • [Python] -项目实战7- 用Python和Tkinter做一个图形界面小游戏
  • 我的世界-推理
  • 基于Event Sourcing和CQRS的微服务架构设计与实战
  • 连接语言大模型(LLM)服务进行对话
  • 随着GPT-5测试中泄露OpenAI 预计将很快发布 揭秘GPT-5冲击波:OpenAI如何颠覆AI战场,碾压谷歌和Claude?
  • [硬件电路-58]:根据电子元器件的控制信号的类型分为:电平控制型和脉冲控制型两大类。
  • 威力导演 12:革新级影音创作平台——专业特效与极致效率的完美融合
  • 算法题(176):three states
  • 100个GEO基因表达芯片或转录组数据处理27 GSE83456
  • [simdjson] 实现不同CPU调度 | 自动硬件适配的抽象
  • JAVA面试宝典 -《API设计:RESTful 与 GraphQL 对比实践》
  • Linux操作系统之线程(四):线程控制
  • RabbitMQ核心组件浅析:从Producer到Consumer
  • 【Django】DRF API版本和解析器
  • ubuntu-linux-pycharm-社区版安装与django配置
  • 高性能熔断限流实现:Spring Cloud Gateway 在电商系统的实战优化
  • Linux网上邻居局域网络共享工具Samba及Smb协议,smbd,nmbd服务,smbpasswd,pdbedit命令,笔记250720
  • 数组算法之【合并两个有序数组】
  • 无线通信相关概念
  • 【机器学习深度学习】魔塔社区模型后缀全解析:Base、Chat、Instruct、Bit、Distill背后的技术密码
  • 【Elasticsearch】冷热集群架构
  • 力扣 hot100 Day50
  • 在Ubuntu22系统上离线部署ai-infra-guard教程【亲测成功】
  • windows C#-本地函数
  • 【计算机组成原理】原码、补码和移码
  • ZooKeeper学习专栏(一):分布式协调的核心基石
  • 阶段1--Linux中的计划任务
  • 大模型词表设计与作用解析
  • 开源安全大模型Foundation-Sec 8B的安全实践
  • Baumer工业相机堡盟工业相机如何通过YoloV8的深度学习模型实现螺母螺丝的分类检测(C#代码,UI界面版)