жонглирование ядром ФЛЕНОВ МИХАИЛ AKA HORRIFIC Спецвыпуск: Хакер, номер #071, стр. 071-030-2 Прямой вызов не является хорошим решением, но и нельзя его отнести к запрещенным способам. Отрицательный момент кроется в том, что MS может поменять функцию в ядре или предоставить новую версию, тогда при работе через NTDLL перекомпиляция программы не понадобится. В реальности такие случаи происходят очень редко, и старые функции не исчезают, а продолжают поддерживаться для обеспечения обратной совместимости. [режим драйвера.] Драйвера можно разделить на две большие группы – пользовательские (user-mode driver) и ядерные (kernel mode driver). Есть еще куча различных классификаций, но в них нет смысла. В принципе, какая разница, в какую группу засунуть драйвер. Главное, чтобы он выполнял поставленную перед ним задачу. Если ее можно решить в пользовательском режиме, то используй его. Дело в том, что возможности драйвера и предоставляемые привилегии отличаются от уровня IRQL (о нем чуть ниже). Драйвер может быть монолитным и многоуровневым. В первом случае все функции берет на себя один единственный драйвер. Он намного проще в отладке, но не всегда эффективен, потому что может оказаться слишком большим. Намного лучше (и поэтому чаще можно встретить) многоуровневые драйвера. Их можно сравнить с классами в С++. Каждый уровень выполняет небольшую задачу, но делает это хорошо. После выполнения необходимых действий управление передается драйверу следующего уровня, где обработка продолжается. Отлаживать многоуровневые драйвера немного сложнее, но зато один раз отшлифованный уровень будет работать великолепно, потому что он выполняет небольшую задачу. Некоторые боятся множественности уровней, не понимая преимуществ. Рассмотрим на примере сетевой карты. Для получения данных из сети можно создать два драйвера. Первый будет разбирать пользовательский запрос, а второй — читать данные из сетевой карты. Чтобы написать снифер или сетевой экран, нужно написать драйвер, который будет работать между двумя существующими. Таким образом, драйверу снифера не нужно работать непосредственно с железом и не нужно разбирать запросы пользователей, мы только реализуем собственные функции в нужном месте. Помимо этого драйверы можно еще разделить на: 1 ГРАФИЧЕСКИЕ. 2 МУЛЬТИМЕДИА. 3 СЕТЕВЫЕ ДРАЙВЕРА. 4 ДРАЙВЕРА ВИРТУАЛЬНЫХ УСТРОЙСТВ. В принципе, по названию уже понятно, для чего они нужны. [формат.] На самом деле, драйвер имеет стандартный PE (Portable Executable) формат, как и у любого другого приложения. Отличие состоит в том, что расширение желательно установить .sys, и внутри файла программист должен реализовать определенные функции, через которые будет происходить общение с операционной системой. Еще могут быть пользовательские функции, которые будут решать поставленные разработчиком задачи. |