· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Загрузка DLL из драйвера

Посл.отвђт Сообщен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