Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 8 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 
Прилепленное (важное) сообщение

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

Для начала, я загрузил программу в известный PE-редактор PE Explorer 1.96 с целью анализа прилинкованных к EXE-файлу ресурсов, среди которых мог обнаружится сам драйвер. Как я и ожидал, драйвер быстро обнаружился в секции RC Data под именем OSCI_DRVNT. Сохраняем драйвер в виде sys-файла на диск выбором команды контекстного меню Save Resource As…. В последующем он понадобился для компиляции в файл ресурсов и, как результат, подключения готового Res-файла к тестовому Delphi-приложению директивой {$R driver.res}.

Следующий этап заключается в поиске необходимых нам так называемых IOCTL-кодов, через которые происходит обращение приложения к драйверу. По сути, это команды, в ответ на которые драйвер выполняет ту или иную функцию, например читает порт или перезаписывает MSR-регистр процессора. В итоге, драйвер возвращает результат выполненной функции приложению. Для поиска IOCTL-кодов я прибегнул к встроенному дизассемблеру программы PE Explorer. Данный дизассемблер хорошо подходит для программ, скомпилированных на Delphi и предоставляет код ассемблера в удобном для изучения виде.

Дизассемблировав EXE-файл, нажатием Ctrl+F вводим запрос IOCTL. Естественно, первая попытка найти соответствие символьной константы необходимому IOCTL-коду неудачна, поэтому двигаем поиск дальше нажатием клавиши F3. И вот она удача! Полный перечень IOCTL-кодов обнаружился!

#77

Итак, видим, что для того, чтобы считать данные MSR-регистра необходимо обратиться к драйверу с IOCTL-кодом IOCTL_READ_MSR, числовое значение в hex-формате которого равно 9C402604h. Драйвер понимает и множество других IOCTL-кодов, смысл которых нам раскрывают интуитивно понятные имена символьных констант. Прекрасно понимая, что автор программы – полный «лом» в написании драйверов, всё-таки не могу не упрекнуть его за такое упущение!

Финальный шаг состоит в определении названия функции, с помощью которой приложение отправляет драйверу IOCTL-код. Их две: DeviceIoControl и WriteFile. Учитывая, что первая функция применяется гораздо чаще и является, по сути, классической в данной случае, с её поиска мы и начнем.

Поднимаемся в самое начало дизассемблированного кода, и начинаем поиск по критерию IOCTL_READ_MSR. Первый найденный результат доказывает, что для обращения к драйверу применяется классическая функция DeviceIoControl – сместившись на 20 строчек по коду выше обнаруживаем вызов данной функции из библиотеки kernel32.dll!

Теперь, когда мы знаем все IOCTL-коды и название применяемой функции мы можем приступить к написанию тестового приложения, полный рабочий пример которого можно взять здесь. Я не буду комментировать его т.к., а я лично одобряю позицию, о которой говорил в самом начале этой статьи: не нужно постигать то, в чем мы не заинтересованы, нам важен конечный результат. Тестовое приложение реализует одним модулем необходимый набор функций для начинающего системного программиста, а именно: чтение/запись портов и MSR-регистров процессора.

Для вашего приложения понадобится лишь прилагаемый к архиву модуль PortIO.pas и сам драйвер в виде ресурса driver.res. Инсталляцию и инициализацию драйвера берет на себя модуль.

В завершении этой статьи я хотел бы акцентировать ваше внимание на том, что моя статья опубликована исключительно в образовательных целях и не носит какой-либо противозаконный характер! Удачи!
Добавлено спустя 7 часов, 53 минуты, 36 секунд
Оригинал статьи можно прочесть здесь.



Партнер
 

Member
Статус: Не в сети
Регистрация: 26.10.2004
Откуда: СПб
Brainstorm писал(а):
Для поиска IOCTL-кодов я прибегнул к встроенному дизассемблеру программы PE Explorer. Данный дизассемблер хорошо подходит для программ, скомпилированных на Delphi и предоставляет код ассемблера в удобном для изучения виде.

По сравнению с IDA Pro этот дизассемблер ничего удобного из себя не представляет, как и другие.

Драйвер чтоб читать и писать MSR регистры пишется элементарно, достаточно посмотреть описание команд RDMSR и WRMSR в мануалах интела или АМД и чиркнуть несколько строчек кода, уж куда быстрее чем искать и реверсить какую-то левую дровину, в общем не вижу какого-либо смысла в статье.


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Собственно хотел бы узнать , а где суть!???


 

Member
Статус: Не в сети
Регистрация: 23.09.2003
Откуда: South Ural
Ray Adams
суть в очередном привлечении внимания к самой персоне сенсея синего шрифта...

_________________
http://stargaz0r.nm.ru
http://people.overclockers.ru/StarGaz0r/files


 

Member
Статус: Не в сети
Регистрация: 20.12.2005
Откуда: Волгоград
Brainstorm,
зачем тебе это вообще нужно. Если не устраивает этот драйвер, напиши свой, а от правки мало что измениться...
Или наоборот измениться, но не то что хотелось :)

_________________
Все в этом Мире имеет какой то смысл. В нем нет ничего бесполезного или случайного...


 

Member
Статус: Не в сети
Регистрация: 16.04.2004
Откуда: [MSK.RU]
А что это мне этот драйвер так сильно напоминает?..


 

GrifeX, мне этот драйвер абсолютно не нужен. Я лишь показал, как на примере одной единственной утилиты PE Explorer можно, при крайней необходимости, прикрутить к собственной программе сторонний драйвер, не имея при этом никакого понятия, как пишется он сам. А также, показать, в чём именно было упущение разработчика, чей драйвер (его личный, написанный для него под заказ, подаренный безвозмездно и т.д. т.п.) был позаимствован.


 

Member
Статус: Не в сети
Регистрация: 20.12.2005
Откуда: Волгоград
Brainstorm писал(а):
не имея при этом никакого понятия, как пишется он сам.

Ну это уже невозможно, асемблер ты знать должен в любом случае и очень даже не плохо...

_________________
Все в этом Мире имеет какой то смысл. В нем нет ничего бесполезного или случайного...


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 8 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan