Проблема с переписыванием DLL

Тема в разделе "WASM.RESEARCH", создана пользователем MrTihiy, 9 фев 2005.

  1. MrTihiy

    MrTihiy New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2005
    Сообщения:
    11
    есть проблема. необходимо переписать функцию в DLL-ке,

    так, чтобы передавала управление другой ф-ции в другой DLL-ке, возвращала бы то значение, которое возвращает функция. Путем проб и ошибок пришел к следующему варианту (листинг IDA)


    Код (Text):
    1.  
    2. .text:BFB78D5A                 public ImageList_DrawIndirect
    3. .text:BFB78D5A ImageList_DrawIndirect proc near        ; CODE XREF: ImageList_DrawEx+55vp
    4. .text:BFB78D5A                                         ; ImageList_Draw+4Evp ...
    5. .text:BFB78D5A
    6. .text:BFB78D5A arg_0           = dword ptr  8
    7. .text:BFB78D5A arg_8           = dword ptr  10h
    8. .text:BFB78D5A arg_10          = dword ptr  18h
    9. .text:BFB78D5A arg_14          = dword ptr  1Ch
    10. .text:BFB78D5A arg_18          = dword ptr  20h
    11. .text:BFB78D5A arg_1C          = dword ptr  24h
    12. .text:BFB78D5A arg_20          = dword ptr  28h
    13. .text:BFB78D5A arg_24          = dword ptr  2Ch
    14. .text:BFB78D5A arg_28          = dword ptr  30h
    15. .text:BFB78D5A arg_34          = dword ptr  3Ch
    16. .text:BFB78D5A
    17. .text:BFB78D5A                 push    ebp
    18. .text:BFB78D5B                 mov     ebp, esp
    19. .text:BFB78D5D                 sub     esp, 40h
    20. .text:BFB78D60                 nop
    21. .text:BFB78D61                 push    esi
    22. .text:BFB78D62                 mov     esi, [ebp+arg_0]
    23. .text:BFB78D65                 nop
    24. .text:BFB78D66                 push    dword ptr [esi+4]
    25. .text:BFB78D69                 push    offset aLibName
    26. .text:BFB78D6E                 call    ds:LoadLibraryA
    27. .text:BFB78D74                 push    offset aImagelist_draw ; "IMAGELIST_DRAWINDIRECTHACK"
    28. .text:BFB78D79                 push    eax
    29. .text:BFB78D7A                 call    ds:GetProcAddress
    30. .text:BFB78D80                 mov     [esi], eax
    31. .text:BFB78D82                 test    eax, eax
    32. .text:BFB78D84                 mov     eax, 0
    33. .text:BFB78D89                 jz      loc_BFB7935E
    34.  
    35. ....
    36.  
    37. .text:BFB78D94                 push    [ebp+arg_34]
    38. .text:BFB78D97                 push    [ebp+arg_28]
    39. .text:BFB78D9A                 push    [ebp+arg_24]
    40. .text:BFB78D9D                 push    [ebp+arg_20]
    41. .text:BFB78DA0                 push    [ebp+arg_1C]
    42. .text:BFB78DA3                 push    [ebp+arg_18]
    43. .text:BFB78DA6                 push    [ebp+arg_14]
    44. .text:BFB78DA9                 push    [ebp+arg_10]
    45. .text:BFB78DAC                 push    dword ptr [ebp+14h]
    46. .text:BFB78DAF                 push    [ebp+arg_8]
    47. .text:BFB78DB2                 push    dword ptr [ebp+0Ch]
    48. .text:BFB78DB5                 push    [ebp+arg_0]
    49. .text:BFB78DB8                 nop
    50. .text:BFB78DB9                 call    dword ptr [esi]
    51. .text:BFB78DBB                 jmp     loc_BFB7935C
    52.  
    53. ....
    54.  
    55. .text:BFB7935C loc_BFB7935C:                           ; CODE XREF: ImageList_DrawIndirect+61^j
    56. .text:BFB7935C                 xor     eax, eax
    57. .text:BFB7935E
    58. .text:BFB7935E loc_BFB7935E:                           ; CODE XREF: ImageList_DrawIndirect+2F^j
    59. .text:BFB7935E                 pop     eax
    60. .text:BFB7935F                 pop     esi
    61. .text:BFB79360                 cwde
    62. .text:BFB79361                 leave
    63. .text:BFB79362                 retn    4




    так вот, данный вариант работает, функция принимает и возвращает все нормально, но в некоторых случаях все рушится с ошибкой в kernel32... если удалить dll-ку вообще, ошибки не происходит. Если dll-ку сделать "пустой", ошибка есть - значит ошибка в этом коде.

    У кого-нибудь есть предположения? А то я в асме не очень...
     
  2. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    export-forwarding тебе поможет
     
  3. MrTihiy

    MrTihiy New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2005
    Сообщения:
    11
    хм... подскажите где сабж найти.
     
  4. MrTihiy

    MrTihiy New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2005
    Сообщения:
    11
    хотя стоп... понял, создать dll-ку, которая будет функции передавать настоящей? это не катит к сожалению, слишком тяжело переписать все функции, не имея исходников библиотеки.
     
  5. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    Я же сказал "forwarding" а не "враппер". Читаешь доку по формату таблицы экспорта, и в подопытной dll правишь имя функции в таблице экспорта так чтобы она форвардилась на другую dll и другую функцию. В случае одной функции это можно и ручками за пару минут в hex-редакторе вколотить. И будут все модули использующии эту либу получать вместо оригинальной функции липовую из другой длл.
     
  6. MrTihiy

    MrTihiy New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2005
    Сообщения:
    11
    Ловко, не знал что можно прям так.. Можно все-таки ссылочку на сабж? или в двух словах?
     
  7. MrTihiy

    MrTihiy New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2005
    Сообщения:
    11
    LibName.FuncName? попробую... Спасибо за толчок в нужное русло.
     
  8. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
  9. MrTihiy

    MrTihiy New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2005
    Сообщения:
    11
    Хм... К сожалению, не прокатило. Поменял указатель в таблице экспорта, ничего не поменялось. Подозреваю, что проблема в том, что библиотека слита с парной 16-битной или у меня чересчур кривые руки..
     
  10. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    Только это LibName.FuncName должно быть в пределах таблицы экспорта (rva + размер) иначе это будет считаться именем функции :) И кстати это будет работать только под NT.
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Dr.Golova

    Это как понимать? Разве Forward работает только на NT?
     
  12. MrTihiy

    MrTihiy New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2005
    Сообщения:
    11
    Не, в документации писали что работает и в Windows 9x. К тому же адрес я переписал, а функция продолжает работать-значит она берет адрес этой функции где-либо еще.



    Ну так мог бы кто-нибудь написать функцию подобную вышенаписанной?
     
  13. MrTihiy

    MrTihiy New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2005
    Сообщения:
    11
    Может проблема в том, что я не вызываю FreeLibrary?
     
  14. MrTihiy

    MrTihiy New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2005
    Сообщения:
    11
    Хм. Вот то, что все-таки получилось и работает:

    push offset DllName

    call LoadLibraryA ;KERNEL32.dll

    push offset ProcName

    push eax

    call GetProcAddress ;KERNEL32.dll

    jmp eax



    Это стоило 3-х дней гемора - а так просто!!!