Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
BulgaraCeha slovacaCroataEnglezaEstonaFinlandezaFranceza
GermanaItalianaLetonaLituanianaMaghiaraOlandezaPoloneza
SarbaSlovenaSpaniolaSuedezaTurcaUcraineana

AdministracjaBajkiBotanikaBudynekChemiaEdukacjaElektronikaFinanse
FizycznyGeografiaGospodarkaGramatykaHistoriaKomputerówKsiążekKultura
LiteraturaMarketinguMatematykaMedycynaOdżywianiePolitykaPrawaPrzepisy kulinarne
PsychologiaRóżnychRozrywkaSportowychTechnikaZarządzanie

Przyszłość wirusów

komputerów



+ Font mai mare | - Font mai mic



DOCUMENTE SIMILARE

Przyszłość wirusów

9.1. Sposoby dostępu do dysków

Najczęściej stosowany (bo najprostszy) mechanizm dostępu do plików lub sektorów polega na używaniu funkcji i przerwań programowych DOS (INT 21h, INT 25h, INT 26h). Najczęściej korzystają z niego wirusy plikowe i czasem wirusy BOOT-sektorów. Ze względu na możliwość istnienia zainstalowanego w systemie monitora antywirusowego sposób ten można bezpiecznie wykorzystać tylko po wyłączeniu aktywnego monitora lub też po znalezieniu oryginalnych procedur wejścia do odpowiednich przerwań.



Na dużo niższym poziomie operują wirusy infekujące Główny Rekord Ładujący (MBR), BOOT-sektory i JAP. Korzystają one z przerwania programowego INT 13h, operującego bezpośrednio na fizycznych sektorach dysków (w przypadku dyskietek można użyć przerwania 40h). Tak jak w przypadku przerwań i funkcji DOS, funkcje BIOS mogą być dość łatwo monitorowane przez program antywirusowy, a w nowoczesnych BIOS-ach - nawet przez program obsługi przerwania. W takim wypadku pozostaje jedyna bezpieczna metoda ingerencji w zawartość sektorów, polegająca na użyciu bezpośrednich odwołań do portów.

Pisanie procedur do obsługi plików, które na najniższym poziomie odwoływałyby się do portów nie ma sensu, natomiast łatwo jest napisać takie procedury tylko dla pojedynczych, wybranych sektorów, czyli np. MBR, BOOT-sektora, co w przypadku dysków (zgodnych z IDE lub EIDE) oraz dyskietek jest względnie proste. W przypadku dysków SCSI jest to o wiele trudniejsze, chociażby ze względu na brak dokładnej dokumentacji technicznej tych urządzeń, stąd też trzeba obsługiwać je przez funkcje systemowe (można pokusić się o poszukanie czystych wejść do procedur ich obsługi).

Operując na portach należy pamiętać, iż wraz z pojawieniem się dysków o pojemnościach o wiele większych od tych, które mogą być standardowo obsługiwane przez funkcje BIOS przerwania 13h, zaszła konieczność jakiegoś obejścia dotychczasowych ograniczeń związanych z pojemnością dysków widzianych przez BIOS. Niektóre twarde dyski posiadają więc w swych pierwszych fizycznych sektorach (począwszy od MBR) coś w rodzaju nakładki (ang. Dynamic Drive Overlay), która po załadowaniu do pamięci przez program zawarty w pierwszym fizycznym sektorze przejmuje i poszerza odpowiednie funkcje obsługi dysku. Aby możliwe było dalsze wczytywanie systemu, po wczytaniu nakładki odwołania do sektorów są przekierowy-wane (do numeru cylindra dodawane jest l). W efekcie prawdziwy sektor MBR wcale nie jest umiejscowiony w sektorze o adresie: cylinder 0, strona 0, sektor l, lecz pod adresem: cylinder l, strona 0, sektor l Nieuwzględnienie tego faktu może przyczynić się do przypadkowego zniszczenia danych na dysku podczas zapisywania przy użyciu portów, a co za tym idzie, do szybszego wykrycia wirusa.

