Tutorial: Como controlar el mouse con el teclado y agregarse al registro de Windows en lenguaje C


En este tutorial les voy a enseñar a hacer un programa que tal vez puedan usar en sus troyanos para control remoto, o simplemente si se les daña el mouse (que fue la causa original de crear el programa ejejeje). Se trata de un programa que permite controlar el mouse con las flechas del teclado y otros botones para hacer las rutinas básicas del mouse, se puede controlar la velocidad del puntero y tiene una opción para ejecutarse de manera oculta al usuario agregandose al registro (es por si no tienes plata para otro mouse) para poder darle un buen susto a tus amigos o agregarlo a un troyano que tenga funciones de control remoto.

Como siempre busco que el código sea entendible y sencillo para no hacer funciones tan absurdas, porque si han programado en Lenguaje C se habrán dado cuenta que un simple programa resulta con un código monstruoso jeje. Bueno comencemos con el código entero y luego explico parte por parte.

// Autor: thEpisode Productions (Camilo Rodriguez)
// Fecha: 02/12/2011
// Descripción: Programa que controla el mouse con el teclado y es capaz de agregarse al registro

/*=========================*/
#include <windows.h>
#include <ctype.h>
#include <conio.h> // Bibliotecas
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*=========================*/

/*-------------------------*/

/*=====Sub-Programas=================================================================*/
void Menu(HWND &hwnd);
void Mensaje_Control();
int Control(HWND hwnd);
int Control_Vista(int &X, int &Y, int &hX, int &hY, int &iX, int &iY, int &velocidad);
/*===================================================================================*/

/*-------------------------*/

/*====Función Main===================================================================*/
int main()
{

 HWND hwnd; // Variable tipo HWND o Handle
 system("CLS"); // Limpiamos la consola
 SetConsoleTitle("Control-Mouse by thEpisode Productions"); // Asignamos el titulo a la consola
 Sleep(100); // Pausamos o dormimos 100 milisegundos el programa
 Menu(hwnd); // Llamamos a la función Menu
}

/*-------------------------*/

/*====Función Main===================================================================*/

void Menu(HWND &hwnd)
{
 char opc;
 if(hwnd=FindWindow(NULL, "Control-Mouse by thEpisode Productions")) // Buscamos la propia consola
 {
   system("CLS");
   printf("\n Bienvenido usuario, este programa sustituye su mouse por el teclado.\n\n\n");
   printf(" 1) Activar el control.\n");
   printf(" 2) Activar el control Modo Oculto.\n");
   printf(" 3) Salir.\n");
   printf("\n Seleccione la opcion que ud desea: ");
   fflush(stdin); // Liberamos el buffer de la entrada Std
   fflush(stdout); // Liberamos el buffer de la salida Sta
   scanf("%c",&opc);
   switch(opc)
   {
     case 49:
         {
            Mensaje_Control(); // Llamamos a la funcion Mensaje_Control
            Control(hwnd); // Llamamos a la funcion Control y le pasamos el valor que contiene hwnd
            fflush(stdin);
            fflush(stdout);
            break;
         }
     case 50:
         {
            int msgboxID;
            FreeConsole(); //Liberamos la consola actual
            msgboxID=MessageBox(NULL, "¿Desea agregar al Registro de Windows este programa?", "", MB_SETFOREGROUND | MB_YESNO | B_ICONINFORMATION);
            switch(msgboxID) // Validamos si presiona el botón SI O NO
            {
               case IDYES:
                   { // En todo este bloque usamos la API de Windows y la manera más segura de ingresar al Registro de Windows
                       HKEY hkey; // Hacemos una variable HKEY donde guardamos la clave necesaria para acceder al registro
                       int resul,resul2; // Variables para el control de uso de las funciones
                       char path[256]="Software\\Microsoft\\Windows\\CurrentVersion\\Run"; // Ruta del RUN de Windows
                       char ruta[60]="C:\\Control_Mouse_by_thEpisode_Productions.exe"; // Nombre de destino del programa
                       char szFileName[MAX_PATH]; // Variable para guardar la direccion actual del programa

                       HINSTANCE hInstance = GetModuleHandle(NULL); // Obtenemos la instancia actual del programa
                       GetModuleFileName(hInstance, szFileName, MAX_PATH); // Obtenemos la dirección actual del programa. szFileName tiene la direccion del archivo
                       CopyFile(szFileName,ruta,true); // Copiamos el programa ejecutado. El primer parametro es el archivo que existe, el segundo a donde va, el tercero es que si el archivo existe no lo copia.

                       resul=RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\run",&hkey);// Abrimos la clave en el Registro de Windows
                       if(resul==ERROR_SUCCESS)
                       {
 // La funcion de abajo crea el registro para nuestro programa
                         resul2=RegSetValueExA (hkey, "Control Mouse by thEpisode Productions", 0, REG_SZ, (const unsigned char*) ruta, strlen(ruta)+1);
                         if(resul2!=ERROR_SUCCESS) // Si no se pudo crear el registro por motivos administrativos
                         {
                            MessageBox(0,"No se pudo agregar el dato al Registro de Windows.\nFavor elevar permisos","Error",MB_OK | MB_ICONSTOP);
                         }
                         else
                            MessageBox(NULL, "Registro agregado", "", MB_SETFOREGROUND | MB_OK | MB_ICONINFORMATION);
                         RegCloseKey(hkey); // Cerramos la llave que se abrio anteriormente

                       }
                       else
                       {
                          MessageBox(0,"No se pudo encontrar el dato en el Registro de Windows.","Error",MB_OK | MB_ICONSTOP);
                          exit(0);
                       }

 // Todo este bloque comentado es por si deseamos agregar al Registro de Windows de la manera fácil o usando comandos Batch
 /*system("CD %HOMEPATH%");
 system("REG ADD HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v Control /d D:\\Juegos\\programa.exe /f");
 system("pause");*/
                  break;
                 }
               }
               hwnd=NULL;
               Control(hwnd);
               exit(0);
               break;
             }
         case 51:
             {
               exit(0);
             }
         default:
             {
               MessageBox(hwnd, "Ingrese una opción correcta", "Error de ingreso", MB_SETFOREGROUND | MB_OK | MB_ICONSTOP);
               system("CLS");
               break;
             }
      }
  Menu(hwnd);
 }
 else
 {
   MessageBox(NULL, "Error de autolocalización, favor abrir con permisos administrativos.", "Error Administrativo", MB_SETFOREGROUND |MB_OK | MB_ICONSTOP);
 }
}

