Как стать автором
Обновить

Комментарии 32

НЛО прилетело и опубликовало эту надпись здесь
Как-раз поиска по сигнатуре и хотелось избежать. Поиск по сигнатуре многократно описан, например здесь же рядом: Встраивание в ядро Linux: перехват системных вызовов (уж лучше так). Но зачем искать по сигнатуре, которая в любой момент может поменяться, если достаточно простого kallsyms_lookup_name( «sys_call_table» ). В вашем коде сигнатура сохраняется только для X86_64 (даже для I386 всё не так), а kallsyms_lookup_name() работает на любой платформе.
НЛО прилетело и опубликовало эту надпись здесь
Для патча sys_call_table на стоковых x86_64 ядрах я написал вот такую функцию

На 64-бит архитектуре всё становится куда интереснее не в том, чтобы патчить sys_call_table (дело не хитрое), а в том, чтобы перехватить в своих целях все варианты выполнения системного вызова. что становится горомоздко из-за вариантов выполнения как 32-бит, так и 64-бит приложений.
Повторю схему, которую здесь уже рядом статье показывали:
image
НЛО прилетело и опубликовало эту надпись здесь
Почему для перехвата системных вызовов не использовать ptrace?
НЛО прилетело и опубликовало эту надпись здесь
Каким образом не подходит-то? Приложению трассирующему другое приложение через ptrace вообще не надо заморачиваться на тему того, как именно выполняется системный вызов.
НЛО прилетело и опубликовало эту надпись здесь
Всех user-mode процессов я, честно говоря, не вижу.
НЛО прилетело и опубликовало эту надпись здесь
Я вообще постановки задачи не вижу.
в юзерспэйс?
Конечно.
Цель ведь не в том, чтобы выловить системные вызовы из одного конкретного процесса… да ещё запущенного каким-то особым образом, под трасировщиком. Цель в том, чтобы контролировать все системные вызовы от всех запускаемых процессов, а потом уже решать что с этим системным вызовом делать… или ничего не делать.

да ещё запущенного каким-то особым образом, под трасировщиком

В этом нет необходимости, к нужному процессу можно присоединиться после его запуска.
Цель в том, чтобы контролировать все системные вызовы от всех запускаемых процессов

И это можно сделать с помощью ptrace, так делает, например, strace -f.
В этом нет необходимости, к нужному процессу можно присоединиться после его запуска.

Это не важно, запущен особым образом, или к нему подключиться после запуска… речь о том, чтобы контролировать системные запросы от любого процесса (всех!), запущенного стандартным образом, командной строкой… или вообще от любого процесса, запущенного как угодно: демон, сервис… без разницы.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
в листинге номер два есть одна хоть и незначительная, но все же проблема:

Нет такой проблемы ;-)
Во-первых, проблема эта известна, описана и ссылка показана в тексте: WP: Safe or Not?.
Во-вторых, проблема в SMP не возникнет из-за cli / sti, хотя можно её оградить и более сложным образом, испольуя макросы preempt_disable() и preempt_enable_no_resched(). Лучше ли это? Не знаю…
В-третьих, когда пишется текст, хотелось бы его упростить «до нельзя», не акцентируясь на детали: описывать схему — чтобы кто-то из читающих смог ним оспользоваться, а не показывать насколько пишущий умён ;-)

Так делать нельзя, короче, если вам нужно модифицировать read only страницу памяти — то для этого следует выставлять атрибуты доступа в PTE описывающей эту страницу

В-четвёртых, этот способ хорошо известен, показан, например, вот здесь: Кошерный способ модификации защищённых от записи областей ядра Linux (в комментариях). Там же (в статье) предложен ещё один способ… лучший, наверное, по сравнению… и с вашим и с нашим ;-). Способов много. Какой из них лучше трудно судить.

НЛО прилетело и опубликовало эту надпись здесь
Полагаю, для таких целей (разработчику хочется знать, что сейчас происходит в системе) целесообразнее использовать стандартные механизмы вроде SystemTap, DTrace, Kprobes

Хотя безусловно, полезно знать, как оно работает на низком уровне.
НЛО прилетело и опубликовало эту надпись здесь
Дык если речь не про руткиты, а про свою машину, то делать с ней можно что угодно.

И если «выяснить, что происходит» — не основная задача, то специализированный язык намного быстрее доведёт до результата — полно готовых примеров на все случаи жизни. А код надо писать как серьёзный проект уже.

Ну это всё, если не руткиты :-D
НЛО прилетело и опубликовало эту надпись здесь
и такое пишем. Да, там не все современные средства отладки бывают доступны, да :-)

Сам не так давно свои боевые исходники ядра, внедрённого в эксплуатацию, потерял :-) Спасло то, что когда-то догадался поставить галочку на конфиге ядра в /proc/config.gz. Получилось всё восстановить. Ну и поскольку 3.8, все SystemTap при желании доступны. OProfile ещё когда-то пробовал, но не очень понравилось.
Не всегда есть возможность пересобрать ядро из сорцов

Поставщик такого ядра не предоставляющий его исходники нарушает условия лицензии ядра.
Интрересно, что лицензия не предусматривает сроки, в которые поставщик обязан предоставить исходники. Возможна ситуация — запрос исходников, ответ — ждите, делаем. И тишина.

На практике я сталкивался с этим у компании HTC, поддержка которой на вопросы по исходникам отвечает «мониторьте портал для разработчиков, там скоро выложат». Задержка от выхода устройства на рынок до появления исходников может быть и полгода, и год.
А можно вместо глобального отключения страничной защиты найти pte страницы где лежаж векторы и поправить там флаги?
Конечно можно.
Здесь в обсуждении и по ссылкам названным показано как минимум 4 разных способа (с фрагментами кода) которыми можно сделать запись в защищённую страницу.
Придётся мне, наверное, написать отдельное дополнение о этих 4-х способах.

P.S. я не знаю какой из них лучше и чем.

За материал спасибо. Просто выше верно подметили про smp и стремность такого отлкючения. Совсем недавно писал модуль для работы с mmu там много неэкспортируемых методов. Ваш материал очень кстати.
Просто выше верно подметили про smp и стремность такого отлкючения.

Для SMP (а это общий на сегодня случай) нужно обеспечить, чтобы выполнение на критическом фрагменте не было перенесено на другой процессор.
Пожалуй, этот вопрос заслуживает отдельного рассмотрения.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории