Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Fastolfe en 11 Enero 2012, 13:46 pm



Título: Filtro para mensajes?
Publicado por: Fastolfe en 11 Enero 2012, 13:46 pm
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:

Código
  1. #include <stdio.h>
  2.  
  3. #define TMENSAJE 1000
  4.  
  5. // Funciones
  6.  
  7. int sizeoffile(char Narchivo[]); // DONE
  8. int sizeofstring(char cadena[]); // DONE
  9. void BInicio(char texto[], int size); // DONE
  10. void Cmensaje(char cadenaF[], char texto[], int posicion, char AEscritura[], int sizeoffin); // DONE
  11. int BFin(char texto[], char cadenaF[], int posicion, int sizeoffin); // DONE
  12.  
  13. int main(){
  14.  
  15. char ALectura[30];
  16. printf("Archivo de lectura: ");
  17. scanf("%s", &ALectura);
  18.  
  19. int sizeL = sizeoffile(ALectura);
  20. char texto[sizeL];
  21.  
  22. FILE *archivo;
  23.  
  24. archivo = fopen(ALectura, "r");
  25.  
  26.  
  27. int i = 0;
  28. for (i = 0; i < sizeL; i++){
  29. texto[i] = fgetc(archivo);
  30. if (texto[i] == EOF){
  31. break;
  32. }
  33. }
  34.  
  35. fclose(archivo);
  36.  
  37. BInicio(texto, sizeL);
  38.  
  39. return 0;
  40. }
  41.  
  42. int sizeoffile(char Narchivo[]){
  43. FILE *archivo;
  44. archivo = fopen(Narchivo, "r");
  45.  
  46. int i = 0;
  47.  
  48. while (fgetc(archivo) != EOF){
  49. i++;
  50. }
  51. fclose(archivo);
  52. return i;
  53. }
  54.  
  55. int sizeofstring(char cadena[]){
  56.  
  57. int i = 0;
  58.  
  59. while (cadena[i] != '\0'){
  60. i++;
  61. }
  62.  
  63. return i;
  64. }
  65.  
  66. void BInicio(char texto[], int size){
  67.  
  68.  
  69. char CInicio[50];
  70. printf("Cadena de inicio: ");
  71. scanf("%s", &CInicio);
  72.  
  73. char CFin[50];
  74. printf("Cadena de fin: ");
  75. scanf("%s", &CFin);
  76.  
  77. char AEscritura[30];
  78. printf("Archivo de escritura: ");
  79. scanf("%s", &AEscritura);
  80.  
  81. int sizeofinicio = sizeofstring(CInicio);
  82. int sizeoffin = sizeofstring(CFin);
  83.  
  84. int i = 0;
  85. int j = 0;
  86. int cont = 0;
  87.  
  88. for (i = 0; i < size; i++){
  89. for (j = 0; j < sizeofinicio; j++){
  90. if (i-j >= 0){
  91. if (texto[i+j] == CInicio[j]){
  92. cont++;
  93. }else{
  94. cont = 0;
  95. }
  96. if (cont == sizeofinicio){
  97. Cmensaje(CFin, texto, i+sizeofinicio, AEscritura, sizeoffin);
  98. cont = 0;
  99. }
  100. }
  101. }
  102. }
  103. }
  104.  
  105. void Cmensaje(char cadenaF[], char texto[], int posicion, char AEscritura[], int sizeoffin){
  106.  
  107. FILE *archivo;
  108.  
  109. archivo = fopen(AEscritura, "a");
  110.  
  111. char mensaje[TMENSAJE];
  112.  
  113. int i = 0;
  114. int j = 0;
  115. int k = 0;
  116. int cont = 0;
  117. for (i = posicion; i < (posicion+TMENSAJE); i++){
  118. mensaje[k] = texto[i];
  119. k++;
  120. for (j = 0; j < sizeoffin; j++){
  121. if (texto[i+j] == cadenaF[j]){
  122. cont++;
  123. }else{
  124. cont = 0;
  125. }
  126. if (cont == sizeoffin){
  127. i = (posicion+TMENSAJE);
  128. mensaje[k-1] = 0;
  129. }
  130. }
  131. }
  132.  
  133. fprintf(archivo, "\n %s", mensaje);
  134.  
  135. fclose(archivo);
  136. }
  137.  
  138. int BFin(char texto[], char cadenaF[], int posicion, int sizeoffin){
  139.  
  140. int i = 0;
  141. int j = 0;
  142. int cont = 0;
  143.  
  144. for (i = 0; i < TMENSAJE; i++){
  145. for (j = 0; j < sizeoffin; j++){
  146. if (i-j >= 0){
  147. if (texto[i+j] == cadenaF[j]){
  148. cont++;
  149. }else{
  150. cont = 0;
  151. }
  152. if (cont == sizeoffin){
  153. cont = 0;
  154. return 1;
  155. }
  156. }
  157. }
  158. }
  159.  
  160. return 0;
  161. }

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.



Título: Re: Filtro para mensajes?
Publicado por: rixi15 en 22 Enero 2012, 23:10 pm
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


Título: Re: Filtro para mensajes?
Publicado por: rir3760 en 23 Enero 2012, 15:57 pm
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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. char cad[] =
  6.   "Solo es flufINICIOEste es el texto de pruebaFINsolo es fluf\n"
  7.   "Solo es flufINICIOFINsolo es fluf\n"
  8.   "Solo es flufINICIOEste es el texto de pruebaFINsolo es fluf\n"
  9.   "Solo es flufINICIOFINsolo es fluf\n"
  10.   "Solo es flufINICIOEste es el texto de pruebaFINsolo es fluf\n"
  11. ;
  12. char *inicio = "INICIO";
  13. char *fin = "FIN";
  14.  
  15. int main(void)
  16. {
  17.   size_t len_inicio;
  18.   size_t len_fin;
  19.   char *p;
  20.   char *q;
  21.  
  22.   len_inicio = strlen(inicio);
  23.   len_fin = strlen(fin);
  24.   p = cad;
  25.  
  26.   while ((p = strstr(p, inicio)) != NULL){
  27.      p += len_inicio;
  28.  
  29.      if ((q = strstr(p, fin)) != NULL){
  30.         if (q > p)
  31.            printf("%.*s\n", q - p, p);
  32.  
  33.         p = q + len_fin;
  34.      }
  35.   }
  36.  
  37.   return EXIT_SUCCESS;
  38. }

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

Un saludo


Título: Re: Filtro para mensajes?
Publicado por: Fastolfe en 30 Enero 2012, 20:17 pm
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! ;)


Título: Re: Filtro para mensajes?
Publicado por: rir3760 en 30 Enero 2012, 23:51 pm
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).
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.


Ademá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.


rir3760, eso es C++?
No. Es C según su (por desgracia todavía) estándar de facto (C90).

Un saludo


Título: Re: Filtro para mensajes?
Publicado por: Fastolfe en 1 Febrero 2012, 09:18 am
Citar
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.
mmm Cierto, si controlas la entrada no deberían darte problemas.

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

Citar
No. 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++