Как я могу получить доступ к Ring 0 через Python? - PullRequest
1 голос
/ 09 апреля 2011

Этот ответ о том, что именование классов в Python не выполняется из-за особых привилегий, здесь смущает меня.

  1. Как я могу получить доступ к нижним кольцам в Python?
  2. Является ли низкоуровневый вход для доступа к кольцам более низкого уровня?
  3. Если да, к каким звонкам я могу получить доступ?
  4. Указание "This function is intended for low-level I/O." относится к кольцам более низкого уровня или к чему-то еще?
  5. C имеет тенденцию быть выдающимся языком в os-программировании. Когда в Python есть OS-класс, означает ли это, что я могу получить доступ к C-коду через этот класс?
  6. Предположим, я играю со странным машинным кодом и хочу как-то понять, что это значит. Есть ли в Python инструменты, которые я могу использовать для анализа таких вещей? Если нет, есть ли способ, которым я все еще мог бы использовать Python для управления каким-то инструментом, который управляет странным машинным языком? [ctypes предлагается в комментариях]
  7. Если Python не имеет ничего общего с низкоуровневыми привилегированными вещами, предлагает ли он еще некоторые обертки для управления привилегированными?

Ответы [ 5 ]

7 голосов
/ 09 апреля 2011

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

Одна из причин кода ring 0 настолько важна, что он может напрямую обращаться к оборудованию. Напротив, когда процесс пользовательского режима (кольцо 3) должен прочитать некоторые данные с диска:

  1. процесс выполняет специальную инструкцию, сообщающую процессору, что он хочет сделать системный вызов
  2. CPU переключается на кольцо 0 и начинает выполнять код ядра
  3. ядро ​​проверяет, что процессу разрешено выполнять операцию
  4. если разрешено, операция выполняется
  5. ядро ​​сообщает процессору, что оно завершено
  6. ЦП переключается обратно на кольцо 3 и возвращает управление процессу

Процессы, принадлежащие «привилегированным» пользователям (например, root / Administrator), выполняются в кольце 3, как и любой другой код режима пользователя; единственное отличие состоит в том, что проверка на шаге 3 всегда проходит успешно. Это хорошо, потому что:

  • процессы, принадлежащие пользователю root, могут аварийно завершить работу, не отключив всю систему
  • многие функции пользовательского режима недоступны в ядре, например, сменная память, личное адресное пространство

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

В другом вопросе, на который вы ссылаетесь, и os.open(), и open() в итоге делают системный вызов open () , который проверяет, разрешено ли процессу открывать соответствующий файл, и выполняет работа.

3 голосов
/ 10 апреля 2011

Я думаю, что ответ SimonJ очень хороший, но я собираюсь опубликовать свой собственный, потому что из ваших комментариев видно, что вы не совсем понимаете вещи.

Во-первых, когда вы загружаете операционную систему, вы загружаете ядро ​​в память и говорите «начните выполнение по адресу X». Ядро, этот код, по сути, просто программа, но, разумеется, больше ничего не загружается, поэтому, если он хочет что-то делать, ему нужно знать точные команды для конкретного оборудования, которое он к нему подключил.

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

Таким образом, функция ядра состоит в том, чтобы контролировать все оборудование, подключенное к системе, и представлять его в общем интерфейсе, называемом API (интерфейс прикладного программирования). Код для программ, работающих в системе, не взаимодействует напрямую с оборудованием. Они разговаривают с ядром. Таким образом, пользовательские программы не должны знать, как задать конкретному жесткому диску чтение сектора 0x213E или что-то еще, но ядро ​​делает это.

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

Здесь также есть другой уровень сложности, а именно концепция разрешений. Большинство операционных систем имеют некоторую форму контроля доступа, при которой «администраторы» имеют полный контроль над системой, а «пользователи» имеют ограниченный набор параметров. Таким образом, запрос ядра на открытие файла, принадлежащего администратору, не должен выполняться при таком подходе. Пользователь, который запускает программу, является частью контекста программы, если вам нравится, и то, что программа может делать, ограничено тем, что может делать этот пользователь.

Большую часть того, чего вы могли бы достичь (если вы не собираетесь писать ядро), можно сделать в пользовательской среде как пользователь root / администратор, где ядро ​​не отклоняет любые запросы API, сделанные к нему. Это все еще программа пользователя. Это все еще программа 3 кольца. Но для большинства (почти всех) применений этого достаточно. Многое может быть достигнуто как пользователь без полномочий root / администратор.

Это относится к интерпретатору Python и, соответственно, ко всему коду Python, выполняемому в этом интерпретаторе.

