如何阻止Windows下C弹窗程序跳转到任务管理器前台及修改其显示名
问题1:弹窗时避免进程进入前台列表
默认MessageBox传入的父窗口句柄为NULL时,窗口会继承桌面作为父窗口,同时默认携带激活属性,会抢占前台焦点,导致进程被系统标记为前台进程,出现在任务管理器的前台进程组。可通过以下方案解决:
- 简易修改方案:直接调整
MessageBox的风格参数,在原有参数后追加MB_NOACTIVATE标识,禁止弹窗激活抢占焦点,修改后代码示例:
// 仅修改第四个参数即可,其余逻辑不变 MessageBox(0 , "Blip" , NULL , MB_OK | MB_NOACTIVATE);
该方案可以避免进程跳转至前台列表,但弹窗仍会在任务栏显示临时图标,如果需要完全隐藏任务栏图标,建议使用第二种方案。
- 最优效果方案:放弃使用系统
MessageBox接口,自行创建自定义弹窗。提前创建一个隐藏的后台消息窗口作为父窗口,调用CreateWindowEx创建弹窗时指定扩展样式为WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW,窗口样式为WS_POPUP | WS_VISIBLE | WS_BORDER,这样创建的弹窗不会抢占焦点、不会在任务栏显示图标,进程会始终停留在后台进程列表。
问题2:修改任务管理器中程序的显示名称
可通过两种层级的方案实现混淆效果:
- 基础修改:直接修改编译生成的exe文件的文件名即可,任务管理器进程列表默认显示的名称就是exe文件名,你可以将其改为和系统进程接近的名称,比如
svchost.exe、explorer.exe等,混淆普通用户的判断。 - 进阶修改:添加版本资源文件修改进程描述。创建后缀为
.rc的资源脚本,添加VERSIONINFO块,将文件描述、产品名称、公司名称等字段修改为和系统进程一致的内容,比如把文件描述改为「Windows 服务主进程」,这样任务管理器「详细信息」页的描述列也会和系统进程完全一致,更难被识别。
示例资源脚本内容:
1 VERSIONINFO FILEVERSION 10,0,19041,1 PRODUCTVERSION 10,0,19041,1 FILEFLAGSMASK 0x3fL FILEFLAGS 0x0L FILEOS 0x40004L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "080404b0" BEGIN VALUE "CompanyName", "Microsoft Corporation" VALUE "FileDescription", "Windows 服务主进程" VALUE "FileVersion", "10.0.19041.1" VALUE "InternalName", "svchost.exe" VALUE "LegalCopyright", "© Microsoft Corporation. All rights reserved." VALUE "OriginalFilename", "svchost.exe" VALUE "ProductName", "Microsoft Windows Operating System" VALUE "ProductVersion", "10.0.19041.1" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x804, 1200 END END
编译时将资源文件和C代码一同传给GCC即可,示例编译命令:gcc yourcode.c res.rc -mwindows -o svchost.exe
注意:以上方案仅限用于合法的朋友间整蛊使用,请勿用于恶意攻击他人设备,否则可能违反相关法律法规。
内容的提问来源于stack exchange,提问作者Noumeno
相关产品推荐
相关产品推荐

