3

Итак, у меня есть этот дешевый RFID-сканер и некоторые RFID-метки.

Я подумал про себя: Знаешь, что будет аккуратно? Включение и отключение экрана блокировки с помощью этой вещи.

Таким образом, посылка прибыла, и я разорвал ее и подключил.

Это устройство эмулирует USB-клавиатуру (что объясняет то, что они нажимали без драйверов) и, по сути, печатает идентификатор карты и вводит нажатия.

Я думал, что смогу просто открыть постоянный поток из /dev /stdin (а-ля кейлоггер) и посмотреть, когда будет выбита нужная карта. Вот что привело меня к созданию этого глупого простого сценария:

#!/bin/bash  

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

Который работал!

Затем я изменил инструкцию THEN на команду разблокировки gnome-screensaver-command -d .

И заблокировал мой экран вручную (Ctrl - Alt - L) Провел мою карту aaand .... ничего. Сканер только что набрал карточку # в поле пароля и нажал клавишу ввода, в результате чего на экране блокировки появился «неверный пароль».

Поэтому я разблокировал экран с помощью пароля и заметил, что на экране терминала ничего не было.

Поэтому я открыл прямую трубу к /dev/stdin и заблокировал мой экран. Разблокировал его своим паролем и ... больше ничего.

Почему это не делает то, что я ожидаю? Разве /dev/stdin не содержит информацию, которая вводится во время экрана блокировки? Если нет, то что?

1 ответ1

1

Ну, вы, ребята, отстой:P Это было своего рода определенная и нишевая, но я не буду держать это против вас;)

Во всяком случае, для полного сбоя.

Я купил этот аккуратный маленький блок, который описывает себя как «без водителя», как в оригинальном посте. Это означает, что он действует как клавиатура USB (и регистрируется как таковой в /dev /input /event *). Это сделало его практически бесполезным для меня, так как я не мог взаимодействовать с устройством каким-либо образом, когда экран блокировки был активен, мне нужно было считывать нажатия клавиш с устройства, поскольку они «вводятся» читателем Cat-ing /dev/input/event3 (мой читатель) дал мне мусор, или я так думаю.

Затем я наткнулся на этот кусок кода здесь: http://itech-planet.net/content/reading-device-input-directly-fromto-devinputeventx-ubuntu-c без? Автор, которого я вижу, но большая часть заслуг в этом приложении принадлежит ему / ей. Спасибо! Упрощая этот код, я смог прочитать необработанный ввод с моей собственной клавиатуры. Секретная фраза была «секретной» и продолжала записывать нажатия клавиш в переменную и искать, когда нажал «ввод», чтобы проверить строку по сохраненному значению. для кода.

Этот код - по сути прославленный кейлоггер, указывающий на другую «клавиатуру» и сканирующий то, что он «печатает», на соответствующую фразу. Очень похоже на то, как ФБР отсеивает миллионы AOL IM от 13-летней девушки, которая ищет террористов!

Когда он находит соответствующую фразу, он запускает оператор if и запускает остальную часть соответствующего кода. Я прокомментировал это как можно лучше, если у вас есть какие-либо проблемы, пишите мне по электронной почте /pm /im /.

Не то, чтобы вы читали что-либо из этого, вы просто хотите код! Ну, вот оно!

Использование:

sudo ./[file] -u [ваше имя пользователя] -d [местоположение на устройстве] -t [идентификатор тега]

Так что я, будучи Тайлером, с моим устройством в /dev /input /event3 и моим тегом 0000996716 должен иметь:

sudo ./input -u Тайлер -d /dev /input /event3 -t 0000996716

КОД:

#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
    }
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .