Extractor de strings de binarios

Iniciado por Jhonjhon_123, Febrero 23, 2010, 05:59:06 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Febrero 23, 2010, 05:59:06 PM Ultima modificación: Febrero 08, 2014, 06:14:05 PM por Expermicid
Muestra o guarda en un archivo los strings de un binario

Código: c

// By Codr_joe
// Bajo la licencia GPLv3
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Cambiar lo que hay entre parentesis para cambiar los caracteres que se buscaran por defecto
#define default_chars "abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789 \n!?\0" // El \0 hace falta para indicar el fin del string

// Cambiar para distinto numero minimo de caracteres
#define default_chnum 4

int chnum; // Numero de caracteres necesarios para considerarlo un string

void rmv_jmp(char *str);
void rmv_strs(char *str,char * tgt);
void add_strs(char *str,char * tgt);
long f_getsize(char *fname);
int exist(char *fname);
void string_find(char * selected);
int es_char(char ch,char* str);


main(int argc,char* argv[]){

chnum=default_chnum;

char selected_chars[256]; // 255 Caracteres + 1 para el \0 (vamos, digo yo que ese no
  // va a ser parte de un string, no?)
char opt;

strcpy(selected_chars,default_chars);
while (1){
printf("\n\n\t\tString Finder\n\n");
printf("Selecciona una opcion:\n");
printf("\ta) Cambiar caracteres a buscar\n");
printf("\tb) Mostrar caracteres a buscar\n");
printf("\tc) Cambiar numero caracteres a buscar (%i)\n",chnum);
printf("\td) Iniciar busqueda\n");
printf("\tx) Salir\n");
printf("->"); fflush(stdout);
opt=getchar();
getchar(); // Uno para recojer la variable y otro para sacar el [Enter] del medio
switch (opt){
case ('a'):
printf("\n\nSelecciona una opcion:\n");
printf("\ta) Añadir a la lista\n");
printf("\tb) Eliminar de la lista\n");
printf("La lista es:\n%s\n",selected_chars);
printf("->"); fflush(stdout);
opt=getchar(); getchar();
if ((opt=='a') || (opt=='b')){
char new_str[256];
printf("Introduce el/los caracteres: "); fflush(stdout);
fgets(new_str,256,stdin);
rmv_jmp(new_str);
if (opt=='a')
add_strs(new_str,selected_chars);
else
rmv_strs(new_str,selected_chars);
}
else {
printf("Opcion no valida\n");
printf("Pulsa [enter] para continuar");fflush(stdout);
getchar();
printf("\n");
}
break;
case ('b'):
printf("Caracteres:%s\n",selected_chars);
printf("Pulsa [enter] para continuar");fflush(stdout);
getchar();
printf("\n");
break;
case ('c'):
printf("Introduce el nuevo numero: ");
scanf("%i",&chnum);
getchar();
break;
case ('d'):
string_find(selected_chars);
break;
case ('x'):
exit(0);
break;
default:
printf("Opcion [%c] no valida.\n",opt);
printf("Pulsa [enter] para continuar");fflush(stdout);
getchar();
printf("\n");
}
}
}

void string_find(char * selected_chars){
char new_char;

char in_fname [256];
memset(in_fname,'\0',256);
FILE * fin;

char out_fname [256];
memset(out_fname,'\0',256);
FILE * fout;

while (1){
printf("Introduce un archivo donde buscar: ");fflush(stdout);
fgets(in_fname,256,stdin);
rmv_jmp(in_fname);
if (exist(in_fname))
break;
else
printf("El archivo no existe o no tienes permisos de lectura\n");
}

fin=fopen(in_fname,"rb");
if (fin==NULL)
exit(1);
while (1){
printf("Introduce un archivo donde guardar los resultados (o stdout para mostrar por pantalla): ");fflush(stdout);
fgets(out_fname,256,stdin);
rmv_jmp(out_fname);
if ((strcmp(out_fname,"stdout")==0) || (!exist(out_fname)))
break;
else{
printf("El archivo ya existe, los resultados se añadiran al final (S/n)\n");
new_char=getchar(); getchar();
if (new_char!='n')
break;
}
}
if (strcmp(out_fname,"stdout")==0)
fout=stdout;
else
fout=fopen(out_fname,"ab");
if (fout==NULL)
exit(1);

char chars[256];
int i=0;
int es_ch;
long str_start;
long count=0;
long e=count;
long fsize=f_getsize(in_fname);
long refresh_rate=fsize/100;

printf("\n");
while (!feof(fin)){

fscanf(fin,"%c",&new_char);
es_ch=es_char(new_char,selected_chars);

if (es_ch){
if (i==0)
str_start=ftell(fin);
chars[i]=new_char;
i++;
}

if ((!es_ch && i>=chnum) || i>=255){
chars[i]='\0';
fprintf(fout,"%li--> %s\n",str_start,chars);
i=0;
}

count++;
if (e<count-refresh_rate){
if (fout!=stdout){
printf("\r");
printf("%li / %li",count,fsize);
fflush(stdout);
}
e=count;
}

}
if (fout!=stdout){
printf("\r");
printf("%li / %li\n",fsize,fsize);
fflush(stdout);
close(fout);
}
close(fin);
}

int es_char(char ch,char* lista){
int es_char=0;
int i;
for (i=0;i<strlen(lista);i++){

if (lista[i]==ch){
es_char=1;
break;
}
}
return es_char;
}

void rmv_strs(char *str,char * tgt){
int len=strlen(tgt);
int i,j;
for (i=0;i<strlen(str);i++){
for (j=0;j<len;j++){
if (tgt[j]==str[i]){
tgt[j]=0;
break;
}
}
}
int clean=0;
while (clean==0){
clean=1;
for (i=0;i<len;i++){
if (tgt[i]=='\0'){
for (j=i+1;j<len;j++){
if (tgt[j]!='\0'){
clean=0;
tgt[j-1]=tgt[j];
tgt[j]='\0';
break;
}
}
}
}
}
}

void add_strs(char *str,char * tgt){
int len=strlen(tgt);
int i,j;
for (i=0;i<strlen(str);i++){
for (j=0;j<len;j++){
if (tgt[j]==str[i]){
break;
}
}
if ((tgt[j]!=str[i]) && (len<255)){
tgt[len]=str[i];
len++;
tgt[len]='\0';
}
}
}



void rmv_jmp(char *str){ //Limpia los saltos de linea que puede dejar el fgets
int i;
for (i=0;i<strlen(str);i++){
if (str[i]=='\n')
str[i]='\0';
else if (str[i]!='\0')
continue;
break;
}
}

long f_getsize(char *fname){ //Devuelve el tamaño de un archivo
FILE *f;
long size;
f=fopen(fname,"rb");
if (f!=NULL){
fseek(f,0,SEEK_END); // Vamos al final
size=ftell(f); // Y guardamos la posicion
close(f);
}
else
size=-1;
return size;
}

int exist(char *fname){ //Devuelve 0 si un archivo no existe (o no se puede leer)
FILE *f; // o 1 si existe
int exist;
f=fopen(fname,"rb"); // Ya se que el metodo no es muy preciso
if (f!=NULL){ // pero si no se puede leer para que seguir?
exist=1;
close(f);
}
else
exist=0;
return exist;
}

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta