closehandle API,x64 Windows上的句柄异常无效
如官方文件()所述 如果应用程序在调试器下运行,则如果函数收到无效的句柄值或伪句柄值,则会引发异常 因此,以下代码可用于检测程序是否正在调试(因为句柄0x1始终无效)closehandle API,x64 Windows上的句柄异常无效,windows,debugging,winapi,windows-7-x64,Windows,Debugging,Winapi,Windows 7 X64,如官方文件()所述 如果应用程序在调试器下运行,则如果函数收到无效的句柄值或伪句柄值,则会引发异常 因此,以下代码可用于检测程序是否正在调试(因为句柄0x1始终无效) #包括“stdafx.h” #包括 #包括 #包括 int _tmain(int argc,_TCHAR*argv[]{ 布尔标志=假; __试一试{ 关闭手柄((手柄)0x1); } __EXCEPTION(异常\u执行\u处理程序){ flag=true; } 如果(标志==false){ printf(“未调试\n”); }
#包括“stdafx.h”
#包括
#包括
#包括
int _tmain(int argc,_TCHAR*argv[]{
布尔标志=假;
__试一试{
关闭手柄((手柄)0x1);
}
__EXCEPTION(异常\u执行\u处理程序){
flag=true;
}
如果(标志==false){
printf(“未调试\n”);
}否则{
printf(“已调试的\n”);
}
}
我使用VisualStudio2008编译了这段代码,创建了一个32位二进制文件
它在Windows XP和Windows 7 32位上正常工作,但在Windows 7 64位上不工作,因为它总是返回“未调试”
你知道为什么会这样吗?
谢谢。这可能与32位仿真层有关。但是,为什么不直接使用IsDebuggerPresent函数呢?如果他试图“隐藏”调试器检测,那么IsDebuggerPresent更容易“绕过”,因为任何人都可以在PEB中清空正在调试的布尔值。避免CloseHandle技巧需要一个二进制绕道(同样,非常简单,但比简单的内存写入要高一点)。CloseHandle API引发的异常在调试应用程序以检测句柄何时错误关闭两次时也很有用。我认为这是32位仿真层的一个bug。这很奇怪,因为官方文档中没有报告32位和64位系统之间的这种不同行为。调试器甚至没有看到异常吗?如果调试器也是32位的呢?我尝试使用32位调试器,但在Windows 7 64位中未检测到异常。
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <string>
int _tmain(int argc, _TCHAR* argv[]){
bool flag = false;
__try {
CloseHandle((HANDLE)0x1);
}
__except (EXCEPTION_EXECUTE_HANDLER) {
flag = true;
}
if (flag == false){
printf("Not debugged\n");
}else{
printf("Debugged\n");
}
}