Pot receptiona mesaje de la alta aplicatie ?

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Pot receptiona mesaje de la alta aplicatie ?

Post by mesajflaviu » 28 Dec 2010, 12:38

Am facut un mic proiect de test care trimite mesaje unei alte aplcatii :

Code: Select all

void CTestMessageView::OnHelpStartapplication() 
{
	// TODO: Add your command handler code here

	ShellExecute(m_hWnd,"open","calc.exe",NULL,NULL,SW_SHOWNORMAL);
}
si apoi din alt item de meniu , trimit mesaje aplicatiei deschise mai sus :

Code: Select all

void CTestMessageView::OnHelpSendmessage() 
{
	// TODO: Add your command handler code here

	HWND hWndCalc;
	hWndCalc = ::FindWindow(NULL,"calculator");
	if(hWndCalc)
	{
		::PostMessage(hWndCalc,WM_CHAR,(WPARAM)'1',0);
	}
}
iar pe aplicatia calculator imi apare cate o cifra '1' de cate ori trimit acest mesaj ... intrebarea mea este , cum pot receptiona mesaje de la aplicatia calculator in aplicatia mea ? De exemplu , cifrele folosite in calcul ?



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Pot receptiona mesaje de la alta aplicatie ?

Post by Ovidiu Cucu » 28 Dec 2010, 13:10

Q: Pot receptiona mesaje de la alta aplicatie ?
A: Da, daca acea aplicatie imi trimite acele mesaje.

// Din nou, parca ti-am mai spus odata ca nu-i OK sa trimiti WM_CHAR: http://www.codexpert.ro/forum/viewtopic ... 591#p11153

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: Pot receptiona mesaje de la alta aplicatie ?

Post by cristianamarie » 28 Dec 2010, 13:14

Poti intercepta mesajele cu un hook WH_CBT.
Nuclear launch detected

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Pot receptiona mesaje de la alta aplicatie ?

Post by mesajflaviu » 30 Dec 2010, 13:29

Ovidiu Cucu wrote:Q: Pot receptiona mesaje de la alta aplicatie ?
A: Da, daca acea aplicatie imi trimite acele mesaje.

// Din nou, parca ti-am mai spus odata ca nu-i OK sa trimiti WM_CHAR: http://www.codexpert.ro/forum/viewtopic ... 591#p11153
De acord , dar cu ce mesaje pot trimite cifre calculatorului ?

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Pot receptiona mesaje de la alta aplicatie ?

Post by mesajflaviu » 30 Dec 2010, 14:12

Sau cazul notepad :

Code: Select all

void CTestMessageView::OnHelpStartapplication() 
{
	// TODO: Add your command handler code here

	ShellExecute(m_hWnd,"open","notepad.exe",NULL,NULL,SW_SHOWNORMAL);
}
si :

Code: Select all

void CTestMessageView::OnHelpSendmessage() 
{
	// TODO: Add your command handler code here

	CString sTemp = "Test message\n";
	LPCTSTR p = sTemp.GetBuffer(0);

	HWND hWnd = ::FindWindow("Notepad",NULL);
	if(hWnd)
	{
//		::PostMessage(hWnd,WM_CLOSE,0,0);
		::PostMessage(hWnd,WM_CHAR,(WPARAM)'1',0);
		::PostMessage(hWnd,WM_KEYDOWN,'1',0);
		::PostMessage(hWnd,WM_SETTEXT,0,(LPARAM)p);
		::PostMessage(hWnd,EM_REPLACESEL,0,(LPARAM)p);
	}

	sTemp.ReleaseBuffer();
}
nici unul din mesajele de mai sus nu le receptioneaza notepad-ul deschis , in afara de WM_CLOSE ( pus pe comentariu ) , de ce ?

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: Pot receptiona mesaje de la alta aplicatie ?

Post by neagu_laurentiu » 30 Dec 2010, 14:57

Foloseste un program de monitorizare mesaje si vezi mai intai care e fereastra din acea aplicatie ce trebuie sa fie tinta intrarilor. Apoi dai si tu mesage exact la fel si sigur vor ajunge.

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Pot receptiona mesaje de la alta aplicatie ?

Post by Silviu Ardelean » 30 Dec 2010, 19:09

