You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何不依赖可执行文件路径检测特定程序是否运行

Windows下无路径依赖检测目标程序运行的实现方案

针对Chrome这类正规发行的目标程序,完全可以抛弃路径匹配逻辑,以下方案均不受用户修改安装目录、拷贝exe到任意位置的影响,稳定性远高于路径比对:

方案1:匹配EXE内置数字签名(推荐度最高,误判率<0.1%)

正规商业软件的官方发行版都会嵌入厂商数字签名,签名信息直接写在exe文件内部,和文件存储路径完全无关,只要文件没有被恶意篡改,就算用户把整个Chrome安装目录拷到U盘、改了文件夹名运行,签名校验逻辑都能正常识别。

  • 实现逻辑:遍历进程或收到进程启动回调时,不再比对exe路径,而是读取对应exe的数字签名发布者信息,匹配到Google LLC官方签名即可判定为Chrome进程
  • 核心实现参考(C#示例,其他Win32开发语言逻辑一致):
using System.Diagnostics;
using System.Security.Cryptography.X509Certificates;

bool IsRealChromeProcess(Process proc)
{
    try
    {
        string exePath = proc.MainModule?.FileName;
        if (string.IsNullOrWhiteSpace(exePath)) return false;
        X509Certificate2 signCert = X509Certificate2.CreateFromSignedFile(exePath);
        // 校验签名主体中的组织字段,匹配Google官方主体
        return signCert.Subject.Contains("O=Google LLC") 
               && signCert.Subject.Contains("CN=Google LLC");
    }
    catch
    {
        // 跳过权限不足无法读取信息的系统进程、异常进程
        return false;
    }
}

如果需要100%杜绝篡改版、重打包版Chrome的误判,可以额外增加一层EXE文件SHA256哈希校验:提前提取官方各正式版Chrome exe的哈希值做白名单,校验签名的同时比对哈希即可。

方案2:匹配程序固定窗口特征(轻量,权限要求低)

GUI程序运行时创建的窗口类名、窗口标题特征是程序内部定义的,和安装路径、exe文件名都没有绑定关系。Chrome主窗口的类名固定为Chrome_WidgetWin_1,可以直接通过Win32窗口枚举接口检测。

  • 实现逻辑:调用EnumWindows接口枚举所有顶层可见窗口,通过GetClassName获取窗口类名,匹配到Chrome专属类名后,再通过GetWindowThreadProcessId拿到对应进程ID做二次校验即可
  • 优势:不需要读取exe文件元数据,普通用户权限就能运行,检测速度快
  • 注意点:部分Chromium内核的第三方套壳浏览器也会复用相同窗口类名,需要加一层过滤:比如校验对应进程的导出表、进程内存特征,排除非Chrome的程序即可。

方案3:基于系统事件做实时监听(性能最优,无轮询开销)

不要用定时遍历全量进程的轮询方案,可以直接注册Windows ETW事件跟踪或WMI进程创建事件,系统中只要有新进程启动就会立刻触发回调,在回调中做上述特征校验即可:

using System.Management;

void StartProcessMonitor()
{
    WqlEventQuery startQuery = new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace");
    ManagementEventWatcher processWatcher = new ManagementEventWatcher(startQuery);
    processWatcher.EventArrived += (s, args) =>
    {
        string processName = args.NewEvent["ProcessName"]?.ToString() ?? "";
        if (processName.Equals("chrome.exe", StringComparison.OrdinalIgnoreCase))
        {
            int pid = Convert.ToInt32(args.NewEvent["ProcessID"]);
            using Process proc = Process.GetProcessById(pid);
            if (IsRealChromeProcess(proc))
            {
                // 校验通过,触发锁屏逻辑
                ShowLockScreen();
            }
        }
    };
    processWatcher.Start();
}

这个方案不需要定时循环扫描进程列表,后台运行CPU占用趋近于0,适合需要长期驻留的监控类程序。


避坑提醒:不要单独用进程名chrome.exe作为判断依据,用户可以把任意exe重命名为chrome.exe运行,单独匹配进程名会产生大量误判,必须结合签名、哈希或窗口特征做二次校验。

内容的提问来源于stack exchange,提问作者EVLF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:03:20