在主线程开始运行之前捕获新的进程事件

Posted

技术标签:

【中文标题】在主线程开始运行之前捕获新的进程事件【英文标题】:Catch new process event before the main thread starts to run 【发布时间】:2021-12-25 04:52:19 【问题描述】:

我正在开发一个应用程序来监控运行进程在主线程开始运行之前。问题是当进程中的所有线程都被加载并且进程正在执行它的工作时,会执行下面的代码。我想做类似 C#C++"sCreateProcessNotifyRoutineEx" 函数。 请帮忙

我尝试过的:

[DllImport("kernel32")]
public extern static int OpenProcess(int access, bool inherit, int pid);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool ReadProcessMemory(IntPtr hProcess, UIntPtr lpBaseAddress, [Out] byte[] lpBuffer, int dwSize, IntPtr lpNumberOfBytesRead);

ManagementEventWatcher processStartEvent = new ManagementEventWatcher("SELECT * FROM Win32_ProcessStartTrace");

public Service1()

     InitializeComponent();
     processStartEvent.EventArrived += new EventArrivedEventHandler(processStartEvent_EventArrived);
     processStartEvent.Start();


public async void processStartEvent_EventArrived(object sender, EventArrivedEventArgs e)

            try
            
                string processName = e.NewEvent.Properties["ProcessName"].Value.ToString();
                string processID = Convert.ToInt32(e.NewEvent.Properties["ProcessID"].Value).ToString();
                int pid = Convert.ToInt32(e.NewEvent.Properties["ProcessID"].Value);
                Process p = Process.GetProcessById(pid);
                string wholeFileName = p.MainModule.FileName;
                await AnalyzeStartup(wholeFileName, p);
            
            catch  

【问题讨论】:

听起来像是 dll 注入的工作,或者最好从内核模式执行此操作,您实际上想要实现什么? 我正在为防病毒引擎开发一个组件,但我不一定想为此使用 C++,而是尝试使用 C#。执行前的初步流程分析是为了确保安全。 通常你会这样做,是dll注入创建进程和加载win32 api调用,代理调用以查看用户模式应用程序正在启动以及何时加载模块等,而且您通常会从内核执行此操作,因此它是可靠的,是的,这将是非托管代码而不是 C#。从来没有用 C# 编写过任何重要的防病毒软件,它只是不能做很多可能需要的事情,或者如果可以的话,无论如何它都是错误的工具 【参考方案1】:

如果您的代码启动了该进程,您可以将其暂停(或更准确地说,使用暂停的主线程)。

在这种情况下,由于您的代码没有启动进程,因此唯一可靠的方法是使用系统范围的 DLL 注入。 Detours 是迄今为止最好的库。要从 C# 中使用它,您可能需要编写一个重要的 p/Invoke 层。你可以试试unofficial wrapper,但这是一个非常复杂的问题要解决; YMMV。

【讨论】:

你也可以添加 YOLO 并拿着我的啤酒 :)

以上是关于在主线程开始运行之前捕获新的进程事件的主要内容,如果未能解决你的问题,请参考以下文章

从Java开始忽略/捕获子进程输出的最简单方法

线程并发并行进程是什么,以及如何开启新的线程?

在qthread中停止长时间运行的进程

[C#] 开始接触 async/await 异步编程

在 qthread 中停止长时间运行的进程

c# 多线程运行时出现主界面卡死现象如何解决?