Ayuda con un stream de fichero en linux.

Iniciado por 0xDani, 23 Agosto 2012, 23:23 PM

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

0xDani

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:
#include <unistd.h>
#include <sys/poll.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
  FILE* log = fopen("log.txt", "a");
  struct pollfd input[1];
  input[0].fd = 1;
  input[0].events = POLLIN;
  int event;
  char chevent;
  while(1)
  {
   event = poll(input, 1, 1);
   if(event>=0){
   chevent = event;
   fprintf(log, "%c", chevent);
   fflush(log);}
  }
  return 0;
 
}

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.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Foxy Rider

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.

0xDani

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 ;)
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Foxy Rider

CitarTambien 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 !!


0xDani

#4
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.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Foxy Rider

#5
CitarEdit: 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 (bash) [Seleccionar]
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

fabianjsm

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 (cpp) [Seleccionar]
#include <unistd.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
printf("STDIN_FILENO: %d\n", STDIN_FILENO);
printf("stdin: %p\n", (unsigned long)stdin);
return 0;
}


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 (cpp) [Seleccionar]
input[0].fd = STDIN_FILENO;



0xDani

Ya he cambiado 1 por STDIN_FILENO, y sigue sin funcionar :-\
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM