C / C++ bit by bit --- exe to text y text to exe

Iniciado por <<<-Basura->>>, 27 Febrero 2014, 05:16 AM

0 Miembros y 2 Visitantes están viendo este tema.

<<<-Basura->>>

Listo mire tengo este código simple:


#include<stdio.h>

int main(){
FILE *file;
unsigned char buffer;

//file = fopen("Prueba.txt","r+");
file = fopen("HolaMundo.exe","r+");
if(file!=NULL){
//printf("Archivo Abierto con exito.");
//fread(&buffer,1,1,file);
//printf("%c",buffer);

int linea = 1;
while (fread(&buffer, 1, 1, file) == 1) // expecting 1
// element of size
// BUFFER_SIZE
{
// process buffer

// print format
if(linea>=1 && linea<=8)
printf(" %c",buffer);
if(linea==8)
printf(" - ");
if(linea>=9 && linea<=15)
printf(" %c",buffer);
if(linea==16){
printf("\n");
linea=0;
}
linea++;
}
if (feof(file))
{
  // hit end of file
}
else
{
  // some other error interrupted read
}



fclose(file);
}else{
printf("Apertura del Fichero no fue exitosa.");
}

getchar();
return 0;
}


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.


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

x64core

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.

do-while

¡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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

<<<-Basura->>>

Cita de: 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.



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.


Cita de: 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!

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

rir3760

#14
Cita de: <<<-Underwar->>> en 27 Febrero 2014, 05:16 AM1.  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.


Cita de: <<<-Underwar->>> en 27 Febrero 2014, 05:16 AM2.  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:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define NOM_ACHIVO  "main.exe"
#define NUM_COLS  16

int main(void)
{
  FILE *in;
  unsigned char ch[NUM_COLS];
  size_t nc;
  size_t i;
 
  if ((in = fopen(NOM_ACHIVO, "rb")) == NULL){
     perror(NOM_ACHIVO);
     return EXIT_FAILURE;
  }
 
  while ((nc = fread(ch, 1, NUM_COLS, in)) != 0){
     for (i = 0; i < NUM_COLS; i++)
        if (i < nc)
           printf(" %02x", ch[i]);
        else
           printf("   ");
     
     printf("  |  ");
     
     for (i = 0; i < nc; i++)
        if (ispunct(ch[i]) || isalnum(ch[i]))
           putchar(ch[i]);
        else
           putchar(' ');
     
     printf("  |\n");
  }
   fclose(in);
 
  return EXIT_SUCCESS;
}

La idea es imprimir valores hexadecimales (lo usual) y también como texto (cuando sea posible).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

<<<-Basura->>>

#15
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:


#include<stdio.h>

int main(){
FILE * pFile;
FILE * newFile;
long size;

pFile = fopen ("Hola.exe","rb");
newFile = fopen("EXE.exe","w+b");

if (pFile==NULL && newFile==NULL) perror ("Error opening file");
else
{
printf("Leyendo archivo\n");
fseek ( pFile , 0 , SEEK_END );
size=ftell (pFile);
printf("Total de bytes: %d\n",size);

fseek ( pFile , 0 , SEEK_SET );
unsigned char buffer;
for(int i = 0; i < size ; i++ ){
fread(&buffer,1,1,pFile);
//printf("%c",buffer);
fwrite(&buffer, 1, sizeof(buffer), newFile);
}

}

fclose (pFile);
getchar();
return 0;
}
<<<--Basura-->>>

Gh057

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
4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...

<<<-Basura->>>

La respuesta es no. Que compilador estas usando ??

Nota: Falta cerrar el Fichero: newFile
fclose (newFile);
<<<--Basura-->>>

Gh057

 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
4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...

<<<-Basura->>>

Depende del sistema que se este usando pero:
int     : 4 bytes
long   : 4 bytes


En lo mas profundo son siempre lo mismo
<<<--Basura-->>>