Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: <<<-Basura->>> en 27 Febrero 2014, 05:16 am



Título: C / C++ bit by bit --- exe to text y text to exe
Publicado por: <<<-Basura->>> en 27 Febrero 2014, 05:16 am
1.  Hola bueno lo que necesito es simple, Quiero tomar un fichero binario y transformarlo en texto... luego cuando tengo el texto quiero transformarlo a exe.

2.  Quisiera saber también como leer este fichero en Binario.


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: engel lex en 27 Febrero 2014, 05:40 am
tomar un fichero en binario y volverlo a texto? no tiene sentido, pero si quieres hacerlo, agarras el binario, buscas un sistema de texto (por ejemplo ascii), sabiendo que ascii es 1 byte por letra, lees el byte y lo pasas a su valor char como hace notepad...

de texto transformarlo a .exe no tiene sentido ya....

como leer el fichero en binario, puedes usar programas como ollydbg o algun editor/lector hexadecimal...


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: <<<-Basura->>> en 27 Febrero 2014, 05:55 am
Claro que tiene mucho sentido, para lo que estoy realizando. Eso busco. pero digamos cuando leo el archivo y lo paso a texto pasa que se pierden bytes o algo. y no pesa igual que el archivo exe entonces mi duda es.... Si esto se puede realizar es que lo necesito urgente! voy a intentar con algunos código en internet si conoces alguna fuente puedes pasarme la por favor


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: engel lex en 27 Febrero 2014, 06:04 am
explicame lo que haces porque no tiene sentido XD

no, no se pierden bytes... es una conversion directa y exacta por ejemplo si el byte es 41(hex) eso se verá como una "A" en texto... pero como el archivo no está diseñado para ser visto como texto tendrás muchos simbolos raros.... (intenta agarrar un .exe pequeño, de unos pocos kb y cambiarle la extension a .txt para que veas que no tiene ningún tipo de sentido)

la cosa es que ese texto contiene exactamente lo mismo que el archivo, solo que tu lo estás visualizando como texto y no corriendo como ejecutable... así que con cambiarle a .exe basta para que sea nuevamente ejecutable


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: eferion en 27 Febrero 2014, 08:40 am
Vamos a aclarar conceptos.

Un carácter ocupa 8 bits.... o un byte... esto nos da 256 combinaciones posibles. Un archivo binario simplemente almacena información utilizando el catálogo completo de 256 combinaciones. Es un archivo que no puede ser leído por una persona. Nuestro alfabeto no tiene 256 caracteres... además este formato es dependiente de la máquina.

Un archivo de texto reduce el espectro de caracteres a utilizar, además procura almacenar la información de tal forma que pueda ser leída con más o menos facilidad por cualquiera que lo abra. Normalmente la información almacenada en estos archivos es independiente de la máquina que los genere.

Un archivo de texto no deja de ser, por tanto, un archivo binario que utiliza un espectro reducido de caracteres para ser más legible... por tanto no hay una conversión directa entre un archivo binario y uno de texto.

Un ejecutable no es sino un conjunto de instrucciones interpretables por la máquina y sistema operativo correspondientes. Esta información es dependiente tanto de la máquina como del sistema operativo.

Como es de entender no hay una relación clara de conversión entre los 3 formatos.

Me da la sensación de que no tienes muy claro qué es lo que quieres conseguir.


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: Stakewinner00 en 27 Febrero 2014, 09:01 am
Como ya te dijeron si quieres leer un ejecutable en plano es una tontería pasarlo a texto. Quizás te interese buscar sobre desensambladores, hay programas que en algunos lenguajes son capaces de conseguir el código fuente del programa. También hay programas que sacan las strings del programa omitiendo todo lo que es la parte de código.

Saludos


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: dseoane en 27 Febrero 2014, 16:49 pm
Y no sera algo como esto lo que busca:
http://www.elhacker.net/base64.html


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: <<<-Basura->>> en 27 Febrero 2014, 17:17 pm
Ok gracias a todos;

Para mi si tiene sentido pasarlo a texto.
No necesito des ensamblarlo.

Voy a realizar pruebas en mi LAB y voy a traer código


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: Gh057 en 27 Febrero 2014, 17:18 pm
si, eso pensaba... capaz que esté buscando algún tipo de des-ofuscador... sino realmente no es muy entendible jejej

me vino a la memoria el norton comander (o la excelente versión creada para linux el midnight comander, creo que es el primera cosa que instalo apenas levanto la red!)

quien no habrá mirado un ejecutable y cambiar de ascii a hex con f4 no? jajajaa

esperemos que nos dé más datos sobre que busca, si ya sabe lo que busca, saludos!


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: x64core en 27 Febrero 2014, 17:50 pm
Si lo que necesitas es mostrar los valores enteros/Hex a representacion de cadena y escribirlos en un txt entonces puede usar
sprint en un bucle para cada entero/hex.


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: <<<-Basura->>> en 28 Febrero 2014, 17:57 pm
Listo mire tengo este código simple:

