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ú

Temas - E.P.I.

#1
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  ;) :)
#2
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
#3
Buenas,

no sé cómo empezar este post. A ver, antes de plantear mi sugerencia, quería que quedase claro los "elementos" principales que usaremos: ¿Qué son las API's?

Los programadores, sabemos que este tipo de funciones son de gran utilidad y ayuda a la hora de hacer nuestros programas. Sabemos que hay API's tanto de: Windows, Linux, Google, Messenger y un etcétera de posiblidades.

Mi sugerencia, es: crear un subforo en la zona de programación, de API's... ¿por qué?:
como bien he dicho son de gran utilidad, tanto en seguridad como en el mundo del malware, pasando por muchos sectores, pero, lo que me ha pasado a mí como ha muchos más programadores, es que a veces, no sabemos como utilizar alguna API. Entonces, vamos al subforo de programación (en mi caso C/C++ y ASM), y allí preguntamos sobre cómo utilizar la API. Y te responden: ¡mira la MSDN! (API's de Windows). Y tu piensas: pero si me la he leído tropecientos de veces, y no acabo de entender como se usa algún determinado parámetro (sea por cualquier motivo). Entonces insistes en el subforo, pero nada (no quiero faltar al respeto a ningún moderador/usuario).
No me nieguen los programadores expertos, que no han tenido alguna vez, dudas con alguna API.

Con este subforo, se podrían resolver dudas, ya que ESTAN MUY SOLICITADAS.

Saludos  :)

PD: siento proponer este subforo, ya sé que últimamente se están pidiendo muchos subforos y, los del staff debéis quedar hartitos.
#4
ASM / Agregar memoria HeapAlloc()
21 Marzo 2010, 13:07 PM
Hola,

respeto a la solución que me dijo Hacker_Zero, en el anterior post, ahora quiero agregarle memoria con HeapAlloc(), el caso es que lo he porbado con esta forma, pero no me va:

Código (asm) [Seleccionar]
invoke HeapAlloc,GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PATH

¿Porque?

Gracias.
#5
ASM / Sumar eax i ebx
21 Marzo 2010, 01:57 AM
Hola,

acabo de empezar a aprender ASM, hace 20 minutos, y estoy con un ejercicio de E0N... que el registro EAX tenga el valor 2 i el registro EBX el valor 5 y, que se sumen, y el valor quede en EAX... después POR MI CUENTA quiero mostrar el resultado con un MessageBoxA(), pero crashea, cuando acaba de ensamblar:

Código (asm) [Seleccionar]
include 'win32ax.inc'

.code

start:
        mov eax,2
        mov ebx,5
        add eax,ebx

invoke MessageBoxA,0,eax,"suma",0
invoke ExitProcess,0

.end start


¿Alguna solución?

Muchas gracias.
#6
Hola,

quería preguntar una estupidez... tengo un código en C++ y quiero hacer la GUI en VB. Creo una dll en C++, y después... ¿cómo la incorporo en VB? ¿Con LoadLibrary? Si ese es el caso, ¿me lo podrían explicar?

Muchas gracias.
#7
EPI Crypter 1.0




¿Qué es?
EPI Crypter 1.0, es un sencillísimo crypter programado en C++ para Win32. Puedes cifrar y descifrar ficheros con el algoritmo ROT13 con absoluta facilidad.

Información
El main ocupa 7 KB.

Inconvenientes

  • No tiene GUI.
  • Sólo puede cifrar ficheros de texto (.doc, .txt, ...).
  • Bucles infinitos. ARREGLADO
  • Cuando buscas la ruta, dónde esta el archivo, el directorio no puede contener espacios. Por ejemplo, si escribimos: C:\Documents and Settings\fichero.txt, no lo reconoce, en cambio: C:\fichero.txt, sí.
  • Ocupa bastante para ser un mini-crypter.
  • El algoritmo de cifrado es sólo uno: ROT13 (básicamente no he podido hacer más por tiempo).




Código (cpp) [Seleccionar]

//-------------------------------------------------------------------------------------------------------------------------
//Título: EPI Crypter 1.0
//Autor: elprogramadorinformatico [EPI]
//Fecha: 03-01-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>
#include <stdio.h>
#include <iostream>
#include <locale>

void cifrar()
{
using namespace std;

//Para que nuestro programa se adapte al español
locale::global(locale("spanish"));

//Creamos un LPCSTR que tendrá la dirección del fichero
LPCSTR nombrefichero = (LPSTR)GlobalAlloc(GPTR,MAX_PATH);

//Escribimos el nombre del fichero
cout << "Escribe el nombre del fichero (ejemplo: C:\\fichero.txt):" << endl;
scanf("%s",nombrefichero);
cout << "Comprobando..." << endl;
Sleep(1000);

//Comprovamos si el fichero existe
if(PathFileExistsA(nombrefichero) == TRUE)
   {
MessageBoxA(0,"El fichero se ha encontrado y se ha cifrado correctamente","Fichero encontrado",0);
}
else
   {
MessageBoxA(0,"El fichero no se ha encontrado, vuélvelo a escribir y asegúrate de que existe","Fichero no encontrado",0);
system("CLS");
cifrar();
}

//Abrimos el fichero, abrirfichero es el HANDLE de archivo abierto, que utilizamos para trabajar con él
HANDLE abrirfichero = CreateFileA(nombrefichero,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);

//Obtenemos el tamaño del archivo abierto, con un DWORD
DWORD tamaniofichero = GetFileSize(abrirfichero,0);

//Creamos un buffer que contendrá el contenido del archivo, con un LPSTR
LPSTR bufferfichero = (LPSTR)GlobalAlloc(GPTR,tamaniofichero);

//Leemos el archivo, metiendo el contenido en bytesfichero, con un DWORD
DWORD bytesfichero;
ReadFile(abrirfichero,bufferfichero,tamaniofichero,&bytesfichero,0);

//Sumamos 13 (sistema ROT13) a todos los caracteres
for(DWORD caracteresfichero = 0;caracteresfichero < tamaniofichero;caracteresfichero++)
{
bufferfichero[caracteresfichero] = bufferfichero[caracteresfichero] + 13;
}

//Borramos los carácteres iniciales del fichero
SetFilePointer(abrirfichero,FILE_BEGIN,0,0);

//Sobreescribimos los nuevos carácteres
BOOL sobreescribirfichero = WriteFile(abrirfichero,bufferfichero,tamaniofichero,&bytesfichero,0);

//Cerramos el fichero
CloseHandle(abrirfichero);

//Creamos un char, para preguntar si queremos volver a cifrar
char pregunta2;
cout << "¿Quiéres volver a cifrar otro fichero? (s/n):" << endl;
cin >> pregunta2;

//Con la función switch(), decidimos que hacer
switch(pregunta2)
   {
case 's':
system("CLS");
cifrar();
break;
case 'S':
system("CLS");
cifrar();
break;
case 'n':
cout << endl;
cout << "Gracias por utilizar: EPI Crypter 1.0" << endl;
getchar();
break;
case 'N':
cout << endl;
cout << "Gracias por utilizar: EPI Crypter 1.0" << endl;
getchar();
break;
default:
MessageBoxA(0, "Su opción no es válida","Error",MB_ICONERROR);
system("CLS");
cifrar();
break;
}

//Damos una pausa y cerramos el programa
getchar();
}

