免入土(三)编译工具配置

一、前言

本文主要介绍的内容是关于 Visual Studio 配置和对程序的一些处理,主要是为了防止生成的免杀木马容易被溯源或者被查杀软件查杀。

二、Visual Studio 配置

  1. 生成 release 的时候使用 MT,不要使用多线程 DLL(/MD)

img

  1. 关闭生成编译信息(防止溯源定位)

如果不关闭该选项的话可能会导致生成的 exe 文件中包含编译路径和相关计算机的用户名

img

img

若未关闭上述设置则会出现如上图的调试信息,可定位编译生成的.pdb文件的位置,泄露物理路径。

三、程序黑框处理

3.1 pragma 预处理指令

1
#pragma comment(linker, "/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")

3.2 API 隐藏窗口

  1. FreeConsole 函数
1
FreeConsole();
  1. GetForegroundWindow + ShowWindow 函数
1
2
HWND hwnd = GetForegroundWindow();
ShowWindow(hwnd, SW_HIDE);
  1. 创建子进程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <Windows.h>

int main(int argc, char* argv[])
{
// 判断启动参数是否为 go,如果是则表明这是子进程,窗口已隐藏
if (argc == 2 && strcmp(argv[1], "go") == 0) {
MessageBoxA(0, "隐藏窗口", "隐藏窗口", 0);
return 0;
}

// 获取当前程序完整路径
char path[MAX_PATH * 4];
GetModuleFileNameA(NULL, path, MAX_PATH * 4);
// 路径加上参数 go
strcat_s(path, " go");

STARTUPINFOA StartInfo;
PROCESS_INFORMATION pinfo;
memset(&StartInfo, 0, sizeof(STARTUPINFO));
StartInfo.cb = sizeof(STARTUPINFO);
//StartInfo.dwFlags = STARTF_USESHOWWINDOW;
//StartInfo.wShowWindow = SW_HIDE;
BOOL result = CreateProcessA(NULL, path, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &StartInfo, &pinfo);

if (!result) {
printf("创建子进程失败:%d\n", GetLastError());
Sleep(10000);
}
return 0;
}

使用该方式隐藏窗口效果等同于 FreeConsole 函数,启动窗口一闪而过,但是隐蔽方式比 FreeConsole 函数要好,但是在某些杀软的复杂环境下可能会阻止进程创建子进程从而导致程序执行失败。

3.3 WinMain()

  • hInstance:当前实例的句柄。
  • hPrevInstance:先前实例的句柄,在现代的Windows系统中这个参数总是NULL。
  • lpCmdLine:命令行参数,是一个指向以空字符结尾的字符串的指针。
  • nCmdShow:指定窗口应该以何种形式显示。
1
2
3
4
5
6
7
8
9
10
#include <Windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// ... 其他初始化工作 ...

// 创建窗口并显示
HWND hWnd = CreateWindow(/* 创建窗口的参数 */);
ShowWindow(hWnd, SW_HIDE); // 将窗口隐藏起来
return 0;
}

四、总结

  1. 对于 visual studio 生成的程序处理,不要保存调试信息,以防反编译溯源本人。
  2. 对于免杀马执行产生黑框的情况,可以采取 3 种方式进行解决,分别为 Pragma 启动 windows 子系统解决、FreeConsole()函数或GetForegroundWindow 函数解决黑框、通过 WinMain()将黑框隐藏。

免入土(三)编译工具配置
http://candyb0x.github.io/2025/06/12/免入土(三)编译工具配置/
作者
Candy
发布于
2025年6月12日
更新于
2025年6月12日
许可协议