/*====Función Mensaje_Control===================================================================*/
void Mensaje_Control()
{
 system("CLS");
 printf("\n El metodo de uso de este programa es el siguiente:\n\n");
 printf(" 1) Flecha arriba : movimiento arriba mouse.\n");
 printf(" 2) Flecha abajo : movimiento abajo mouse.\n");
 printf(" 3) Flecha izq : movimiento izquierda mouse.\n");
 printf(" 4) Flecha der : movimiento derecha mouse.\n");
 printf(" 5) Numpad 0 : Click izquierdo mouse mouse.\n");
 printf(" 6) Numpad + : Aumenta velocidad del cursor.\n");
 printf(" 7) Numpad - : Disminuye velocidad cursor.\n");
 printf(" 8) F8 : Salir");
 printf("\n\n Presione alguna tecla: ");
}

/*====Función Control===================================================================*/
int Control(HWND hwnd)
{
 int X, Y, hX, hY, iY=0, iX=0,velocidad=1; // Declaramos todas las variables necesarias
 X = GetSystemMetrics(SM_CXSCREEN)-1; // Obtenemos el tamaño de la pantalla -1
 Y = GetSystemMetrics(SM_CYSCREEN)-1;
 hX = X/2; // Dividimos entre 2 para obtener la mitad de la pantalla
 hY = Y/2;
 MessageBox(hwnd, "Para salir del control presione F8", "Aviso", MB_SETFOREGROUND |MB_OK | MB_ICONINFORMATION);
 while(!GetAsyncKeyState(VK_F8))
 {
   Control_Vista(X,Y,hX,hY,iX,iY,velocidad); // Llamamos a la funcion Control_Vista
   Sleep(1); // Dormimos el programa 1 milisegundo para que no se consuma todo el CPU
 }
}
int Control_Vista(int &X, int &Y, int &hX, int &hY, int &iX, int &iY, int &velocidad)
{
 if (GetAsyncKeyState(VK_ADD)==-32767) // Si presionamos el botón '+' aumentamos la velocidad del cursor
   velocidad++;
 if(GetAsyncKeyState(VK_SUBTRACT)) // Si presionamos el boton '-' disminuimos la velodad
 {
   if(velocidad>1)
   velocidad--;
 }
 if(hX>=X) // Si esta en la más aya de la mitad de la pantalla
   iX=1; // Con esto garantizamos que el verdadero mouse no mueva el cursor
 if(hY>=Y) // Y tengamos que hacer diversas validaciones
   iY=1;
 if(hX<=1)
   iX=0;
 if(hY<=1)
   iY=0;
 if(GetAsyncKeyState(VK_UP)) // Todo el control del cursor
   hY-=velocidad;
 else if(GetAsyncKeyState(VK_DOWN))
   hY+=velocidad;
 else if(GetAsyncKeyState(VK_LEFT))
   hX-=velocidad;
 else if(GetAsyncKeyState(VK_RIGHT))
   hX+=velocidad;
 SetCursorPos(hX,hY); // Posicionamos el cursor
 if(GetAsyncKeyState(VK_NUMPAD0)) // Cuando presionamos el '0' hace un click
 {
   mouse_event(MOUSEEVENTF_LEFTDOWN,hX,hY,0,0);
   mouse_event(MOUSEEVENTF_LEFTUP,hX,hY,0,0);
 }
}

