C# 如何使用Deviceare进行系统调用计数器

C# 如何使用Deviceare进行系统调用计数器,c#,hook,deviare,C#,Hook,Deviare,我想钩住所有正在运行的进程的所有函数调用。我可以通过以下方式使用Deviceare钩住所有进程的特定函数(“ws2_32.dll!recv”): CreateSpyMgr(out mgr); hook = mgr.CreateHook("ws2_32.dll!recv"); hook.Attach(mgr.get_Processes(0)); mgr.set_ReportProcessCreation(DeviareCommonLi

我想钩住所有正在运行的进程的所有函数调用。我可以通过以下方式使用Deviceare钩住所有进程的特定函数(“ws2_32.dll!recv”):

        CreateSpyMgr(out mgr);
        hook = mgr.CreateHook("ws2_32.dll!recv");
        hook.Attach(mgr.get_Processes(0));
        mgr.set_ReportProcessCreation(DeviareCommonLib.ReportMethod._create_process_hook_and_polling, 0);
        hook.set_HookNewProcesses(0, 1);
        hook.OnFunctionCalled += new DHookEvents_OnFunctionCalledEventHandler(hook_OnFunctionCalled);
        hook.Hook();
我怎样才能钩住所有函数调用而不是一个?可能吗

或者我应该使用INktSpyMgr::CreateHooksCollection创建钩子集合(所有函数都很难),并向其中添加钩子,然后调用钩子方法并将INktHooksEnum对象作为参数传递。这是唯一的办法吗


我的目标是制作一个工具,统计每个运行进程的所有系统调用。请随意提出任何建议。

首先一个建议是:要非常小心挂接哪些API。如果在钩子方法中执行的任何操作导致对钩子的某个API的调用,那么您正在创建一个可能破坏计算机的无限递归。记住这一点。您可能还想过滤掉自己进程的API调用,否则您将最终记录由日志记录项引起的磁盘访问的条目,在您知道之前,您的内存已满,硬盘驱动器已完全被日志记录占用

DeviceareAPI中似乎没有允许您在多个方法上创建钩子的任何内容—没有通配符或“钩子所有内容”调用—因此您必须枚举API(有关一些想法,请参阅)并钩子它们。我建议您使用一个钩子集合(请参见和),这样您就可以设置所有钩子,然后在一次操作中连接和分离它们

至于日志方面,请考虑使用某种类型的队列(根据偏好)将实际日志操作传递给另一个线程。这样,您可以在实际的钩子函数中花费最少的时间,并减少钩子导致递归的机会。您必须在日志线程和钩子函数中进行过滤实验,以找出哪个对系统的性能影响较小

始终确保您知道您的程序正在处理多少数据,并制定了处理数据量的计划。您将不得不进行一些认真的分析以找到痛点,然后投入大量的工作来减少开销,这样您的程序就不会把系统搞得太糟

就我个人而言,我将从您最终想要监控的API的一小部分开始,编写尽可能好地工作的代码,然后升级到完整的API集。你用这种方式杀死电脑的可能性更小