Najskuteczniejszym sposobem uchronienia się przed odczytem i zapisem bezpośrednio przez porty jest odpowiednia kontrola dostępu do urządzeń we/wy na poziomie trybu chronionego przy pomocy tablic map portu. Jednak i to zabezpieczenie nie wydaje się bardzo pewne, gdyż najczęściej istnieje jakaś możliwość ingerencji w jądro systemu nawet dla trybu chronionego (jeżeli nie w pamięci, to w plikach), a co za tym idzie, można zmienić odpowiednią część systemu, odpowiedzialną w tym wypadku za operacje na dyskach.

W przypadku systemu Windows 95 (działającego w trybie chronionym) można spróbować wymuszać jego uruchamianie w tzw. trybie zgodności z MS DOS. Tryb ten oznacza, iż wszelkie wykonywane operacje dyskowe są przekierowywane do trybu rzeczywistego, a tam nie działa mechanizm ochrony portów.

Aby wymusić używanie tego trybu przez Windows 95, należy skasować lub tymczasowo usunąć następujące pliki:

> ściezkaSYSTEMIOSUBSYSHSFLOP.PDR - plik odpowiedzialny za dyski FDD;

> ścieźkaSYSTEMIOSUBSYSESDI_506.PDR - plik odpowiedzialny za dyski twarde zgodne z (E)IDE;

> ścieżkaSYSTEMIOSUBSYSSCSIPORT.PDR - plik odpowiedzialny za dyski twarde SCSI,

gdzie ścieżka oznacza katalog, w którym umieszczony jest system Windows. Zastosowanie tego triku spowoduje, iż przy następnym ładowaniu systemu Windowa zostanie on uruchomiony w trybie zgodności z MS DOS.

Odnalezienie katalogu, w którym umieszczony jest system Windows, nie stanowi problemu. Wystarczy w bloku pamięci należącym do środowiska (ang. enviroment) odnaleźć jedną ze zmiennych (nie zawsze występują wszystkie):

> WIN=;

> WINDIR=;

> WINBOOTDIR=

i odczytać opisywany przez daną zmienną katalog, a następnie już bez trudu uzyskać dostęp do plików *.PDR.

Poniżej zamieszczono dwa programy, z których jeden odczytuje przy pomocy portów tablicę partycji pierwszego dysku twardego, a drugi BOOT-sektor dyskietki (musi być w napędzie). Odczytane sektory są porównywane z zawartością sektorów widzianych przez funkcje BIOS, zaś wynik porównania jest wyświetlany na ekranie.

;

Czesc ksiazki : 'Nowoczesne techniki wirusowe i antywirusowe' ;

;

IDE_PORT v1.0, Autor : Adam Blaszczyk 1997 ;

;

Program odczytuje sektor tablicy partycji pierwszego twardego dysku ;

przez porty IDE i przerwanie BIOS, a nastepnie tak odczytane sektory ;

porownuje ze soba. ;

Umozliwia wiec sprawdzenie, czy odczyty BIOSa nie sa zafalszowane ;

przez jakiegos wirusa. ;

;

; UWAGA : Odczyt przez porty dziala tylko dla dyskow zgodnych z IDE lub EIDE ;

i nie dziala w systemie Windows'95 ;

;

; Kompilacja :  ;

TASM /t IDE_PORT.ASM ;

TLINK IDE_PORT.OBJ ;

;

IDE_PORT SEGMENT

ASSUME CS:IDE_PORT, DS:IDE_PORT

ORG 100h

NUL = 00h ;

LF = 0Ah ; - stale potrzebne do deklaracji

CR = 0Dh ; / lancuchow napisowych

Start:

lea si,TeCopyRight ; wyswietl info o programie

Call Druk ; /

mov ax,1600h ; sprawdz, czy praca w systemie Windows ?

int 2Fh

test al,7Fh ;

jz NieMaWindows ; ZF=0 - nie ma Windows

cmp al,4 ; czy wersja Windows < 4.0 ?

jb NieMaWindows ; TAK - to nie Windows 95

; NIE - to Windows 95

lea bp,TeWindows95 ; program nie dziala pod Windows 95

jmp Rozne ; / wiec koncz

NieMaWindows:

mov dx,1F2h ; 1F2 - okresla ile sektorow czytac

mov al,00000001b ; czytaj 1 sektor

out dx,al ; wyslij do IDE

