如何禁用功能的缓冲区安全检查(#pragma strict_gs_check)

时间:2019-01-17 17:52:03

标签: security buffer local disable

我需要禁止某些功能的缓冲区安全检查(/ GS)功能(MSVC),而不是像/ GS-那样取消整个项目。 MSVSC文档https://docs.microsoft.com/en-us/cpp/preprocessor/strict-gs-check?view=vs-2017提示使用#pragma strict_gs_check(off)。不幸的是,它对我不起作用-我仍然在程序集中看到“ cookies”。请帮忙。

这是要复制的最简单的代码,请点击此处的粗体链接:https://godbolt.org/z/gYiGam

#include <memory>

struct Tmp {
    char v[8];
};

//#pragma check_stack(off)
#pragma strict_gs_check(off)
int make1(Tmp& a)
{
    Tmp r;
    return memcmp(&r, &a, sizeof(r));
}

//result
//-------------------------
  pop esi
  mov ecx, DWORD PTR __$ArrayPad$[esp+12]
  xor ecx, esp
  call @__security_check_cookie@4
  add esp, 12 ; 0000000cH
  ret 0
$LN6@make1:
  mov ecx, DWORD PTR __$ArrayPad$[esp+16]
  sbb eax, eax
  pop esi
  xor ecx, esp
  or eax, 1
  call @__security_check_cookie@4
  add esp, 12 ; 0000000cH
  ret 0
int make1(Tmp &) ENDP ; make1

2 个答案:

答案 0 :(得分:2)

我认为您不能以这种方式禁用它。严格GS检查是对编译器的请求,要求编译器将 stricter 检查添加到原本没有此检查的函数中。

换句话说,/GS控制是否进行了GS缓冲区检查,而编译指示仅控制如何具有攻击性。

如果您想完全禁用特定功能,请在该功能上使用__declspec(safebuffers)(请参见 https://docs.microsoft.com/en-us/cpp/cpp/safebuffers?view=vs-2017)。这表明您根本不想检查。

答案 1 :(得分:1)

您可以将所有不需要检查的功能移至单个文件,然后仅对该文件使用/ GS-。 还可以查看/ RTC / RTCu / RTC1设置