miércoles, 23 de enero de 2013

Inyectar DLL en memoria [C++]

DLL a Inyectar [ASM]
format PE GUI 4.0 DLL
entry DllEntryPoint

include 'C:\fasm\INCLUDE\WIN32AX.INC'

section '.code' code readable executable
 proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
     
   cmp [fdwReason],1
      JE mensaje
      mensaje:
      invoke MessageBox,0,"Kiere Pelea?","Ola Ke Ase?",MB_OK
      ret
 endp
 
 section '.idata' import data readable writeable
  library user,'USER32.DLL'
import user,\
       MessageBox, 'MessageBoxA'
Inyector.exe [C++]
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{
 HWND hwProceso;
 DWORD idProceso;
 HANDLE hProceso; 
 HANDLE hThread;
 LPVOID memoria;
 char *DLL="C:\\dll.dll";
 
 //Buscamos el proceso a inyectar.
 if(!(hwProceso=FindWindowEx(0,0,0,"Calculadora")))
 {
  MessageBox(0,"Ventana no encontrada","ERROR X",0);
  return 1;
 }
 
 if(!(GetWindowThreadProcessId(hwProceso,&idProceso)))
 {
  MessageBox(0,"No se pudo Obtener la id del proceso","ERROR X",0);
  return 1;
 }
 
 //Abrimos el proceso
 if(!(hProceso=OpenProcess(PROCESS_ALL_ACCESS,false,idProceso)))
 {
  MessageBox(0,"No se pudo abrir el proceso","ERROR X",0);
  return 1;
 }
 
 //Reservamos memoria en el proceso para la DLL 
 memoria=VirtualAllocEx(hProceso,0,strlen(DLL),MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
 SIZE_T write=0;
 
 //Escribimos en el proceso
 if(WriteProcessMemory(hProceso,memoria,(LPVOID)DLL,strlen(DLL),&write)==0)
 {
  MessageBox(0,"No se pudo escribir en el proceso","ERROR X",0);
 }
 
 //Creamos un nuevo hilo de ejecucion en el proceso
 if( (hThread=CreateRemoteThread(hProceso,0,0,(LPTHREAD_START_ROUTINE)GetProcAddress(LoadLibrary("Kernel32.dll"),"LoadLibraryA"),memoria,0,0))==NULL)
 {
  MessageBox(0,"No se pudo EJECUTAR en el proceso","ERROR X",0);
 }
 
}

1 comentario: