2012-05-09 2 views
0

В моей программе я хочу перехватить каждый системный вызов на уровне пользователя в рамках одного и того же процесса (я не хочу использовать отдельный процесс, например ptrace, или такой инструмент, как strace). Я также не хочу использовать LD_PRELOAD. Как я могу это сделать?Перехват системных вызовов на уровне пользователя без LD_PRELOAD

+0

Я не думаю, что 'LD_PRELOAD' может использоваться для перехвата системных вызовов в любом случае. – Job

ответ

3

Использовать макросы. Он работает следующим образом:

  1. Создать файл заголовка, который определяет макрос для каждого системного вызова, который вы хотите отслеживать. Пример: open()

    #define open(path,flags,mode) mySpecialOpen(path,flags,mode) 
    
  2. Создать библиотеку, которая содержит mySpecial*() функции, пересылать вызовы к системному вызову. Скомпилируйте библиотеку без файла заголовка.

  3. Скомпилируйте свой код (и все библиотеки, которые вы используете), с указанным выше заголовком. Связь с библиотекой.

+1

Но это не вызовет системные вызовы с ручной кодировкой (т. Е. Встроенные сборки), которые инструмент «strace' * делает». Кроме того, если вы не перекомпилируете 'libc', все системные вызовы, выполняемые через стандартные библиотечные функции, также не пойманы. – Job

+2

@Job: Как я уже сказал, «и все библиотеки, которые вы используете». Вы знаете лучшее решение? OP не хочет использовать какие-либо официальные инструменты; они выполняют надлежащую работу. Все остальное должно иметь некоторые недостатки. –

+0

Да, я знаю, но я просто указывал на два из этих недостатков вашего решения. Что касается лучшего решения, очевидно, у меня его нет, поскольку я бы разместил его тогда :-) Я думал использовать какой-то трюк, чтобы использовать 'ptrace' для отслеживания собственного процесса, а не для ребенка, но я предполагаю, что выиграл возможно. – Job

Смежные вопросы