如何确认运行中的进程为真实应用?以notepad.exe检测为例
验证系统中真实notepad.exe的方法
完全可以通过可执行路径结合进程哈希的方式验证真实的系统记事本进程,解决Process.GetProcessesByName仅匹配进程名导致的误判问题,具体实现思路和代码如下:
核心思路
- 路径过滤:系统自带的notepad.exe默认位于Windows系统目录(如
C:\Windows或C:\Windows\System32),先排除非系统目录下的同名进程,缩小验证范围。 - 哈希校验:系统记事本的可执行文件哈希值在特定Windows版本下是固定的,通过计算进程对应exe文件的哈希,与预先获取的官方哈希对比,确保进程是真实的系统程序。
实现步骤与代码示例
1. 获取进程可执行路径并过滤系统目录
遍历所有名为notepad的进程,获取其主模块的文件路径,判断是否位于系统目录内。
2. 计算文件哈希并对比
对系统目录内的notepad.exe计算SHA256哈希(安全性高,碰撞概率极低),与预先获取的真实哈希值对比。
using System; using System.Diagnostics; using System.IO; using System.Security.Cryptography; public class NotepadValidator { public static bool IsGenuineNotepadRunning() { // 获取系统目录路径(自动适配不同Windows安装位置) string[] validSystemPaths = new[] { Environment.GetFolderPath(Environment.SpecialFolder.Windows), Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "System32") }; // 替换为你当前Windows版本的notepad.exe SHA256哈希值 // 可通过命令行执行:certutil -hashfile C:\Windows\notepad.exe SHA256 获取 string genuineNotepadHash = "abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890"; Process[] notepadProcesses = Process.GetProcessesByName("notepad"); foreach (Process proc in notepadProcesses) { try { string exePath = proc.MainModule.FileName; // 检查路径是否属于系统目录 bool isSystemPath = Array.Exists(validSystemPaths, path => exePath.StartsWith(path, StringComparison.OrdinalIgnoreCase)); if (!isSystemPath) continue; // 计算文件SHA256哈希 string currentHash = ComputeSha256Hash(exePath); if (currentHash.Equals(genuineNotepadHash, StringComparison.OrdinalIgnoreCase)) { return true; } } catch (Exception) { // 跳过权限不足或已退出的进程 continue; } } return false; } private static string ComputeSha256Hash(string filePath) { using (SHA256 sha256 = SHA256.Create()) using (FileStream fs = File.OpenRead(filePath)) { byte[] hashBytes = sha256.ComputeHash(fs); return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant(); } } }
关键注意事项
- 哈希值获取:运行
certutil -hashfile C:\Windows\notepad.exe SHA256命令,复制输出的哈希值(去掉空格)替换代码中的genuineNotepadHash。不同Windows版本(如Win10 22H2、Win11 23H2)的哈希值不同,需对应目标系统版本获取。 - 权限问题:访问进程的
MainModule.FileName需要管理员权限,否则会抛出UnauthorizedAccessException,代码中已做异常捕获处理。 - 路径适配:使用
Environment.GetFolderPath获取系统目录,避免硬编码路径导致的兼容性问题(如Windows安装在非C盘)。
内容的提问来源于stack exchange,提问作者canowar
相关产品推荐
相关产品推荐

