C/C++检测进程是否被调试
来源:互联网 发布:java环境配置 编辑:程序博客网 时间:2024/06/05 10:11
程序使用API SetUnhandledExceptionFilter 来注册一个未处理异常的函数1,如果进程没有被调试,那么会触发一个未处理异常,导致操作系统会将控制权交给函数1。如果进程被调试,则调试器会捕捉这个未处理异常。这样,我们的函数1也就不会被执行了。
这里在触发异常时,则是跳回原来的代码来执行,而不会退出程序。
UnhandledExceptionFilter 这个函数修改了EIP的值,在参数_EXCEPTION_POINTERS中,保存了触发异常的指令地址。所以根据这个指令地址修改寄存器中EIP的值就可以了。
如果写成控制台程序,则这个控制台程序要支持MFC。 我的IDLE是VS2012。
#include "stdafx.h"#include "ConsoleApplication66.h"#ifdef _DEBUG#define new DEBUG_NEW#endifCWinApp theApp;using namespace std;LONG WINAPI UnhandledExceptionFilter(struct _EXCEPTION_POINTERS *pei);bool UnhandledExceptionFilterApproach();int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){int nRetCode = 0;HMODULE hModule = ::GetModuleHandle(NULL);if (hModule != NULL){if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0)){_tprintf(_T("错误\n"));nRetCode = 1;}else{if(!UnhandledExceptionFilterApproach()){puts("Hello World!");printf("Press any key to continue");getchar();}return 0;}}else{_tprintf(_T("错误: GetModuleHandle 失败\n"));nRetCode = 1;}return nRetCode;}LONG WINAPI UnhandledExceptionFilter(struct _EXCEPTION_POINTERS *BlackDragon){SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)BlackDragon->ContextRecord->Eax);BlackDragon->ContextRecord->Eip += 2;//继续执行进程剩余指令return EXCEPTION_CONTINUE_EXECUTION;}bool UnhandledExceptionFilterApproach()//检测调试器{SetUnhandledExceptionFilter(UnhandledExceptionFilter);__asm{//初始化xor eax,eax//触发异常div eax}return false;}
0 0
- C/C++检测进程是否被调试
- [C++]使用FS寄存器判断进程是否被调试
- C++--------检测电脑是否休眠过
- 如何检测程序是否被调试
- 检测当前进程是否被挂起
- 检测进程是否存在
- 用C#检查一个进程是否打开
- c语言实现查看进程是否存在
- C语言判断某进程是否存在
- C监控进程是否存在的方法
- Linux C语言检查进程是否存在
- C监控进程是否存在的方法
- C#检测是否文件是否被其他进程占用
- 【C/C++】判断指定进程是否为x64的方法
- [Windows]_[C/C++]_[如何调试子进程]
- 用c#怎么检测iis应用程序池是否被停止了,即它的状态
- 检测网络是否连接的两种方法(C#)
- 检测随机数是否为一个素数的C/C++实现
- SSL/TLS 协议详解
- 编程珠玑 第三部分 应用
- HTML5基础--新特性
- 忘记mysq rootl密码后解决办法
- java竞赛-大数阶乘问题
- C/C++检测进程是否被调试
- edX-Cypress OVA导入后个性定制
- HTML5基础--开发工具
- C-050.条件编译
- EL表达式---关系运算符
- NYOJ-33-蛇形填数
- MXNet安装教程
- 【后缀数组系列】二、后缀数组的两种求法
- 学习日记--第三方开源mpandroidchart统计图片测试