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
相关产品推荐
相关产品推荐

