elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


  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, ...

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
  1. //-------------------------------------------------------------------------------------------------------------------------
  2. //Título: Small EXE breaker
  3. //Autor: elprogramadorinformatico [EPI]
  4. //Fecha: 27-04-2010
  5. //
  6. //Se puede distribuir libremente este código, siempre que se mantenga esta cabecera
  7. //-------------------------------------------------------------------------------------------------------------------------
  8.  
  9. #pragma comment(lib,"shlwapi.lib")
  10.  
  11. #include <windows.h>
  12. #include <shlwapi.h>
  13.  
  14. int main()
  15. {
  16. HANDLE hGetProcessHeap = GetProcessHeap();
  17.  
  18. //Estructuras para PE
  19. PIMAGE_DOS_HEADER IDH;
  20. PIMAGE_NT_HEADERS INTH;
  21.  
  22. //Variables para el nombre del archivo y los bytes
  23. LPSTR lpFileName = (LPSTR)HeapAlloc(hGetProcessHeap,HEAP_ZERO_MEMORY,MAX_PATH);
  24. DWORD dwNumberOfBytesToWrite = 0;
  25.  
  26. //Escribimos el nombre del fichero
  27. HANDLE hConsoleWrite = GetStdHandle(STD_OUTPUT_HANDLE);
  28. DWORD dwConsoleBytes = 0;
  29. CHAR cConsoleText[] = "Escribe el nombre del fichero (ejemplo: C:\\fichero.exe):";
  30. WriteFile(hConsoleWrite,cConsoleText,sizeof(cConsoleText),&dwConsoleBytes,0);
  31.  
  32. //Lo recibimos
  33. DWORD dwReceiveBytes;
  34. HANDLE hReceiveFileName = GetStdHandle(STD_INPUT_HANDLE);
  35. ReadFile(hReceiveFileName,(LPVOID)lpFileName,MAX_PATH,&dwReceiveBytes,0);
  36.  
  37. //Hacemos este if(), porque si no el PathFileExistsA() no detecta ningún archivo aunque exista por culpa de \r y \n
  38. if (dwConsoleBytes > 2)
  39. {
  40. LPSTR lpRealFile = (LPSTR)lpFileName + dwConsoleBytes - 2;
  41. *lpRealFile = 0;
  42. }
  43.  
  44. //Escribimos la cantidad de bytes que queremos
  45. HANDLE hConsoleWrite1 = GetStdHandle(STD_OUTPUT_HANDLE);
  46. DWORD dwConsoleBytes1 = 0;
  47. CHAR cConsoleText1[] = "Escribe la cantidad de bytes que deseas:";
  48. WriteFile(hConsoleWrite1,cConsoleText1,sizeof(cConsoleText1),&dwConsoleBytes1,0);
  49.  
  50. //Lo recibimos
  51. DWORD dwReceiveBytes1;
  52. HANDLE hReceiveFileName1 = GetStdHandle(STD_INPUT_HANDLE);
  53. ReadFile(hReceiveFileName1,(LPVOID)dwNumberOfBytesToWrite,MAX_PATH,&dwReceiveBytes1,0);
  54.  
  55. //Hacemos este if(), porque si no el PathFileExistsA() no detecta ningún archivo aunque exista por culpa de \r y \n
  56. if (dwConsoleBytes1 > 2)
  57. {
  58. DWORD dwRealBytes = dwNumberOfBytesToWrite + dwConsoleBytes1 - 2;
  59. dwRealBytes = 0;
  60. }
  61.  
  62. if(PathFileExistsA(lpFileName))
  63. {
  64. //Abrimos la ruta del exe
  65. HANDLE hFile = CreateFileA(lpFileName,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
  66.  
  67. //Comprovamos si el archivo existe
  68. if(hFile == INVALID_HANDLE_VALUE)
  69. {
  70. MessageBoxA(0,"No se ha podido crear el archivo","Archivo no creado",0);
  71. return 0;
  72. }
  73.  
  74. //Miramos su tamaño
  75. DWORD dwNumberOfBytesToRead = GetFileSize(hFile,0);
  76.  
  77. //Esto nos servirá para después, tener cada parte de X bytes
  78. DWORD dwPartsOfBytes = dwNumberOfBytesToRead / dwNumberOfBytesToWrite;
  79.  
  80. //Reservamos memoria para el buffer del exe
  81. LPSTR lpBuffer = (LPSTR)HeapAlloc(hGetProcessHeap,HEAP_ZERO_MEMORY,dwNumberOfBytesToRead);
  82.  
  83. //Leemos el archivo
  84. DWORD dwNumberOfBytesRead;
  85. ReadFile(hFile,lpBuffer,dwNumberOfBytesToRead,&dwNumberOfBytesRead,0);
  86.  
  87. //Obtenemos la dirección PE y las diferentes cabeceras
  88. IDH = (PIMAGE_DOS_HEADER)&lpBuffer[0];
  89. INTH = (PIMAGE_NT_HEADERS)&lpBuffer[IDH->e_lfanew];
  90. DWORD dwSize = INTH->OptionalHeader.SizeOfHeaders;
  91.  
  92. //Lo cortamos en pedazos
  93. for(INT nNumberOfExe = 0;nNumberOfExe < dwNumberOfBytesToRead;nNumberOfExe++)
  94. {
  95. //Le ponemos nombres variables al nuevo exe
  96. LPSTR szFileName = (LPSTR)HeapAlloc(hGetProcessHeap,HEAP_ZERO_MEMORY,MAX_PATH);
  97.  
  98. wsprintfA(szFileName,"%s%d","C:\\particion_",nNumberOfExe);
  99.  
  100. lstrcatA(szFileName,".exe");
  101.  
  102. //Creamos el nuevo exe
  103. HANDLE hNewFile = CreateFileA(szFileName,GENERIC_READ+GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0);
  104.  
  105. //Le sobreescribimos la cabecera PE
  106. WriteFile(hNewFile,lpBuffer,dwSize,&dwNumberOfBytesRead,0);
  107.  
  108. //Continuamos escribiendo al final del archivo, si no se sobreescribirá
  109. SetFilePointer(hNewFile,FILE_END,0,0);
  110.  
  111. for(DWORD dwActualPart = 0;dwActualPart < dwPartsOfBytes;dwActualPart++)
  112. {
  113. //Sobreescribimos 100 bytes a cada parte
  114. WriteFile(hNewFile,lpBuffer + (dwActualPart * dwNumberOfBytesToWrite),dwNumberOfBytesToWrite,&dwNumberOfBytesRead,0);
  115. }
  116. }
  117.  
  118. //Liberamos la memoria
  119. HeapFree(hGetProcessHeap,0,lpBuffer);
  120.  
  121. //Cerramos los handles
  122. CloseHandle(hGetProcessHeap);
  123. CloseHandle(hFile);
  124. }
  125.  
  126. else
  127. {
  128. MessageBoxA(0,"Archivo no encontrado","No se ha encontrado el archivo",0);
  129. return 0;
  130. }
  131.  
  132. return 0;
  133. }



¡Espero que os guste y, criticarme cuanto queráis, que me servirá de mucha ayuda  ;)!