Código
  1. #include<stdio.h>
  2.  
  3. int main(){
  4. FILE *file;
  5. unsigned char buffer;
  6.  
  7. //file = fopen("Prueba.txt","r+");
  8. file = fopen("HolaMundo.exe","r+");
  9. if(file!=NULL){
  10. //printf("Archivo Abierto con exito.");
  11. //fread(&buffer,1,1,file);
  12. //printf("%c",buffer);
  13.  
  14. int linea = 1;
  15. while (fread(&buffer, 1, 1, file) == 1) // expecting 1
  16. // element of size
  17. // BUFFER_SIZE
  18. {
  19. // process buffer
  20.  
  21. // print format
  22. if(linea>=1 && linea<=8)
  23. printf(" %c",buffer);
  24. if(linea==8)
  25. printf(" - ");
  26. if(linea>=9 && linea<=15)
  27. printf(" %c",buffer);
  28. if(linea==16){
  29. printf("\n");
  30. linea=0;
  31. }
  32. linea++;
  33. }
  34. if (feof(file))
  35. {
  36.  // hit end of file
  37. }
  38. else
  39. {
  40.  // some other error interrupted read
  41. }
  42.  
  43.  
  44.  
  45. fclose(file);
  46. }else{
  47. printf("Apertura del Fichero no fue exitosa.");
  48. }
  49.  
  50. return 0;
  51. }
  52.  

Bueno el código expuesto puede leer archivos de texto plano y los va a leer perfectamente. ya lo probé.

