Использование дампов сеанса трассировки системных вызовов ядра Windows NT - PullRequest
0 голосов
/ 15 марта 2012

Я пытаюсь каким-то образом регистрировать (программно или в файл журнала) каждый системный вызов, который вызывает определенное число процессов в течение заданного промежутка времени. Используя ответ на Есть ли что-то вроде системного вызова linux ptrace в Windows? , я смог правильно использовать ETW для отслеживания всех системных вызовов, вызываемых в файл etl, который я затем могу перевести в XML-файл с использованием tracerpt. Однако, глядя на файлы XML и другие доступные форматы, я обнаружил две основные проблемы:

  1. Системные вызовы даны в терминах адреса памяти для вызова, но я не могу найти какой-либо хороший способ перевода этих адресов в имена. Для справки пример адреса системного вызова: 0xFFFFF80002AC22BC.

  2. Все идентификаторы процессов установлены в 0xFFFFFFFF, но кажется, что системные вызовы регистрируются для всех процессов, а не только для процесса, который запустил трассировку. Как мне определить, какой процесс совершил какой системный вызов, или хотя бы отфильтровать один или несколько выбранных процессов, которые я хочу отследить?

Есть ли у кого-нибудь решения вышеупомянутых проблем или, что еще лучше, какой-нибудь пример кода, который может использовать один из этих форматов файлов журнала, который может выводить tracerpt, и переводить его в удобочитаемый и пригодный для использования формат?

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Так что я думаю, что после осмотра, я смог решить эти проблемы таким образом, чтобы, по крайней мере, сделать его полезным (хотя, к сожалению, бесполезным для меня из-за других проблем).

  1. Адреса последовательны, и у меня есть теория, что эти адреса являются постоянным смещением в изображении библиотеки в памяти, поэтому все, что вам нужно сделать, это взять разницу от адреса к библиотеке, которой он принадлежит to, и это может отображаться непосредственно на имя системного вызова вручную, или вы можете использовать таблицу символов для исполняемого файла, чтобы найти имя. Ни один из них не был проверен мною, но похоже, что стоит посмотреть на него.

  2. Чтобы выяснить, какой процесс выполняет системный вызов, при прохождении журнала, если вы включаете информацию о переключении контекста, вы знаете, какой процесс и на каком ядре в какое время, и каждый системный вызов включает в себя, какое ядро происходит системный вызов, так что вы получите поток, который точно вызывает системный вызов.

0 голосов
/ 21 мая 2012

(1) Библиотека, содержащая системные функции ядра, перечисленные в трассировщике ядра, не загружается в одно и то же место при каждой перезагрузке системы.Один из способов разрешить адреса системных вызовов с помощью отладчика ядра.Например, ln <address> даст вам имя функции в <address>.Если вы введете lm в ядре при нескольких перезагрузках, вы заметите, что модуль 'nt' всегда находится в другом месте.

(2) Из того, что я прочитал, вы правы в том, что вам нужноотслеживать переключение контекста, но я никогда не пытался это сделать.

...