|
Mostrar Temas
|
Páginas: [1]
|
1
|
Seguridad Informática / Abril negro / [ABRIL NEGRO][SRC][C++] Small EXE breaker
|
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, ... InconvenientesHace 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: //------------------------------------------------------------------------------------------------------------------------- //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
|
|
|
3
|
Foros Generales / Sugerencias y dudas sobre el Foro / [SUGERENCIA] API's (Windows, Linux, MSN, Google, ...)
|
en: 1 Abril 2010, 10:48 am
|
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
|
Programación / ASM / Agregar memoria HeapAlloc()
|
en: 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: invoke HeapAlloc,GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PATH
¿Porque? Gracias.
|
|
|
5
|
Programación / ASM / Sumar eax i ebx
|
en: 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: 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
|
Programación / Programación Visual Basic / Dll's en C++ incorporados
|
en: 30 Enero 2010, 13:05 pm
|
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
|
Programación / Programación C/C++ / [SRC][C++] EPI Crypter 1.0
|
en: 3 Enero 2010, 18:35 pm
|
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ónEl 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).
//------------------------------------------------------------------------------------------------------------------------- //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.0He 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
|
Foros Generales / Sugerencias y dudas sobre el Foro / Nuevo sub-foro Qt
|
en: 2 Enero 2010, 12:54 pm
|
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.
|
|
|
|
|
|
|