счетчик загрузок DLL

Тема в разделе "WASM.WIN32", создана пользователем K10, 28 дек 2008.

  1. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Можно ли узнать значение счетчика загрузок DLL?
    Ситуация такая:
    ДЛЛ должна выгрузить сама себя. Но в общем случае неизвестно сколько раз была вызвана для нее LoadLibrary. FreeLibraryAndExitThread уменьшает счетчик загрузок и завершает поток. А поскольку счетчик загрузок не обнулился, ДЛЛ остается загруженной. Необходимо предварительно сделать FreeLibrary, столько раз, сколько значение счетчика загрузок - 1, и потом уже FreeLibraryAndExitThread. Проблема в том, где взять это значение...
     
  2. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    ну, думаю, если ничего другого не подходит, то можно поенумеровать модули своего процесса..
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    PEB.Ldr -> PEB_LDR_DATA -> LDR_DATA_TABLE_ENTRY.LoadCount
     
  4. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Спасибо, разобрался :)
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    K10
    Вот сделол кодес:
    Код (Text):
    1. UnloadAndExitDll proc uses ebx Status:NTSTATUS
    2. Local Entry:PLDR_DATA_TABLE_ENTRY
    3.     Call @f
    4. @@:
    5.     pop edx
    6.     invoke LdrFindEntryForAddress, edx, addr Entry
    7.     test eax,eax
    8.     mov edx,Entry
    9.     jnz exit_
    10.     mov eax,dword ptr [RtlExitUserThread + 2]
    11.     assume edx:PLDR_DATA_TABLE_ENTRY
    12.     push Status
    13.     push offset exit_
    14.     push [edx].DllBase
    15.     push dword ptr [eax]        ;RtlExitUserThread
    16.     mov [edx].LoadCount,0ffffh
    17.     jmp LdrUnloadDll
    18. exit_:
    19.     ret
    20. UnloadAndExitDll endp
    Работает :)))
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Тока вот не выгружаетсо почемуто непонятно..
    [Выгружаетсо если счётчик в 1 поставить, но не основной модуль. Основной не выгружает, хз смотри в сурцах что к чему.]
     
  7. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Clerk
    Спасибо, конечно, но мне там надо было еще самоудалять эту DLL, поэтому я сделал шеллкодес...

    Код (Text):
    1. DeleteSelf PROC
    2. LOCAL pFreeLibrary, pDeleteFileA, pExitThread: DWORD
    3.   PUSHAD
    4.   invoke GetModuleHandle, zStr("kernel32.dll")
    5.   MOV EBX, EAX
    6.   invoke GetProcAddress, EBX, zStr("FreeLibrary")
    7.   TEST EAX, EAX
    8.   JZ ds_exit
    9.   MOV pFreeLibrary, EAX
    10.   invoke GetProcAddress, EBX, zStr("ExitThread")
    11.   TEST EAX, EAX
    12.   JZ ds_exit
    13.   MOV pExitThread, EAX
    14.   invoke GetProcAddress, EBX, zStr("DeleteFileA")
    15.   TEST EAX, EAX
    16.   JZ ds_exit
    17.   MOV pDeleteFileA, EAX
    18.   invoke VirtualAlloc, NULL, 4096, MEM_COMMIT OR MEM_RESERVE , PAGE_EXECUTE_READWRITE
    19.   TEST EAX, EAX
    20.   JZ ds_exit
    21.   MOV EDI, EAX  
    22.   invoke GetModuleFileName, ModuleInstance, EDI, MAX_PATH
    23.   TEST EAX, EAX
    24.   JZ ds_exit
    25.   MOV EBX, EDI
    26.   ADD EDI, MAX_PATH + 100
    27.  
    28.   _STOSB(068h)           ; PUSH
    29.   _STOSD(ModuleInstance) ; hModule
    30.   _STOSB(0B8h)           ; MOV EAX,
    31.   _STOSD(pFreeLibrary)   ; OFFSET kernel32:FreeLibrary
    32.   _STOSW(0D0FFh)         ; CALL EAX
    33.   _STOSW(0C085h)         ; TEST EAX, EAX
    34.   _STOSW(0F075h)         ; JNZ -10
    35.   _STOSB(068h)           ; PUSH
    36.   _STOSD(EBX)            ; lpFileName
    37.   _STOSB(0B8h)           ; MOV EAX,
    38.   _STOSD(pDeleteFileA)   ; OFFSET kernel32:DeleteFileA
    39.   _STOSW(0D0FFh)         ; CALL EAX  
    40.   _STOSW(006Ah)          ; PUSH 0
    41.   _STOSB(0B8h)           ; MOV EAX,
    42.   _STOSD(pExitThread)    ; OFFSET kernel32.ExitThread
    43.   _STOSW(0D0FFh)         ; CALL EAX
    44.   _STOSB(0C3h)           ; RET
    45.   ADD EBX, MAX_PATH + 100
    46.   ;INT 3
    47.   invoke CreateThread, NULL, 0, EBX, NULL, NULL, NULL
    48.  
    49. ds_exit:
    50.   POPAD
    51.   RET
    52. DeleteSelf endp
    Работает :)