Bonjour / bonsoir,
Je viens tout doucement sur les forums suite à mes recherches nombreuses (trop ou mauvaise) sur un problème que j'ai depuis pas mal de jour (heures devant le pc ). Je suis actuellement en train de réaliser un petit programme doit me permettre de faire 2 choses. Simuler des appuis de touches claviers et lire une partie de la mémoire d'un processus. Je me suis donc penché sur le C++ et la winAPI . Gros poissons bien compliqué.
Dans un premier temps, mon programme peut simuler les appuis de touches claviers (en cliquant sur un bouton, une recherche du process, un focus, un envoi est réalisé). J'utilise FindWindow, SetForegroundWindow et keybd_event. Cette partie là fonctionne très bien sauf si je décide de ne plus focus mon process.... Du coup première petite question, est-il possible d'injecter dans un process / dans une fenêtre non focus, l'appui du touche clavier. Je suis passer par PostMessage, mais sans succès. Y a-t-il un autre moyen ?
Mon deuxième problème est légèrement plus compliquer (ou pas). J'arrive à trouver mon processus, et à récupérer l'adresse mémoire "basse". Je la compare avec OllyDbg et je trouve une adresse identique. Par contre, et c'est là que je me paume un peu, sur OllyDbg, on peut voir les différentes Adresse, taille, section, "contains",... Je souhaiterai pouvoir faire la même chose avec mon programme mais pour mon processus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 HWND myWindow; uint keyCode; const TCHAR str[11] = TEXT("MonProcessChercher"); LPCTSTR h =(const TCHAR *)str; myWindow = ::FindWindow(NULL,h); if(myWindow == NULL) qDebug() << "failed to find"; if(!SetForegroundWindow(myWindow)) qDebug() << "Unsucessful foreground window"; keyCode = VK_CONTROL; keybd_event(VK_CONTROL, 0x9D, 0, 0); keybd_event(0x2E, 0x2E, 0, 0); ::Sleep(1); keybd_event(VK_CONTROL, 0x9D, KEYEVENTF_KEYUP, 0); keybd_event(0x2E, 0x2E, KEYEVENTF_KEYUP, 0);
Comment peut-on déterminer la taille que prend une application (adresse "basse" et adresse "haute"), comment peut-on la "parser",comme par exemple OllyDbg, pour retrouver les différentes sections tel que les Data, Ressources, Relocations...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 hwnd = FindWindow(NULL,L"MonProcessChercher"); if(!hwnd) qDebug() << "not found!"; // Get Process GetWindowThreadProcessId(hwnd, &pid); // Get the process id and place it in the PID HANDLE phandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid); // Get permission to Read & Write if(!phandle) qDebug() << "Could not get handle !"; DWORD_PTR base = GetModuleBase(pid); qDebug() << " nouvelle base :" << QString::number(base,16); ReadProcessMemory(phandle,(void*)base,&value,sizeof(double),0); // read what is in "address" and store it in "value" ReadProcessMemory(phandle,(void*)base,&myValue,sizeof(myValue),0);
Je sais que je demande beaucoup de choses et que je fournis peu ... Je comprendrai aussi très bien si des personnes me redirige vers un sujet déjà existant ou des tutos "bien fait" à sur ces sujets. J'ai pas mal cherché et j'ai eu un peu de mal à trouver (je cherche peut-être mal aussi mais c'est une autre histoire).
D'avance merci pour vos réponses et votre aide.
Naevis.
Partager