inc dx ; 1F3 - okresla, ktory sektor pierwszy

mov al,00000001b ; czytaj sektor nr 1

out dx,al ; wyslij do IDE

inc dx ; 1F4 - starsza czesc cylindra (bity 0-1)

mov al,00000000b ; czytaj cylinder 0

out dx,al ; wyslij do IDE

inc dx ; 1F5 - mlodsza czesc cylindra (bity 0-7)

mov al,00000000b ; czytaj cylinder 0

out dx,al ; wyslij do IDE

inc dx ; 1F6 - nr dysku + nr glowicy

mov al,10100000b ; 101NGggg, N=0=master/1=slave, Gggg - glowica

out dx,al ; wyslij do IDE

inc dx ; 1F7 - rejestr rozkazowy IDE

mov al,00100000b ; rozkaz odczytu

out dx,al ; wyslij do IDE

lea bp,TeIDENieDziala ; odczyt przez porty nie dziala

mov cx,0FFFFh ; tyle razy odczytuj z portu

CzekajNaDane:

in al,dx ; czekaj na dane z kontrolera IDE

test al,00001000b ; bit 3 ustawiony ?

loopz CzekajNaDane ; TAK - mozna czytac, NIE - czekaj dalej

test al,00001000b ; bit 3 ustawiony ?

jz Rozne ; NIE - jakis blad

mov cx,256 ; 256x2 bajtow

lea di,SektorIDE ; gdzie zapisac dane

mov dx,1F0h ; 1F0 - port danych IDE

cld ; INC DI w operacjach lancuchowych

CzytajSektor:

in ax,dx ; czytaj slowo

stosw ; zachowaj je

loop CzytajSektor ; czytaj 256 slow=512 bajtow sektora

mov dx,80h ; dysk twardy nr 0, glowica 0

mov cx,1 ; cylinder 0, sektor 1

lea bx,SektorBIOS ; dokad czytac sektor

mov ax,0201h ; funkcja BIOS - czytaj 1 sektor

int 13h ; wywolaj funkcje BIOS

lea bp,TeInne ; komunikat ze rozne

mov cx,256 ; porownaj 256 slow=512 bajtow

lea si,SektorIDE ; bufor z sektorem odczytanym przez porty

lea di,SektorBIOS ; bufor z sektorem odczytanym przez BIOS

rep cmpsw ; porownaj oba bufory

jne Rozne ; ZF=0 - takie same, ZF=1 - rozne

lea bp,TeTakieSame ; komunikat, ze takie same

Rozne:

mov si,bp ; komunikat : rozne lub takie same

Call Druk ; wyswietl komunikat

mov ax,4C00h ; funkcja DOS - koncz program

int 21h ; wywolaj funkcje

Druk: ; procedura wyswietla tekst ASCIIZ z CS:SI

push ax si ; zachowaj zmieniane rejestry

NastepnyZnak:

lods byte ptr cs:[si] ; wez kolejny znak

or al,al ; czy znak jest zerem ?

jz DrukPowrot ; TAK = koniec napisu wyjdz z petli

mov ah,0Eh ; funkcja BIOS

int 10h ; wyswietl znak (z AL)

jmp short NastepnyZnak ; wez nastepny znak

DrukPowrot:

pop si ax ; przywroc zmieniane rejestry

ret ; powrot z procedury

TeCopyRight db CR,LF,'IDE_PORT v1.0, Autor : Adam Blaszczyk 1997',NUL

TeTakieSame db CR,LF,'_ Odczyt przez IDE-porty = odczyt przez BIOS !',NUL

TeInne db CR,LF,'_ Odczyt przez IDE-porty <> odczyt przez BIOS !',NUL

TeWindows95 db CR,LF,'_ Odczyt przez IDE-porty nie dziala w Windows''95 !',NUL

TeIDENieDziala db CR,LF,'_ Odczyt przez IDE-porty nie dziala !',NUL

SektorBIOS db 512/16 dup ('[ SEKTOR BIOS ] ')

SektorIDE db 512/16 dup ('[ SEKTOR EIDE ] ')

IDE_PORT ENDS

END Start

9.2. Sztuczki antydebuggerowe, antydeasemblerowe, antyemulacyjne i antyheurystyczne