A la hora de leer un archivo *.exe tengo el pequeño que lo lee mal.
(http://s14.postimg.org/tbxbmr9pd/Output.png)

Como pueden ver es absurda la salida, si pueden leer en la salida se puede leer algo como:
This program can be run in dos mode
Este programa puede ser corrido en dos modo


Pero cuando lo abro con notepad++ y lo guardo como txt si realizo lo que necesito,  el problema es que no necesito abrirlo con notepad++ sino necesito hacer un programa que lo haga...


NOTA: que se parece absurdo transformar un exe a texto. pero es que realmente lo necesito.


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: x64core en 28 Febrero 2014, 19:24 pm
La salida esta bien, así es como son representados los caracteres en ANSI-ASCII.
Los ejecutable no tiene nada que ver con la codificacion de caracteres. Podes abrir algun ejecutable con un editor hexadecimal
y se mostrara la representación en hexadecimal y la codificación que tenga establecida generalmente ANSI-ASCII. para hacerlo
así como ellos podes usar sprintf pasando byte por byte.


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: do-while en 28 Febrero 2014, 19:49 pm
¡Buenas!

No intentes utilizar la función feof para saber si has llegado al final de un archivo binario. Te puede dar falsos positivos, y la mayor parte de las veces te los dará (no me preguntes porqué), y no podrás leer el contenido del archivo.

Primero tienes que saber el tamaño, en bytes, del fichero (utilizando por ejemplo ftell y fseek), y luego empiezas a leer datos desde el principio hasta alcanzar el numero de bytes que tenga el fichero.

Si no conoces las fuciónes anteriores en www.cplusplus.com encontraras mas información.

¡Saludos!


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: <<<-Basura->>> en 1 Marzo 2014, 01:20 am
La salida esta bien, así es como son representados los caracteres en ANSI-ASCII.
Los ejecutable no tiene nada que ver con la codificacion de caracteres. Podes abrir algun ejecutable con un editor hexadecimal
y se mostrara la representación en hexadecimal y la codificación que tenga establecida generalmente ANSI-ASCII. para hacerlo
así como ellos podes usar sprintf pasando byte por byte.



La salida esta mal ya que no representa lo que necesito, estoy viendo el mismo contenido del "exe" en el notepad++

También se hex y binario, y ASCII code

Se lo que necesito pero no se como hacerlo.


¡Buenas!

No intentes utilizar la función feof para saber si has llegado al final de un archivo binario. Te puede dar falsos positivos, y la mayor parte de las veces te los dará (no me preguntes porqué), y no podrás leer el contenido del archivo.

Primero tienes que saber el tamaño, en bytes, del fichero (utilizando por ejemplo ftell y fseek), y luego empiezas a leer datos desde el principio hasta alcanzar el numero de bytes que tenga el fichero.

Si no conoces las fuciónes anteriores en www.cplusplus.com encontraras mas información.

¡Saludos!

Gracias por tu información voy hacer la prueba de lo que me dices!! Muchas gracias!!


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: rir3760 en 1 Marzo 2014, 02:55 am
1.  Hola bueno lo que necesito es simple, Quiero tomar un fichero binario y transformarlo en texto... luego cuando tengo el texto quiero transformarlo a exe.
Como ya te comentaron un archivo es una secuencia de bytes, imprimir el valor de cada uno literalmente (65, 97, etc. en base 10 o cualquier otra base) o como un carácter de algún juego de caracteres (por ejemplo en ASCII A, a, etc.) es cuestión del usuario.


2.  Quisiera saber también como leer este fichero en Binario.
En el caso de C basta con abrir el archivo en modo binario "rb" y leer los caracteres con funciónes como fread, fgetc, etc. pero no estoy seguro si eso es lo que buscas.

Con todo un ejemplo sencillo (un "poor man's hex viewer") en C:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4.  
  5. #define NOM_ACHIVO  "main.exe"
  6. #define NUM_COLS  16
  7.  
  8. int main(void)
  9. {
  10.   FILE *in;
  11.   unsigned char ch[NUM_COLS];
  12.   size_t nc;
  13.   size_t i;
  14.  
  15.   if ((in = fopen(NOM_ACHIVO, "rb")) == NULL){
  16.      perror(NOM_ACHIVO);
  17.      return EXIT_FAILURE;
  18.   }
  19.  
  20.   while ((nc = fread(ch, 1, NUM_COLS, in)) != 0){
  21.      for (i = 0; i < NUM_COLS; i++)
  22.         if (i < nc)
  23.            printf(" %02x", ch[i]);
  24.         else
  25.            printf("   ");
  26.  
  27.      printf("  |  ");
  28.  
  29.      for (i = 0; i < nc; i++)
  30.         if (ispunct(ch[i]) || isalnum(ch[i]))
  31.            putchar(ch[i]);
  32.         else
  33.            putchar(' ');
  34.  
  35.      printf("  |\n");
  36.   }
  37.   fclose(in);
  38.  
  39.   return EXIT_SUCCESS;
  40. }
La idea es imprimir valores hexadecimales (lo usual) y también como texto (cuando sea posible).

Un saludo


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: <<<-Basura->>> en 1 Marzo 2014, 03:05 am
Gracias por publicar tu código: rir3760
Gracias la ayuda brindada me ayudo a resolver el problema: do-while

Ya tengo mi solución también, para quien la necesite:

Código
  1. #include<stdio.h>
  2.  
  3. int main(){
  4. FILE * pFile;
  5. FILE * newFile;
  6. long size;
  7.  
  8. pFile = fopen ("Hola.exe","rb");
  9. newFile = fopen("EXE.exe","w+b");
  10.  
  11. if (pFile==NULL && newFile==NULL) perror ("Error opening file");
  12. else
  13. {
  14. printf("Leyendo archivo\n");
  15. fseek ( pFile , 0 , SEEK_END );
  16. size=ftell (pFile);
  17. printf("Total de bytes: %d\n",size);
  18.  
  19. fseek ( pFile , 0 , SEEK_SET );
  20. unsigned char buffer;
  21. for(int i = 0; i < size ; i++ ){
  22. fread(&buffer,1,1,pFile);
  23. //printf("%c",buffer);
  24. fwrite(&buffer, 1, sizeof(buffer), newFile);
  25. }
  26.  
  27. }
  28.  
  29. fclose (pFile);
  30. return 0;
  31. }
  32.  


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: Gh057 en 1 Marzo 2014, 04:10 am
hola <<<-Underwar->>> no te tira error de segmentación? también veo que debería haber un warning por la variable size, fue declarado long int pero lo visualizas como entero (línea 17)

saludos


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: <<<-Basura->>> en 1 Marzo 2014, 04:20 am
La respuesta es no. Que compilador estas usando ??

Nota: Falta cerrar el Fichero: newFile
Código
  1. fclose (newFile);


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: Gh057 en 1 Marzo 2014, 04:30 am
 solo miré el código, pero en g++ lo deberías visualizar como %li.; si justamente por la falta del cierre de newfile es que te preguntaba si no te tiraba error. saludos


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: <<<-Basura->>> en 1 Marzo 2014, 04:42 am
Depende del sistema que se este usando pero:
int     : 4 bytes
long   : 4 bytes


En lo mas profundo son siempre lo mismo


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: rir3760 en 1 Marzo 2014, 14:58 pm
Debes cambiar la condicion del if:
Código
  1. if (pFile==NULL && newFile==NULL)
  2.   perror ("Error opening file");
Ya que el mensaje de error solo se presentara si la apertura de ambos archivos falla (se debe sustituir "&&" por "||").

Y si piensas leer caracter por caracter puedes utilizar las funciones fgetc y fputc. Por ejemplo:
Código
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   FILE * pFile;
  6.   FILE * newFile;
  7.   int ch;
  8.  
  9.   if ((pFile = fopen("Hola.exe", "rb")) == NULL)
  10.      perror("Hola.exe");
  11.   else if ((newFile = fopen("EXE.exe", "wb")) == NULL)
  12.      perror("EXE.exe");
  13.   else
  14.      while ((ch = fgetc(pFile)) != EOF)
  15.         fputc(ch, newFile);
  16.  
  17.   if (pFile != NULL)
  18.      fclose(pFile);
  19.   if (newFile != NULL)
  20.      fclose(newFile);
  21.  
  22.   return 0;
  23. }

Sin embargo el programa lo unico que hace es una copia del archivo original, para el caso mejor utiliza una funcion cortesia del SO (en MS Windows puedes utilizar CopyFile (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363851%28v=vs.85%29.aspx) y CopyFileEx).

Un saludo


Título: Re: C / C++ bit by bit --- exe to text y text to exe
Publicado por: <<<-Basura->>> en 2 Marzo 2014, 22:42 pm
Gracias: rir3760, Tu solución también funciona.

No estoy buscando crear una copia del archivo original.