一、研究背景
编译器生成的二进制文件特征(代码结构、元数据、指纹)可能被杀软的静态或动态检测规则匹配。Visual Studio 的构建配置(特别是运行库、编译器优化、链接方式等)会直接影响最终生成的二进制文件的结构、行为特征和依赖关系,而这些都是杀毒软件/EDR 检测的关键依据。
二、推荐测试环境
三、基本模式选择
选择“Release”模式,不要使用"Debug"模式
四、常规配置
以下是一些在Visual Studio(VS)中进行免检配置的相关内容
1、关闭SDL检查
项目属性页→配置属性→C/C++→常规
2、运行库配置
项目属性页→配置属性→C/C++→代码生成(同3、图)
需结合实际情况设置多线程(/MT)或多线程DLL(/MD),既取决于目标的CRT环境,部分老的机器上没有CRT环境就需要/MT(自带CRT,但是生成的文件较大);又取决于杀软机制。
3、禁用安全检查(/GS-)
项目属性页→配置属性→C/C++→代码生成
4、关闭生成清单
项目属性页→配置属性→链接器→清单文件
五、其它配置参考
5、去除调试信息
项目属性页→配置属性→链接器→调试
6、关闭清单详细输出
项目属性页→配置属性→清单工具→常规→详细输出→否
7、取消嵌入清单
项目属性页→配置属性→清单工具→输入和输出→嵌入清单→否
8、禁用优化
项目属性页→配置属性→C/C++→优化
9、启用最小重新生成
项目属性页→配置属性→C/C++→代码生成
六、测试代码示例与构建对比
HRESULT CreateLink(LPCWSTR lpszPathObj, LPCWSTR lpszPathLink, LPCWSTR lpszDesc)
{
HRESULT hres;
IShellLinkW* psl;
hres = CoInitialize(NULL);
if (FAILED(hres)) return hres;
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (LPVOID*)&psl);
if (SUCCEEDED(hres)) {
IPersistFile* ppf;
if (!PathFileExistsW(lpszPathObj)) {
wprintf(L"目标文件不存在: %sn", lpszPathObj);
CoUninitialize();
return E_FAIL;
}
psl->SetPath(lpszPathObj);
psl->SetDescription(lpszDesc);
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);
if (SUCCEEDED(hres)) {
hres = ppf->Save(lpszPathLink, TRUE);
ppf->Release();
} else {
wprintf(L"QueryInterface失败,HRESULT: 0x%08Xn", hres);
}
psl->Release();
} else {
wprintf(L"CoCreateInstance失败,HRESULT: 0x%08Xn", hres);
}
CoUninitialize();
return hres;
}
int main()
{
LPCWSTR lpszPathObj = L"C:\Users\Coriander\Desktop\1.html";
LPCWSTR lpszPathLink = L"C:\Users\Coriander\Desktop\ToolsShortcut.lnk";
LPCWSTR lpszDesc = L"快捷方式测试";
HRESULT hres = CreateLink(lpszPathObj, lpszPathLink, lpszDesc);
if (SUCCEEDED(hres)) {
wprintf(L"✅ 快捷方式创建成功!n");
} else {
wprintf(L"❌ 创建失败,HRESULT: 0x%08Xn", hres);
}
system("pause");
return 0;
}
七、总结
参考文章:
原文始发于微信公众号(仇辉攻防):VS配置优化:编译器的一行选项,也是红队勇士的免检盒
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论