
Драйвер режима ядра Windows с клиентом режима пользователя, предоставляющий чтение/запись физической и виртуальной памяти на основе IOCTL, обход таблиц страниц, сканирование по шаблону и эмуляцию ввода для читерства в играх.
██╗ ██╗████████╗██╗ ██╗██╗██╗ ██╗███╗ ███╗
██║ ██║╚══██╔══╝██║ ██║██║██║ ██║████╗ ████║
██║ ██║ ██║ ███████║██║██║ ██║██╔████╔██║
██║ ██║ ██║ ██╔══██║██║██║ ██║██║╚██╔╝██║
███████╗██║ ██║ ██║ ██║██║╚██████╔╝██║ ╚═╝ ██║
╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═════╝ ╚═╝ ╚═╝
Фреймворк драйвера режима ядра Windows с клиентом режима пользователя
[!IMPORTANT]
Получить полный проект
Файлы решения доступны через Discord-сервер.
Заинтересованы в покупке полного исходного кода? Свяжитесь со мной в Telegram или Discord: @tonythimself.
Lithium — это драйвер режима ядра Windows (lithium-kernel) в паре с клиентом режима пользователя (lithium-usermode). Он взаимодействует через пользовательский интерфейс IOCTL и предоставляет низкоуровневые примитивы манипуляции памятью, обхода таблиц страниц и управления устройствами ввода.
| Возможность | Описание |
|---|---|
| Физическое чтение/запись памяти | Прямое чтение/запись физических адресов через MmCopyMemory |
| Виртуальное чтение/запись памяти | Кросс-процессный доступ к виртуальной памяти через MmCopyVirtualMemory |
| Разрешение DTB | Извлечение базы таблицы каталогов через перечисление базы данных PFN |
| Обход таблиц страниц | Трансляция линейных адресов с кэшированием уровней PML4/PDPT/PD/PT |
| Сканирование по шаблону | Сканирование сигнатур в стиле IDA по памяти процесса |
| Выделение памяти | ZwAllocateVirtualMemory в контексте целевого процесса |
| Защита памяти | ZwProtectVirtualMemory в контексте целевого процесса |
| Эмуляция мыши | Ввод мыши на уровне ядра через хук callback-сервиса MouClass |
| Скрытие потоков | Подмена полей ETHREAD (адрес запуска, CID, время создания и т.д.) |
| Отключение NMI Callback | Подавление NMI callback для обхода отладчика |
| Очистка пула | Удаление записи из таблицы больших пулов в трекере пулов ядра |
lithium/
├── lithium-kernel/ # Kernel-mode driver (KMDF)
│ ├── entry.cpp # DriverEntry entry point
│ ├── core/
│ │ ├── dispatch/ # IOCTL dispatch and request routing
│ │ ├── requests/
│ │ │ ├── directory-table-base/ # DTB resolution & page table walk
│ │ │ ├── image-base/ # Process module base retrieval
│ │ │ ├── mouse/ # Mouse input emulation via MouClass
│ │ │ ├── read-write/ # Physical and virtual memory R/W
│ │ │ └── virtual-memory/ # Allocate, protect, query, pattern scan
│ │ └── utilities/
│ │ ├── kernel/ # Module enumeration, NMI, thread ops
│ │ └── ... # Pool cleaner, CRT shim
│ └── dependencies/
│ ├── additional/
│ │ ├── crt/ # Minimal CRT implementation
│ │ ├── security/ # skCrypter string encryption, oxorany
│ │ └── structures/ # Shared invoke data structures
│ └── includes.hpp # Master include header
│
└── lithium-usermode/ # User-mode client
├── entry.cpp # Client entry point
├── core/
│ └── driver/ # IOCTL communication layer
└── dependencies/
├── additional/
│ └── structs.hpp # Page table entry unions & helpers
└── includes.hpp
Связь устанавливается путём перехвата процедуры диспетчеризации IOCTL существующего драйвера (ProcObsrvesx.sys). При загрузке модуль ядра находит целевой драйвер, сканирует его обработчик диспетчеризации IRP и перезаписывает его трамплином на собственный hooked_ioctl lithium. Клиент режима пользователя открывает \\.\ProcObsrvesx, и все IOCTL прозрачно перенаправляются через хук.
| Код | Входная структура | Действие |
|---|---|---|
invoke_base | base_invoke { pid, handle } | Получить базу образа процесса |
invoke_dtb | dtb_invoke { pid, dtb } | Разрешить базу таблицы каталогов |
invoke_read | read_invoke { pid, directory_table, address, buffer, size } | Чтение физической памяти |
invoke_write | write_invoke { pid, directory_table, address, buffer, size } | Запись физической памяти |
invoke_read_virtual | read_virtual_invoke { pid, address, buffer, size } | Чтение виртуальной памяти |
invoke_write_virtual | write_virtual_invoke { pid, address, buffer, size } | Запись виртуальной памяти |
invoke_allocate | allocate_invoke { pid, type, protection, address, size } | Выделить виртуальную память |
invoke_protect | protect_invoke { pid, protection, address, size } | Изменить защиту памяти |
invoke_virtual_query | query_virtual_invoke { pid, address, mbi } | Запросить информацию о виртуальной памяти |
invoke_pattern_scan | pattern_invoke { pid, signature, address, pattern_address } | Сканирование памяти по шаблону |
invoke_move_mouse | mouse_invoke { x, y, flags, button_flags } | Эмуляция ввода мыши |
Драйвер перебирает диапазоны физической памяти, возвращаемые MmGetPhysicalMemoryRanges, обходит базу данных PFN для поиска самореферентной записи PML4 и проверяет каждый уровень таблицы страниц для подтверждения правильной базы таблицы каталогов для заданного процесса.
Трансляция линейных адресов в физические проходит по четырёхуровневой иерархии таблиц страниц x64 (PML4 → PDPT → PD → PT) с кэшированием на каждом уровне. Поддержка больших страниц (2MB / 1GB) включена по мере возможности.
Драйвер находит объекты драйверов MouClass и MouHID, извлекает MouseClassServiceCallback из расширения устройства HID и внедряет пакеты MOUSE_INPUT_DATA непосредственно в цепочку callback-ов.
Ключевые поля ETHREAD — время создания, адрес запуска, адрес запуска Win32, стек ядра, CID и статус завершения — сохраняются и заменяются безобидными или нулевыми значениями. При завершении исходные значения восстанавливаются перед завершением потока.
lithium.sln в Visual Studiolithium-kernel → lithium-kernel.syslithium-usermode → lithium-usermode.exeИли через MSBuild:
msbuild lithium.sln /p:Configuration=Release /p:Platform=x64
#include <core/driver/driver.hpp>
g_driver->initialize_handle();
DWORD pid = g_driver->get_process_id(L"target.exe");
g_driver->attach(pid);
g_driver->image_base = g_driver->get_image_base(0);
g_driver->dtb = g_driver->resolve_directory_table_base();
auto value = g_driver->read<uintptr_t>(g_driver->image_base + 0xOFFSET);
g_driver->mouse_event(-10, -10, 0, 0);
Этот проект предназначен только для образовательных и исследовательских целей.
Используйте только на системах, которыми вы владеете или на тестирование которых у вас есть явное разрешение.
Авторы не несут ответственности за любое неправомерное использование или ущерб, причинённый этим программным обеспечением.