Filtro para mensajes?

Iniciado por Fastolfe, 11 Enero 2012, 13:46 PM

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

Fastolfe

Buenas!! hace un par de semanas se me ocurrió hacer un programa para ver conversaciones de chat de tuenti que habia capturado con un mitm y un sniffer. Se me ocurrió "generalizarlo", y ahora lo que hace es copiar todo lo que se encuentre entre una "cadena de inicio" y una "cadena de fin". Hay que darle un archivo para leer y otro para guardar las conversaciones, o lo que queramos "filtrar".

Aquí teneis el código:

#include <stdio.h>

#define TMENSAJE 1000

// Funciones

int sizeoffile(char Narchivo[]); // DONE
int sizeofstring(char cadena[]); // DONE
void BInicio(char texto[], int size); // DONE
void Cmensaje(char cadenaF[], char texto[], int posicion, char AEscritura[], int sizeoffin); // DONE
int BFin(char texto[], char cadenaF[], int posicion, int sizeoffin); // DONE

int main(){

char ALectura[30];
printf("Archivo de lectura: ");
scanf("%s", &ALectura);

int sizeL = sizeoffile(ALectura);
char texto[sizeL];

FILE *archivo;

archivo = fopen(ALectura, "r");


int i = 0;
for (i = 0; i < sizeL; i++){
texto[i] = fgetc(archivo);
if (texto[i] == EOF){
break;
}
}

fclose(archivo);

BInicio(texto, sizeL);

return 0;
}

int sizeoffile(char Narchivo[]){
FILE *archivo;
archivo = fopen(Narchivo, "r");

int i = 0;

while (fgetc(archivo) != EOF){
i++;
}
fclose(archivo);
return i;
}

int sizeofstring(char cadena[]){

int i = 0;

while (cadena[i] != '\0'){
i++;
}

return i;
}

void BInicio(char texto[], int size){


char CInicio[50];
printf("Cadena de inicio: ");
scanf("%s", &CInicio);

char CFin[50];
printf("Cadena de fin: ");
scanf("%s", &CFin);

char AEscritura[30];
printf("Archivo de escritura: ");
scanf("%s", &AEscritura);

int sizeofinicio = sizeofstring(CInicio);
int sizeoffin = sizeofstring(CFin);

int i = 0;
int j = 0;
int cont = 0;

for (i = 0; i < size; i++){
for (j = 0; j < sizeofinicio; j++){
if (i-j >= 0){
if (texto[i+j] == CInicio[j]){
cont++;
}else{
cont = 0;
}
if (cont == sizeofinicio){
Cmensaje(CFin, texto, i+sizeofinicio, AEscritura, sizeoffin);
cont = 0;
}
}
}
}
}

void Cmensaje(char cadenaF[], char texto[], int posicion, char AEscritura[], int sizeoffin){

FILE *archivo;

archivo = fopen(AEscritura, "a");

char mensaje[TMENSAJE];

int i = 0;
int j = 0;
int k = 0;
int cont = 0;
for (i = posicion; i < (posicion+TMENSAJE); i++){
mensaje[k] = texto[i];
k++;
for (j = 0; j < sizeoffin; j++){
if (texto[i+j] == cadenaF[j]){
cont++;
}else{
cont = 0;
}
if (cont == sizeoffin){
i = (posicion+TMENSAJE);
mensaje[k-1] = 0;
}
}
}

fprintf(archivo, "\n %s", mensaje);

fclose(archivo);
}

int BFin(char texto[], char cadenaF[], int posicion, int sizeoffin){

int i = 0;
int j = 0;
int cont = 0;

for (i = 0; i < TMENSAJE; i++){
for (j = 0; j < sizeoffin; j++){
if (i-j >= 0){
if (texto[i+j] == cadenaF[j]){
cont++;
}else{
cont = 0;
}
if (cont == sizeoffin){
cont = 0;
return 1;
}
}
}
}

return 0;
}


Tengo también el primero que hice especifico para tuenti, que ademas te pone de quien es el mensaje y para quien (con direcciones de correo de tuenti). Si alguien lo quiere puedo postearlo.

También estoy abierto a sugerencias sobre mejoras en el programa.

Espero que le sirva a alguien!! ;)

PD: siento la falta de comentarios en el código, pero si alguien no lo entiende puedo explicarselo o editarlo con comentarios.


rixi15

Buenas, yo en mi red local con dos portátiles, he conseguido con wireshar ver algún mensaje en el chat del tuenti pero es muy engorroso. ¿Podrías decirme como capturabas las conversaciones? Por cierto te el código fuente de un sniffer programado en java. Gracias

sniffer tuenti chat: http://www.ldelgado.es/index.php?dir=aplicaciones/tuentisniffer

rir3760

