Bloqueio de desbloqueio do Ubuntu RFID Screensaver

3

Então, eu tenho esse scanner RFID e algumas etiquetas RFID.

Eu pensei comigo mesmo: Você sabe o que seria legal? Ativando e desativando a tela de bloqueio com essa coisa.

Então o pacote chegou e eu o separei e o conectei.

Este dispositivo emula um teclado USB (que explica a coisa sem o driver que eles estavam empurrando) e basicamente digita a ID da placa e pressiona enter.

Eu pensei em abrir um fluxo constante de / dev / stdin (a keylogger) e observar quando o cartão que eu queria foi inserido. Isso é o que me levou a criar este script simples e estúpido:

#!/bin/bash  

cat /dev/stdin | while read line  
do  
  if [ "$line" == "0000996716" ]  
     then echo "Correct!"  
  fi  
done  

Que funcionou!

Em seguida, alterei a instrução THEN para o comando gnome-screensaver unlock, gnome-screensaver-command -d .

E bloqueei minha tela manualmente ( Ctrl - Alt - L ) Swipou minha placa aae .... nada. O scanner tinha acabado de digitar o cartão # no campo de senha e pressionar enter, resultando em uma 'senha incorreta' para aparecer na tela de bloqueio.

Então eu abri minha tela através da senha e notei que não havia nada na tela do terminal.

Então eu abri um pipe direto para /dev/stdin e tranquei minha tela. Desbloqueou com minha senha e ... nada mais.

Por que isso não está fazendo o que eu espero? O /dev/stdin não contém informações que estão sendo digitadas durante a tela de bloqueio? Se não, o que faz?

    
por user2183032 02.06.2013 / 04:32

1 resposta

1

Bem, vocês são uma merda: P Foi meio específico e nicho, mas eu não vou segurá-lo contra você;)

Anywho, para o esgotamento completo.

Eu comprei esta pequena unidade que se descreve como 'sem motorista' como no post original. Isso significa que ele funciona como um teclado USB (e se registra como tal em / dev / input / event *). Isso tornou quase inútil para mim, já que eu não conseguia interagir com o dispositivo de qualquer maneira quando a tela de bloqueio estava ativa, eu precisava ler as teclas digitadas no dispositivo, já que elas estavam sendo "inseridas" pelo leitor Cat-ing /dev/input/event3 (meu leitor) me deu lixo, ou então eu pensei.

Então eu encontrei este pedaço de código aqui: link sem? autor que eu posso ver, mas a maior parte do crédito para o legwork nesta aplicação vai para ele / ela. Obrigado! Simplificando este código eu consegui ler a entrada bruta do meu próprio teclado, com a frase secreta sendo 'secreta' e comecei a capturar as teclas digitadas em uma variável e procurar quando 'enter' foi pressionado para verificar a string contra o valor armazenado para o código.

Este código é essencialmente um keylogger glorificado que aponta para um 'teclado' diferente e escaneia o que ele 'digita' para uma frase correspondente. Muito parecido com o modo como o FBI analisa milhões de usuários da AOL de uma garota de 13 anos à procura de terroristas!

Quando atinge a frase correspondente, aciona a instrução if e executa o restante do código correspondente. Eu comentei o melhor que posso, se você tiver algum problema, envie um e-mail / pm / im / yell em voz alta para mim.

Não gosto de ler nada disso, você só quer o código! Bem, aqui está!

Uso:

sudo ./[file] -u [your username] -d [location to device] -t [tag id]

Então eu, sendo Tyler, com meu dispositivo em / dev / input / event3 e minha tag sendo 0000996716 teria:

sudo ./input -u tyler -d /dev/input/event3 -t 0000996716

CÓDIGO:

#include <linux/input.h>  
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int getStatus(){
  FILE *fp;
  char path[128];
  fp = popen("sudo -u tyler gnome-screensaver-command -q", "r");

  fgets(path, sizeof(path)-1, fp);
  pclose(fp);
  printf("%s\n",path);
  if(strcmp("The screensaver is inactive\n",path)==0) 
    return 1;//if screensaver is disabled
  else if(strcmp("The screensaver is active\n",path)==0) 
    return 0;//if screensaver is enabled
  else
    return -1;//wat
}

