Символы ядра в модуле ядра
Прежде всего мне нужно знать адреса в System.map
или же /proc/kallsyms
виртуальные или физические? тогда я хочу читать с адресов символов ядра, например, я хочу читать pid
поле init_task
условное обозначение. я могу найти init_task
адрес от System.map
а также смещение pid
, но я не знаю, как читать с адреса в ядре. Я действительно ценю любую ссылку или ссылку, чтобы сказать вещи подробно, потому что я не знаком с программированием ядра.
другой вопрос: когда они говорят DKOM
(динамическое манипулирование объектами ядра) что это значит? Я искал, но просто найти что-то о системе Windows!
и когда они говорят, что вы можете получить доступ exported symbols
в LKM
? какие операции они имеют в виду? конкретные функции для чтения или записи из символов ядра?
2 ответа
Почти любой адрес указателя, который вы видите, является виртуальным. Это либо виртуальное пространство процессов пользовательского пространства (а именно вашего процесса), либо виртуальное адресное пространство ядра. Только когда ядро должно сообщить одному аппаратному компоненту, как получить доступ к другому, оно будет преобразовывать указатель в физическое представление.
Стоит отметить, что в этом случае физическое адресное пространство является виртуальным в том смысле, что разным аппаратным компонентам прагматически назначаются диапазоны памяти, и ожидается, что они будут реагировать при обращении к ним. Это все еще очень физически в том смысле, что эти значения адреса являются теми, которые закодированы на адресе шины, и никакой программной трансляции не требуется.
Что касается чтения / записи указателей ядра из пространства пользователя. Без специального API и настройки пользователем и ядром (например, с общей памятью) вы не сможете. Это самая базовая защита, встроенная в ядро операционной системы. (Вы даже не можете получить доступ к памяти другого пользователя в этом отношении).
Сказав это, если вы хотите намеренно понизить безопасность вашего ядра, вы можете делать что-нибудь под root, включая загрузку модуля, который делает именно это...
Вот еще одно обсуждение на ту же тему: как получить доступ к пространству ядра из пространства пользователя в linux
Во-первых, адреса в System.map
или же /proc/kallsyms
являются виртуальными адресами.
Во-вторых, если вы хотите просмотреть структуру данных в ядре, вы можете использовать инструмент Crash. Он основан на GDB, прост в использовании. Но вы должны сначала перекомпилировать ваше ядро с отладочной информацией. С помощью инструмента аварийного завершения вы можете легко прочитать каждую структуру данных ядра в пространстве пользователя. И он поддерживает множественные дистрибутивы, такие как Ubuntu, Fedora и так далее.
Другой инструмент - Volatility, написанный Python, вы можете сделать снимок вашей системы. Затем прочитайте снимок памяти с волатильностью.