Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 0xDani en 23 Agosto 2012, 23:23 pm



Título: Ayuda con un stream de fichero en linux.
Publicado por: 0xDani en 23 Agosto 2012, 23:23 pm
Hola!

Estaba trasteando por mi sistema, un Ubuntu, cuando me encontre el siguiente encabezado: poll.h. Me dio curiosidad, y decidi buscar documentacion acerca de esta libreria(si, estaba aburrido :xD). Encontre y lei esto: http://pubs.opengroup.org/onlinepubs/7908799/xsh/poll.h.html. Entonces he pensado que podia hacer un keylogger simple, y he armado este codigo:
Código
  1. #include <unistd.h>
  2. #include <sys/poll.h>
  3. #include <stdio.h>
  4.  
  5. int main(int argc, char* argv[])
  6. {
  7.  FILE* log = fopen("log.txt", "a");
  8.  struct pollfd input[1];
  9.  input[0].fd = 1;
  10.  input[0].events = POLLIN;
  11.  int event;
  12.  char chevent;
  13.  while(1)
  14.  {
  15.   event = poll(input, 1, 1);
  16.   if(event>=0){
  17.   chevent = event;
  18.   fprintf(log, "%c", chevent);
  19.   fflush(log);}
  20.  }
  21.  return 0;
  22.  
  23. }
El problema es que escribo cuatro o cinco letras, cierro la terminal y el fichero "log.txt" ocupa entre 10 y 15 KBs, y al abrirlo se me queda pillado el editor de texto.
Cuando simplemente imprimo las letras por pantalla funciona perfectamente.

Saludos.


Título: Re: Ayuda con un stream de fichero en linux.
Publicado por: Foxy Rider en 26 Agosto 2012, 01:34 am
La verdad es que no conozco poll(), báh, lo he visto, pero no lo he usado ... revisando la manpage veo que sirve para trabajar con descriptores de ficheros.
Puede llegar a funcionar sobre STDIN, pero tené en cuenta que stdin en entorno gráfico no sirve (sólo con terminales y emuladores de terminales)

http://pubs.opengroup.org/onlinepubs/009695399/functions/poll.html

Si vas a referenciar descriptores de ficheros bajo *nix, incluí unistd.h y usá las macros STDIN_FILENO, STDOUT_FILENO y STDERR_FILENO por motivos de limpieza visual y estilo.

En este caso, lo que hace poll() es algo parecido a lo que hice acá, fijate:

http://foro.elhacker.net/programacion_cc/como_hacer_que_un_bucle_se_ejecute_durante_x_milisegundos_en_linux-t369295.0.html;msg1775072#msg1775072

En principio sí ... podría servir para un keylogger mal hecho, pero sirve.
En entorno gráfico tendrías que usar otro método (creo que hemos visto en otros posts como pedir las teclas bajo X), por lo que ya tenés varios métodos para keylog, en diferentes entornos :D (consola y X), jugá con ellos y fijate qué limitaciones tienen y qué se ajusta más a lo que querés, pero sobretodo, nunca recaigas sobre un sólo método, siempre tené un fallback

Saludos.


Título: Re: Ayuda con un stream de fichero en linux.
Publicado por: 0xDani en 26 Agosto 2012, 02:24 am
Ah claro, cierto, stdin no sirve para entorno grafico... No habia caido en eso! La verdad es que le puse 1 como descriptor de fichero porque sabia que en entornos *nix stdin esta definido como 1, pero usare las macros, es cierto que queda mas limpio.

Tambien es cierto que ya hemos visto como pedir las teclas bajo X, yo mismo trate de hacer un keylogger usando la Xlib, pero tenia demasiada poca experiencia y costumbre de leer en ingles xD. Entonces si consigo pedir las teclas usando la Xlib, el problema estaria en como saber si se esta escribiendo en la terminal o en el entorno grafico. Bueno, supongo que siempre se pueden usar threads o hacer un fork. De todas formas tengo el mismo problema, que viene a ser que el fichero ocupa entre 10 y 15 KB (aunque despues de varias pruebas he visto 120 KB) y no es accesible, me cuelga el gedit.

Saludos.

PD: Hace un rato he visto tu blog, no sabia que tenias uno. La proxima vez avisame, siempre es enriquecedor leer escritos tuyos ;)


Título: Re: Ayuda con un stream de fichero en linux.
Publicado por: Foxy Rider en 26 Agosto 2012, 02:43 am
Citar
Tambien es cierto que ya hemos visto como pedir las teclas bajo X, yo mismo trate de hacer un keylogger usando la Xlib, pero tenia demasiada poca experiencia y costumbre de leer en ingles xD. Entonces si consigo pedir las teclas usando la Xlib, el problema estaria en como saber si se esta escribiendo en la terminal o en el entorno grafico. Bueno, supongo que siempre se pueden usar threads o hacer un fork. De todas formas tengo el mismo problema, que viene a ser que el fichero ocupa entre 10 y 15 KB (aunque despues de varias pruebas he visto 120 KB) y no es accesible, me cuelga el gedit.

Por que poll() no bloquea, está escribiendo a matar en ese bucle ... cambiá el fprintf por un printf, y fijate que sucede
Si no pongo un if revisando el char, me bombardea la salida de la terminal.

Si estás en entorno gráfico, los emuladores de terminales están corriendo bajo X, así que podría decirse que ahí no vas a tener problemas, por que podés usar el método de X (ejemplo? xterm y konsole son emuladores, pero usando el keylogger de X puede leerse lo que se les escribe, por que corren sobre X)
Pensalo así: Te instalás en el .rc del usuario que te interesa, y en base a eso, vas monitoreando si se arranca X ... si no se arranca, hacés un keylogging estándar, y si se arranca, hacés un fork() y te ponés a hacerlo con la manera de X también.

*En principio*

Saludos.

P.S → Mi blog es rrré político y hace poquito lo armé ... pero no lo ando publicitando, es decir, se lo pasé a pocas personas ... fuera de eso, lo referencio cuando necesito abordar un punto (como lo de GNU/Linux). Ahora ando escribiendo una entrada llamada "Un acercamiento al derecho de autor y licenciamientos copyleft", aunque quiero escribir algo de programación !!



Título: Re: Ayuda con un stream de fichero en linux.
Publicado por: 0xDani en 26 Agosto 2012, 03:05 am
Si, es cierto que poll() no bloquea, pero le pongo un if para comprobar que el valor de retorno sea mayor o igual a 0, entonces si no escribo en la terminal no deberia escribir en el archivo no?  Voy a cambiar el ">=" por un ">"y probare asi.

En cuanto a lo del blog, por favor escribe sobre programacion :laugh:!! Me encantara leerlo.

Saludos.

Edit: Pues parece ser que no, ahora no coge las teclas. Ahora que le he cambiado el operador de comparacion, crea el archivo pero se queda a cero bytes.


Título: Re: Ayuda con un stream de fichero en linux.
Publicado por: Foxy Rider en 26 Agosto 2012, 03:49 am
Citar
Edit: Pues parece ser que no, ahora no coge las teclas. Ahora que le he cambiado el operador de comparacion, crea el archivo pero se queda a cero bytes.

Antes las leía? a mi nunca me las leyó ... si querés ver un fichero de texto sin sobrecargar la compu con ficheros grandes, usá el comando head (tantas líneas desde el comienzo del fichero) o tail (tantas líneas del final del fichero) ... sino less

Código
  1. less /var/log/Xorg.0.log

Dejalo como estaba antes, y revisá así el fichero de texto ... pero me parece que el código en sí no funciona, la diferencia entre > y >= a 0 es que si chevent vale 0, eso dá verdadero y escribe al fichero ... y no es válido (significa EOF)

Saludos.

P.S → Es la única manera cuando el fichero es monstruoso ... no hay editor que aguante cuando un fichero pesa MBs


Título: Re: Ayuda con un stream de fichero en linux.
Publicado por: fabianjsm en 26 Agosto 2012, 13:05 pm
El valor de STDIN_FILENO (definido en <unistd.h>) suele ser cero, no uno ¿Realmente conoces algún sistema
donde esto sea diferente? … Por otra parte stdin difícilmente valdra 0 porque es un puntero (FILE *stdin). STDIN_FILENO y stdin son cosas distintas.

Código
  1. #include <unistd.h>
  2. #include <stdio.h>
  3.  
  4. int main(int argc, char* argv[])
  5. {
  6. printf("STDIN_FILENO: %d\n", STDIN_FILENO);
  7. printf("stdin: %p\n", (unsigned long)stdin);
  8. return 0;
  9. }

Talvez la función no se bloquee porque estas leyendo una salida (sinceramente nunca utilicé esta función). Podrías cambiar esta linea:

Código
  1. input[0].fd = STDIN_FILENO;




Título: Re: Ayuda con un stream de fichero en linux.
Publicado por: 0xDani en 26 Agosto 2012, 23:34 pm
Ya he cambiado 1 por STDIN_FILENO, y sigue sin funcionar :-\