Давайте разберемся с некоторыми неопределенностями:

  • Наименование os и sys Я думаю, это потому, что это "системные" задачи (в отличие от urllib2). Например, они дают вам возможность манипулировать и открывать файлы. Однако они проходят через интерпретатор python, который, в свою очередь, обращается к ядру.
  • Я не знаю ни одной реализации Python в режиме ядра. Поэтому, насколько мне известно, нет никакого способа написать код на python, который будет работать в ядре (linux / windows).
  • Существует два типа привилегированных: привилегированные с точки зрения аппаратного доступа и привилегированные с точки зрения системы контроля доступа, предоставляемой ядром. Python может запускаться от имени пользователя root / администратора (на самом деле в Linux многие инструменты администрирования написаны на python), поэтому в некотором смысле он может обращаться к привилегированному коду.
  • Написание расширения C или управление приложением C в Python означало бы, что вы либо используете код, добавленный в интерпретатор (пользовательское пространство), либо управляете другим пользовательским приложением. Однако , если вы написали модуль ядра в C (Linux) или Driver в C (Windows), можно было бы загрузить этот драйвер и взаимодействовать с ним через API ядра из питон. Примером может быть создание записи / proc в C, а затем передача приложением python сообщений через чтение / запись в эту запись / proc (которую модуль ядра должен обработать с помощью обработчика записи / чтения. По сути, вы пишете код вы хотите работать в пространстве ядра и в основном добавлять / расширять API ядра одним из многих способов, чтобы ваша программа могла взаимодействовать с этим кодом.
  • «Низкоуровневый» IO означает больший контроль над типом IO и тем, как вы получаете эти данные из операционной системы. Это низкий уровень по сравнению с функциями более высокого уровня, все еще работающими в Python, которые предоставляют более простые способы чтения файлов (удобство за счет контроля). Это сравнимо с разницей между read() звонками и fread() или fscanf() в C.

Предупреждение о работоспособности: написание модулей ядра, если вы ошиблись, в лучшем случае приведет к тому, что этот модуль будет загружен неправильно; в худшем случае ваша система будет паниковать / синий экран, и вам придется перезагрузиться.

Последний пункт о машинных инструкциях, я не могу ответить здесь. Это совершенно отдельный вопрос, и это зависит. Я уверен, что есть много инструментов, способных анализировать код, но я не являюсь реверс-инженером. Тем не менее, я знаю, что многие из этих инструментов (GDB, Valgrind), например. инструментам, которые подключаются к двоичному коду, не нужны модули ядра для своей работы.

1 голос
/ 23 января 2014

Вы можете использовать входную библиотеку http://logix4u.net/parallel-port/index.php

import ctypes

#Example of strobing data out with nStrobe pin (note - inverted)
#Get 50kbaud without the read, 30kbaud with
read = []
for n in range(4):
    ctypes.windll.inpout32.Out32(0x37a, 1)
    ctypes.windll.inpout32.Out32(0x378, n)
    read.append(ctypes.windll.inpout32.Inp32(0x378))   #Dummy read to see what is going on
    ctypes.windll.inpout32.Out32(0x37a, 0)

print read
1 голос
/ 09 апреля 2011

[примечание: я был не прав.Код пользовательского режима больше не может обращаться к кольцу 0 в современных системах Unix.- jc 2019-01-17]

Я забыл, что мало что знал о привилегиях Windows.Во всех Unix-системах, с которыми я знаком, пользователь root может получить доступ ко всем привилегиям ring0.Но я не могу думать ни о каком отображении модулей Python с кольцами привилегий.То есть модули 'os' и 'sys' не дают вам никаких особых привилегий.Они у вас есть или нет из-за ваших учетных данных.

0 голосов
/ 11 апреля 2011

Как получить доступ к нижним кольцам в Python?

ctypes

Является ли низкоуровневый ввод-вывод для доступа к кольцам нижнего уровня?

Нет.

Является ли утверждение «Эта функция предназначена для низкоуровневого ввода-вывода».имеется в виду кольца более низкого уровня или что-то еще?

Что-то еще.

C имеет тенденцию быть выдающимся языком в программировании os.Когда в Python есть OS-класс, значит ли это, что я могу получить доступ к C-коду через этот класс?

Весь CPython реализован на C.

The os модуль (это не класс , это модуль ) предназначен для доступа к API ОС.C не имеет ничего общего с доступом к OS API.Python обращается к API «напрямую».

Предположим, я играю с причудливым кодом машинного языка и хочу как-то понять, что он означает.Есть ли в Python инструменты, которые я могу использовать для анализа таких вещей?

"игра с"?

"понимаете, что это значит"?это твоя проблема.Вы читаете код, вы понимаете это.Сможет ли Python помочь, сказать невозможно.Что вы не понимаете?

Если нет, есть ли способ, которым я все еще мог бы использовать Python для управления каким-либо инструментом, который контролирует странный машинный язык?[ctypes предлагается в комментариях]

ctypes

Если Python не имеет ничего общего с низкоуровневыми привилегированными вещами, он все равно предлагает некоторые обертки для управленияпривилегированный?

Вы не «оборачиваете» вещи, чтобы контролировать привилегии.

Большинство ОС работают следующим образом.

  1. Вы предоставляете привилегиина учетную запись пользователя.

  2. API OS проверяют привилегии, предоставленные пользователю, выполняющему запрос API OS.

Если пользователь имеетпривилегий, OS API работает.

Если пользователю не хватает привилегий, OS API вызывает исключение.

Это все, что нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...