|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 26, 2004 17:27:30 Есть, ли вариант загрузки dll в драйвере. Хотел ипользовать LdrLoadDll, она в ntdll.dll, при старте ОС ругается - "Указанный адрес процедуры не найден...." |
|
|
Дата: Авг 26, 2004 19:13:14 чТОБ запустить функцию из нтдлл ее надо сначала найти типа 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); если чего не напутал то вроде так надо делать тока выбери свою функцию |
|
|
Дата: Авг 27, 2004 00:43:59 Забудь про NtDll.dll. Используй ZwSetSystemInformation из ntoskrnl. Там есть подкласс позволяющий грузить DLL. |
|
|
Дата: Авг 30, 2004 17:57:22 Zufyxe Подробнее можно, про класс... |
|
|
Дата: Авг 30, 2004 20:54:31 Имеется в виду ZwSetSystemInformation, SystemLoadImage... ZwSetSystemInformation, SystemUnloadImage... Где-то в недрах rootkit.com валяется то ли исходник, то-ли статья, то ли пост ;) на эту тему. Но мне так и не удалось это всё прикрутить. Дрова загружаются, но точка входа не вызывается. При этом SystemUnloadImage возвращает STATUS_SUCCESS, по драйвер не выгружается. Юзерные библиотеки вообще не грузятся - STATUS_PROCEDURE_NOT_FOUND. По научному, эти два класса называются SystemLoadGdiDriverInformation и SystemUnloadGdiDriverInformation. Так что не удивительно, что они косячат с другими модулями. Подробности можно посмотреть в исходнике функции MiLoadSystemImage. ;@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 |
|
|
Дата: Сен 2, 2004 13:48:01 Вот есть документ http://www.wd-3.com/archive/KernelDlls.htm Там про DLL уровня ядра, может URL кому и пригодится :) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.095 |