martes, 12 de marzo de 2013

Inyectar Codigo en Memoria [C++]

pequeño source que inyecta un MessageBox en un proceso externo

inyectar.cpp

#include 
#include 
#define PROCESO    "explorer.exe"
#define SIZE  1024          


typedef int (WINAPI *MYMESSAGE)(HWND, LPCSTR, LPCSTR, UINT); //Puntero a Estructura

typedef struct _EstructuraInyectar
{
 MYMESSAGE _MessageBox;
 char mensaje[1024];
}EstructuraInyectar;

void FuncionInyectar(EstructuraInyectar *estructura)
{
 estructura->_MessageBox(NULL, estructura->mensaje, estructura->mensaje, MB_OK);
}

void ObtenerPunteros(EstructuraInyectar *estructura)
{
 HINSTANCE Library;
 ZeroMemory(estructura, sizeof(EstructuraInyectar));
 Library = LoadLibrary("user32.dll");
 estructura->_MessageBox = (MYMESSAGE)GetProcAddress(Library, "MessageBoxA");
 memset(estructura->mensaje, 0, sizeof(estructura->mensaje));
 strcpy(estructura->mensaje, "Ola Ke Ase?,ejecutandose o ke ase");
}


int main()
{
 DWORD pID;
 HANDLE hProcess, hSnap;
 void *pRemoteThread;
 EstructuraInyectar estructura, *Estructura;
 PROCESSENTRY32 pe32 = {0};
 
 ObtenerPunteros(&estructura);
 if((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) == INVALID_HANDLE_VALUE) return -1;
 pe32.dwSize = sizeof(PROCESSENTRY32);
 Process32First(hSnap, &pe32);
 do{
  if(strcmp(PROCESO,pe32.szExeFile) == 0)
  {
   pID = pe32.th32ProcessID;
   break;
  }
 }while(Process32Next(hSnap, &pe32));
 if(hSnap != INVALID_HANDLE_VALUE){CloseHandle(hSnap);}
 
 hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
 pRemoteThread = VirtualAllocEx(hProcess, 0, SIZE, MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
 WriteProcessMemory(hProcess, pRemoteThread,(LPCVOID) FuncionInyectar, SIZE, 0);
 Estructura = (EstructuraInyectar*)VirtualAllocEx(hProcess , 0, sizeof(EstructuraInyectar), MEM_COMMIT, PAGE_READWRITE);
 WriteProcessMemory(hProcess, Estructura,&estructura, sizeof estructura, 0);
 CreateRemoteThread(hProcess , 0, 0, (DWORD (__stdcall *)(void *))pRemoteThread, Estructura, 0, NULL);
 CloseHandle(hProcess);
}