Dobry
Tueur de lamouz
Messages : 206
Sujets : 25
Points: 73
Inscription : Aug 2011
|
[C++] Spammeur linux
Bonjour, alors tout d'abord, je tiens à préciser que ce programme ne m'a servit qu'a découvrir la libX sous linux, en espérant que vous ne l'utiliserez uniquement dans ce but.
Si vous avez des questions sur le script, n'hésitez pas.
Il se compile de la façon suivante :
g++ script.cpp -o script -lX11 -lXtst
Code PHP : #include <X11/extensions/XTest.h> #include <X11/Xlib.h> #include <X11/keysym.h> #include <X11/Xresource.h> #include <X11/Xatom.h> #include <iostream> #include <string>
Window *listWin (Display *disp, unsigned long *len); char *nameWin (Display *disp, Window win); void sendKey(Display* disp, char letter);
int main(int argc, char* argv[]){ int i, counter, selectWindow, currentState; unsigned long len; char *name; XKeyEvent esend; Display *disp = XOpenDisplay(NULL); Window *list, currentWindow; std::string data; XGetInputFocus(disp, ¤tWindow, ¤tState); // Getting the current focused window list = (Window*)listWin(disp,&len); // Getting all the windows for (i=0;i<(int)len;i++) { name = nameWin(disp,list[i]); std::cout << i << " : " << name << std::endl; // Display window's name } std::cout << "Wich window do you want to use ?" << std::endl; std::cin>>selectWindow; if(selectWindow<0 || selectWindow >i){ std::cout << "Invalid window" << std::endl; return 1; } std::cout << "Data to send ?" << std::endl; std::cin.ignore(); std::getline(std::cin,data); std::cout << "Number of sending : " << std::endl; std::cin >> counter; for(counter;counter > 0; counter--){ XSetInputFocus(disp, list[selectWindow],RevertToPointerRoot,0); for(i=0;i<data.size();i++) sendKey(disp, data[i]); // Send a char to the window sleep(1); // Sleep is needed, otherwise, the return caracter is not send. sendKey(disp, '\n'); } XSetInputFocus(disp, currentWindow, RevertToPointerRoot, 0); // Put the old window on focus XFlush(disp); return 0; }
void sendKey(Display* disp, char letter){ // Send a char to the selected window KeySym key; switch(letter){ // this switch is requiered to handle all the keyboards, you can add case: if you need case '1': key = XK_1; break; case '2': key = XK_2; break; case '3': key = XK_3; break; case '4': key = XK_4; break; case '5': key = XK_5; break; case '6': key = XK_6; break; case '7': key = XK_7; break; case '8': key = XK_8; break; case '9': key = XK_9; break; case '0': key = XK_0; break;
case 'a': key = XK_a; break; case 'b': key = XK_b; break; case 'c': key = XK_c; break; case 'd': key = XK_d; break; case 'e': key = XK_e; break; case 'f': key = XK_f; break; case 'g': key = XK_g; break; case 'h': key = XK_h; break; case 'i': key = XK_i; break; case 'j': key = XK_j; break; case 'k': key = XK_k; break; case 'l': key = XK_l; break; case 'm': key = XK_m; break; case 'n': key = XK_n; break; case 'o': key = XK_o; break; case 'p': key = XK_p; break; case 'q': key = XK_q; break; case 'r': key = XK_r; break; case 's': key = XK_s; break; case 't': key = XK_t; break; case 'u': key = XK_u; break; case 'v': key = XK_v; break; case 'w': key = XK_w; break; case 'x': key = XK_x; break; case 'y': key = XK_y; break; case 'z': key = XK_z; break;
case 'A': key = XK_a; break; case 'B': key = XK_b; break; case 'C': key = XK_c; break; case 'D': key = XK_d; break; case 'E': key = XK_e; break; case 'F': key = XK_f; break; case 'G': key = XK_g; break; case 'H': key = XK_h; break; case 'I': key = XK_i; break; case 'J': key = XK_j; break; case 'K': key = XK_k; break; case 'L': key = XK_l; break; case 'M': key = XK_m; break; case 'N': key = XK_n; break; case 'O': key = XK_o; break; case 'P': key = XK_p; break; case 'Q': key = XK_q; break; case 'R': key = XK_r; break; case 'S': key = XK_s; break; case 'T': key = XK_t; break; case 'U': key = XK_u; break; case 'V': key = XK_v; break; case 'W': key = XK_w; break; case 'X': key = XK_x; break; case 'Y': key = XK_y; break; case 'Z': key = XK_z; break;
case 'é': key = XK_2; break; case 'è': key = XK_7; break;
case '!': key = XK_exclam; break; case ' ': key = XK_space; break; case '\n': key = XK_Return; break;
default : key = XK_space; break; } XTestGrabControl (disp, True); XTestFakeKeyEvent (disp, XKeysymToKeycode(disp, key), True, 0); XTestFakeKeyEvent (disp, XKeysymToKeycode(disp, key), False, 0); XSync (disp, False); XTestGrabControl (disp, False); }
Window *listWin (Display *disp, unsigned long *len) { // List all the application running on X Atom prop = XInternAtom(disp,"_NET_CLIENT_LIST",False), type; int form; unsigned long remain; unsigned char *list; if (XGetWindowProperty(disp,XDefaultRootWindow(disp),prop,0,1024,False,XA_WINDOW, &type,&form,len,&remain,&list) != Success) { return 0; } return (Window*)list; } char *nameWin (Display *disp, Window win) { // Return a window name Atom prop = XInternAtom(disp,"WM_NAME",False), type; int form; unsigned long remain, len; unsigned char *list;
if (XGetWindowProperty(disp,win,prop,0,1024,False,AnyPropertyType, &type,&form,&len,&remain,&list) != Success) { return NULL; } return (char*)list; }
Petite précision au niveau de l'énorme Switch, très moche, mais bon, je n'ai pas trouvé d'autre moyen 'simple'.
Par défaut, il existe une fonction XStringToKeysym() ( http://tronche.com/gui/x/xlib/utilities/...eysym.html), utilisant la représentation QWERTY du clavier malheureusement, il faut tout de même gérer les caractères spéciaux tels que ':' ',' '!', '?' grâce à des conditions, on peut donc arriver à une fonction senKey() qui ressemble à :
Code PHP : void sendKey(Display* disp, char letter){ // Send a char to the selected window KeySym key; char tamper[2]; tamper[1] = '\0'; if(letter == '!') key = XK_exclam; else if(letter == ' ') key = XK_space; else if(letter == '\n') key = XK_Return; else{ tamper[0] = letter; key = XStringToKeysym(disp,tamper); } XTestGrabControl (disp, True); XTestFakeKeyEvent (disp, XKeysymToKeycode(disp, key), True, 0); XTestFakeKeyEvent (disp, XKeysymToKeycode(disp, key), False, 0); XSync (disp, False); XTestGrabControl (disp, False); }
Cette fonction est loin d’être correcte car si elle rencontre un caractère spécial non attendu, c'est le bug assuré xD
Aestuārium Erudītiōnis
There are only two hard things in Computer Science: cache invalidation, naming things, and off-by-one errors.
|