我想挂钩所有正在运行的进程的所有函数调用。我可以使用deviare挂钩所有进程的某些函数(" 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创建钩子集合(所有功能很难),并为其添加钩子,然后调用hook方法并传递INktHooksEnum对象作为参数。这是唯一的方法吗?
我的目标是创建一个工具来计算每个正在运行的进程的所有系统调用。随意提出任何建议。
答案 0 :(得分:2)
首先提出建议:非常非常小心你挂钩的API。如果您在钩子方法中执行的任何操作导致调用您正在挂钩的其中一个API,那么您将创建一个可能会破坏您的计算机的无限递归。记住这一点。您可能也希望过滤掉您自己的进程的API调用,否则您将最终记录有关日志条目导致的磁盘访问的条目,并且在您知道它之前您的内存已满并且硬盘驱动器完全占用了有关日志记录的日志。
Deviare API中似乎没有任何内容允许您在多种方法上创建挂钩 - 没有通配符或“挂钩”所有内容'调用 - 因此您必须枚举API(请参阅INktModule.ExportedFunctions
了解一些想法)并将它们挂钩。我建议您使用钩子集合(请参阅INktSpyMgr.CreateHookCollection
和INktHooksEnum
),以便您可以设置所有钩子,然后在一次操作中附加和分离它们。
至于日志记录方面,请考虑使用某种类型的队列 - 优先级ConcurrentQueue<T>
- 将实际的日志记录操作传递给另一个线程。这样你就可以在实际的钩子函数中花费最少的时间,并减少钩子导致递归的可能性。您必须在日志记录线程和钩子函数中尝试过滤,以找出哪个对系统的性能影响较小。
始终确保您知道程序正在处理多少数据,并制定计划来处理数据量。你需要做一些严肃的剖析才能找到痛点,然后投入大量的工作来减少开销,这样你的程序就不会让系统陷入困境。
就我个人而言,我从最初想要监控的一小部分API开始,编写可以实现的代码,然后转到完整的API集。你以这种方式杀死计算机的可能性较小。