OutPutDebugString
本帖最后由 苏紫方璇 于 2023-12-30 21:08 编辑#include <iostream>
#include <Windows.h>
int main()
{
DWORD errorValue = 12345;
SetLastError(errorValue);
OutputDebugString("Test for debugger!");
if (GetLastError() == errorValue)
{
printf("没有检测到调试器");
getchar();
return TRUE;
}
else
{
printf("检测到调试器");
getchar();
return FALSE;
}
return 0;
}
有没有了解OutPutDebugString这个函数的这个函数执行成功与执行失败会影响 Eflag标志位吗???????? 这个是输出给DebugView看调试信息的 多了反检测功能? OutputDebugString作为一个API,执行成功的话应该会SetLastError为0 本帖最后由 sumile 于 2023-12-27 22:21 编辑
函数失败会改变LastError的值,反之则不改变。所以可以事先自己设置一个值,比如12345,然后调用OutputDebugString()最后再判断之前设置的值还是不是12345。如果不是12345(有改变)就说明函数执行失败,无调试器,楼主的代码写反了
以下内容出自此处
对于OutputDebugString函数,它的作用是在调试器中显示一个字符串,同时它也可以用来探测调试器的存在。使用SetLastError函数,将当前的错误码设置为一个任意值。如果进程没有被调试器附加,调用OutputDebugString函数会失败,错误码会重新设置,因此GetLastError获取的错误码应该不是我们设置的任意值。但如果进程被调试器附加,调用OutputDebugString函数会成功,这时GetLastError获取的错误码应该没改变。
网络上的确有这个检测调试的方法,但是实际情况是大部分调试器已经默认处理了这个问题,如果是想用来检测调试建议另寻套路。 忆魂丶天雷 发表于 2023-12-28 00:33
网络上的确有这个检测调试的方法,但是实际情况是大部分调试器已经默认处理了这个问题,如果是想用来检测调 ...
这种检测方法连vc编译器的调试器都检测不到 yes2 发表于 2023-12-27 21:19
OutputDebugString作为一个API,执行成功的话应该会SetLastError为0
按理说这个API执行成功与不成功都会改变Eflag标志的值,可将程序拖入OD,观察这个函数应该是执行成功了,eax=设定的Eflag的值,可就是对Eflag的值没影响,所以没法检测到
页:
[1]