2011-02-10 5 views
0

Я уже некоторое время искал способы получения системных вызовов в реальном времени на окнах. Я смотрел пару сообщений здесь, в stackoverflow и в других местах, но не мог найти ничего достаточно легкого, чтобы я мог следовать. Я посмотрел на procmon, но его результат был довольно неустойчивым. Один и тот же двоичный код на двух системах генерирует различное количество записей. Возможно, мне не хватает предварительных знаний, чтобы делать такие вещи. Любая помощь/рекомендация приветствуются.Запись системных вызовов в windows

Я смотрел на эти ссылки раньше:

С уважением

+1

Что именно вы пытаетесь делать? Вы хотите совершать звонки в подсистему NT или контролировать активность? Если первый, то три ссылки, которые вы поставили, являются хорошим местом для начала. Если последнее, то я бы предложил промон. Я ожидаю, что он будет предоставлять разные результаты на разных системах или даже на другой вывод на нескольких прогонах одной и той же программы в одной и той же системе в зависимости от состояния системы и программы при ее запуске. –

+0

На самом деле я хочу контролировать/записывать системные вызовы. Procmon - отличный инструмент, но опять же его выход не устойчив, как вы упомянули. Интересно, почему он неустойчив и как я могу сделать его устойчивым. Кроме того, чтобы сделать снимок прозрачным, я пытаюсь отобразить функции C, такие как printf, getche и т. Д., В syscalls, сгенерированные окнами. – Jamil

+0

Чтобы действительно контролировать системные вызовы, вам нужно будет поменять таблицу ввода syscall в режиме ядра. Это опасно и сложно, особенно в 64-битных версиях окон, чтобы препятствовать ISVs в этом. Функции C, такие как printf, обрабатываются в пользовательском режиме и не включают в себя системные вызовы до тех пор, пока они не выйдут на вывод, который был бы либо из процесса LPC-вызова для CSRSS, либо для записи файла в зависимости от того, подключена ли реальная консоль. Это было бы более полезно для знать, что вы пытаетесь выполнить. –

ответ

0

В зависимости от версии Windows, вы используете, ответ на ваш вопрос, вероятно, Ева нт Tracing для Windows (в ETW), который может делать системные вызовы протоколирования [link]

0

Если Вы удовлетворены подходом выборки, то Вы можете попробовать это:

typedef struct _THREAD_LAST_SYSCALL_INFORMATION 
{ 
    PVOID FirstArgument; 
    USHORT SystemCallNumber; 

} THREAD_LAST_SYSCALL_INFORMATION, *PTHREAD_LAST_SYSCALL_INFORMATION; 

THREAD_LAST_SYSCALL_INFORMATION lastSystemCall; 
NtQueryInformationThread(
    hThread, 
    ThreadLastSystemCall, 
    &lastSystemCall, 
    sizeof(THREAD_LAST_SYSCALL_INFORMATION), 
    NULL 
); 

где ThreadLastSystemCall = 21