Polimorfizm (informatyka)
Z Wikipedii
Spis treści |
[edytuj] Polimorfizm w programowaniu obiektowym
to wykazywanie przez metodę różnych form działania w zależności od tego jaki typ obiektu jest wskazywany przez wskaźnik lub referencję (pomijając typ wskaźnika lub referencji).
Zobacz też: metoda wirtualna, rzutowanie w górę
[edytuj] Polimorfizm w programowaniu funkcyjnym
to możliwość stosowania tej samej funkcji dla różnych typów parametrów. Najprostsza funkcja polimorficzna:
function <typ zmiennej> f (<typ zmiennej> x){ return x; }
zwróci wartość takiego typu, jakiego będzie przekazany jej argument.
Znacznie ciekawsze mogą być polimorficzne funkcje wyższego rzędu, np:
function <typ zmiennej> f (<typ zmiennej> g, <typ zmiennej> x){ return g (g (x)); }
Ta funkcja przyjmuje dwa parametry. Drugi jest dowolnego typu 'a, zaś pierwszy jest funkcją przyjmującą argumenty typu 'a i zwracającą wartości również typu 'a (czyli jest typu 'a→'a).
[edytuj] Polimorfizm statyczny
to inaczej programowanie generyczne. Jest to stosowalność tej samej procedury/funkcji do różnych typów argumentów, przy czym można statycznie (zazwyczaj w trakcie kompilacji) stwierdzić jaki będzie typ argumentów w trakcie wykonania. Przykładem jest Standard Template Library w C++ oraz klasy generyczne w Javie.
[edytuj] Polimorfizm (samo-modyfikujący się kod)
jest to technika służąca "zaciemnianiu" kodu programu i zmianie rozmiaru, sumy kontrolnej (sygnatury, jedna z głównych metod działania programów antywirusowych) i instrukcji już po skompilowaniu (stąd "samomodyfikujący się kod") - technika używana najcześciej przez autorów wirusów komputerowych.
Można wyróżnić kilka głównych metod:
[edytuj] Metoda syntaktyczna
Zmiana kolejności rozkazów przy zachowaniu takiego samego sensu, np.:
mov ah, 3 add ebx, dword[ebp+8]
Można zmienić na:
add ebx, dword[ebp+8] mov ah, 3
[edytuj] Metoda morfologiczna
Wstawianie "śmieci" do kodu, np.:
lea eax, [edi-4] db 90h, 90h, 90h, 90h jmp label
(90h to liczbowy zapis instrukcji nop-nie rob nic-miejsce na wstawienie "śmieci") można zmienić na:
lea eax, [edi-4] cld std xchg eax, eax jmp label
itp.
[edytuj] Metoda metamorficzna
Najbardziej zaawansowana technika, zamiana instrukcji na inne, ale dające takie same wyniki, np.:
xor eax, eax
można zmienić na:
sub eax, eax
albo
mov eax, 0
albo
and eax, 0
itp. Technika używana najrzadziej z powodu trudności w budowie i dużego rozmiaru kodu morfującego - jednak wirusy używające tej metody są najtrudniejsze do wykrycia, szczególnie w połączeniu z poprzednimi metodami.