wuyingjie2022 发表于 2023-12-27 20:23

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标志位吗????????

冥界3大法王 发表于 2023-12-27 20:40

这个是输出给DebugView看调试信息的 多了反检测功能?

yes2 发表于 2023-12-27 21:19

OutputDebugString作为一个API,执行成功的话应该会SetLastError为0

sumile 发表于 2023-12-27 22:17

本帖最后由 sumile 于 2023-12-27 22:21 编辑

函数失败会改变LastError的值,反之则不改变。所以可以事先自己设置一个值,比如12345,然后调用OutputDebugString()最后再判断之前设置的值还是不是12345。如果不是12345(有改变)就说明函数执行失败,无调试器,楼主的代码写反了

以下内容出自此处
对于OutputDebugString函数,它的作用是在调试器中显示一个字符串,同时它也可以用来探测调试器的存在。使用SetLastError函数,将当前的错误码设置为一个任意值。如果进程没有被调试器附加,调用OutputDebugString函数会失败,错误码会重新设置,因此GetLastError获取的错误码应该不是我们设置的任意值。但如果进程被调试器附加,调用OutputDebugString函数会成功,这时GetLastError获取的错误码应该没改变。

忆魂丶天雷 发表于 2023-12-28 00:33

网络上的确有这个检测调试的方法,但是实际情况是大部分调试器已经默认处理了这个问题,如果是想用来检测调试建议另寻套路。

wuyingjie2022 发表于 2023-12-28 16:02

忆魂丶天雷 发表于 2023-12-28 00:33
网络上的确有这个检测调试的方法,但是实际情况是大部分调试器已经默认处理了这个问题,如果是想用来检测调 ...

这种检测方法连vc编译器的调试器都检测不到

wuyingjie2022 发表于 2023-12-28 16:05

yes2 发表于 2023-12-27 21:19
OutputDebugString作为一个API,执行成功的话应该会SetLastError为0

按理说这个API执行成功与不成功都会改变Eflag标志的值,可将程序拖入OD,观察这个函数应该是执行成功了,eax=设定的Eflag的值,可就是对Eflag的值没影响,所以没法检测到
页: [1]
查看完整版本: OutPutDebugString