Есть, ли вариант загрузки dll в драйвере. Хотел ипользовать LdrLoadDll, она в ntdll.dll, при старте ОС ругается - "Указанный адрес процедуры не найден...."
чТОБ запустить функцию из нтдлл ее надо сначала найти типа PVOID FindNT() { ULONG n; PVOID ntdll =0; PULONG q; PSYSTEM_MODULE_INFORMATION p; ULONG i; ZwQuerySystemInformation (SystemModuleInformation, &n,0,&n); q = (PULONG) (ExAllocatePool (PagedPool,n)); ZwQuerySystemInformation (SystemModuleInformation, q,n *sizeof *q,0); p = (PSYSTEM_MODULE_INFORMATION) (q +1); for (i =0;i <*q;i++) if (_stricmp(p [i ].ImageName +p [i ].ModuleNameOffset, "ntdll.dll")==0) ntdll = p [i ].Base; ExFreePool(q); return ntdll; } Далее ищещ функцию PVOID FindFunc(PVOID Base,PCSTR Name) { PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER) (Base); PIMAGE_NT_HEADERS nt = (PIMAGE_NT_HEADERS) ((PCHAR) (Base)+dos->e_lfanew); PIMAGE_DATA_DIRECTORY expdir = nt->OptionalHeader.DataDirectory +IMAGE_DIRECTORY_ENTRY_EXPORT; ULONG size =expdir->Size; ULONG addr =expdir->VirtualAddress; PIMAGE_EXPORT_DIRECTORY exports = (PIMAGE_EXPORT_DIRECTORY) ((PCHAR) (Base)+addr); PULONG functions = (PULONG)((PCHAR) (Base)+exports->AddressOfFunctions); PSHORT ordinals = (PSHORT) ((PCHAR)(Base) + exports->AddressOfNameOrdinals); PULONG names = (PULONG) ((PCHAR) (Base) + exports->AddressOfNames); PVOID func =0; ULONG i; ULONG ord; for (i =0;i < exports->NumberOfNames;i++) { ord =ordinals [i ]; if ((functions [ord ] << addr) || (functions [ord ] >>=addr +size)) { if (strcmp((PSTR) ((PCHAR)(Base)+names [i ]),Name)==0) func = (PCHAR) (Base)+functions [ord ]; } } return func; } а вызываешь все функции так lpNtDll = FindNT (); ZwCreateNamedPipeFile = FindFunc (lpNtDll, "ZwCreateNamedPipeFile"); только вначале описываешь NTSTATUS (*ZwCreateNamedPipeFile) ( OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN BOOLEAN TypeMessage, IN BOOLEAN ReadmodeMessage, IN BOOLEAN Nonblocking, IN ULONG MaxInstances, IN ULONG InBufferSize, IN ULONG OutBufferSize, IN PLARGE_INTEGER DefaultTimeout OPTIONAL); если чего не напутал то вроде так надо делать тока выбери свою функцию
Забудь про NtDll.dll. Используй ZwSetSystemInformation из ntoskrnl. Там есть подкласс позволяющий грузить DLL.
Имеется в виду ZwSetSystemInformation, SystemLoadImage... ZwSetSystemInformation, SystemUnloadImage... Где-то в недрах rootkit.com валяется то ли исходник, то-ли статья, то ли пост на эту тему. Но мне так и не удалось это всё прикрутить. Дрова загружаются, но точка входа не вызывается. При этом SystemUnloadImage возвращает STATUS_SUCCESS, по драйвер не выгружается. Юзерные библиотеки вообще не грузятся - STATUS_PROCEDURE_NOT_FOUND. По научному, эти два класса называются SystemLoadGdiDriverInformation и SystemUnloadGdiDriverInformation. Так что не удивительно, что они косячат с другими модулями. Подробности можно посмотреть в исходнике функции MiLoadSystemImage. Код (Text): ;@echo off ;goto make ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: ; ; Written by Four-F ; ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: .386 .model flat, stdcall option casemap:none ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: ; I N C L U D E F I L E S ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: include \masm32\include\w2k\ntstatus.inc include \masm32\include\w2k\ntddk.inc include \masm32\include\w2k\ntoskrnl.inc include \masm32\include\w2k\native.inc includelib \masm32\lib\w2k\ntoskrnl.lib include \masm32\Macros\Strings.mac ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: ; S T R U C T U R E S ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: SYSTEM_LOAD_IMAGE STRUCT ; Information Class 26 ModuleName UNICODE_STRING <> ModuleBase PVOID ? Unknown PVOID ? EntryPoint PVOID ? ExportDirectory PVOID ? SYSTEM_LOAD_IMAGE ENDS PSYSTEM_LOAD_IMAGE typedef ptr SYSTEM_LOAD_IMAGE SYSTEM_UNLOAD_IMAGE STRUCT ; Information Class 27 ModuleBase PVOID ? SYSTEM_UNLOAD_IMAGE ENDS PSYSTEM_UNLOAD_IMAGE typedef ptr SYSTEM_UNLOAD_IMAGE ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: ; D I S C A R D A B L E C O D E ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: .code INIT ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: ; LoadModule ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: LoadModule proc pwszDriverFileName:PWSTR local sli:SYSTEM_LOAD_IMAGE invoke memset, addr sli, 0, sizeof sli invoke RtlInitUnicodeString, addr sli.ModuleName, pwszDriverFileName invoke ZwSetSystemInformation, SystemLoadImage, addr sli, sizeof sli .if eax == STATUS_SUCCESS invoke DbgPrint, $CTA0("Module loaded at address: %08X\n"), sli.ModuleBase mov eax, sli.ModuleBase ; Return module base address .elseif eax == STATUS_IMAGE_ALREADY_LOADED invoke DbgPrint, $CTA0("Module already loaded\n") xor eax, eax ; Return NULL .else invoke DbgPrint, $CTA0("Failed to load module with status: %08X\n"), eax xor eax, eax ; Return NULL .endif ret LoadModule endp ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: ; UnloadModule ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: UnloadModule proc pModuleBase:PVOID local sui:SYSTEM_UNLOAD_IMAGE local status:NTSTATUS mov eax, pModuleBase mov sui.ModuleBase, eax invoke ZwSetSystemInformation, SystemUnloadImage, addr sui, sizeof sui mov status, eax .if eax == STATUS_SUCCESS invoke DbgPrint, $CTA0("Module unloaded from address: %08X\n"), sui.ModuleBase .else invoke DbgPrint, $CTA0("Failed to unload module with status: %08X\n"), status .endif mov eax, status ret UnloadModule endp ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: ; DriverEntry ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING invoke LoadModule, $CTW0("\\??\\C:\\WINNT\\system32\\kernel32.dll") .if eax != NULL invoke UnloadModule, eax .endif mov eax, STATUS_DEVICE_CONFIGURATION_ERROR ret DriverEntry endp ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: ; ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: end DriverEntry :make set drv=DriverLoadsModule \masm32\bin\ml /nologo /c /coff %drv%.bat \masm32\bin\link /nologo /driver /base:0x10000 /align:32 /out:%drv%.sys /subsystem:native /ignore:4078 %drv%.obj del %drv%.obj echo. pause
Вот есть документ http://www.wd-3.com/archive/KernelDlls.htm Там про DLL уровня ядра, может URL кому и пригодится