• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Статья Создание драйвера под Windows. Часть 2: Как выгрузить драйвер и первый функционал.

MLNK

Mod. Ethical Hacking
Red Team
23.01.2018
560
706
BIT
1
Часть 1.

Как выгрузить драйвер и первый функционал.


И снова здравствуйте, пришло время продолжить работу над нашим драйвером.
На данный момент мы:
  • Настроили рабочее окружение
  • Настроили тестовую машину
  • Написали, скомпилировали и даже запустили наш первый драйвер
База у нас есть, теперь начнем работать над функционалом. Те, кто повторял за мной в первой статье, могли заметить, что в нашем драйвере отсутствует функция выгрузки. Поэтому, чтобы запустить наш драйвер заново, приходится перезагружать виртуальную машину, что не очень удобно. Мало того, это может быть небезопасно - ведь ядро не будет само удалять драйвер из памяти, он будет там висеть пока система не перезагрузится, что может привести к утечкам памяти. Для данной операции предусмотрена функция , которая принимает в себя указатель на DriverObject и возвращает void.

Так как наш драйвер пока что не сделал ничего, чтобы потребовало дополнительных действий перед его выгрузкой, наша функция будет выглядеть крайне просто.
C++:
void CodebyDriverUnload(_In_ PDRIVER_OBJECT DriverObject) {
    UNREFERENCED_PARAMETER(DriverObject);
    KdPrint(("CodebyDriverUnload called.\n"));
}

В коде DriverEntry также передадим указатель на DriverObject.
DriverObject->DriverUnload = CodebyDriverUnload;

Теперь пересобираем наш драйвер, и проверим, работает ли выгрузка. На тестовой машине вызываем службу запуска драйвера.
sc start CodebyDriver

Теперь вызовем службу остановки драйвера.
sc stop CodebyDriver

Отлично! функция CodebyDriverUnload отработала.
1.png


Наш драйвер большой молодец: умеет загружаться и выгружаться! Однако, все понимают, да и он сам понимает, что он бесполезен. :(
Давайте научим его делать что-нибудь. Я бы хотел, чтобы он собирал информацию о системе, на которой он запущен.
Для этого надо проштудировать .
Например, давайте определим какая версия Windows установлена на нашей машине.
Для этого нам пригодятся структура и функция .
Инициализируем новую структуру info в которой будут записаны данные OSVERISONINFOW.
C++:
RTL_OSVERSIONINFOW info = { sizeof(info) };

Далее передадим функции RtlGetVersion адрес нашей структуры.
C++:
RtlGetVersion(&info);

Теперь, все что нам надо - это вывести необходимую информацию.
C++:
KdPrint(("Windows Version: %d.%d.%d PlatformID: %d\n", info.dwMajorVersion, info.dwMinorVersion, info.dwBuildNumber, info.dwPlatformId ));

Пересобираем драйвер и проверяем результат.
2.png


C++:
#include <ntddk.h>

void CodebyDriverUnload(_In_ PDRIVER_OBJECT DriverObject) {
    UNREFERENCED_PARAMETER(DriverObject);
    KdPrint(("CodebyDriverUnload called.\n"));
}

extern "C"
NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath)
{
    UNREFERENCED_PARAMETER(DriverObject);
    UNREFERENCED_PARAMETER(RegistryPath);

    KdPrint(("Hi Codeby, this is our first driver! Yuhu!\n"));

    RTL_OSVERSIONINFOW info = { sizeof(info) };
    RtlGetVersion(&info);
    KdPrint(("Windows Version: %d.%d.%d  PlatformID: %d\n", info.dwMajorVersion, info.dwMinorVersion, info.dwBuildNumber, info.dwPlatformId ));
    
    DriverObject->DriverUnload = CodebyDriverUnload;

    return STATUS_SUCCESS;
}
Все отработало отлично, и теперь наш драйвер стал чуточку полезнее.
На этом вторая часть закончена. Я решил не писать полотна текста, а поставлять информацию небольшими частями. Причин на это несколько:
  1. Материал не из легких и усвоить все сразу в больших количествах будет сложно, что может отбить интерес.
  2. Писать небольшие статьи проще и менее ресурсозатратно лично для меня.
В следующей части мы познакомимся с выделением памяти и последующей ее очисткой перед выгрузкой драйвера.

Всем спасибо! :geek:

ПС: Как выяснилось книгу "Windows Kernel Programming" перевели на . Спасибо M0r7iF3r за наводку.
 

morgot

Green Team
25.07.2018
74
35
BIT
2
ПС: Как выяснилось книгу "Windows Kernel Programming" перевели на русский
Да, сначала был любительский перевод от X-shar, а потом и официально перевели.


Автор же, тем временем, пишет вторую версию
 
  • Нравится
Реакции: MLNK

Fleyd13

Member
30.11.2019
5
0
BIT
12
Подскажите пожалуйста. Я тоже прочитал документацию, но я если честно вообще не понял синтаксис и как использовать эту функцию API. Подскажите кто сможет пожалуйста
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!