Ahora explicaré cada parte importante:

Lo primero que tenemos es nuestra función main con las siguientes líneas

HWND hwnd;
 system("CLS");
 SetConsoleTitle("Control-Mouse by thEpisode Productions");
 Sleep(100);
 Menu(hwnd);

Donde primero hacemos una variable tipo HWND que es la que nos permitirá controlar las ventanas que necesitemos en nuestros programas de Lenguaje C, luego limpiamos la consola mediante código Batch usando la función system, en la tercera línea colocamos un nombre a la consola para que se vea un poco mejor y para poder localizarla más fácilmente y mientas se hace ese proceso dormimos el programa durante 100 milisegundos y procedemos a ir a la función Menu() pasandole por referencia la variable hwnd.

Ahora en la función Menu() lo primero que hacemos es tratar de buscar la consola con el nombre “Control-Mouse by thEpisode Productions”  y creamos una variable tipo char que usaremos en todos los switch, uso este tipo de dato para prevenir usuarios malintencionados o que cometan algún error en la entrada de dato que se pide y así no puedan hacer una excepción que no se puede controlar.

char opc;
if(hwnd=FindWindow(NULL, "Control-Mouse by thEpisode Productions"))

Si se puede encontrar el nombre de la ventana procedo a hacer el menú como tal y controlo la entrada con un switch.

Control-Mouse by thEpisode Productions

Vale aclarar que como estamos manejando carácteres podemos usar la forma case ’1′ o case 49 que son los equivalentes en ASCII. En la primera opción que activamos el control tenemos el siguiente código:

</pre>
Mensaje_Control();
 Control(hwnd);
 fflush(stdin);
 fflush(stdout);
 break;

Donde primero llamamos a la función de Mensaje_Control() que se encarga de imprimir todos los controles disponibles del programa. Luego llamo a la función Control y le paso por valor la variable hwnd. Luego libero memoria de entrada, salida y finalmente la sentencia break que controla el switch.

Siguiendo el orden del programa en la segunda opción que es para  usar el Control-Mouse de manera oculta comenzamos con el siguiente código:

</pre>
int msgboxID;
 FreeConsole();
 msgboxID=MessageBox(NULL, "¿Desea agregar al Registro de Windows este programa?", "", MB_SETFOREGROUND | MB_YESNO | MB_ICONINFORMATION);
 switch(msgboxID)

Donde hacemos una variable tipo entera para controlar lo que retorna un MessageBox, luego liberamos la consola o la destruimos y muestro un MessageBox donde pregunta que si desea agregar al registro del Windows y lo almacenamos en la variable hecha previamente, finalmente cuando el usuario se decide usamos un switch para controlar lo que el usuario escogió.

MessageBox en Lenguaje C

Si el usuario escogió la opción “Sí” procedemos a guardarlo en el registro, en caso contrario no manejamos ningún case y continuamos con la ejecución. También añadí el código Batch para los que no se sientan a gusto de usar el API de Windows. El código lo puedes mirar completo arriba, explico el mecanismo

Obtengo la instancia actual del programa
Obtengo la ruta de donde está almacenado actualmente el programa
copio el archivo a C://
Abro el Registro de Windows
Si pude abrir la clave de Registro añado la nueva clave
Valido si pude agregarla o no

En la siguiente función llamada Control() declaramos variable para obtener la posición del cursor y así poder manejarlo. En las otras variables calculamos la mitad de la pantalla para posicionar inicialmente el puntero en la mitad. Por último hacemos un bucle que mientras no se presione la tecla F8 llame a la función Control_Vista que es el que se encarga de posicionar el cursor en la pantalla dependiendo de la velocidad y pausamos 1 milisegundo el programa para que no se llene toda nuestra memoria solamente en este bucle:

</pre>
int X, Y, hX, hY, iY=0, iX=0,velocidad=1;
 X = GetSystemMetrics(SM_CXSCREEN)-1;
 Y = GetSystemMetrics(SM_CYSCREEN)-1;
 hX = X/2;
 hY = Y/2;
 MessageBox(hwnd, "Para salir del control presione F8", "Aviso", MB_SETFOREGROUND |MB_OK | MB_ICONINFORMATION);
 while(!GetAsyncKeyState(VK_F8))
 {
 Control_Vista(X,Y,hX,hY,iX,iY,velocidad);
 Sleep(1);
 }
<pre>

En la última función posiciono el mouse y hago toda la funcionalidad disponible en el programa.

Espero te sirva este código.

About these ads

Un comentario en “Tutorial: Como controlar el mouse con el teclado y agregarse al registro de Windows en lenguaje C

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s