在主线程开始运行之前捕获新的进程事件
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 并拿着我的啤酒 :)以上是关于在主线程开始运行之前捕获新的进程事件的主要内容,如果未能解决你的问题,请参考以下文章