LINUX.ORG.RU

Перехват execve в ядре

 


1

1

реализую перехват, функций ядра, как описано тут https://habrahabr.ru/post/206778/
Меня интересует, почему? как? в новых ядрах (например 3,19. 4,4) не удаётся, осуществить перехват функции execve ? (на младших ядрах функция перехватывалась без проблем).(именно данная функция не перехватывается, остальные . не относящиеся к exec отрабатывают как им и положено)
Как реализовать перехват??


Ответ на: комментарий от anonymous

Именно do_execve
После изменения, в опкод начала функции записываться f b . Но исключения не происходит, как-будто код туда не попадает. (на всякий случай повторюсь, на старых ядрах (скажем 3,6) перехват работает)

GIigo
() автор топика
Ответ на: комментарий от GIigo

в опкод начала функции записываться f b

Ты проверил?

Что-то не увидел по твоим ссылкам ничего про кеш. Ты меняешь код на лету, значит надо как минимум сбросить кеш данных и инвалидировать кеш инструкций.

anonymous
()
Ответ на: комментарий от anonymous

байты проверил. (перезаписаны)
(перехват ОСТАЛЬНЫх функций на этомже ядре, работает..значит действия наподобии «кеш» сделаны). (проверил байты остальных перехваченных функций. в execve всё аналогично..но не работает.)

GIigo
() автор топика
Ответ на: комментарий от GIigo

значит действия наподобии «кеш» сделаны

Где? Особенно инвалидация.

Вообще, так хуевые студенты рассуждают - не упало значит все правильно типа.

anonymous
()
Ответ на: комментарий от anonymous

Ок. Поясните , как правильно делается «кеш» и «инвалидация» (кстати, это действительно так, я не знаю что под этим подразумивается. )

GIigo
() автор топика
Ответ на: комментарий от GIigo

Открывай мануал на свой проц и читай про self modifying code.

anonymous
()

kprobes своими руками

Если не работает своими, то первое - это попробовать, работает ли в принципе, т.е. с помощью systemtap:

stap -c df -e 'probe syscall.execve { printf ("%s(%d) execve (%s)\n", execname(), pid(), argstr) }'
Не проверял, т.к. нужно установить сначала здоровенный linux-image-*-dbg (3.1 GB), склеил из:

1. systemtap.git/testsuite/systemtap.base/execve.stp

probe syscall.execve
{
    if (pid() == target()) {
        println(filename)
    }
}

2. Try It Out

stap -c df -e 'probe syscall.* { if (target()==pid()) log(name." ".argstr) }'

3. Probing a system call

# cat exec.stp
probe syscall.execve
{
    printf ("%s(%d) execve (%s)\n", execname(), pid(), argstr)
}

gag ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.