Small EXE breaker
Bueno, después de tantos días decidiendo si me presento a este concurso que tanto me gusta, mis amigos me convencieron para programar algo y esto es lo que ha salido... como algunos saben, no soy muy creativo pensando ideas y sólo he podido hacer este programa.
¿Qué es?
Small EXE breaker, es literalmente un cortador de exes. Está todo programado en C++ e incluye un mínimo funcionamiento de PE, el cual soy muy novato.
Como bien he dicho, es un cortador de exes y, se le pueden dar muchos usos, uno de los cuales indetectar un exe (de malware) o conseguir la firma de AV's, ...
Inconvenientes
Hace poco que programo y, lógicamente he hecho este humilde programa lo más bien que he podido (no he tenido mucho tiempo para testearlo). Se encontrarán algunas cosas a mejorar y sobretodo muchos errores, si los encontráis, por favor, comunicármelo que me servirá de gran utilidad en un futuro... no me enrollo más y os muestro el code:
Código (cpp) [Seleccionar]
//-------------------------------------------------------------------------------------------------------------------------
//Título: Small EXE breaker
//Autor: elprogramadorinformatico [EPI]
//Fecha: 27-04-2010
//
//Se puede distribuir libremente este código, siempre que se mantenga esta cabecera
//-------------------------------------------------------------------------------------------------------------------------
#pragma comment(lib,"shlwapi.lib")
#include <windows.h>
#include <shlwapi.h>
int main()
{
HANDLE hGetProcessHeap = GetProcessHeap();
//Estructuras para PE
PIMAGE_DOS_HEADER IDH;
PIMAGE_NT_HEADERS INTH;
//Variables para el nombre del archivo y los bytes
LPSTR lpFileName = (LPSTR)HeapAlloc(hGetProcessHeap,HEAP_ZERO_MEMORY,MAX_PATH);
DWORD dwNumberOfBytesToWrite = 0;
//Escribimos el nombre del fichero
HANDLE hConsoleWrite = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwConsoleBytes = 0;
CHAR cConsoleText[] = "Escribe el nombre del fichero (ejemplo: C:\\fichero.exe):";
WriteFile(hConsoleWrite,cConsoleText,sizeof(cConsoleText),&dwConsoleBytes,0);
//Lo recibimos
DWORD dwReceiveBytes;
HANDLE hReceiveFileName = GetStdHandle(STD_INPUT_HANDLE);
ReadFile(hReceiveFileName,(LPVOID)lpFileName,MAX_PATH,&dwReceiveBytes,0);
//Hacemos este if(), porque si no el PathFileExistsA() no detecta ningún archivo aunque exista por culpa de \r y \n
if (dwConsoleBytes > 2)
{
LPSTR lpRealFile = (LPSTR)lpFileName + dwConsoleBytes - 2;
*lpRealFile = 0;
}
//Escribimos la cantidad de bytes que queremos
HANDLE hConsoleWrite1 = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwConsoleBytes1 = 0;
CHAR cConsoleText1[] = "Escribe la cantidad de bytes que deseas:";
WriteFile(hConsoleWrite1,cConsoleText1,sizeof(cConsoleText1),&dwConsoleBytes1,0);
//Lo recibimos
DWORD dwReceiveBytes1;
HANDLE hReceiveFileName1 = GetStdHandle(STD_INPUT_HANDLE);
ReadFile(hReceiveFileName1,(LPVOID)dwNumberOfBytesToWrite,MAX_PATH,&dwReceiveBytes1,0);
//Hacemos este if(), porque si no el PathFileExistsA() no detecta ningún archivo aunque exista por culpa de \r y \n
if (dwConsoleBytes1 > 2)
{
DWORD dwRealBytes = dwNumberOfBytesToWrite + dwConsoleBytes1 - 2;
dwRealBytes = 0;
}
if(PathFileExistsA(lpFileName))
{
//Abrimos la ruta del exe
HANDLE hFile = CreateFileA(lpFileName,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
//Comprovamos si el archivo existe
if(hFile == INVALID_HANDLE_VALUE)
{
MessageBoxA(0,"No se ha podido crear el archivo","Archivo no creado",0);
return 0;
}
//Miramos su tamaño
DWORD dwNumberOfBytesToRead = GetFileSize(hFile,0);
//Esto nos servirá para después, tener cada parte de X bytes
DWORD dwPartsOfBytes = dwNumberOfBytesToRead / dwNumberOfBytesToWrite;
//Reservamos memoria para el buffer del exe
LPSTR lpBuffer = (LPSTR)HeapAlloc(hGetProcessHeap,HEAP_ZERO_MEMORY,dwNumberOfBytesToRead);
//Leemos el archivo
DWORD dwNumberOfBytesRead;
ReadFile(hFile,lpBuffer,dwNumberOfBytesToRead,&dwNumberOfBytesRead,0);
//Obtenemos la dirección PE y las diferentes cabeceras
IDH = (PIMAGE_DOS_HEADER)&lpBuffer[0];
INTH = (PIMAGE_NT_HEADERS)&lpBuffer[IDH->e_lfanew];
DWORD dwSize = INTH->OptionalHeader.SizeOfHeaders;
//Lo cortamos en pedazos
for(INT nNumberOfExe = 0;nNumberOfExe < dwNumberOfBytesToRead;nNumberOfExe++)
{
//Le ponemos nombres variables al nuevo exe
LPSTR szFileName = (LPSTR)HeapAlloc(hGetProcessHeap,HEAP_ZERO_MEMORY,MAX_PATH);
wsprintfA(szFileName,"%s%d","C:\\particion_",nNumberOfExe);
lstrcatA(szFileName,".exe");
//Creamos el nuevo exe
HANDLE hNewFile = CreateFileA(szFileName,GENERIC_READ+GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0);
//Le sobreescribimos la cabecera PE
WriteFile(hNewFile,lpBuffer,dwSize,&dwNumberOfBytesRead,0);
//Continuamos escribiendo al final del archivo, si no se sobreescribirá
SetFilePointer(hNewFile,FILE_END,0,0);
for(DWORD dwActualPart = 0;dwActualPart < dwPartsOfBytes;dwActualPart++)
{
//Sobreescribimos 100 bytes a cada parte
WriteFile(hNewFile,lpBuffer + (dwActualPart * dwNumberOfBytesToWrite),dwNumberOfBytesToWrite,&dwNumberOfBytesRead,0);
}
}
//Liberamos la memoria
HeapFree(hGetProcessHeap,0,lpBuffer);
//Cerramos los handles
CloseHandle(hGetProcessHeap);
CloseHandle(hFile);
}
else
{
MessageBoxA(0,"Archivo no encontrado","No se ha encontrado el archivo",0);
return 0;
}
return 0;
}
¡Espero que os guste y, criticarme cuanto queráis, que me servirá de mucha ayuda !
Saludos