elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Filtro para mensajes?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Filtro para mensajes?  (Leído 3,022 veces)
Fastolfe

Desconectado Desconectado

Mensajes: 69


Ver Perfil
Filtro para mensajes?
« 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.



En línea

rixi15

Desconectado Desconectado

Mensajes: 66



Ver Perfil
Re: Filtro para mensajes?
« Respuesta #1 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


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Filtro para mensajes?
« Respuesta #2 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
En línea

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

Desconectado Desconectado

Mensajes: 69


Ver Perfil
Re: Filtro para mensajes?
« Respuesta #3 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! ;)
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Filtro para mensajes?
« Respuesta #4 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
En línea

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

Desconectado Desconectado

Mensajes: 69


Ver Perfil
Re: Filtro para mensajes?
« Respuesta #5 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++
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Fractalius [Filtro para photoshop]
Diseño Gráfico
Darioxhcx 1 7,689 Último mensaje 20 Diciembre 2010, 23:16 pm
por madpitbull_99
Ayuda para saltarse filtro Dansguardian
Hacking
lord-xavi 0 7,612 Último mensaje 12 Febrero 2011, 01:25 am
por lord-xavi
Filtro para Lammers xD « 1 2 3 »
Foro Libre
Edu 26 9,298 Último mensaje 25 Junio 2011, 17:46 pm
por Edu
Filtro dinamico para consultas MySQL
Desarrollo Web
Shell Root 3 7,282 Último mensaje 8 Agosto 2011, 20:52 pm
por Shell Root
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines