Windows 程序隐藏启动黑窗口总结

news/2025/2/21 17:15:51/文章来源:https://www.cnblogs.com/o-O-oO/p/18729602

免责声明:

该公众号分享的安全工具和项目均来源于网络,仅供安全研究与学习之用,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本公众号无关。

以下文章来源于锦鲤安全 ,作者四五qq

前言

Windows 控制台程序在启动时会出现一个黑(dos)窗口,一般我们想要隐藏有两种方式,一是转成窗口(Windows GUI)程序,二是使用Windows API 隐藏,这里对不同种方式隐藏黑窗口的效果和优缺点进行了总结。

一、转换为窗口程序隐藏

优点:最常用的方式。

缺点:窗口程序某些时候容易引起杀软报毒,尤其是 x86 应用程序,报毒最为明显。

1. pragma 预处理指令

使用如下预处理指令将程序从控制台程序切换为 GUI 程序, GUI 程序不会显示 dos 窗口:

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

这条指令的意思是使用子系统(subsystem)为窗口(Windows)模式,入口(entry)点指定为 mainCRTStartup 函数。

C 控制台程序并不会直接调用main函数,而是先调用 mainCRTStartup 执行一些 C 程序处理之后再调用main函数。

这里之所有要指定入口点指定为 mainCRTStartup 函数是因为使用子系统为窗口模式后默认的 C 窗口程序入口点是 WinMainCRTStartup 函数,由 WinMainCRTStartup 函数间接调用 WinMain 函数,并不会调用我们常见的 main 函数,为了让程序转为 C 窗口程序后还能调用 main 函数则必须指定入口点为 mainCRTStartup。

2. 通过 VS 属性设置隐藏

使用预处理指令等同于 VS 进行如下设置:

3. 通过PE编辑器隐藏

通过PE编辑器直接修改 PE 文件的 Optional Header,将 Subsystem 由 3 修改为 2,即将控制台程序修改为窗口程序:

这种方式与前两种操作方式效果是一样的。

二、通过 API 隐藏窗口

优点:相比于直接将控制台程序转成窗口程序隐藏窗口,通过 API 方式隐藏更隐蔽,同时报毒也更低

缺点:使用 API 隐藏的行为特征也会更为明显,且不同的 API 隐藏方式的行为特征也不同。

1. FreeConsole 函数

执行如下代码即可,使用起来简单粗暴:

FreeConsole();

使用这个 API 隐藏窗口最为快速,dos 窗口一闪而过,之后就被隐藏了。但是杀软也对该API的使用最为敏感,使用该 API 可能直接被杀软行为检测然后报毒。

2. GetForegroundWindow + ShowWindow 函数

使用该 API 组合必须在 dos 窗口完全显示出来之后才能隐藏,否则调用无效:

HWND hwnd = GetForegroundWindow();
ShowWindow(hwnd, SW_HIDE);

也就是像下面这样子,Sleep 延迟1秒,等待窗口完全显示出来,然后再调用 API 隐藏窗口:

使用该 API 组合效果比起 FreeConsole 函数,隐藏效果要慢很多,而且容易出现隐藏到错误的窗口。

GetForegroundWindow() 函数效果是用户当前正在使用的窗口,如何用户操作比较快的话,就可能获取到其它程序的窗口,导致隐藏到错误的窗口,因此不建议使用该 API 组合。

3. 创建子进程

这种方式是 API 隐藏最为推荐的方式,也是很多木马使用的隐藏方式。

使用如下代码创建子进程隐藏窗口,首先获取当前路径,加上 go 参数,调用 CreateProcessA() 函数创建子进程,设置 CREATE_NO_WINDOW 标志隐藏子进程的窗口,然后在前面加上判断,判断启动参数是否为 go 如果是则表明这是子进程则不需要再创建子进程隐藏窗口,执行其它操作:

#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);// 路径加上参数 gostrcat_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 函数要好,但是在某些杀软的复杂环境下可能会阻止进程创建子进程从而导致程序执行失败。

最后

一般场景下推款将程序转为窗口程序隐藏黑窗口,特殊场景如果不得不使用控制程序,较为推款使用最后一种方式创建子进程隐藏黑窗口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/887668.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker部署.net core3.1

1.安装dockerapt install docker.io2.拉取.net core依赖镜像docker pull mcr.microsoft.com/dotnet/core/aspnet:latest3.创建.net core3.1项目 选择docker支持,会生成dockerFile配置文件如图:4.编写dockerfile文件,经删减后为:FROM mcr.microsoft.com/dotnet/core/aspnet:3…

DeepSeek 满血版在 VScode 和 IDEA 中怎么用?手把手教程来了

DeepSeek 满血版在 IDEA 中怎么用?手把手教程来了作者:沉默王二近期有几个热点事件,不知道大家关注到没有?第一个标志事件,一向挑剔的苹果宣布和阿里合作,一起为国行版 iPhone 提供 AI 技术服务。 第二个标志事件,DeepSeek R1 蒸馏了 6 个模型开源给社区,其中有 4 个来…

redission-delay-queue使用及原理

1.引入jar包<dependency><groupId>xxxx.delay</groupId><artifactId>redisson-delayed-queue</artifactId><version>1.0.0-SNAPSHOT</version> </dependency>2.客户端代码开发2.1:新增实现BaseTask的bean 参数由业务自行决定…

利用网页爬虫从专业产品论坛提取评论的完整指南

了解如何通过网页爬虫从专业产品论坛提取评论,以获取可操作的洞见、改进策略,并节省时间。利用网页爬虫从专业产品论坛提取评论已经成为企业的游戏规则改变者。它使您能够从多个平台收集客户反馈(https://dataforest.ai/blog/top-web-scraping-use-cases),实时监控情绪,并自…

树的重心(树形dp)

我最开始将n减了1,应为边长有n-1条,但是这会导致计算时出现错误,因为其他地方会用到n#include<iostream> #include<vector> using namespace std; const int N=1e5+5; vector<int>v[N]; int f[N]; int vis[N]; int ans=1e5; int n; int dfs(int x){vis[x]…

仓库管理到底该怎么管?记住这五常六准原则!

仓库管理到底该怎么管? 要是你觉得仓库只是个“堆货的地方”,那可就大错特错了! 想象一下,货物乱成一团,找东西时费劲,出库慢,结果错发了货,那可真的是“大麻烦”啊。 客户打电话来投诉,老板又来催货,这种情况谁遇到谁头疼。 但其实,仓库管理不复杂,只要掌握了一些…

让窗口显示在所有虚拟桌面上

功能如图 C#代码实现如下public partial class MainWindow : Window {public MainWindow(){InitializeComponent();ShowInTaskbar = false;this.Loaded += MainWindow_Loaded;}private void MainWindow_Loaded(object sender, RoutedEventArgs e){IntPtr a = new System.Window…

[Vite] 性能优化

关于HTTP: https://www.cnblogs.com/Answer1215/p/18729206 DNS 打包方式:所有代码(包括 lodash-es、element-ui 等)被打包到一起,部署时只需请求一个或几个大文件。 优点是简单,不需要额外的网络请求;缺点是文件体积大,首次加载延迟较高,而且用户如果之前访问过其他…

python 并发场景梳理

一、多进程(Multiprocessing) 1、使用场景 适合CPU密集型任务,因为每个进程运行在独立的Python解释器中,不受全局解释器锁(GIL)的影响。 2、代码from multiprocessing import Process import timedef task():print("Task is running")time.sleep(10)processes …

Pic2Word

目录概Pic2Word代码Saito K., Sohn K., Zhang X., Li C., Lee C., Saenko K., and Pfister T. Pic2Word: Mapping pictures to words for zero-shot composed image retrieval. CVPR, 2023.概 本文关注的是 Composed Image Retrieval (CIR) 任务: 给定一个 reference (query) i…

SciTech-EECS-BigDataAIML-NN(神经网络): 常用的18种Activation(激活函数)

SciTech-EECS-BigDataAIML-NN(神经网络): 常用的18种Activation(激活函数) 一:简介 二:为什么要用激活函数 三:激活函数的分类 四:常见的几种激活函数 4.1.Sigmoid函数 4.2.Tanh函数 4.3.ReLU函数 4.4.Leaky Relu函数 4.5.PRelu函数 4.6.ELU函数 4.7.SELU函数 4.8.Swish函数…

用了CRM后,业绩不升反滑?问题可能出在这6个地方!

用了CRM系统后,我的公司——客户跟丢了 销售效率下降了 业绩一落千丈哈哈,比我惨的还有谁?! 不过我潜心研究了一阵,终于把这个CRM系统给弄懂了! 今天就跟大家聊一聊,为什么用了CRM系统后不仅没能提升业绩,反而拖了后腿,这是踩了哪些坑?以及该怎么调整才能真正发挥CRM…