Test Foro de elhacker.net SMF 2.1

Seguridad Informática => Análisis y Diseño de Malware => Abril negro => Mensaje iniciado por: E.P.I. en 27 Abril 2010, 21:11 PM

Título: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: E.P.I. en 27 Abril 2010, 21:11 PM
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  ;) :)
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: ☺BADMAN en 27 Abril 2010, 22:26 PM
 :D Al paso que van , seras el ganador  EPI@elhacker.net XD  :silbar:
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: [L]ord [R]NA en 27 Abril 2010, 22:28 PM
EPI... te dije que eso no  serviria para indetectar, y posiblemente cazaria firmas de AV pero no Heuristica.
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: Zzombi en 27 Abril 2010, 23:11 PM
xDDD
no  les quedará más opción que dar a epi por ganador porque no se presento nada más hasta ahora

EPI@elhacker.net xDD
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: Dober-ManN en 28 Abril 2010, 02:16 AM
Cita de: Zzombi en 27 Abril 2010, 23:11 PM
xDDD
no  les quedará más opción que dar a epi por ganador porque no se presento nada más hasta ahora

EPI@elhacker.net xDD

Seee XD yo me iva  apresentar, pero estaba relacionado con la Denegacion de Servicio asi que como dijeron que no se podia desde ahora  :¬¬ , entonces no me voy a presentar.

Saludos
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: Littlehorse en 28 Abril 2010, 09:38 AM
EPI no seas vago y aunque sea lee la ruta por consola. No la valides si queres pero mínimo una lectura de ruta, lo mismo con los bytes. Modifica eso para que no haya que compilarlo cada vez que se quiera dividir un ejecutable distinto o utilizar otra cantidad de bytes.
Tal vez quieras usar los argumentos de la consola, pero obviamente en ese caso si deberías validar los parámetros.

Saludos!
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: E.P.I. en 28 Abril 2010, 18:07 PM
Cita de: Littlehorse en 28 Abril 2010, 09:38 AM
EPI no seas vago y aunque sea lee la ruta por consola. No la valides si queres pero mínimo una lectura de ruta, lo mismo con los bytes. Modifica eso para que no haya que compilarlo cada vez que se quiera dividir un ejecutable distinto o utilizar otra cantidad de bytes.
Tal vez quieras usar los argumentos de la consola, pero obviamente en ese caso si deberías validar los parámetros.

Saludos!

Modificado... ya está arreglado, ahora se puede hacer desde consola. Y he modificado un poco el code.

Saludos  ;)

PD: aún no tengo la cuenta... me parece que habrá más gente que se presentará  ;)  :silbar:  :¬¬
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: Karcrack en 28 Abril 2010, 20:56 PM
Hay mas gente presentada, y tu proyecto todavia no esta presentado... has de postear un link a este post con una breve descripcion en el tema principal del Abril Negro 2010 ;)
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: h0oke en 29 Abril 2010, 03:54 AM
Sería bueno que comiences a estudiar estructuras de datos y profundizar un poco más la teoría del lenguaje, para no tan sólo utilizar API's...

Por lo demás, como eres novato aún, está bien por el momento.
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: skapunky en 29 Abril 2010, 15:57 PM
CitarEPI no seas vago y aunque sea lee la ruta por consola. No la valides si queres pero mínimo una lectura de ruta, lo mismo con los bytes. Modifica eso para que no haya que compilarlo cada vez que se quiera dividir un ejecutable distinto o utilizar otra cantidad de bytes.
Tal vez quieras usar los argumentos de la consola, pero obviamente en ese caso si deberías validar los parámetros.

Saludos!

Ves EPI, exactamente lo que te dije que deberias de poner, ahora ya si es algo mas genérico y de utilidad, no costava tanto agregar dos líneas mas  :P
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: E.P.I. en 29 Abril 2010, 18:55 PM
Cita de: algorythm en 29 Abril 2010, 03:54 AM
Sería bueno que comiences a estudiar estructuras de datos y profundizar un poco más la teoría del lenguaje, para no tan sólo utilizar API's...

Por lo demás, como eres novato aún, está bien por el momento.

Ya sé profundizarme en el lenguaje (me faltan punteros  :¬¬ para repasar...). Structs, classes y, todo esto ya me lo sé, pero en este code, no creo que haga falta  ;)

Saludos :P
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: toxeek en 29 Abril 2010, 19:27 PM

CitarxDDD
no  les quedará más opción que dar a epi por ganador porque no se presento nada más hasta ahora


WTF ??  :o


Que yo sepa yo estoy ahi! Otra cosa es que no sepan como usar lo que puse, y que no tengan los requisitos.   :xD


Saludos!
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: ☺BADMAN en 30 Abril 2010, 22:29 PM
Cita de: averno en 29 Abril 2010, 19:27 PM

