1

我想挂钩所有正在运行的进程的所有函数调用。我可以通过以下方式使用 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 创建钩子集合(所有函数都很难)并向其添加钩子,然后调用钩子方法并将 INktHooksEnum 对象作为参数传递。这是唯一的方法吗?

我的目标是制作一个工具来计算每个正在运行的进程的所有系统调用。随时提出任何建议。

4

1 回答 1

2

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

Deviare API 中似乎没有任何内容允许您在多个方法上创建挂钩 - 没有通配符或“挂钩一切”调用 - 因此您必须枚举 API(请参阅INktModule.ExportedFunctions参考资料)并挂钩它们。我建议您使用钩子集合(请参阅INktSpyMgr.CreateHookCollectionINktHooksEnum),以便您可以设置所有钩子,然后在一次操作中附加和分离它们。

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

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

就我个人而言,我会从您最终想要监控的 API 的一小部分开始,编写尽可能好用的代码,然后再升级到完整的 API 集。以这种方式杀死计算机的可能性较小。

于 2015-12-18T06:45:28.823 回答