Ca si completare la ce spunea Laurentiu: in suita Visual Studio, la tooluri, gasesti aplicatia Spy++.
O poti folosesti pentru a afla numele ferestrelor tinta si pentru a monitoriza ce mesaje primeste ferestra respectiva.

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Pot receptiona mesaje de la alta aplicatie ?

Post by mesajflaviu » 30 Dec 2010, 23:09

N-am mai folosit pana acum Spy++ , dar o sa incerc .

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Pot receptiona mesaje de la alta aplicatie ?

Post by Ovidiu Cucu » 31 Dec 2010, 19:49

mesajflaviu wrote:

Code: Select all

void CTestMessageView::OnHelpSendmessage() 
{
	// TODO: Add your command handler code here

	CString sTemp = "Test message\n";
	LPCTSTR p = sTemp.GetBuffer(0);

	HWND hWnd = ::FindWindow("Notepad",NULL);
	if(hWnd)
	{
//		::PostMessage(hWnd,WM_CLOSE,0,0);
		::PostMessage(hWnd,WM_CHAR,(WPARAM)'1',0);
		::PostMessage(hWnd,WM_KEYDOWN,'1',0);
		::PostMessage(hWnd,WM_SETTEXT,0,(LPARAM)p);
		::PostMessage(hWnd,EM_REPLACESEL,0,(LPARAM)p);
	}

	sTemp.ReleaseBuffer();
}
nici unul din mesajele de mai sus nu le receptioneaza notepad-ul deschis , in afara de WM_CLOSE ( pus pe comentariu ) , de ce ?
Din moment ce le-ai trimis receptioneaza cum sa nu, numai ca nu le trimiti cui trebuie.
La Notepad, textul nu se scrie in fereastra principala ci intr-un copil de tip Edit.

Si cateva observatii suplimentare.
  • Giumbuslucul cu LPCTSTR p = sTemp.GetBuffer(0) n-are rost acolo din moment ce CString are operatorul LPCTSTR.
  • sTemp este definit local si apoi il transmiti cu PostMessage. In partea cealalta o sa se primeasca carcalaci.
  • Nu prea-i Ok sa cauti notepadul cu FindWindow. Ce te faci daca-s mai multe deschise?

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Pot receptiona mesaje de la alta aplicatie ?

Post by mesajflaviu » 01 Jan 2011, 22:35

Ovidiu Cucu wrote:
mesajflaviu wrote:

Code: Select all

void CTestMessageView::OnHelpSendmessage() 
{
	// TODO: Add your command handler code here

	CString sTemp = "Test message\n";
	LPCTSTR p = sTemp.GetBuffer(0);

	HWND hWnd = ::FindWindow("Notepad",NULL);
	if(hWnd)
	{
//		::PostMessage(hWnd,WM_CLOSE,0,0);
		::PostMessage(hWnd,WM_CHAR,(WPARAM)'1',0);
		::PostMessage(hWnd,WM_KEYDOWN,'1',0);
		::PostMessage(hWnd,WM_SETTEXT,0,(LPARAM)p);
		::PostMessage(hWnd,EM_REPLACESEL,0,(LPARAM)p);
	}

	sTemp.ReleaseBuffer();
}
nici unul din mesajele de mai sus nu le receptioneaza notepad-ul deschis , in afara de WM_CLOSE ( pus pe comentariu ) , de ce ?
Din moment ce le-ai trimis receptioneaza cum sa nu, numai ca nu le trimiti cui trebuie.
La Notepad, textul nu se scrie in fereastra principala ci intr-un copil de tip Edit.

Si cateva observatii suplimentare.
  • Giumbuslucul cu LPCTSTR p = sTemp.GetBuffer(0) n-are rost acolo din moment ce CString are operatorul LPCTSTR.
  • sTemp este definit local si apoi il transmiti cu PostMessage. In partea cealalta o sa se primeasca carcalaci.
  • Nu prea-i Ok sa cauti notepadul cu FindWindow. Ce te faci daca-s mai multe deschise?
O sa caut fereastra copil cu EnumChildWindows , dar cum ma asigur ca trimit mesaje la notepad-ul deschis de mine in aplicatia mea si nu la altele ?

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Pot receptiona mesaje de la alta aplicatie ?

Post by Ovidiu Cucu » 02 Jan 2011, 00:35

