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

软件反调试(1)- 基于进程列表的检测

反调原理

在打开了调试器的情况下,在任务管理器中可以看到调试器的进程信息,通过枚举列表来进行检查当前是否打开了调试器

如果调试程序的执行文件被改名了,那么该检测方法就会失效,通常只能作为辅助的检查

20250628091410

实现细节

使用 vs2022 新建 c++ 的控制台项目 anti01,并将工程的字符集改为 “多字节”

20250628085207

在工程的 main.cpp 文件中增加以下代码,通过 windows 的 TlHelp32 库来遍历进程,检查是否有目标进程在运行

这里只检查了 x64dbg 调试器名称,实现上需要检查所有的调试器名称

#include <iostream>
#include <thread>
#include <windows.h>
#include <TlHelp32.h>bool CheckProcess(const char* szProcessName)
{HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hSnapshot == INVALID_HANDLE_VALUE){return false;}PROCESSENTRY32 pe32 = { 0 };pe32.dwSize = sizeof(PROCESSENTRY32);BOOL bRet = Process32First(hSnapshot, &pe32);while (bRet){if (strstr(pe32.szExeFile, szProcessName) != NULL){std::cout << "find debug process:" << pe32.szExeFile << std::endl;CloseHandle(hSnapshot);return true;}bRet = Process32Next(hSnapshot, &pe32);}CloseHandle(hSnapshot);return false;
}void ThreadProc()
{while (true){if (CheckProcess("x64dbg")){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;
}

运行结果

编译该代码生成 anti01.exe 执行文件,然后启动 x64dbg,在任务管理器中可以看到该进程信息,运行 anti01.exe,输出信息如下图

当业务进程检测到当前运行调试进程后,可以做出退出进程,或暂停业务等处理

20250628091656

逆向处理

为了尽量接近实现上,这里将修改编译模式为 release,然后运行 anti01.exe,并启动 x64dbg 附件到 anti01 进程上

附加到进程后,将运行模块切换到 anti01 模块上来,并右键搜索该模块下的字符串

20250628093832

字符串列表中可以看到关心的字符串,双击该记录跳转到该字符串引用的地址上

20250628093911

可以看到内存地址中的 x64dbg 值,任意修改该值即可以

20250628100458

选定该部分内存右键填充输入任意字符,如 ‘0’ 然后确定,将值修改为 ‘000000’

20250628102330

在 cpu 窗口中右键补丁,保存为修补文件 anti01-hack.exe,启动修补文件,就可以对调试器检测进行绕过了

20250628102613

后记

一般情况下,是不会这么顺利达成的,比如反调试一般还会有动态内存、内存保护、文件完整性保护等其他额外的手段,就会导致无法修改

这里只是最基本的,通过进程列表的反调试以及绕过处理,暂不涉及这些复杂的场景

http://www.lryc.cn/news/576395.html

相关文章:

  • Spring AI Alibaba 入门指南:打造企业级 AI 应用
  • 《从 0 到 1 掌握正则表达式:解析串口数据的万能钥匙》
  • Note2.3 机器学习:Adaptive Learning Rate
  • golang中struct中大小写对gin框架的影响
  • 深入剖析AI大模型:Dify的介绍
  • SpringMVC系列(七)(Restful架构风格(下))(完结篇)
  • SpringMVC系列(五)(响应实验以及Restful架构风格(上))
  • 微软人工智能证书AI-102 | 如何快速通过?
  • JavaScript---数组篇
  • 循环向python异步中增加task的几个方法
  • 【unity游戏开发——网络】网络协议、TCP vs UDP 本质区别
  • 卸载Modelsim/Qustasim方法
  • AngularJS Git 提交消息规范
  • Centos 8设置固定IP
  • Linux通过Crontab实现自启动
  • Grab×亚矩阵云手机:以“云端超级节点”重塑东南亚出行与数字生活生态
  • 第十节:Vben Admin 最新 v5.0 (vben5) 快速入门 - 菜单管理(下)
  • docker部署后端服务的脚本
  • 深入详解:决策树算法的概念、原理、实现与应用场景
  • WHERE 子句中使用子查询:深度解析与最佳实践
  • 设计模式精讲 Day 16:迭代器模式(Iterator Pattern)
  • 如何解决电脑windows蓝屏问题
  • VScode使用usb转网口远程开发rk3588
  • 【龙泽科技】新能源汽车故障诊断仿真教学软件【吉利几何G6】
  • [Linux]从零开始的STM32MP157移植Ubuntu根文件系统教程
  • ubuntu-server 与 ubuntu-live-server 的区别 笔记250628
  • React环境搭建及语法简介
  • Word之空白页删除2
  • 利用GPU加速TensorFlow
  • python多线程详细讲解