Aby utrudnić życie programistom piszącym szczepionki oraz zabezpieczyć swój kod przed niepowołanymi osobami, twórcy wirusów (i nie tylko) często używają tzw. sztuczek antydebuggerowych oraz antydeasemblerowych. Najbardziej znane sztuczki antydebuggerowe polegają na chwilowym (na czas wykonywania kodu wirusa) blokowaniu przerwań sprzętowych, co dla osoby próbującej analizować kod programu objawia się tym, iż np. klawiatura przestaje działać po wykonaniu instrukcji.

Przeszkadzanie włamywaczom polegać może także na blokowaniu lub chwilowym przejmowaniu przerwań newralgicznych dla działania programu uruchomieniowego, a więc 0lh (przerwanie trybu krokowego) i 03h (pułapka programowa). Ich adresy najczęściej ustawia się na 0FFFFh:0000h, czyli na procedurę resetującą programowo komputer. Często w takich wypadkach przejmowane są także przerwania 21h, 16h, 10h, służące debuggerom do obsługi plików, klawiatury, ekranu itd.

Inna metoda przeszkadzania potencjalnym włamywaczom polega na tym, iż wirus próbuje wykrywać fakt pracowania pod kontrolą de-buggera i po ewentualnym wykryciu - wykonywać jakąś destrukcyjną operację lub też próbować uciec włamywaczowi tak, aby ten niczego nie zauważył.

Klasycznymi przykładami sztuczek antydebuggerowych są poniższe sekwencje:

; Blokada przerwa± sprzΩtowych

MOV AL,0FFh ; ustaw wszystkie bity w AL na 1

OUT 21h, AL ; zamaskuj przerwania sprzΩtowe od 0 do 7

OUT 0Alh, AL ; zamaskuj przerwania sprzΩtowe od 8 do F Wykrywanie,

; czy kod wykonuje siΩ pod kontrola debuggera

PUSH SS ; za│aduj na stos warto£µ SS

POP SS ; po tej instrukcji, nastΩpny rozkaz nie jest

; kontrolowany,

PUSHF ; wiΩc mo┐na zachowaµ na stosie prawdziwe flagi

POP AX ; AX=flagi zdjΩte ze stosu

TEST AH,1 ; czy bit TF=1 ?

JNZ DEBUG_ON ; je£li tak, to u┐ywany jest debugger

; debugger nie jest u┐ywany

DEBUG_ON: ; debugger jest u┐ywany

Wraz z pojawieniem się debuggerów działających w trybie chronionym znaczenie sztuczek anydebuggerowych zmalało. Oczywiście, ciągle można je stosować, jednak będą one raczej nieskuteczne. Na przykład, jeżeli program próbuje manipulować adresami procedur obsługi przerwań INT l czy INT 3, debugger działający w trybie rzeczywistym oczywiście im ulegnie, natomiast w przypadku debuggera dla trybu chronionego w zasadzie nic się nie stanie, gdyż używa on innej, własnej tablicy przerwań.

Aby uniemożliwić lub utrudnić deasemblację wirusa, stosuje się szyfrowanie oraz odpowiednie kombinaqe instrukcji, które zakłócają typowy listing programu tak, iż staje się on chaotyczny, nieczytelny i na pozór bezsensowny (tak jak we wspomnianym we wstępie wirusie JUMP).

Przykładem jest krótki programik wyświetlający po uruchomieniu komunikat Cześć!, a napisany tak, iż po jego deasemblacji (np. SOUR-CER-em) uzyskuje się chaotyczny listing (co ciekawe, podczas kilkakrotnych prób otrzymywane źródło nie było zawsze takie same).

;

Czesc ksiazki : 'Nowoczesne techniki wirusowe i antywirusowe' ;

;

ANTY_DEA v1.0, Autor : Adam Blaszczyk 1997 ;

;

; Program demonstruje proste techniki antydeasemblerowe ;

; Po skompilowaniu mozna sprobowac deasemblowac kod tego ;

; programu przy uzyciu np. SOURCERa i porownac z oryginalnym ;

; zrodlem ;

;

; Kompilacja :  ;

TASM ANTY_DEA.ASM ;