int main(int argc, char **argv)
{
//char array that stores the keys in order up to like 40 something, DO NOT MESS WITH THE ORDER OF THIS ARRAY. ITS IMPORTANT.
    char arr[]={' ',' ','1','2','3','4','5','6','7','8','9','0','-','=','\b','\t','q','w','e','r','t','y','u','i','o','p','[',']','\n',' ','a','s','d','f','g','h','j','k','l',';',',',''',' ','\','z','x','c','v','b','n','m',',','.','/',' ','*',' ',' '};
    char inp[256];//input string to check what you type.
    int fd;//file pointer to the /dev/input device
char usr[32];//stores your username to run screensaver command as you. Root user (sudo) can NOT lock the screen.
char tag[32];//stores the tag ID for the RFID
char dev[32];//stores the device location, /dev/input/eventX
char lcom[96];//locking command builder string
char ucom[96];//unlocking command builder string
//processes arguments, dont ask.
   int idx = 0;
   for (idx = 1; idx < argc;  idx++) {
       if (strcmp(argv[idx], "-u") == 0) {
      strcpy(usr,argv[idx+1]);
          printf("User = %s\n", usr);
       } else if (strcmp(argv[idx], "-t") == 0) {
      strcpy(tag,argv[idx+1]);
          printf("Tag = %s\n", tag);
       } else if (strcmp(argv[idx], "-d") == 0) {
      strcpy(dev,argv[idx+1]);
          printf("Device = %s\n", dev);
      fd = open(dev, O_RDONLY);
       } else {}
    }
    //build commands
    strcpy(lcom,"sudo -u ");
    strcat(lcom,usr);
    strcat(lcom," gnome-screensaver-command -l");
    strcpy(ucom,"sudo -u ");
    strcat(ucom,usr);
    strcat(ucom," gnome-screensaver-command -d");
    struct input_event ev;
    int cursor=0;
    while (1)
    {
        read(fd, &ev, sizeof(struct input_event));
        if(ev.type == 1)//only key ID event
            if(ev.value == 0)//only not repeat
        if(ev.code== 28||ev.code==14){//if code is enter or bsp, reset the counter and compare
            inp[cursor]='
#include <linux/input.h>  
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int getStatus(){
  FILE *fp;
  char path[128];
  fp = popen("sudo -u tyler gnome-screensaver-command -q", "r");

  fgets(path, sizeof(path)-1, fp);
  pclose(fp);
  printf("%s\n",path);
  if(strcmp("The screensaver is inactive\n",path)==0) 
    return 1;//if screensaver is disabled
  else if(strcmp("The screensaver is active\n",path)==0) 
    return 0;//if screensaver is enabled
  else
    return -1;//wat
}

int main(int argc, char **argv)
{
//char array that stores the keys in order up to like 40 something, DO NOT MESS WITH THE ORDER OF THIS ARRAY. ITS IMPORTANT.
    char arr[]={' ',' ','1','2','3','4','5','6','7','8','9','0','-','=','\b','\t','q','w','e','r','t','y','u','i','o','p','[',']','\n',' ','a','s','d','f','g','h','j','k','l',';',',',''',' ','\','z','x','c','v','b','n','m',',','.','/',' ','*',' ',' '};
    char inp[256];//input string to check what you type.
    int fd;//file pointer to the /dev/input device
char usr[32];//stores your username to run screensaver command as you. Root user (sudo) can NOT lock the screen.
char tag[32];//stores the tag ID for the RFID
char dev[32];//stores the device location, /dev/input/eventX
char lcom[96];//locking command builder string
char ucom[96];//unlocking command builder string
//processes arguments, dont ask.
   int idx = 0;
   for (idx = 1; idx < argc;  idx++) {
       if (strcmp(argv[idx], "-u") == 0) {
      strcpy(usr,argv[idx+1]);
          printf("User = %s\n", usr);
       } else if (strcmp(argv[idx], "-t") == 0) {
      strcpy(tag,argv[idx+1]);
          printf("Tag = %s\n", tag);
       } else if (strcmp(argv[idx], "-d") == 0) {
      strcpy(dev,argv[idx+1]);
          printf("Device = %s\n", dev);
      fd = open(dev, O_RDONLY);
       } else {}
    }
    //build commands
    strcpy(lcom,"sudo -u ");
    strcat(lcom,usr);
    strcat(lcom," gnome-screensaver-command -l");
    strcpy(ucom,"sudo -u ");
    strcat(ucom,usr);
    strcat(ucom," gnome-screensaver-command -d");
    struct input_event ev;
    int cursor=0;
    while (1)
    {
        read(fd, &ev, sizeof(struct input_event));
        if(ev.type == 1)//only key ID event
            if(ev.value == 0)//only not repeat
        if(ev.code== 28||ev.code==14){//if code is enter or bsp, reset the counter and compare
            inp[cursor]='%pre%';//terminate string
            cursor=0;
            if(strcmp(inp,tag)==0){//if input string equals tag, strcmp works funny lol
                int status=getStatus();//find out what the screensaver is doing
                if(status==1){//screensaver is unlocked, so lock it
                    printf("Locking...");
                    system(lcom);}
                else if(status==0){//screensaver is locked, so unlock it!
                    printf("Unlocking...");
                    system(ucom);}
                else printf("Wat happened");//???
            }
        }
            else{//if not enter or bsp, log it      
            inp[cursor]=arr[ev.code];
            cursor++;
        }
    //fflush(stdout);this was here for debug purposes, since apparently I dont know how STDOUT works lol
    }
}
';//terminate string cursor=0; if(strcmp(inp,tag)==0){//if input string equals tag, strcmp works funny lol int status=getStatus();//find out what the screensaver is doing if(status==1){//screensaver is unlocked, so lock it printf("Locking..."); system(lcom);} else if(status==0){//screensaver is locked, so unlock it! printf("Unlocking..."); system(ucom);} else printf("Wat happened");//??? } } else{//if not enter or bsp, log it inp[cursor]=arr[ev.code]; cursor++; } //fflush(stdout);this was here for debug purposes, since apparently I dont know how STDOUT works lol } }
    
por 04.06.2013 / 03:08