监控进程A消失后关闭进程B“CMD隐藏法”
时间:2025-4-9 15:26 作者:六度科技 分类: C
核心
运行cmd脚本来监视执行
cmd脚本代码
cmd /c "@echo off & for /l %a in (0,0,1) do (tasklist | findstr /i /c:""a.exe"" >nul || (taskkill /f /im b.exe >nul 2>&1 & exit) & ping 127.0.0.1 -n 1 >nul)"
powershell脚本代码
powershell -Command "while(1) { if(-not [System.Diagnostics.Process]::GetProcessesByName('a')) { [System.Diagnostics.Process]::GetProcessesByName('b') | %{ $_.Kill() }; exit }; [GC]::Collect(); Start-Sleep -Milliseconds 500 }"
易语言调用
.版本 2
' cmd方式内存占用最低,大概1.5M左右
运行 (#运行cmd, 假, 1)
' powershell方式内存占用较高,大概20M左右
运行 (#运行powershell, 假, 1)
C++调用
注意代码内的"要加\
#include <iostream>
#include <windows.h>
#include <string>
// 完全模拟易语言 Run 命令
bool YY_Run(std::string cmd, bool wait = false, int nCmdShow = 2) {
// 窗口状态映射表
static const int mapping[] = {
SW_HIDE, // 1: 隐藏窗口
SW_SHOWNORMAL, // 2: 普通激活
SW_SHOWMINIMIZED, // 3: 最小化激活
SW_SHOWMAXIMIZED, // 4: 最大化激活
SW_SHOWNOACTIVATE, // 5: 普通不激活
SW_MINIMIZE // 6: 最小化不激活
};
nCmdShow = (nCmdShow >= 1 && nCmdShow <= 6) ? mapping[nCmdShow - 1] : SW_SHOWNORMAL;
SHELLEXECUTEINFOA sei = { sizeof(sei) };
sei.lpVerb = "open"; // 兼容 Win+R 行为
sei.lpFile = cmd.c_str(); // 直接接受任意命令
sei.nShow = nCmdShow;
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
// 分离命令行参数(如果有)
std::string file = cmd;
std::string params = "";
size_t spacePos = cmd.find(' ');
if (spacePos != std::string::npos) {
file = cmd.substr(0, spacePos);
params = cmd.substr(spacePos + 1);
sei.lpFile = file.c_str();
sei.lpParameters = params.c_str();
}
// 执行命令(支持所有 Win+R 能运行的格式)
if (!ShellExecuteExA(&sei)) {
return false;
}
// 同步等待逻辑
if (wait && sei.hProcess) {
WaitForSingleObject(sei.hProcess, INFINITE);
CloseHandle(sei.hProcess);
}
else if (sei.hProcess) {
CloseHandle(sei.hProcess);
}
return true;
}
/* 使用示例 */
int main() {
// 示例1:完全等同于 Win+R 输入 notepad(异步)
//YY_Run("notepad");
// 示例2:带参数的命令(同步等待)
//YY_Run("ping 127.0.0.1 -n 3", true);
// 示例3:使用易语言兼容的命令格式
// 完全按照易语言格式构造命令
YY_Run(
"cmd /c \"@echo off & for /l %a in (0,0,1) do (tasklist | findstr /i /c:\"\"a.exe\"\" >nul || (taskkill /f /im b.exe >nul 2>&1 & exit) & ping 127.0.0.1 -n 1 >nul)\"",
//"powershell -Command \"while(1) { if(-not [System.Diagnostics.Process]::GetProcessesByName('a')) { [System.Diagnostics.Process]::GetProcessesByName('b') | %{ $_.Kill() }; exit }; [GC]::Collect(); Start-Sleep -Milliseconds 500 }\"",
true, // 同步等待
2 // 2普通激活窗口 1隐藏窗口
);
std::cout << "Hello World!\n";
}