Можем ли мы изменить процедуру int 0x80? - PullRequest
0 голосов
/ 26 февраля 2009
  1. Чем linux 2.6 отличается от 2.4?
  2. Можем ли мы изменить исходное ядро?
  3. Можем ли мы изменить процедуру обслуживания int 0x80?

Ответы [ 2 ]

6 голосов
/ 26 февраля 2009

UPDATE:
1. обработчик 0x80 по существу одинаков между 2,4 и 2.6, хотя функция, вызываемая из обработчика, вызывается обработчиком инструкций 'syscall' для x86-64 в 2.6. 2. обработчик 0x80 можно изменить так же, как и остальное ядро.
3. Вы ничего не сломаете, изменив его, если не удалите обратную совместимость. Например, вы можете добавить свой собственный след или бэкдор, если вы чувствуете такую ​​склонность. Другой пост, в котором говорится, что вы сломаете свои библиотеки и набор инструментов, если вы измените обработчик, неверен. Если вы нарушите алгоритм диспетчеризации или неправильно измените таблицу диспетчеризации, вы все испортите.
3a. Как я писал ранее, лучший способ расширить службу 0x80 - это расширить обработчик системных вызовов.

Как говорит источник в ядре:

What:           The kernel syscall interface
Description:
        This interface matches much of the POSIX interface and is based
        on it and other Unix based interfaces.  It will only be added to
        over time, and not have things removed from it.</p>

<pre><code>    Note that this interface is different for every architecture
    that Linux supports.  Please see the architecture-specific
    documentation for details on the syscall numbers that are to be
    mapped to each syscall.
</code>


Записи таблицы системных вызовов для i386 находятся в:
arch/i386/kernel/syscall_table.S

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

Номер вектора системного вызова определен в irq_vectors .h
Затем traps.c устанавливает адрес функции system_call через set_system_gate, которая помещает запись в таблицу дескрипторов прерываний. Сама функция system_call находится в entry.S и вызывает запрошенный указатель из таблицы системных вызовов.
Есть несколько подробностей, которые вы можете увидеть, читая код, но прямое изменение обработчика прерываний 0x80 выполняется в entry.S внутри функции system_call. Более разумным способом вы можете изменить таблицу системных вызовов, вставив свою собственную функцию без изменения механизма диспетчеризации.

Фактически, прочитав исходный код 2.6, он прямо говорит, что системные вызовы int 0x80 и x86-64 до сих пор используют один и тот же код. Таким образом, вы можете вносить переносимые изменения для x86-32 и x86-64.
КОНЕЦ Обновление

Метод INT 0x80 вызывает обработчик таблицы системных вызовов. Это сопоставляет аргументы регистра с таблицей вызовов, вызывая функции ядра на основе содержимого регистра EAX. Вы можете легко расширить таблицу системных вызовов для добавления пользовательских функций API ядра.

Это может даже работать с новым кодом системного вызова на x86-64, так как он также использует таблицу системных вызовов.

Если вы изменяете текущую таблицу системных вызовов иначе, чем расширяете ее, вы нарушаете все зависимые библиотеки и код, включая libc, init и т. Д.

Вот текущая таблица системных вызовов Linux: http://asm.sourceforge.net/syscall.html

5 голосов
/ 26 февраля 2009
  1. Это архитектурный ремонт. Все изменилось внутри. Поддержка SMP завершена, значительно улучшен планировщик процессов, капитальный ремонт управления памятью и многое-многое другое.
  2. Да. Это программное обеспечение с открытым исходным кодом. Если у вас нет копии исходного кода, вы можете получить ее у своего поставщика или у kernel.org .
  3. Да, но это не рекомендуется, потому что будет нарушать libc, будет разрушать ваш базовый план, и будет нарушать вашу цепочку инструментов, если вы измените последовательность существующих системных вызовов, и почти все, что, как вы думаете, вы хотите сделать, должно быть сделано в пользовательском пространстве, когда это возможно.
...