Saludos  ;) :)
2  Foros Generales / Sugerencias y dudas sobre el Foro / ¿Se puede borrar un post? en: 10 Abril 2010, 18:52 pm
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  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:

Código
  1. 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:

Código
  1. include 'win32ax.inc'
  2.  
  3. .code
  4.  
  5. start:
  6.        mov eax,2
  7.        mov ebx,5
  8.        add eax,ebx
  9.  
  10. invoke MessageBoxA,0,eax,"suma",0
  11. invoke ExitProcess,0
  12.  
  13. .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ó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
  1. //-------------------------------------------------------------------------------------------------------------------------
  2. //Título: EPI Crypter 1.0
  3. //Autor: elprogramadorinformatico [EPI]
  4. //Fecha: 03-01-2010
  5. //
  6. //Se puede distribuir libremente este código, siempre que se mantenga esta cabecera
  7. //-------------------------------------------------------------------------------------------------------------------------
  8.  
  9. #pragma comment(lib,"shlwapi.lib")
  10.  
  11. #include <windows.h>
  12. #include <shlwapi.h>
  13. #include <stdio.h>
  14. #include <iostream>
  15. #include <locale>
  16.  
  17. void cifrar()
  18. {
  19. using namespace std;
  20.  
  21. //Para que nuestro programa se adapte al español
  22. locale::global(locale("spanish"));
  23.  
  24. //Creamos un LPCSTR que tendrá la dirección del fichero
  25. LPCSTR nombrefichero = (LPSTR)GlobalAlloc(GPTR,MAX_PATH);
  26.  
  27. //Escribimos el nombre del fichero
  28. cout << "Escribe el nombre del fichero (ejemplo: C:\\fichero.txt):" << endl;
  29. scanf("%s",nombrefichero);
  30. cout << "Comprobando..." << endl;
  31. Sleep(1000);
  32.  
  33. //Comprovamos si el fichero existe
  34. if(PathFileExistsA(nombrefichero) == TRUE)
  35.    {
  36. MessageBoxA(0,"El fichero se ha encontrado y se ha cifrado correctamente","Fichero encontrado",0);
  37. }
  38. else
  39.    {
  40. MessageBoxA(0,"El fichero no se ha encontrado, vuélvelo a escribir y asegúrate de que existe","Fichero no encontrado",0);
  41. system("CLS");
  42. cifrar();
  43. }
  44.  
  45. //Abrimos el fichero, abrirfichero es el HANDLE de archivo abierto, que utilizamos para trabajar con él
  46. HANDLE abrirfichero = CreateFileA(nombrefichero,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
  47.  
  48. //Obtenemos el tamaño del archivo abierto, con un DWORD
  49. DWORD tamaniofichero = GetFileSize(abrirfichero,0);
  50.  
  51. //Creamos un buffer que contendrá el contenido del archivo, con un LPSTR
  52. LPSTR bufferfichero = (LPSTR)GlobalAlloc(GPTR,tamaniofichero);
  53.  
  54. //Leemos el archivo, metiendo el contenido en bytesfichero, con un DWORD
  55. DWORD bytesfichero;
  56. ReadFile(abrirfichero,bufferfichero,tamaniofichero,&bytesfichero,0);
  57.  
  58. //Sumamos 13 (sistema ROT13) a todos los caracteres
  59. for(DWORD caracteresfichero = 0;caracteresfichero < tamaniofichero;caracteresfichero++)
  60. {
  61. bufferfichero[caracteresfichero] = bufferfichero[caracteresfichero] + 13;
  62. }
  63.  
  64. //Borramos los carácteres iniciales del fichero
  65. SetFilePointer(abrirfichero,FILE_BEGIN,0,0);
  66.  
  67. //Sobreescribimos los nuevos carácteres
  68. BOOL sobreescribirfichero = WriteFile(abrirfichero,bufferfichero,tamaniofichero,&bytesfichero,0);
  69.  
  70. //Cerramos el fichero
  71. CloseHandle(abrirfichero);
  72.  
  73. //Creamos un char, para preguntar si queremos volver a cifrar
  74. char pregunta2;
  75. cout << "¿Quiéres volver a cifrar otro fichero? (s/n):" << endl;
  76. cin >> pregunta2;
  77.  
  78. //Con la función switch(), decidimos que hacer
  79. switch(pregunta2)
  80.    {
  81. case 's':
  82. system("CLS");
  83. cifrar();
  84. break;
  85. case 'S':
  86. system("CLS");
  87. cifrar();
  88. break;
  89. case 'n':
  90. cout << endl;
  91. cout << "Gracias por utilizar: EPI Crypter 1.0" << endl;
  92. getchar();
  93. break;
  94. case 'N':
  95. cout << endl;
  96. cout << "Gracias por utilizar: EPI Crypter 1.0" << endl;
  97. getchar();
  98. break;
  99. default:
  100. MessageBoxA(0, "Su opción no es válida","Error",MB_ICONERROR);
  101. system("CLS");
  102. cifrar();
  103. break;
  104. }
  105.  
  106. //Damos una pausa y cerramos el programa
  107. getchar();
  108. }
  109.  
  110. void descifrar()
  111. {
  112. using namespace std;
  113.  
  114. //Para que nuestro programa se adapte al español
  115. locale::global(locale("spanish"));
  116.  
  117. //Creamos un LPCSTR que tendrá la dirección del fichero
  118. LPCSTR nombrefichero = (LPSTR)GlobalAlloc(GPTR,MAX_PATH);
  119.  
  120. //Escribimos el nombre del fichero
  121. cout << "Escribe el nombre del fichero (ejemplo: C:\\fichero.txt, y sólo se pueden descifrar ficheros cifrados en ROT13):" << endl;
  122. scanf("%s",nombrefichero);
  123. cout << "Comprobando..." << endl;
  124. Sleep(1000);
  125.  
  126. //Comprovamos si el fichero existe
  127. if(PathFileExistsA(nombrefichero) == TRUE)
  128.    {
  129. MessageBoxA(0,"El fichero se ha encontrado y se ha descifrado correctamente","Fichero encontrado",0);
  130. }
  131. else
  132.    {
  133. MessageBoxA(0,"El fichero no se ha encontrado, vuélvelo a escribir y asegúrate de que existe","Fichero no encontrado",0);
  134. system("CLS");
  135. descifrar();
  136. }
  137.  
  138. //Abrimos el fichero, abrirfichero es el HANDLE de archivo abierto, que utilizamos para trabajar con él
  139. HANDLE abrirfichero = CreateFileA(nombrefichero,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
  140.  
  141. //Obtenemos el tamaño del archivo abierto, con un DWORD
  142. DWORD tamaniofichero = GetFileSize(abrirfichero,0);
  143.  
  144. //Creamos un buffer que contendrá el contenido del archivo, con un LPSTR
  145. LPSTR bufferfichero = (LPSTR)GlobalAlloc(GPTR,tamaniofichero);
  146.  
  147. //Leemos el archivo, metiendo el contenido en bytesfichero, con un DWORD
  148. DWORD bytesfichero;
  149. ReadFile(abrirfichero,bufferfichero,tamaniofichero,&bytesfichero,0);
  150.  
  151. //Restamos 13 (sistema ROT13) a todos los caracteres
  152. for(DWORD caracteresfichero = 0;caracteresfichero < tamaniofichero;caracteresfichero++)
  153. {
  154. bufferfichero[caracteresfichero] = bufferfichero[caracteresfichero] - 13;
  155. }
  156.  
  157. //Borramos los carácteres iniciales del fichero
  158. SetFilePointer(abrirfichero,FILE_BEGIN,0,0);
  159.  
  160. //Sobreescribimos los nuevos carácteres
  161. BOOL sobreescribirfichero = WriteFile(abrirfichero,bufferfichero,tamaniofichero,&bytesfichero,0);
  162.  
  163. //Cerramos el fichero
  164. CloseHandle(abrirfichero);
  165.  
  166. //Creamos un char, para preguntar si queremos volver a descifrar
  167. char pregunta2;
  168. cout << "¿Quiéres volver a descifrar otro fichero? (s/n):" << endl;
  169. cin >> pregunta2;
  170.  
  171. //Con la función switch(), decidimos que hacer
  172. switch(pregunta2)
  173.    {
  174. case 's':
  175. system("CLS");
  176. descifrar();
  177. break;
  178. case 'S':
  179. system("CLS");
  180. descifrar();
  181. break;
  182. case 'n':
  183. cout << endl;
  184. cout << "Gracias por utilizar: EPI Crypter 1.0" << endl;
  185. getchar();
  186. break;
  187. case 'N':
  188. cout << endl;
  189. cout << "Gracias por utilizar: EPI Crypter 1.0" << endl;
  190. getchar();
  191. break;
  192. default:
  193. MessageBoxA(0, "Su opción no es válida","Error",MB_ICONERROR);
  194. system("CLS");
  195. descifrar();
  196. break;
  197. }
  198. }
  199.  
  200. int main() {
  201.  
  202. using namespace std;
  203.  
  204. //Para que nuestro programa se adapte al español
  205. locale::global(locale("spanish"));
  206.  
  207. //Creamos un char, para preguntar que queremos hacer
  208. char pregunta1;
  209. cout << "¿Qué deseas hacer? Para cifrar pulse: a; para descifrar (ficheros cifrados en ROT13) pulse: b; para salir pulse: c:" << endl;
  210. cin >> pregunta1;
  211.  
  212. //Con la función switch(), decidimos que hacer
  213. switch(pregunta1)
  214.    {
  215. case 'a':
  216. system("CLS");
  217. cifrar();
  218. break;
  219. case 'A':
  220. system("CLS");
  221. cifrar();
  222. break;
  223. case 'b':
  224. system("CLS");
  225. descifrar();
  226. break;
  227. case 'B':
  228. system("CLS");
  229. descifrar();
  230. break;
  231. case 'c':
  232. cout << endl;
  233. cout << "Gracias por utilizar: EPI Crypter 1.0" << endl;
  234. getchar();
  235. return 0;
  236. break;
  237. case 'C':
  238. cout << endl;
  239. cout << "Gracias por utilizar: EPI Crypter 1.0" << endl;
  240. getchar();
  241. return 0;
  242. break;
  243. default:
  244. MessageBoxA(0, "Su opción no es válida","Error",MB_ICONERROR);
  245. system("CLS");
  246. main();
  247. break;
  248. }
  249. }
  250.  



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  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.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines