«

监控进程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";
}