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