TLINK /t ANTY_DEA.OBJ ;

;

ANTY_DEA SEGMENT

ASSUME CS:ANTY_DEA, DS:ANTY_DEA

ORG 100h

Start:  ; poczatek programu

sub bp,bp ; zeruj rejestr BP

lea dx,[bp+offset TxCzesc] ; dostep do danych poprzez

; adresowanie typowo uzywane

; przy operacjach na stosie

; deasembler moze nie zauwazyc

; ze chodzi o zwykly ofset

; do tekstu

jmp $+4 ; przeskocz bajt 0EAh

; i wskocz w drugi bajt

; rozkazu ADD, czyli

; przejdz do rozkazu

; jmp Koniec

; (ukrytego w kodzie rozkazu ADD)

db 0EAh ; symuluj wywolanie

; dalekiej procedury

; o kodzie EA OO OO SS SS, gdzie

; SS SS : Seg, OO OO : ofs

; mozliwe, ze deasembler pobierze

; dwuslowo i zamieni je

; na SS SS : OO OO

; i nie wykryje ani ADD, ani JMP

add ax,0EBh+256*(offset Koniec-$-3) ; kod tego rozkazu

; to db 05

; db EB

; db (offset Koniec-$-3)

; od drugiego bajtu rozpoczyna sie

; kod rozkazu Jmp Koniec (EB,??)

TxCzesc db 0Dh,0Ah,'Czesc!',0Dh,0Ah,'$' ; tekst w srodku kodu;

; istnieje szansa, ze

; deasembler zacznie

; go interpretowac jako kod

db 0EAh ; ta sama sztuczka co powyzej;

; symulacja wywolania dalekiej

; procedury

Koniec: ; tu dotrze program omijajac tekst

jmp $+3 ; przeskocz bajt 0EAh

db 0EAh ; ta sama sztuczka co powyzej;

; symulacja wywolania dalekie

; procedury CALL FAR

; ponizsza sekwencja mov ah,9/

; int 21h jest 4 bajtowa i jest

; calkowicie 'pochlonieta' przez

; symulowany rozkaz CALL FAR

mov ah,9 ; funkcja DOS - wyswietl tekst$

int 21h ; wywolaj funkcje DOS

ret ; powrot do PSP:0000h,

; gdzie znajduje sie kod Int 20h,

; czyli koncz program

ANTY_DEA ENDS

END Start

Ze względu na fakt, iż większość obecnie istniejących programów antywirusowych stosuje tryb krokowy lub też emulację procesora do wykrywania wirusów polimorficznych, twórcy wirusów starają się w jakiś sposób utrudnić wykrywanie wirusów tymi metodami.

Specjalnie w tym celu do procedury dekodera, tworzonej przez poli-morficzny generator, dodaje się wywołania różnych, występujących typowo w zwykłym oprogramowaniu, funkcji przerwań 10h, 21h, 16h i innych, a także umieszcza się w niej wywołania procedur. Ciekawym zabiegiem antyemulacyjnym są też próby nadania dekoderowi wyglądu programu napisanego w językach wysokiego poziomu (posiadają one charakterystyczne sekwencje kodu na początku programu), bądź też nadanie plikowi cech np. wewnętrznie spakowanego programu (np. dodanie sygnatur PKLITE, LZEXE lub innych).

Po wykryciu wywołania pewnej ilości funkcji obsługiwanych przez przerwania programowe, próbujący wgryźć się w kod wirusa program antywirusowy zwykle przerywa dalsze poszukiwania i pozostawia plik bez zmian.

Ze względu na stosowanie przez programy antywirusowe heurysty-cznego wykrywania wirusów, nowsze wirusy potrafią już poradzić sobie z tego typu metodami, poprzez odpowiednią manipulację kodem, np. tradycjną sekwencję:

CMP AX,4B00h

mo┐na zakodowaµ w wirusie jako:

ADD AX,1234h

CMP AX,4B00h+1234h

lub

XCHG AX,CX

CMP AX,4B00h XCHG AX,CX

lub na inną, gdyż możliwości jest tu w zasadzie nieskończenie wiele. Gdy podobną operację wykona się dla większości zawartych w wirusie instrukcji, program antywirusowy będzie miał spore kłopoty z rozpoznaniem intruza.