mesajflaviu wrote: O sa caut fereastra copil cu EnumChildWindows , dar cum ma asigur ca trimit mesaje la notepad-ul deschis de mine in aplicatia mea si nu la altele ?
Lansezi Notepad-ul cu CreateProcess si apoi folosesti structura PROCESS_INFORMATION ca sa gasesti fereastra principala a procesului.
In felul asta esti sigur ca nu te legi de alta fereastra din aceeasi clasa si/sau cu acelasi caption, asa cum se poate intampla la FindWindow.

Simplificat, ar arata cam asa:

Code: Select all

BOOL RunNotepad()
{
   CString strCmdLine = _T("Notepad.exe");
   PROCESS_INFORMATION processInfo = {0};
   STARTUPINFO startupInfo = {0};
   BOOL bRet = ::CreateProcess(NULL, strCmdLine.GetBuffer(0),
                               NULL, NULL, FALSE, 0, NULL, NULL,
                               &startupInfo, &processInfo);
   strCmdLine.ReleaseBuffer();
   if(bRet)
   {
      ::WaitForInputIdle(processInfo.hProcess, 10000);
      // ...s.a.m.d.
   }
   return bRet;
}
Sunt mai multe metode de inlocuit "...s.a.m.d.-ul". Poti de exemplu folosi EnumThreadWindows sau, sa enumeri ferestrele top-level si sa o alegi pe cea care iese la GetWindowThreadProcessId.

Am atasat aici o mica aplicatie demo cu care m-am jucat mai demult si am uitat de ea.
Stie sa lanseze Notepad-ul sa scrie in el si sa-i transmita comenzi.

// Este inca in lucru asa ca e posibil sa aiba mici galme. Daca ai intrebari, te rog nu ezita sa intrebi.
// Enjoy!
Attachments
UsingNotepadDemo.zip
(11.6 KiB) Downloaded 249 times

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Pot receptiona mesaje de la alta aplicatie ?

Post by mesajflaviu » 03 Jan 2011, 11:01

Am incercat aplicatia si merge fain ... si e interesanta rezolvarea problemei , de fapt e rezolvata gasirea aplicatiei la care se trimit mesajele .

Ramane intrebarea postului : cum pot receptiona mesaje dintr-un notepad ?
Ovidiu Cucu wrote:Q: Pot receptiona mesaje de la alta aplicatie ?
A: Da, daca acea aplicatie imi trimite acele mesaje.
Sa inteleg ca daca nu imi sant adresate mie (aplicatiei mele) mesajele nu le pot/nu e bine a le receptiona ?

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: Pot receptiona mesaje de la alta aplicatie ?

Post by neagu_laurentiu » 03 Jan 2011, 16:18

mesajflaviu wrote:Sa inteleg ca daca nu imi sant adresate mie (aplicatiei mele) mesajele nu le pot/nu e bine a le receptiona ?
Pai nu e normal ?

Tot ce poti face e sa furi mesajele... dar nu-i frumos ! Vezi notiunea hooks.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Pot receptiona mesaje de la alta aplicatie ?

Post by Ovidiu Cucu » 05 Jan 2011, 09:46

DLL Injection care include system hooks e unul dintre capitolele din WinAPI preferate de hackeri. :)
Totusi, sunt lucruri documentate (Richter a dedicat un capitol intreg in Windows Via C/C++), deci atata timp cat nu sunt intentii "malicious" nu-i pacat sa le folosesti. ;)

Insusi Spy-ul foloseste hooks. Exista si o versiune care are sursele in MSDN. Cauta la "SDK tools samples".

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Pot receptiona mesaje de la alta aplicatie ?

Post by mesajflaviu » 05 Jan 2011, 12:18

Ovidiu Cucu wrote:DLL Injection care include system hooks e unul dintre capitolele din WinAPI preferate de hackeri. :)
Totusi, sunt lucruri documentate (Richter a dedicat un capitol intreg in Windows Via C/C++), deci atata timp cat nu sunt intentii "malicious" nu-i pacat sa le folosesti. ;)

Insusi Spy-ul foloseste hooks. Exista si o versiune care are sursele in MSDN. Cauta la "SDK tools samples".
Nu sant , si n-o sa devin in mod sigur niciodata un hacker ... altceva , nu se stie :biggrin:

Oricum , o sa citesc un pic sursele de care ai zis ... sant convins ca sant interesante.

Post Reply