. De todas formas, con éste mismo método es sencillo hacer un realineamiento de la cabecera para que los datos no se queden en el EOF, quien tenga curiosidad el Little Joiner lo hace tal cual.El builder:
Código
#include <stdio.h>
#include <cstdlib>
#include <windows.h>
LPSTR AbrirArchivo(LPSTR ruta,LPDWORD szFile);
void GuardarArchivo(LPSTR ruta,LPSTR lpDatos,DWORD szDatos);
int main(int argc,char* argv[])
{
system("cls");
printf("---------------------------------------------------------------------------\n");
printf("\t\t\tEjemplo Builder Simple en C\t\t\n");
printf("---------------------------------------------------------------------------\n\n");
//Pedimos al usuario que introduzca el tipo de MessageBox
DWORD tipo;
printf("Seleccione el tipo de MessageBox (numero)\n");
scanf_s("%d",&tipo);
//Pedimos al usuario que introduzca el titulo del MessageBox
DWORD szTitulo=1024;
char *titulo=(LPSTR)malloc(1024);
printf("Seleccione el titulo del MessageBox (string)\n");
scanf_s("%s",titulo,1024);
//Obtenemos el tamaño del titulo
szTitulo=lstrlenA(titulo);
//Pedimos al usuario que introduzca el mensaje del MessageBox
DWORD szMensaje=1024;
char *mensaje=(LPSTR)malloc(1024);
printf("Selecicone el mensaje del MessageBox (string)\n");
scanf_s("%s",mensaje);
//Obtenemos el tamaño del mensaje
szMensaje=lstrlenA(mensaje);
printf("Configurando Stub...\n\tTipo:%d\n\tTitulo:%s\n\tMensaje:%s\n\n",tipo,titulo,mensaje);
//Copiamos stub.dll a generado.exe, si no se encuentra stub.dll salimos
if(!CopyFileA("stub.dll","generado.exe",FALSE))
{
MessageBoxA(0,"No se encontró stub.dll!","Error",0);
return 0;
}
//Leemos el stub
DWORD szFile;
LPSTR lpFile=AbrirArchivo("generado.exe",&szFile);
//Reservamos un buffer en memoria para el Stub y los Datos que añadiremos al final de éste
LPSTR lpNewFile=(LPSTR)GlobalAlloc(GPTR,szFile+4+4+4+szMensaje+szFile);
///////////////////////////////////////
// ESTRUCUTRA ARCHIVO GENERADO //
//-----------------------------------//
//Archivo -> szFile Bytes //
//Tipo Mensaje -> 4 Bytes //
//Tamaño Titulo -> 4 Bytes //
//Tamaño Mensaje -> 4 Bytes //
//Titulo -> szTitulo //
//Mensaje -> szMensaje //
//-----------------------------------//
///////////////////////////////////////
//Copiamos el Stub al Buffer
CopyMemory(&lpNewFile[0],&lpFile[0],szFile);
//Copiamos el tipo de MessageBox al Buffer
CopyMemory(&lpNewFile[szFile],&tipo,4);
//Copiamos el tamaño del titulo al Buffer
CopyMemory(&lpNewFile[szFile+4],&szTitulo,4);
//Copiamos el tamaño del mensaje al Buffer
CopyMemory(&lpNewFile[szFile+8],&szMensaje,4);
//Copiamos el titulo al Buffer
CopyMemory(&lpNewFile[szFile+12],&titulo[0],szTitulo);
//Copiamos el mensaje al buffer
CopyMemory(&lpNewFile[szFile+12+szTitulo],&mensaje[0],szMensaje);
//Sobreescribimso generado.exe con nuestro Buffer
GuardarArchivo("generado.exe",lpNewFile,szFile+12+szTitulo+szMensaje);
printf("Hecho!\n\n");
system("pause");
return 0;
}
LPSTR AbrirArchivo(LPSTR ruta,LPDWORD szFile)
{
HANDLE hFile=CreateFileA(ruta,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
DWORD dwBytes;
*szFile=GetFileSize(hFile,0);
LPSTR lpFile=(LPSTR)GlobalAlloc(GPTR,*szFile);
ReadFile(hFile,lpFile,*szFile,&dwBytes,0);
CloseHandle(hFile);
return lpFile;
}
void GuardarArchivo(LPSTR ruta,LPSTR lpDatos,DWORD szDatos)
{
DWORD dwBytes;
HANDLE hFile=CreateFileA(ruta,GENERIC_READ+GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0);
WriteFile(hFile,lpDatos,szDatos,&dwBytes,0);
CloseHandle(hFile);
}
El Stub:
Código
#pragma comment(linker,"/ENTRY:main")
#pragma comment(linker,"/NODEFAULTLIB")
#include <windows.h>
//Definición de dipo para la API RtlMoveMemory
typedef VOID (WINAPI *_CopyMemory)(PVOID Destination,CONST VOID *Source,SIZE_T Length);
void main()
{
//Cargamos dinamicamente la API RtlMoveMemory
_CopyMemory miCopyMemory=NULL;
miCopyMemory=(_CopyMemory)GetProcAddress(GetModuleHandleA("KERNEL32.DLL"),"RtlMoveMemory");
//Obtenemos nuestor nombre completo (incluída ruta)
char FileName[MAX_PATH];
GetModuleFileNameA(NULL,FileName,MAX_PATH);
//Nos leemos
HANDLE hFile=CreateFileA(FileName,GENERIC_READ,0,0,OPEN_EXISTING,0,0);
DWORD dwBytes;
DWORD FileSize=GetFileSize(hFile,0);
char *lpFileBuffer=(char*)GlobalAlloc(GPTR,FileSize);
ReadFile(hFile,lpFileBuffer,FileSize,&dwBytes,0);
CloseHandle(hFile);
//Reservamos memoria para los datos que extraeremos el final del stub
DWORD Tipo;
DWORD szTitulo;
DWORD szMensaje;
char *Titulo=(char*)GlobalAlloc(GPTR,1024);
char *Mensaje=(char*)GlobalAlloc(GPTR,1024);
//Tamaño del stub original (sin los datos añadidos en el EOF)
DWORD StubSize=0xA00;
//Obtenemos el tipo de MessageBox
miCopyMemory(&Tipo,&lpFileBuffer[StubSize],4);
//Obtenemos el tamaño del titulo
miCopyMemory(&szTitulo,&lpFileBuffer[StubSize+4],4);
//Obtenemos el tamaño del mensaje
miCopyMemory(&szMensaje,&lpFileBuffer[StubSize+8],4);
//Obtenemos el titulo del MessageBox
miCopyMemory(&Titulo[0],&lpFileBuffer[StubSize+12],szTitulo);
//Obtenemos el mensaje del MessageBox
miCopyMemory(&Mensaje[0],&lpFileBuffer[StubSize+12+szTitulo],szMensaje);
//Mostramos el MessageBox con los datos obtenidos
MessageBoxA(0,Mensaje,Titulo,Tipo);
}
Descargar Proyecto
Compilado en Microsoft Visual C++ 2008
Saludos










Autor





En línea




.


.