9.3. Optymalizacje kodu

Jak wspomniano na początku, wirus powinien być maksymalnie krótki i zwięzły, tak więc autorom wirusów zwykle zależy na minimalizacji kodu wirusa, bez utracenia jego funkcjonalności. W tym celu stosuje się różne rozwiązania polegające na odpowiednim kodowaniu różnych instrukcji, które - mimo, że krótsze od normal-

nie przeznaczonych do danego celu rozkazów - zachowują ich funkcjonalność. Poniższe przykłady ilustrują najbardziej znane i proste optymalizacje kodu:

XOR REJ16,REJ16 ; zeruj rejestr 16-bitowy za pomoce 2-bajtowego

; rozkazu (zamiast 3-bajtowego rozkazu MOV REJ16,0)

XOR AX,AX ; zeruj rejestry DX:AX za pomoc╣ dw≤ch rozkaz≤w CWD

; zajmuj╣cych razem 3 bajty (zamiast 4 lub 6 bajt≤w)

XCHG AX,REJ16 ; przenie£ zawarto£µ rejestru AX do innego rejestru ; 16-bitowego zamiast 2-bajtowej instrukcji MOV BX,AX

; (mo┐na u┐ywaµ tylko w niekt≤rych sytuacjach)

INC REJ16 ; dwie 1-bajtowe instrukcje INC

INC REJ16 ; zamiast jednej 3-bajtowej instrukcji

ADD REJ16,2 ; analogicznie dla rozkazu

SUB REJ16,2 ; 2xDEC

9.4. Retrostruktury (techniki anty-antywirusowe), czyli walka z zainstalowanymi monitorami antywirusowymi

Większość z nowoczesnych wirusów w aktywny sposób stara się walczyć z zainstalowanym oprogramowaniem antywirusowym. Wirusy kasują więc pliki z sumami kontrolnymi, modyfikują znalezione w pamięci programy antywirusowe, tak aby nie były one aktywne, lub nawet deinstalują je całkowicie z pamięci w sposób niewidoczny dla użytkownika.

Co ciekawe, większość monitorów antywirusowych, zawierających wyrafinowane metody wykrywania niebezpiecznych odwołań do plików czy sektorów, nie przykłada żadnej wagi do ochrony własnego

kodu. W kolejnych wersjach programy te mają schematyczną budo' we, a korzystające z tego wirusy potrafią wykryć odpowiednią sekwencję w pamięci i zmienić ją tak, iż program, mimo że jest zainstalowany, nie działa tak, jak powinien.

Najbardziej jaskrawym tego przykładem jest chyba modyfikacja parametrów wejściowych programu antywirusowego, który po uruchomieniu wyświetla swój status, zawierający użyty przez wirusa parametr. Dodawane przez wirusy parametry najczęściej wyłączają bezpośredni dostęp do dysków, przeszukiwanie pamięci itp. Aby uniemożliwić użytkownikowi zauważenie wprowadzonych w parametrach zmian, wirusy zmieniają odpowiedni łańcuch bezpośrednio w pamięci ekranu, tak iż odbiorca (użytkownik programu) patrząc na ekran jest przekonany o poprawnym działaniu programu, mimo że ten ma zablokowane funkcje, które prawdopodobnie pomogłyby wykryć wirusa.

We wspomnianych we wstępie zinach, dotyczących programowania wirusów, znaleźć można artykuły, które bardzo dokładnie opisują sposoby łamania najbardziej znanych na świecie programów antywirusowych (w artykułach tych najczęściej mówi się o serii zaawansowanych programów antywirusowych ThunderByte autorstwa Fransa Veldmana).

W najbliższych latach spodziewać się można powstania zupełnie nowych odmian wirusów, które wykorzystywać będą nie znane nam aktualnie mechanizmy. Poniżej przedstawiono krótki przegląd przewidywanych przez większość znawców wirusów trendów rozwojowych progamowania wirusów Ze względu jednak na charakter rozdziału oraz na wątpliwą wiarygodność różnego rodzaju przepowiedni, zalecam czytelnikowi podejście do tego tekstu z odrobiną sceptycyzmu.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 625
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved