Загрузка DLL из драйвера

Тема в разделе "WASM.WIN32", создана пользователем SteelRat, 26 авг 2004.

  1. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Есть, ли вариант загрузки dll в драйвере. Хотел ипользовать LdrLoadDll, она в ntdll.dll, при старте ОС ругается - "Указанный адрес процедуры не найден...."
     
  2. kamatoz

    kamatoz New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2004
    Сообщения:
    31
    Адрес:
    Russia
    чТОБ запустить функцию из нтдлл ее надо сначала найти

    типа

    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);

    если чего не напутал то вроде так надо делать тока выбери свою функцию
     
  3. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    Забудь про NtDll.dll. Используй ZwSetSystemInformation из ntoskrnl. Там есть подкласс позволяющий грузить DLL.
     
  4. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Zufyxe

    Подробнее можно, про класс...
     
  5. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Имеется в виду

    ZwSetSystemInformation, SystemLoadImage...

    ZwSetSystemInformation, SystemUnloadImage...



    Где-то в недрах rootkit.com валяется то ли исходник, то-ли статья, то ли пост ;) на эту тему. Но мне так и не удалось это всё прикрутить. Дрова загружаются, но точка входа не вызывается. При этом SystemUnloadImage возвращает STATUS_SUCCESS, по драйвер не выгружается. Юзерные библиотеки вообще не грузятся - STATUS_PROCEDURE_NOT_FOUND.



    По научному, эти два класса называются SystemLoadGdiDriverInformation и SystemUnloadGdiDriverInformation. Так что не удивительно, что они косячат с другими модулями. Подробности можно посмотреть в исходнике функции MiLoadSystemImage.


    Код (Text):
    1. ;@echo off
    2. ;goto make
    3.  
    4. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    5. ;
    6. ;  Written by Four-F
    7. ;
    8. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    9.  
    10. .386
    11. .model flat, stdcall
    12. option casemap:none
    13.  
    14. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    15. ;                                  I N C L U D E   F I L E S                                        
    16. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    17.  
    18. include \masm32\include\w2k\ntstatus.inc
    19. include \masm32\include\w2k\ntddk.inc
    20. include \masm32\include\w2k\ntoskrnl.inc
    21. include \masm32\include\w2k\native.inc
    22.  
    23. includelib \masm32\lib\w2k\ntoskrnl.lib
    24.  
    25. include \masm32\Macros\Strings.mac
    26.  
    27. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    28. ;                                    S T R U C T U R E S                                            
    29. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    30.  
    31. SYSTEM_LOAD_IMAGE STRUCT    ; Information Class 26
    32.     ModuleName      UNICODE_STRING  <>
    33.     ModuleBase      PVOID           ?
    34.     Unknown         PVOID           ?
    35.     EntryPoint      PVOID           ?
    36.     ExportDirectory PVOID           ?
    37. SYSTEM_LOAD_IMAGE ENDS
    38. PSYSTEM_LOAD_IMAGE typedef ptr SYSTEM_LOAD_IMAGE
    39.  
    40. SYSTEM_UNLOAD_IMAGE STRUCT  ; Information Class 27
    41.     ModuleBase      PVOID           ?
    42. SYSTEM_UNLOAD_IMAGE ENDS
    43. PSYSTEM_UNLOAD_IMAGE typedef ptr SYSTEM_UNLOAD_IMAGE
    44.  
    45. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    46. ;                              D I S C A R D A B L E   C O D E                                      
    47. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    48.  
    49. .code INIT
    50.  
    51. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    52. ;                                        LoadModule                                                
    53. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    54.  
    55. LoadModule proc pwszDriverFileName:PWSTR
    56.  
    57. local sli:SYSTEM_LOAD_IMAGE
    58.  
    59.     invoke memset, addr sli, 0, sizeof sli
    60.  
    61.     invoke RtlInitUnicodeString, addr sli.ModuleName, pwszDriverFileName
    62.  
    63.     invoke ZwSetSystemInformation, SystemLoadImage, addr sli, sizeof sli
    64.  
    65.     .if eax == STATUS_SUCCESS
    66.         invoke DbgPrint, $CTA0("Module loaded at address: %08X\n"), sli.ModuleBase
    67.         mov eax, sli.ModuleBase     ; Return module base address
    68.     .elseif eax == STATUS_IMAGE_ALREADY_LOADED
    69.         invoke DbgPrint, $CTA0("Module already loaded\n")
    70.         xor eax, eax                ; Return NULL
    71.     .else
    72.         invoke DbgPrint, $CTA0("Failed to load module with status: %08X\n"), eax
    73.         xor eax, eax                ; Return NULL
    74.     .endif
    75.  
    76.     ret
    77.  
    78. LoadModule endp
    79.  
    80. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    81. ;                                       UnloadModule                                                
    82. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    83.  
    84. UnloadModule proc pModuleBase:PVOID
    85.  
    86. local sui:SYSTEM_UNLOAD_IMAGE
    87. local status:NTSTATUS
    88.  
    89.     mov eax, pModuleBase
    90.     mov sui.ModuleBase, eax
    91.  
    92.     invoke ZwSetSystemInformation, SystemUnloadImage, addr sui, sizeof sui
    93.     mov status, eax
    94.     .if eax == STATUS_SUCCESS
    95.         invoke DbgPrint, $CTA0("Module unloaded from address: %08X\n"), sui.ModuleBase
    96.     .else
    97.         invoke DbgPrint, $CTA0("Failed to unload module with status: %08X\n"), status
    98.     .endif
    99.  
    100.     mov eax, status
    101.     ret
    102.  
    103. UnloadModule endp
    104.  
    105. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    106. ;                                       DriverEntry                                                
    107. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    108.  
    109. DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    110.  
    111.     invoke LoadModule, $CTW0("\\??\\C:\\WINNT\\system32\\kernel32.dll")
    112.     .if eax != NULL
    113.         invoke UnloadModule, eax
    114.     .endif
    115.  
    116.     mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
    117.     ret
    118.  
    119. DriverEntry endp
    120.  
    121. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    122. ;                                                                                                  
    123. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    124.  
    125. end DriverEntry
    126.  
    127. :make
    128.  
    129. set drv=DriverLoadsModule
    130.  
    131. \masm32\bin\ml /nologo /c /coff %drv%.bat
    132. \masm32\bin\link /nologo /driver /base:0x10000 /align:32 /out:%drv%.sys /subsystem:native /ignore:4078 %drv%.obj
    133.  
    134. del %drv%.obj
    135.  
    136. echo.
    137. pause
     
  6. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409