На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Модераторы: JoeUser, Qraizer
  
> [Patch question IAT] Как правильно заменять вызов функции на импортируемую, IDA Pro
    Добрый.
    Имеется win32 библиотека, в одном месте потребовалось заменить функцию LoadLibrary_Helper, на импортную GetModuleHandle

    Имеется такая функция, место где нужно заменить функцию 01D02BCF
    ExpandedWrap disabled
      .text:01D02B7C                               loc_1D02B7C:                            ; CODE XREF: sub_1D02B60+12↑j
      .text:01D02B7C 57                                            push    edi
      .text:01D02B7D 68 03 01 00 00                                push    103h            ; size_t
      .text:01D02B82 8D 85 FD FE FF FF                             lea     eax, [ebp+szModulePath+1]
      .text:01D02B88 53                                            push    ebx             ; int
      .text:01D02B89 50                                            push    eax             ; void *
      .text:01D02B8A 88 1D 68 61 D1 01                             mov     byte_1D16168, bl
      .text:01D02B90 89 1D 8C 62 D1 01                             mov     dword_1D1628C, ebx
      .text:01D02B96 88 9D FC FE FF FF                             mov     [ebp+szModulePath], bl
      .text:01D02B9C E8 6F 18 00 00                                call    _memset
      .text:01D02BA1 8D 8D FC FE FF FF                             lea     ecx, [ebp+szModulePath]
      .text:01D02BA7 68 04 01 00 00                                push    104h            ; size_t
      .text:01D02BAC 51                                            push    ecx             ; char *
      .text:01D02BAD E8 FE F2 FF FF                                call    sub_1D01EB0
      .text:01D02BB2 8B 3D 30 00 D1 01                             mov     edi, ds:OutputDebugStringA
      .text:01D02BB8 83 C4 14                                      add     esp, 14h
      .text:01D02BBB 84 C0                                         test    al, al
      .text:01D02BBD 74 54                                         jz      short loc_1D02C13
      .text:01D02BBF E8 7C F8 FF FF                                call    IsAppRunning
      .text:01D02BC4 84 C0                                         test    al, al
      .text:01D02BC6 74 44                                         jz      short loc_1D02C0C
      .text:01D02BC8 8D 95 FC FE FF FF                             lea     edx, [ebp+szModulePath]
      .text:01D02BCE 52                                            push    edx             ; lpMultiByteStr
      .text:01D02BCF E8 8C F0 FF FF         ------------------>    call    LoadLibrary_Helper ; HMODULE __stdcall LoadLibrary_Helper(LPCSTR lpLibFileName);
      .text:01D02BD4 83 C4 04                                      add     esp, 4
      .text:01D02BD7 89 06                                         mov     [esi], eax
      .text:01D02BD9 3B C3                                         cmp     eax, ebx
      .text:01D02BDB 75 63                                         jnz     short loc_1D02C40


    Нужно пропатчить вызов на это
    ExpandedWrap disabled
      FF 15 18 10 D1 01                             call    ds:GetModuleHandleA


    Но т.к здесь для патча требуется больше 5 байтов, то воспользуемся пространством выравнивания поблизости и реализуем некую thunk-функцию.

    ExpandedWrap disabled
      .text:01D02E21                               sub_1D02CA0     endp
      .text:01D02E21
      .text:01D02E21                               ; ---------------------------------------------------------------------------
      .text:01D02E23 CC CC CC CC                                   dd 0CCCCCCCCh
      .text:01D02E27
      .text:01D02E27                               ; =============== S U B R O U T I N E =======================================
      .text:01D02E27
      .text:01D02E27                               ; Attributes: thunk
      .text:01D02E27
      .text:01D02E27   ------------------->        ; HMODULE __stdcall GetModuleHandleA_Thunk(LPCSTR lpModuleName)
      .text:01D02E27                               GetModuleHandleA_Thunk proc near
      .text:01D02E27 FF 25 18 00 D1 01                             jmp     ds:__imp_GetModuleHandleA
      .text:01D02E27                               GetModuleHandleA_Thunk endp
      .text:01D02E27
      .text:01D02E27                               ; ---------------------------------------------------------------------------
      .text:01D02E2D CC CC CC                                      align 10h
      .text:01D02E30                               ; Exported entry  16. App_Shutdown
      .text:01D02E30
      .text:01D02E30                               ; =============== S U B R O U T I N E =======================================
      .text:01D02E30
      .text:01D02E30
      .text:01D02E30                                               public sub_1D02E30
      .text:01D02E30                               sub_1D02E30     proc near               ; CODE XREF: sub_1D02FD0:loc_1D0308E↓p


    И эту thunk-функцию мы можем заменить там, высчитываем разницу адресов и патчим функцию.
    В итоге мы получаем такой вид.

    ExpandedWrap disabled
      .text:01D02B7C                               loc_1D02B7C:                            ; CODE XREF: sub_1D02B60+12↑j
      .text:01D02B7C 57                                            push    edi
      .text:01D02B7D 68 03 01 00 00                                push    103h            ; size_t
      .text:01D02B82 8D 85 FD FE FF FF                             lea     eax, [ebp+szModulePath+1]
      .text:01D02B88 53                                            push    ebx             ; int
      .text:01D02B89 50                                            push    eax             ; void *
      .text:01D02B8A 88 1D 68 61 D1 01                             mov     byte_1D16168, bl
      .text:01D02B90 89 1D 8C 62 D1 01                             mov     dword_1D1628C, ebx
      .text:01D02B96 88 9D FC FE FF FF                             mov     [ebp+szModulePath], bl
      .text:01D02B9C E8 6F 18 00 00                                call    _memset
      .text:01D02BA1 8D 8D FC FE FF FF                             lea     ecx, [ebp+szModulePath]
      .text:01D02BA7 68 04 01 00 00                                push    104h            ; size_t
      .text:01D02BAC 51                                            push    ecx             ; char *
      .text:01D02BAD E8 FE F2 FF FF                                call    sub_1D01EB0
      .text:01D02BB2 8B 3D 30 00 D1 01                             mov     edi, ds:OutputDebugStringA
      .text:01D02BB8 83 C4 14                                      add     esp, 14h
      .text:01D02BBB 84 C0                                         test    al, al
      .text:01D02BBD 74 54                                         jz      short loc_1D02C13
      .text:01D02BBF E8 7C F8 FF FF                                call    IsAppRunning
      .text:01D02BC4 84 C0                                         test    al, al
      .text:01D02BC6 74 44                                         jz      short loc_1D02C0C
      .text:01D02BC8 8D 95 FC FE FF FF                             lea     edx, [ebp+szModulePath]
      .text:01D02BCE 52                                            push    edx             ; lpMultiByteStr
      .text:01D02BCF E8 53 02 00 00         ------------------>    call    GetModuleHandleA_Thunk ; HMODULE __stdcall GetModuleHandleA_Thunk(LPCSTR lpModuleName);
      .text:01D02BD4 83 C4 04                                      add     esp, 4
      .text:01D02BD7 89 06                                         mov     [esi], eax
      .text:01D02BD9 3B C3                                         cmp     eax, ebx
      .text:01D02BDB 75 63                                         jnz     short loc_1D02C40



    А теперь о проблеме, поскольку я заменяю на импортируемую функцию, то в этом месте во время загрузки адрес к импортируемой функции не ребейзится как положено, отсюда закономерно происходит краш приложения.
    Я точно знаю, что такие вещи нужно делать с обновлением информации в IAT, но не уверен где конкретно, ткните носом пожалуйста.
    Сообщение отредактировано: bloment -
      Решил, нужно добавить запись в Relocations таблице.
      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script Execution time: 0,0733 ]   [ 15 queries used ]   [ Generated: 18.07.19, 11:04 GMT ]