замена DLL "на лету"

Тема в разделе "WASM.WIN32", создана пользователем lamer2k, 24 авг 2008.

  1. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    так оно и есть
     
  2. z_x_spectrum

    z_x_spectrum New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    145
    Хендлы не закроются. Только при завершении процесса.

    ДЛЛ можно переименовать когда она загружена.

    ИМХО, нафик шеллкоды... Всем загруженным модулям послать команду через файлмеппинг/пайпы/мьютексы. Каждый модуль освобождает свои ресурсы/память/хендлы, снимает свои хуки/пуки, грузит новую DLL и делает FreeLibraryAndExitThread.
     
  3. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Должно работать. Я это давненько юзаю.
    Единственный момент, что такой способ годится если длл подгружена только в один процесс, если процессов несколько, то это уже геморрой.
     
  4. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    z_x_spectrum ну тогда получается что новая длл должна быть с новым именем
     
  5. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    lamer2k попробуй такой код. это для масм

    Код (Text):
    1. GetRealAddr proc
    2.    
    3.     mov     eax,[eax+2]
    4.     mov     eax,[eax]
    5.    
    6.     ret
    7.  
    8. GetRealAddr endp
    9.  
    10. ReloadDll   proc
    11. LOCAL mem:dword
    12.     mov     esi,m2
    13.     sub     esi,m1
    14.     mov     ecx,esi
    15.     add     ecx,4*8
    16.     invoke  VirtualAlloc,0,ecx,MEM_COMMIT,PAGE_EXECUTE_READWRITE
    17.     mov     mem,eax
    18.     add     eax,4*8
    19.     push    eax
    20.  
    21.     mov     ecx,esi
    22.     mov     edi,eax
    23.     mov     esi,m1
    24.     cld
    25. @@:
    26.     lodsb
    27.     stosb
    28.     dec     ecx
    29.     jnz     @b
    30.    
    31.    
    32.     mov     edi,mem
    33.    
    34.     mov     eax,ExitThread
    35.     call    GetRealAddr
    36.     mov     [edi],eax
    37.    
    38.     mov     eax,Sleep
    39.     call    GetRealAddr
    40.     mov     [edi+4],eax
    41.    
    42.     mov     eax,LoadLibrary
    43.     call    GetRealAddr
    44.     mov     [edi+8],eax
    45.    
    46.     mov     eax,FreeLibrary
    47.     call    GetRealAddr
    48.     mov     [edi+12],eax
    49.    
    50.     invoke  VirtualAlloc,0,100,MEM_COMMIT,PAGE_READWRITE
    51.     mov     [edi+20],eax
    52.     invoke  GetModuleFileName,hInstance,eax,100
    53.    
    54.     mov     eax,VirtualFree
    55.     call    GetRealAddr
    56.     mov     [edi+24],eax
    57.    
    58.     pop eax
    59.     jmp eax
    60.    
    61. m1:
    62.     push    hInstance
    63.     call    dword ptr[edi+12]   ;FreeLibrary
    64.    
    65.     push    60000               ;One Minute
    66.     call    dword ptr[edi+4]    ;Sleep
    67.    
    68.     push    [edi+20]            ;Dll String
    69.     call    dword ptr[edi+8]    ;Load Library
    70.    
    71.     push    MEM_RELEASE
    72.     push    0
    73.     push    [edi+20]            ;Dll String
    74.    
    75.     push    0
    76.     call    dword ptr[edi]      ;ExitThread
    77.    
    78. m2:
    79.  
    80. ReloadDll endp
     
  6. z_x_spectrum

    z_x_spectrum New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    145
    2FED
    Или с новым именем, или загруженную переименовать.
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Три года просидел в BEGINNERS, а оказывается ерунду можно во многих разделах писать. :)
    Aspire
    Не похоже на правду. %SYSTEMROOT%\system32\kernel32.dll элементарно переименовывается/перемещается. Для подобных перемещений (когда загружен исполняемый модуль, но нет открытых к нему хэндлов) единственное ограничение - это перемещения только в пределах логического диска.
    lamer2k
    Как вариант решения Вашей задачи:
    всю функциональность Вашей dll поместить в базонезависимый код. При загрузке в DLL_PROCESS_ATTACH dll выделяет для него память и помещает его туда, создаёт поток, исполняющий этот код, а возвращает FALSE. dll выгружается, а поток остаётся. Соответственно никаких проблем с подменой dll в рантайме не будет. В случае необходимости замены старая dll заменяется, базонезависимый код информируется о необходимости замены, освобождает ресурсы, спокойно делает LoadLibrary новой dll, делает на себя VirtualFree и передаёт управление на ExitThread.
    Единственный недостаток - нужно писать базонезависимый код, но это дело привычки.
     
  8. z_x_spectrum

    z_x_spectrum New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    145
    А если там МНОГО кода. Запаришся все это писать в шелкод стиле.
    А вобще, если развить эту мысль, то можно сделать так. Две ДЛЛ, одна запускалка/подгружалка второй - основной. В основной вся функциональность. При обновлении первая вызывает из второй процедуру деинициализации, после чего выгружает, удаляет и загружает новую.
     
  9. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    z_x_spectrum Пройденый этап...

    Собсно зачем лишная дллка. Код который я привёл вполне рабочий, я им к стате пользуюсь как раз для обновления длл, работает исправно. Естественно длл динамическая и никаких функций не экспортирует. задача её попасть в АП нужного процесса =)
     
  10. realnoob

    realnoob New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2008
    Сообщения:
    1
    Код (Text):
    1.     GetRealAddr proc
    2. mov     eax,[eax+2]
    3.     mov     eax,[eax]
    4.    
    5.     ret
    6.  
    7. GetRealAddr endp
    8.  
    9. ReloadDll   proc
    10. LOCAL mem:dword
    11.     mov     esi,m2
    12.     sub     esi,m1
    13.     mov     ecx,esi
    14.     add     ecx,4*8
    15.     invoke  VirtualAlloc,0,ecx,MEM_COMMIT,PAGE_EXECUTE_READWRITE
    16.     mov     mem,eax
    17.     add     eax,4*8
    18.     push    eax
    19.  
    20.     mov     ecx,esi
    21.     mov     edi,eax
    22.     mov     esi,m1
    23.     cld
    24. @@:
    25.     lodsb
    26.     stosb
    27.     dec     ecx
    28.     jnz     @b
    29.    
    30.    
    31.     mov     edi,mem
    32.    
    33.     mov     eax,ExitThread
    34.     call    GetRealAddr
    35.     mov     [edi],eax
    36.    
    37.     mov     eax,Sleep
    38.     call    GetRealAddr
    39.     mov     [edi+4],eax
    40.    
    41.     mov     eax,LoadLibrary
    42.     call    GetRealAddr
    43.     mov     [edi+8],eax
    44.    
    45.     mov     eax,FreeLibrary
    46.     call    GetRealAddr
    47.     mov     [edi+12],eax
    48.    
    49.     invoke  VirtualAlloc,0,100,MEM_COMMIT,PAGE_READWRITE
    50.     mov     [edi+20],eax
    51.     invoke  GetModuleFileName,hInstance,eax,100
    52.    
    53.     mov     eax,VirtualFree
    54.     call    GetRealAddr
    55.     mov     [edi+24],eax
    56.    
    57.     pop eax
    58.     jmp eax
    59.    
    60. m1:
    61.     push    hInstance
    62.     call    dword ptr[edi+12]   ;FreeLibrary
    63.    
    64.     push    60000               ;One Minute
    65.     call    dword ptr[edi+4]    ;Sleep
    66.    
    67.     push    [edi+20]            ;Dll String
    68.     call    dword ptr[edi+8]    ;Load Library
    69.    
    70.     push    MEM_RELEASE
    71.     push    0
    72.     push    [edi+20]            ;Dll String
    73.    
    74.     push    0
    75.     call    dword ptr[edi]      ;ExitThread
    76.    
    77. m2:
    78.  
    79. ReloadDll endp
    Не мог бы кто перевести это на си, очень интересует тема :dntknw: