Blokada odblokowania wygaszacza ekranu Ubuntu RFID

3

Mam więc ten skaner RFID el-cheapo i kilka tagów RFID.

Pomyślałem sobie: wiesz, co byłoby fajne? Włączanie i wyłączanie ekranu blokady za pomocą tej rzeczy.

Tak więc paczka dotarła, a ja ją rozerwałem i połączyłem.

To urządzenie emuluje klawiaturę USB (która wyjaśnia, co pchali bez sterowników) i zasadniczo wpisuje identyfikator karty i wprowadza liczbę uderzeń.

Pomyślałem, że mogę po prostu otworzyć ciągły strumień z / dev / stdin (a la keylogger) i sprawdzić, kiedy wybrana karta jest wbita. To doprowadziło mnie do stworzenia tego głupiego prostego skryptu:

#! / bin / bash  

cat / dev / stdin | podczas czytania linii  
zrobić  
  jeśli [„$ line” == „0000996716”]  
     następnie powtórz „Prawda!”  
  fi  
gotowy  

Który działał!

Potem zmienił ówczesny oświadczenie polecenia odblokowania gnome-screensaver, gnome-screensaver-command -d.

I ręcznie zablokowałem ekran ( Ctrl- Alt- L) Przesunąłem kartę i ... i nic. Skaner właśnie wpisał numer karty w polu hasła i wcisnął Enter, co powoduje wyświetlenie „nieprawidłowego hasła” na ekranie blokady.

Odblokowałem więc ekran za pomocą hasła i zauważyłem, że na ekranie terminala nic nie ma.

Więc otworzyłem bezpośredni potok /dev/stdini zablokowałem ekran. Odblokowałem je moim hasłem i ... nic więcej.

Dlaczego to nie robi tego, czego oczekuję? Nie /dev/stdinzawiera informacji wpisywanych na ekranie blokady? Jeśli nie, co robi?

użytkownik2183032
źródło
Myśląc tutaj głośno, ale skoro emulowała to klawiaturę USB, czy możliwe byłoby podłączenie 2 haseł do mojego konta użytkownika? Skrypt (opublikowany powyżej, nieznacznie zmodyfikowany) może zablokować piargi, podczas gdy hasło dodatkowe jest ustawione na identyfikator karty, umożliwiając odblokowanie ekranu? Po prostu mam ustawione hasło główne na kilka liczb haha
user2183032
Używanie dwóch haseł nigdy nie jest dobrym pomysłem, ponieważ obniża bezpieczeństwo zamiast go ulepszać. Hasła numeryczne też nie są dobre, można je bardzo szybko złamać.
gronostaj
Czy jest jakiś plik w / dev, z którego mogę odczytać dane wejściowe? / dev / input / event * daje mi śmieci.
user2183032

Odpowiedzi:

1

Cóż, chłopaki, ssicie: P To było trochę specyficzne i niszowe, ale nie będę miał tego przeciwko tobie;)

Tak czy inaczej, dla pełnego zaniedbania.

Kupiłem tę zgrabną małą jednostkę, która opisuje się jako „bez sterownika”, jak w oryginalnym poście. Oznacza to, że działa jak klawiatura USB (i rejestruje się jako taka w / dev / input / event *). Uczyniło mnie to niemal bezużytecznym, ponieważ nie mogłem w żaden sposób wchodzić w interakcje z urządzeniem, gdy ekran blokady był aktywny, musiałem czytać naciśnięcia klawiszy z urządzenia, ponieważ były one „wprowadzane” przez czytnik Cating /dev/input/event3(mój czytnik) ) dała mi śmieci, a przynajmniej tak mi się zdawało.

Potem natknąłem się na ten fragment kodu tutaj: http://itech-planet.net/content/reading-device-input-directly-fromto-devinputeventx-ubuntu-c bez? autora, którego widzę, ale większość zasług za pracę nóg w tej aplikacji należy do niego. Dzięki! Upraszczając ten kod, byłem w stanie odczytać nieprzetworzone dane wejściowe z własnej klawiatury, przy czym tajne wyrażenie jest „tajne” i przystąpiłem do przechwytywania naciśnięć klawiszy w zmiennej i sprawdzam, kiedy naciśnięty został klawisz „Enter”, aby sprawdzić ciąg znaków względem zapisanej wartości dla kodu.

Ten kod jest w zasadzie uwielbionym keyloggerem wskazującym na inną „klawiaturę” i skanującym to, co „wpisuje” do pasującej frazy. Podobnie jak FBI przesuwa miliony AOL IM od 13-letniej dziewczyny szukającej terrorystów!

Gdy trafi w pasującą frazę, uruchamia instrukcję if i uruchamia resztę odpowiedniego kodu. Skomentowałem to najlepiej jak potrafię, jeśli masz jakiekolwiek problemy, napisz do mnie e-mail / pm / im / krzyk.

Nie tak, jak to czytasz, po prostu chcesz kod! Cóż, oto jest!

Stosowanie:

sudo ./[file] -u [twoja nazwa użytkownika] -d [lokalizacja do urządzenia] -t [identyfikator tagu]

Więc ja, będąc Tylerem, z moim urządzeniem w / dev / input / event3 i moim tagiem 0000996716 miałbym:

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

KOD:

#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]='\0';//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
    }
}
użytkownik2183032
źródło