Как сделать счетчик системных вызовов с помощью deviare

Я хотел бы подключить все вызовы функций всех запущенных процессов. Я могу перехватить определенную функцию ("ws2_32.dll! Recv") всех процессов, использующих deviare:

        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. Это единственный способ сделать это?

Моя цель - создать инструмент, который подсчитывает все системные вызовы для каждого запущенного процесса. Не стесняйтесь давать любые предложения.

1 ответ

Сначала несколько советов: будьте очень, очень осторожны в отношении того, какие API вы подключаете. Если что-то, что вы делаете в своем методе ловушек, приводит к вызову одного из перехватываемых API-интерфейсов, то вы создаете бесконечную рекурсию, которая может потенциально разрушить ваш компьютер. Имейте это в виду. Вы, вероятно, захотите отфильтровать вызовы API и для своего собственного процесса, в противном случае вы в конечном итоге будете регистрировать записи о доступе к диску, вызванном записями журналов, и прежде чем вы узнаете, что ваша память заполнена, а жесткий диск полностью занято ведение журнала о ведении журнала.

Похоже, в Deviare API нет ничего, что позволяло бы вам создавать ловушки для нескольких методов - без подстановочных знаков или вызовов "перехватить все" - поэтому вам придется перечислять API (см. INktModule.ExportedFunctions для некоторых идей) и зацепить их. Я бы посоветовал вам использовать коллекцию крючков (см. INktSpyMgr.CreateHookCollection а также INktHooksEnum), чтобы вы могли настроить все свои крючки, а затем прикрепить и отсоединить их за одну операцию.

Что касается аспекта регистрации, подумайте об использовании какой-либо очереди - ConcurrentQueue<T> по предпочтению - передать фактические операции регистрации другому потоку. Таким образом, вы тратите минимум времени на фактическую функцию хуков, а также снижаете вероятность того, что ваши хуки вызовут рекурсию. Вам придется поэкспериментировать с фильтрацией в потоке журналирования по сравнению с функциями ловушки, чтобы выяснить, какое из них оказывает меньшее влияние на производительность системы.

Всегда убедитесь, что вы знаете, с какими данными работает ваша программа, и что у вас есть план работы с объемом данных. Вам нужно будет провести серьезное профилирование, чтобы найти болевые точки, а затем приложить немало усилий, чтобы уменьшить накладные расходы, чтобы ваша программа не сильно испортила систему.

Лично я бы начал с небольшого подмножества API-интерфейсов, которые вы в конечном итоге хотите отслеживать, напишите код, который работает так же хорошо, как вы можете это сделать, а затем перейдите к полному набору API-интерфейсов. Меньше шансов, что таким образом вы убьете свой компьютер.

Другие вопросы по тегам