[Ayuda] Injector Messageboox

Iniciado por Luchoz95, 4 Marzo 2013, 17:52 PM

0 Miembros y 1 Visitante están viendo este tema.

Luchoz95

Holaaa genteee, ando con un problema , el otro dia lei un codigo que subieron en este foro, que es el siguiente

Código (cpp) [Seleccionar]
#include <windows.h>
#include <stdio.h>

typedef int (WINAPI *_MessageBoxA)(HWND, LPCTSTR, LPCTSTR, UINT);

struct sTDatos_MessageBoxA
{
   _MessageBoxA direccionMessageBoxA;
   char titulo[255], texto[255];
};

typedef struct sTDatos_MessageBoxA TDatos_MessageBoxA;

void Hilo_MessageBoxA(TDatos_MessageBoxA *datos)
{
   datos->direccionMessageBoxA(0, datos->texto, datos->titulo, 0);
}

void Inyectar_MessageBoxA(DWORD pID, char* titulo, char* texto)
{
   DWORD tamFunc;
   HANDLE tHandle, funcionRemota;
   TDatos_MessageBoxA datos, *direccionDatosRemotos;
   void* direccionFuncionRemota;

   tHandle = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, 0, pID);

   datos.direccionMessageBoxA = (_MessageBoxA)GetProcAddress(GetModuleHandle("USER32.DLL"), "MessageBoxA");
   sprintf(datos.titulo, titulo);
   sprintf(datos.texto, texto);

   direccionDatosRemotos = (TDatos_MessageBoxA*)VirtualAllocEx(tHandle, 0, sizeof(TDatos_MessageBoxA), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
   WriteProcessMemory(tHandle, direccionDatosRemotos, &datos, sizeof(TDatos_MessageBoxA), NULL);

tamFunc = (DWORD)Inyectar_MessageBoxA - (DWORD)Hilo_MessageBoxA;

direccionFuncionRemota = VirtualAllocEx(tHandle, 0, tamFunc, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(tHandle, direccionFuncionRemota, (void*)Hilo_MessageBoxA, tamFunc, NULL);

funcionRemota = CreateRemoteThread(tHandle, NULL, 0, (LPTHREAD_START_ROUTINE)direccionFuncionRemota, direccionDatosRemotos, 0, NULL);

WaitForSingleObject(funcionRemota,INFINITE);
  CloseHandle(funcionRemota);

  VirtualFreeEx(tHandle,direccionFuncionRemota,0,MEM_RELEASE);
  VirtualFreeEx(tHandle,direccionDatosRemotos,0,MEM_RELEASE);  

  CloseHandle(tHandle);  
}

int main()
{
   DWORD pID;
   HWND hWnd;

   hWnd = FindWindow("SciCalc", NULL);

   if(hWnd!=NULL)
   {
       GetWindowThreadProcessId(hWnd, &pID);
       Inyectar_MessageBoxA(pID, "descifra.me", "Codigo inyectado!");
   }

   return 0;
}



el problema surge que no se logra injectar el codigo en la calculadora, abro la calculadora y ejecuto ese codigo y no pasa nada, alguien sabe si copie mal el codigo o algo ? por lo que tengo entendido no tengo ningún error
Saludos

x64core

#1
Hola

La causa podria ser entre varias, por ejemplo si estas compilando en modo release y las opciones que estas pasando al compilador,
otro es en que sistema operativo estas intentando ejecutarlo en un windows de 64bits programas tales como esos estan compilandos para 64 bits pero existen versiones de 32 bits en la sysWow64 ( verifica de ejecutar la version correcta ) debido a que este metodo
no funciona para inyectar de 32 bits a un proceso de 64 bits, otro problema puede ser el nombre de la clase de la calculadora en Win7 64 bits el nombre de la clase es: "CalcFrame"

Eternal Idol

Creo que como te dijo x64Core SciCalc no coincide con la calculadora de Windows PERO lo que tenes que hacer es DEPURAR el programa linea y por linea y ver que devuelven las llamadas a la API.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Luchoz95

El sistema operativo que uso es el W7 32 bits , nose a te referis modo relaese y la opciones de mi compilador , Saludos!

x64core

Cita de: Luchoz95 en  4 Marzo 2013, 22:55 PM
El sistema operativo que uso es el W7 32 bits , nose a te referis modo relaese y la opciones de mi compilador , Saludos!
Entonces seguramente es el nombre de la clase, verificarlo, de lo contrario depura tu codigo como dijo EI  :)
Respecto a las opciones del compilador eso podría afectar el compilador por lo general crea una tabla con punteros a las funciones y esto afecta cuando haces referencias a funciones basándote en el hecho de la posición de las funciones ( como en este ejemplo ). cuando haces referencia al inicio de la funcion en realidad estas haciendo referencia a la posicion de memoria donde esta almacenado el puntero a la función y los resultados no son los que se esperan.

Además siempre es muy recomendable usar los valores de retonos de las funciones no solo por el hecho que funcione en una version de Windows significa que funcionara siempre. Y además solo por información, también podria ser el token de seguridad del proceso que intenta hacer la inyección. Lo mejor por ahora seria depurar el código.

Luchoz95

perdon pero no entiendo cuando te referis al nombre de la clase, y depurar tampoco nunca lo hice,
pd: estoy usando Codeblocks

x64core

Cita de: Luchoz95 en  5 Marzo 2013, 01:53 AM
perdon pero no entiendo cuando te referis al nombre de la clase, y depurar tampoco nunca lo hice,
pd: estoy usando Codeblocks

http://en.wikipedia.org/wiki/Window_class en el codigo se ha escrito "SciCalc", existen varias herramientas para saber el nombre
de la clases de una ventana por ejemplo: spy++ de microsoft, La version más actulizada la podes encontrar entre las herramientas que vienen con Visual Studio professional ( no express ).

Y aprender a depurar tus propios programas y utilizar la funcion GetlastError. Recomiendo VC++.