Un problema es la creación de funciones cuando la biblioteca estándar de C ya provee las necesarias para el calculo de la longitud de una cadena (es "strlen") y para la búsqueda de una subcadena (es "strstr"), el prototipo de ambas se encuentra en el encabezado <string.h>.

En base a ellas (mas aritmética de punteros) se puede realizar el mismo proceso. Un programa de ejemplo reducido a lo (mas) básico es:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char cad[] =
   "Solo es flufINICIOEste es el texto de pruebaFINsolo es fluf\n"
   "Solo es flufINICIOFINsolo es fluf\n"
   "Solo es flufINICIOEste es el texto de pruebaFINsolo es fluf\n"
   "Solo es flufINICIOFINsolo es fluf\n"
   "Solo es flufINICIOEste es el texto de pruebaFINsolo es fluf\n"
;
char *inicio = "INICIO";
char *fin = "FIN";

int main(void)
{
   size_t len_inicio;
   size_t len_fin;
   char *p;
   char *q;
   
   len_inicio = strlen(inicio);
   len_fin = strlen(fin);
   p = cad;
   
   while ((p = strstr(p, inicio)) != NULL){
      p += len_inicio;
     
      if ((q = strstr(p, fin)) != NULL){
         if (q > p)
            printf("%.*s\n", q - p, p);
         
         p = q + len_fin;
      }
   }
   
   return EXIT_SUCCESS;
}


Las variables "globales" solo están ahí por una cuestión subjetiva: dejar en la función principal solo lo indispensable.

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

Fastolfe

Perdón por haber tardado tanto en responder, he estado ocupado :P

rixi15, capturo con ettercap y un filtro que hice para los mensajes de tuenti, es bastante sencillo:
if (search(DATA.data,"</body><active xmlns=")){
log(DATA.data, "/tmp/tuentic.log");
}

Luego si quieres pillar también privados añadele esto:


if (search(DATA.data,"messageBody%22%3A%22")){
log(DATA.data, "/tmp/tuentip.log");
}

Obviamente tienes que compilarlo con el etterfilter.

Ya se que existen esas funciones rir3760, pero prefiero no acostumbrarme a no usarlas, ya que son vulnerables a los desbordamientos del buffer (y porque me gusta hacerme mis propias funciones xD).
Además me divertí rompiendome la cabeza para encontrar el algoritmo de busqueda, usando esas funciones no habría sido lo mismo,

Le echaré un vistazo al sniffer que dices rixi15 a ver que tal funciona.

rir3760, eso es C++?

Gracias a ambos por echarle un vistazo al programa! ;)

rir3760

Cita de: Fastolfe en 30 Enero 2012, 20:17 PMYa se que existen esas funciones rir3760, pero prefiero no acostumbrarme a no usarlas, ya que son vulnerables a los desbordamientos del buffer (y porque me gusta hacerme mis propias funciones xD).
Siendo muy estrictos (lease pedantes) la única función totalmente insegura es "gets". Las demás pueden serlo (o no) dependiendo del contexto. Por ejemplo imagina que desarrollas un procesador de texto (un filtro) y controlas la entrada. En un caso así no hay problema si utilizas funciones como strcpy y strcat.


Cita de: Fastolfe en 30 Enero 2012, 20:17 PMAdemás me divertí rompiendome la cabeza para encontrar el algoritmo de busqueda, usando esas funciones no habría sido lo mismo
Si es por diversión, adelante.

Pero siempre sin "perder de vista" que alguien mas (usualmente mas entendido en el tema) ha trabajado con la función y su operación eficiente, por ejemplo utilizando un algoritmo como Booyer-More.


Cita de: Fastolfe en 30 Enero 2012, 20:17 PMrir3760, eso es C++?
No. Es C según su (por desgracia todavía) estándar de facto (C90).

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

Fastolfe

CitarSiendo muy estrictos (lease pedantes) la única función totalmente insegura es "gets". Las demás pueden serlo (o no) dependiendo del contexto. Por ejemplo imagina que desarrollas un procesador de texto (un filtro) y controlas la entrada. En un caso así no hay problema si utilizas funciones como strcpy y strcat.
mmm Cierto, si controlas la entrada no deberían darte problemas.

CitarPero siempre sin "perder de vista" que alguien mas (usualmente mas entendido en el tema) ha trabajado con la función y su operación eficiente, por ejemplo utilizando un algoritmo como Booyer-More.
Si en el momento de plantearme el programa se me hubiese ocurrido usar ese algoritmo me habría suicidado antes de terminarlo, pero por suerte no lo he conocido hasta hace poco jaja. Ahora que comprendo un poco como va la busqueda de cadenas creo que intentaré usarlo en mis próximos programas.

CitarNo. Es C según su (por desgracia todavía) estándar de facto (C90).
Ok, es que no conocía "size_t" y al buscar en google me salian páginas de C++, así que supuse (ya veo que erroneamente) que era C++