CitarxDDD
no  les quedará más opción que dar a epi por ganador porque no se presento nada más hasta ahora


WTF ??  :o


Que yo sepa yo estoy ahi! Otra cosa es que no sepan como usar lo que puse, y que no tengan los requisitos.   :xD


Saludos!

  Pues Si va ganando averno por 10 Cuerpos XD
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: E.P.I. en 30 Abril 2010, 23:36 PM
Cita de: ☺BADMAN en 30 Abril 2010, 22:29 PM
Cita de: averno en 29 Abril 2010, 19:27 PM

CitarxDDD
no  les quedará más opción que dar a epi por ganador porque no se presento nada más hasta ahora


WTF ??  :o


Que yo sepa yo estoy ahi! Otra cosa es que no sepan como usar lo que puse, y que no tengan los requisitos.   :xD


Saludos!

  Pues Si va ganando averno por 10 Cuerpos XD

Programo lo que sé y lo que puedo. Ya me gustaría haber presentado algo más decente  :-\

Saludos  :-(
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: ☺BADMAN en 30 Abril 2010, 23:49 PM
 :laugh:  jeje Men con el nivelazo que tienen los de alli arriba tienes agallas para  participar a otros nos hace falta para subir nuestros juguetes  :rolleyes:
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: toxeek en 1 Mayo 2010, 00:54 AM
 :xD   ;-)

Gracias BADMAN! Pero yo creo que E.P.I, por ejemplo, ha hecho una buena contribucion tambien!

Yo no creo que una app se mas buena que otra.. habra para gustos colores  :)
Mi app sirve (por ahora) para lo que sirve, y puede que para muchos sea una chorrada. Puede que la de E.P.I a alguien le venga de perlas.. y asi.

No quise decir que la mia era mejor, solo que no se me ignorase!


Saludos  ;D


/*** MOD ***/

Nivelazo ??! Atreverse?? No hombre, en el concurso lo primero que hay que hacer es atreverse. Da igual el nivel. Hay que intentar participar.
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: E.P.I. en 1 Mayo 2010, 03:12 AM
Cita de: ?BADMAN en 30 Abril 2010, 23:49 PM
:laugh:  jeje Men con el nivelazo que tienen los de alli arriba tienes agallas para  participar a otros nos hace falta para subir nuestros juguetes  :rolleyes:

Mira tio, te estas pasando mucho con tus comentarios hipócritas. ¿Qué te crees, el rey del mambo?
No vengo a ganar, vengo a participar. No soy el mejor programando y puede que este code sea un asco. Pero participar en estos concursos, me supone un ESFUERZO y APRENDIZAJE muy buenos para mí y PARA PROGRESAR COMO PROGRAMADOR (vease este o CoreWar, con los mismos argumentos, no voy a ganar, pero aprendo mucho y bla bla bla...), así que NO TOLERO que me hables así ni que te me pongas así de chulito, porque para chulito YO.

PD: pido perdón a todo el mundo, pero es que no me gusta que me critiquen el esfuerzo y la dedicación que le he puesto, aunque ME ENCANTA que me critiquen la faena sólo PARA MEJORAR y, encontrar posibles errores.
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: p3p3mus en 1 Mayo 2010, 04:31 AM
Tranquilo tio, no te rayes. Si el tipico que intenta tirar el trabajo de los demás por la borda lo hay en todos lados (topicazo xD).

Pues eso, que tu soft está muy bueno y ganar o perder como bien dices es lo de menos. Lo realmente importante es participar para progresar

No tienes necesidad de ponerte así, a su altura, para que todos sepamos que su comentario es inoportuno y despectivo. Las críticas deben ser constructivas y comentarios de este tipo no vienen a cuento.
Título: Re: [ABRIL NEGRO][SRC][C++] Small EXE breaker
Publicado por: skapunky en 1 Mayo 2010, 12:24 PM
Haber, no pasa nada, cada uno hace lo que puede, dentro el tiempo y recursos que tiene, yo personalmente creo que lo importante es la participación y para gusto personal entre las tres cosas que he visto, para mi gusto hay una herramienta de las tres que me gusta con diferencia a las otras y no por eso debe ser la que mantiene "nivelazo" porque recordemos que ese "nivelazo" depende de muchos factores que por desgracia quizá solo se pueda apreciar en 1º persona y no como usuario del foro.

Depende de los recursos para programar la herramienta, tiempo, imaginación, conocimientos... No es lo mismo programar por ej un troyano en VB (hoy dia está demostrado que cualquier hace uno) que por ejemplo que se yo... una aplicación que tenga 40 lineas de codigo pero que sea útil, original, tenga su complicación y la persona haya dedicado mucho tiempo en su desarrollo y haya aprendido un montón en el transcurso de ella.