Introducing Windows 95 by Quantum / VLAD
����������������������������������������

 When VLAD started working on the Win95 problem (back when WinSurfer was
 released), all we had to work with was the win32s update to win3.1 that
 allowed win3.1 users to run (not very successfully) 32 bit win95/NT
 applications.  Tracing through the code one day we noticed that every
 exe started with loading the PE header with eax pointing to it and
 jumping to the entrypoint (jmp [eax + 28h]).  So we changed the
 entrypoint RVA to point to our code, pushed eax, did our code, popped
 eax, and jumped to [eax + 28].  It worked, we had a win32s infector,
 then we noticed we didn't actually have any way to infect.  There were
 no ints and we really felt out of our depth and then to top it all off
 we came across the ultimate way to go resident without infecting the
 win3.1 shell and so PH33R was born.  About this time I left the scene
 in an unexplainable burst of insane "oh my god I'm going to fail uni"
 panic and that was about the end of the win32s/95/NT project.

 Just recently, uni ended.  I was on holidays, bored out of my skull,
 and running win95, so I decided I'd give it another go.  To my surprise
 the jmp [eax + 28] was gone, it was just a byproduct of win32s.  Instead
 I just calculated the distance between the end of the exe and the
 entrypoint, calculated the start of the virus code and subtracted the
 two.  It worked, I had a win95/NT infector.  That is, 'cept for a little
 matter of calling API...


 The Day the World Changed
 �������������������������

 In the beginning there were memory locations and we manipulated what
 our computer did by peeking and poking.  And it was good.  But this
 was not to last, for on the horizon was the "port" and slowly we
 learnt to communicate with attached devices by puting values in, and
 pulling values out, of specific ports.

 After a while the computer was no longer young and we needed
 something to keep things in check.  We needed a way to communicate
 indirectly with the hardware and thus the interrupt was born.  Not
 everyone liked the interrupt system but soon we all learnt to live
 with it, to manipulate it, and use it to our advantage.

 Everyone that is, except one group at Microsoft - the guys who were
 writing a "revolutionary" GUI called "Windows".  These guys were
 looking for a way to split all the functions that were once provided
 by interrupts into seperate, shared files called Dynamic Link
 Librarys (Dll's).  And so the Application Program Interface (API) was
 born.  API's made calling functions just that little bit harder and
 admittedly sometimes completely impossible.  But the guys at Microsoft
 had not yet taken away our interrupts and we still had (some) control
 over the system with DPMI.

 Then the guys at Microsoft did it again.  Their latest concoction
 eliminated interrupts and ports and yes, even memory locations.  For
 "Windows 95/NT" is a true non-preemptive multitasking system or in
 other words - a bully.  This ogre pushes programs around, squeezes
 them into confined spaces, locks them out of restricted areas and,
 worst of all, forces them into using a new, impossibly complex, method
 of calling API.

 Which brings us to...


 One drunk night at Microsoft
 ����������������������������

 When the guys at Microsoft get drunk, they truly get drunk.  But rather
 than running around with a cop's panties on their collective head and
 stealing traffic cones, they designed a new call construct.

 In the spirit of Windows 3.1, the guys at Microsoft chose against using
 interrupts.  In some ways this was good - programmers dont need to check
 to see if dll's are in memory (although they could), and they can state
 what dll's they need.  The way that Microsoft achieved this is through
 the Import and Export Tables.  The Import table lets the programmer state
 what functions they need from which dll's.  The Export table lets the
 provider of the dll specify what functions it provides.

 The problem is, once the import table has been written it is set in stone.
 There is no space to add any new entries and you cant move anything around.
 Why ?  Well, mainly because of a certain jump table that can be ANYWHERE
 in the exe.  To call an API the code calls a hardcoded address.  This
 address points to an indirect jump which points to an entry in the import
 table that is filled in (when the executable is loaded) with an address to
 a similar jump table in the dll that pushes a value and jumps to the
 function dispatcher which uses the values that are inserted in the dll's
 export table.  To add an entry to the import table you would have to
 move the current entries around so that you could fit it in.  This means
 you have to change the jump table to point to the relocated entries, which
 is impossible as the jump table can be ANYWHERE in the file and cannot be
 located.

 The New Frontier
 ----------------

 Windows 95 is a whole new platform.  It's a new challenge and although
 a lot of things have been stacked against you - it IS possible.  So
 get in there and start researching.  Research will be the end-all of
 the VX/AV war, one way or the other.