void descifrar()
{
using namespace std;

//Para que nuestro programa se adapte al español
locale::global(locale("spanish"));

//Creamos un LPCSTR que tendrá la dirección del fichero
LPCSTR nombrefichero = (LPSTR)GlobalAlloc(GPTR,MAX_PATH);

//Escribimos el nombre del fichero
cout << "Escribe el nombre del fichero (ejemplo: C:\\fichero.txt, y sólo se pueden descifrar ficheros cifrados en ROT13):" << endl;
scanf("%s",nombrefichero);
cout << "Comprobando..." << endl;
Sleep(1000);

//Comprovamos si el fichero existe
if(PathFileExistsA(nombrefichero) == TRUE)
   {
MessageBoxA(0,"El fichero se ha encontrado y se ha descifrado correctamente","Fichero encontrado",0);
}
else
   {
MessageBoxA(0,"El fichero no se ha encontrado, vuélvelo a escribir y asegúrate de que existe","Fichero no encontrado",0);
system("CLS");
descifrar();
}

//Abrimos el fichero, abrirfichero es el HANDLE de archivo abierto, que utilizamos para trabajar con él
HANDLE abrirfichero = CreateFileA(nombrefichero,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);

//Obtenemos el tamaño del archivo abierto, con un DWORD
DWORD tamaniofichero = GetFileSize(abrirfichero,0);

//Creamos un buffer que contendrá el contenido del archivo, con un LPSTR
LPSTR bufferfichero = (LPSTR)GlobalAlloc(GPTR,tamaniofichero);

//Leemos el archivo, metiendo el contenido en bytesfichero, con un DWORD
DWORD bytesfichero;
ReadFile(abrirfichero,bufferfichero,tamaniofichero,&bytesfichero,0);

//Restamos 13 (sistema ROT13) a todos los caracteres
for(DWORD caracteresfichero = 0;caracteresfichero < tamaniofichero;caracteresfichero++)
{
bufferfichero[caracteresfichero] = bufferfichero[caracteresfichero] - 13;
}

//Borramos los carácteres iniciales del fichero
SetFilePointer(abrirfichero,FILE_BEGIN,0,0);

//Sobreescribimos los nuevos carácteres
BOOL sobreescribirfichero = WriteFile(abrirfichero,bufferfichero,tamaniofichero,&bytesfichero,0);

//Cerramos el fichero
CloseHandle(abrirfichero);

//Creamos un char, para preguntar si queremos volver a descifrar
char pregunta2;
cout << "¿Quiéres volver a descifrar otro fichero? (s/n):" << endl;
cin >> pregunta2;

//Con la función switch(), decidimos que hacer
switch(pregunta2)
   {
case 's':
system("CLS");
descifrar();
break;
case 'S':
system("CLS");
descifrar();
break;
case 'n':
cout << endl;
cout << "Gracias por utilizar: EPI Crypter 1.0" << endl;
getchar();
break;
case 'N':
cout << endl;
cout << "Gracias por utilizar: EPI Crypter 1.0" << endl;
getchar();
break;
default:
MessageBoxA(0, "Su opción no es válida","Error",MB_ICONERROR);
system("CLS");
descifrar();
break;
}
}

int main() {

using namespace std;

//Para que nuestro programa se adapte al español
locale::global(locale("spanish"));

//Creamos un char, para preguntar que queremos hacer
char pregunta1;
cout << "¿Qué deseas hacer? Para cifrar pulse: a; para descifrar (ficheros cifrados en ROT13) pulse: b; para salir pulse: c:" << endl;
cin >> pregunta1;

//Con la función switch(), decidimos que hacer
switch(pregunta1)
   {
case 'a':
system("CLS");
cifrar();
break;
case 'A':
system("CLS");
cifrar();
break;
case 'b':
system("CLS");
descifrar();
break;
case 'B':
system("CLS");
descifrar();
break;
case 'c':
cout << endl;
cout << "Gracias por utilizar: EPI Crypter 1.0" << endl;
getchar();
return 0;
break;
case 'C':
cout << endl;
cout << "Gracias por utilizar: EPI Crypter 1.0" << endl;
getchar();
return 0;
break;
default:
MessageBoxA(0, "Su opción no es válida","Error",MB_ICONERROR);
system("CLS");
main();
break;
}
}





Para la 2.0
He hecho este crypter muy rápido porqué estoy estudiando mucho para la 2.0 y, seguramente tendrá de nuevo:
- GUI (con Qt).
- Algoritomos de cifrado variados y más potentes (base64, XOR, ...).
- cifrado de exe's (estructura PE).

Bueno, eso es todo. Espero que les guste.

PD: dedico este humilde trabajo a Hacker_Zero y Karcrack por su paciencia conmigo.
#8
Hola,

en primer lugar buen año nuevo. Bueno, desde 1992, la "línea" de productos de software, Qt, se ha ido popularizando a nivel mundial. Ya es más fácil crear interfaces gráficas para nuestros programas (para C++) y es compatible para todos los SO (Mac, Linux y variantes, Windows, ...).

Mi propuesta a el-brujo y a los mods correspondientes, es crear un sub-foro dentro de C/C++ de Qt, para compartir, discutir y básicamente aprender esta "variante (dígalo como quiera)" para que nuestros programas queden mejor y más bonitos.

Muchas gracias y espero sus respuestas.