Wirusy polimorficzne
Uwagi ogólne
- Narzucającym się sposobem szukania i naprawiania zainfekowanych
plików jest znajdowanie w ich kodzie charakterystycznych dla znanych
wirusów ciągów bajtów.
- Proste wirusy bronią się przed tym kodując swój kod. Pozostaje jednak
niezmienna procedura odkodowująca, po której można je rozpoznać.
- Wirusy polimorficzne mają także zmienną procedurę odkodowującą.
Działanie wirusów polimorficznych
Kodowanie procedur szyfrujących wirusy bazuje na fakcie, że wiele
różnych ciągów instrukcji procesora daje ten sam efekt.
Na przykład poniższe trzy ciągi instrukcji zerują rejestr AX:
- XOR AX, AX
NOP
NOP
- MOV AX, 0
NOP
- NOP
MOV AL, 0
MOV AH, 0
Chcąc zmienić kod, nie zmieniając wyniku, można też np.:
- Zamiast INC używać ADD.
- Zamiast DEC używać SUB.
- Wykorzystywać różne rejestry do obliczania tych samych wartości.
Wirusy polimorficzne infekując pliki mogą działać zgodnie
z poniższym schematem:
- Zmiana pierwszych trzech bajtów (w przypadku plików w postaci
absolutnej) lub nagłówka programu (w przypadku plików w postaci
przemieszczalnej), tak by najpierw wykonał się kod wirusa.
- Wywołanie funkcji kodującej, która tworzy zakodowaną wersję wirusa
oraz generuje procedurę odkodowującą. Procedura odkodowująca może być
za każdym razem inna (a przynajmniej powtarza się bardzo rzadko).
- Dopisanie do infekowanego pliku:
- Procedury odkodowującej.
- Zakodowanego wirusa (zakodowany wirus zawiera funkcję kodującą).
Generatory wirusów polimorficznych
Istnieją biblioteki funkcji, które można wykorzystać do tworzenia
wirusów polimorficznych. Są to t.zw. generatory wirusów polimorficznych.
Dostarczają one funkcje: kodujące i generujące
funkcje odkodowujące. Do poprawnego
i efektywnego działania funkcje te potrzebują generatorów liczb losowych
(proste generatory są dołączane do bibliotek).
Aby stworzyć wirusa polimorficznego z wykorzystaniem generatora
wystarczy:
- Napisać zwykłego wirusa niepolimorficznego.
Wirus ten przed zainfekowanoiem powinien wywołać funkcję kodującą.
- Napisać generator liczb losowych (ew. można użyć generatora
dostarczonego z biblioteką, ale im lepszy generator tym lepiej działa
funkcja kodująca).
- Skompilować wirusa i połączyć go z używaną biblioteką funkcji
kodujących.
Przykłady generatorów wirusów polimorficznych
Mutation Engine (MtE)
Napisał ją Dark Ayenger. Od niej rozpoczęła się historia wirusów
polimorficznych. Była rozprowadzana w postaci pliku mte.obj. Kodowanie
odbywało się słowo po słowie. Generator liczb losowych znajdował się
w pliku ran.asm, można go było zamienić na inny.
TridenT Polymorphic Engine (TPE)
Był to najbardziej rozpowszechniony generator wirusów polimorficznych.
Do szyfrowania służyła procedura Crypt.