开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1607|回复: 4
收起左侧

[源码分享] C/C++检测进程是否被调试

[复制链接]
发表于 2015-12-13 16:59:28 | 显示全部楼层 |阅读模式   辽宁省沈阳市

程序使用API SetUnhandledExceptionFilter 来注册一个未处理异常的函数1,如果进程没有被调试,那么会触发一个未处理异常,导致操作系统会将控制权交给函数1。如果进程被调试,则调试器会捕捉这个未处理异常。这样,我们的函数1也就不会被执行了。

这里在触发异常时,则是跳回原来的代码来执行,而不会退出程序。

UnhandledExceptionFilter 这个函数修改了EIP的值,在参数_EXCEPTION_POINTERS中,保存了触发异常的指令地址。所以根据这个指令地址修改寄存器中EIP的值就可以了。

如果写成控制台程序,则这个控制台程序要支持MFC。 我的IDLE是VS2012。


  1. #include "stdafx.h"
  2. #include "ConsoleApplication66.h"

  3. #ifdef _DEBUG
  4. #define new DEBUG_NEW
  5. #endif


  6. CWinApp theApp;

  7. using namespace std;
  8. LONG WINAPI UnhandledExceptionFilter(struct _EXCEPTION_POINTERS *pei);
  9. bool UnhandledExceptionFilterApproach();
  10. int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
  11. {
  12.         int nRetCode = 0;

  13.         HMODULE hModule = ::GetModuleHandle(NULL);

  14.         if (hModule != NULL)
  15.         {
  16.                 if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
  17.                 {
  18.                         _tprintf(_T("错误\n"));
  19.                         nRetCode = 1;
  20.                 }
  21.                 else
  22.                 {
  23.                         if(!UnhandledExceptionFilterApproach())
  24.                         {
  25.                                 puts("Hello World!");
  26.                                 printf("Press any key to continue");
  27.                                 getchar();
  28.                         }
  29.                         return 0;
  30.                 }
  31.         }
  32.         else
  33.         {
  34.                 _tprintf(_T("错误: GetModuleHandle 失败\n"));
  35.                 nRetCode = 1;
  36.         }

  37.         return nRetCode;
  38. }
  39. LONG WINAPI UnhandledExceptionFilter(struct _EXCEPTION_POINTERS *BlackDragon)
  40. {
  41.         SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)BlackDragon->ContextRecord->Eax);
  42.         BlackDragon->ContextRecord->Eip += 2;
  43.         //继续执行进程剩余指令
  44.         return EXCEPTION_CONTINUE_EXECUTION;
  45. }
  46. bool UnhandledExceptionFilterApproach()//检测调试器
  47. {
  48.         SetUnhandledExceptionFilter(UnhandledExceptionFilter);
  49.         __asm
  50.         {
  51.                 //初始化
  52.                 xor eax,eax
  53.                 //触发异常
  54.                 div eax
  55.         }
  56.         return false;
  57. }
复制代码



 楼主| 发表于 2015-12-13 20:45:48 | 显示全部楼层   辽宁省沈阳市
lolskin 发表于 2015-12-13 18:55
利用自身产生异常,调试模式下 OD可设置 "忽略传递给程序异常",那么该程序不会接收到这个异常,则为被调试, ...

这样是检测调试器中最简单的一个了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-13 20:45:19 | 显示全部楼层   辽宁省沈阳市
lolskin 发表于 2015-12-13 18:55
利用自身产生异常,调试模式下 OD可设置 "忽略传递给程序异常",那么该程序不会接收到这个异常,则为被调试, ...

就是这个原理。。。
回复 支持 反对

使用道具 举报

结帖率:43% (3/7)
发表于 2015-12-13 18:55:57 | 显示全部楼层   广西壮族自治区钦州市
简单的 Anti SEH
回复 支持 反对

使用道具 举报

结帖率:43% (3/7)
发表于 2015-12-13 18:55:13 | 显示全部楼层   广西壮族自治区钦州市
利用自身产生异常,调试模式下 OD可设置 "忽略传递给程序异常",那么该程序不会接收到这个异常,则为被调试,反之,在未调试状态该程序接收到这个异常.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表