Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - E.P.I.

#11
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  ;) :)
#12
Cita de: shark0 en 20 Abril 2010, 13:53 PM

PD : Dudita segundona, porque si hago un MessageBox a un LPSTR no funciona?  :-\


Puede ser porque la estructura de MessageBox() sea:

Código (cpp) [Seleccionar]
int MessageBox(
 __in  HWND hWnd,
 __in  LPCTSTR lpText,
 __in  LPCTSTR lpCaption,
 __in  UINT uType
);


Intenta pasarlo a un int  ;) :xD

Saludos  :)

PD: ¡me hiciste caso con HeapAlloc()  ;D! ¿fue por lo que te dije?
#13
Cita de: skapunky en 11 Abril 2010, 01:00 AM
EPI no te preocupes, no te averguenzes, ahora recopilo tus posts vergonzosos, creo un tema para ello y lo ponemos como "Tema destacado" en el cabezal del foro.  :laugh:

Nada, no te preocupes, es normal preguntar cosas básicas y mas si en ese momento necesitavas esa ayuda. Creo que no debería preocuparte, no le des importancia.

Un saludo.

Jajaja! Gracias  ;)
#14
Cita de: Littlehorse en 11 Abril 2010, 00:12 AM
Esa idea que si haces una pregunta, sos un ignorante y tendrás esa imagen de ignorante para siempre es lamentable y hace mucho que se instalo en el foro en ciertas secciones. Lo peor es que muchos usuarios si siguen esa regla y califican a otros usuarios por haber preguntado algo en su momento.

Por esa razón me llueven preguntas de C/C++ por pm que nunca se postean, y por lo que pienso sobre todo esto hace rato que deje de responderlas hasta que no las vea en un post (la mayoría de ellas por lo menos)

La idea principal de un foro es poder preguntar, que te respondan, y que no solo aprendas vos si no también el resto de las personas que lean ese post. Ninguna persona con algo de madurez te juzgara por haber preguntado algo en su momento, por lo menos mientras vos tampoco juzgues a nadie por lo mismo.

Algunos tienen preguntas de como juankear hotmail, y como veras nunca pidieron que se las borren  ;D.

Saludos!


Cita de: seba123neo en 10 Abril 2010, 20:53 PM
creo que lo que pedis termino siendo mas vergonzoso que el post que hayas realizado hace tiempo. por mi parte si hubiera preguntado si pueden borrarme un post donde no sabia y pregunte, me daria tanta verguenza publica como para no entrar mas en el foro.

imaginte la situación, todo mundo se tendria que borrarse miles de post proque antes no sabian y ahora le da verguenza...digo yo..¿venguenza de que? ¿de preguntar? si es asi nadie hubiera preguntado.

me imagino los grandes usuarios de este foro borrandose los post donde preguntaron cuando no sabian algo :xD...la verdad no estoy para nada de acuerdo con esto.y eso de que van a pensar mal, es solo una mala idea tuya... :xD

¡Perdón! Es verdad. Mis disculpas a los dos (no hago broma).

Saludos.

PD: me acuerdo que hice un post, que decía como hacer un virus utilizando std::cout... jajaja! Aun me acuerdo.
#15
Cita de: SeC en 10 Abril 2010, 19:14 PM
Cita de: E.P.I. en 10 Abril 2010, 19:12 PM
Cita de: SeC en 10 Abril 2010, 19:08 PM
Si seguro, en eso consiste la humildad, saber quien eres, sentirte orgulloso, y poder decir soy alguien mejor que en aquel tiempo .

:¬¬ ok. Supongo que no se puede. ¿Algún admin, co-admin, mod global lo sabe?


Tomaste a mal lo que dije ? :S , yo solo intente darte un consejo que solucionara tu problema, si te moleste disculpame.

Nah, tranquilo. Pero es que me avergüenzo de haber sido tan estúpido y no pensar las cosas antes de hacerlo. No estoy enfadado  :)

Cita de: Carloswaldo en 10 Abril 2010, 19:49 PM
Depende del post y de la razón que des, por ejemplo podrías pedir que se te borre un post de "Presentaciones aquí" para que no te vuelva a salir el post en "Mostrar nuevas respuestas a tus mensajes." xD En todo caso puedes mandarle un pm a un global/coadmin y nosotros miraremos si vale borrar el post o no (pues junto con el post también hay mensajes de otros usuarios y puede que también resulte útil para otras personas)

Ok! Gracias. Lo hacía porque si alguien ve esto pensará que soy idiota y, además, se tiene que hacer limpieza del foro, para que sea el mejor, no?

Saludos  ;)
#16
Cita de: SeC en 10 Abril 2010, 19:08 PM
Si seguro, en eso consiste la humildad, saber quien eres, sentirte orgulloso, y poder decir soy alguien mejor que en aquel tiempo .

:¬¬ ok. Supongo que no se puede. ¿Algún admin, co-admin, mod global lo sabe?
#17
Cita de: SeC en 10 Abril 2010, 19:01 PM
No debes avergonzarte de ti, ni de tus post, el pasado es lo que te hizo lo que eres ahora y sea lo que sea debes estar orgulloso.



¿Seguro?

Saludos  ;)

PD: lo que quería hacer, era un MessageBox. En estos tiempos no sabía que eran las API's  :xD
#18
Cita de: Alex@ShellRoot en 10 Abril 2010, 18:55 PM
muahhahaha voy a ver todos tus mensajes a ver de cual te averguenzas, jejeje...
Lo dudo, amenos de que tengas un rango diferente a un usuario comun y corriente...
;D

A ver si nos dan la solución algún jefecillo... ¡de verdad que daba pena (y doy)!
#19
Estaba mirando mis POSTS antiguos  :rolleyes: y quería eliminar alguno, porque me parece bastante vergonzoso. La pregunta es: ¿se puede eliminar un POST creado por mí?

Saludos  :P
#20
Cita de: Littlehorse en  8 Abril 2010, 19:08 PM
Cita de: E.P.I. en  8 Abril 2010, 17:58 PM
Es que las normas de C/C++ dicen que es RECOMENDABLE. Esto podría ser NORMA.

EPI, no leíste nada de lo que puse  ;-)

Cita de: Xafirot en  8 Abril 2010, 18:26 PM
Entoces cuando lo ponen? XDDDDDDD

Con suerte nunca, igual ya seria hora que dejemos de opinar y veamos que opina el staff al respecto ya que no tiene sentido discutir con una idea que posiblemente tenga un rotundo no desde el principio.

Saludos


Gracias por el alago  :-[ Sí que me leí... como tampoco se hará el subforo, no hace falta más comentar.