CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Symulacja klawiszy na obcym programie

Symulacja klawiszy na obcym programie

dział ogólny

Symulacja klawiszy na obcym programie

Nowy postprzez Mironas » czwartek, 5 czerwca 2014, 14:30

Program do przechowywania haseł. Chciałbym dodać automatyzację wstawiania loginu i hasła z mojego programu do formularza innego programu lub strony www.

W tym celu po kliknięciu przycisku minimalizuję aplikację i w timerze czekam na kliknięcie na formatce w obcym programie. Po kliknięciu pobieram uchwyt do tej formatki i próbuję na niej 'pisać' symulując wciskanie klawiszy.

Poniższy kod na jednych programach działa poprawnie, a na innych powoduje dziwne reakcje - tak jakby wciskano skróty klawiszowe. Np jeśli we wpisywanym tekście jest litera p to w przeglądarce Chrome otwiera się strona pomocy.

Próbowałem symulować klawisze za pomocą keybd_event oraz SendMessage ale w obu wariantach wyniki są beznadziejne.
Czy ktoś ma lepszy pomysł jak wstawić tekst do formatki w obcym programie?

Oto przykładowy kod (Timer1->Interval ustawić na małą wartość - np 50ms):
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  WindowState = wsMinimized;
  Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  if ( GetAsyncKeyState(VK_LBUTTON) )
  {
    Timer1->Enabled = false;

    // komponent pod myszką
    HWND hWnd = WindowFromPoint(Mouse->CursorPos);

    // wstawienie testu do komponentu
    WstawTekst(hWnd, Edit1->Text);

    WindowState = wsNormal;
    SetForegroundWindow( this->Handle );
  }
}
//---------------------------------------------------------------------------
void TForm1::WstawTekst(HWND hWnd, String tekst)
{
  int znak;
  for (int i=1 ; i<=tekst.Length() ; i++)
  {
    znak = tekst[i];

    // wariant 1
    //keybd_event(znak, 0, 0, 0);
    //keybd_event(znak, 0, KEYEVENTF_KEYUP, 0);

    // wariant 2
    SendMessage(hWnd, WM_KEYDOWN, znak, 0);
    SendMessage(hWnd, WM_CHAR, znak, 0);
    SendMessage(hWnd, WM_KEYUP, znak, 0);

    Application->ProcessMessages();
  }
}
//---------------------------------------------------------------------------
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Symulacja klawiszy na obcym programie

Nowy postprzez Cyfrowy Baron » czwartek, 5 czerwca 2014, 14:42

To wciskanie klawiszy nie będzie działać w każdym programie. Gdzieś już kiedyś na tym forum było wyjaśniane dlaczego w przeglądarkach to nie działa. Już nie pamiętam o co dokładnie chodziło, ale przeglądarki mają zaimplementowany mechanizm zabezpieczający przed takim symulowanym klikaniem.
Jeśli chcesz wysłać jakąś komendę za pomocą przeglądarki na jakąś stronę, to trzeba najpierw sprawdzić jaka to komenda i z jakimi parametrami trzeba ją przesłać. W przeglądarce Firefox jest funkcja 'Zbadaj element', która pozwala śledzić te komunikaty.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Symulacja klawiszy na obcym programie

Nowy postprzez Mironas » czwartek, 5 czerwca 2014, 15:20

Nie chodzi tylko o przeglądarki. Np w Notepad++ otwiera się okno 'O programie' a w Total Commanderze otwiera się wszystko co tylko możliwe.

A w Chrome można bez problemu wpisać 'abcdefghijklmnosvwx' ale jeśli w tekście pojawi się p to otwiera stronę pomocy, r, u i y się nie wpisują (chociaż nic złego się nie dzieje), t powoduje przeładowanie strony a z włącza widok pełnoekranowy. Wygląda to tak jakby program rozpoznawał wysyłany znak jako skrót klawiszowy.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Symulacja klawiszy na obcym programie

Nowy postprzez Cyfrowy Baron » czwartek, 5 czerwca 2014, 17:00

Załóżmy, że chcesz się dobrać do przycisku w oknie programu, który dodatkowo znajduje się na panelu. Musisz najpierw pobrać uchwyt do okna tego programu, a potem do panelu i dopiero potem do przycisku, czyli po kolei do wszystkich elementów powiązanych z tym przyciskiem. Opisałem to dokładnie tutaj: http://programowanie.cal.pl/cyfbar/teor13.htm

Ty wysyłasz symulację bezpośrednio do okna, co w zasadzie nic nie daje, ponieważ to nie całe okno ma reagować na te komunikaty, ale konkretne kontrolki w tym oknie. Wysłanie bezpośrednio do okna działa jak skrót klawiaturowy
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Symulacja klawiszy na obcym programie

Nowy postprzez Mironas » czwartek, 5 czerwca 2014, 17:26

No to kiszka :(

Ale dlaczego nie działa przy użyciu keybd_event - który nie używa uchwytu do okna aplikacji?
Mam przecież wstawiony kursor do formatki na innej aplikacji (bo kliknąłem na nim). Ta aplikacja jest aktywna - i w tym momencie mój program symuluje wciśnięcie klawisza. Na zdrowy rozum stosowny znak powinien pojawić się w formatce.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Symulacja klawiszy na obcym programie

Nowy postprzez Cyfrowy Baron » czwartek, 5 czerwca 2014, 18:29

Okno musi być na wierzchu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Symulacja klawiszy na obcym programie

Nowy postprzez Mironas » piątek, 6 czerwca 2014, 11:02

Jest na wierzchu.
W pierwszej kolejności minimalizuję własny program a przeglądarka staje się programem aktywnym. Nawet mogę pisać z klawiatury na formatce (jeśli akurat ma kursor tekstowy). Jednak gdy kliknę na tej formatce i uruchamia się kod symulujący pisanie - to zaczynają się cuda.

Trudno - chyba muszę zrezygnować z tej funkcjonalności.
Chyba, że ktoś ma inny pomysł jak ułatwić przenoszenia loginów i haseł do zewnętrznych programów.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Symulacja klawiszy na obcym programie

Nowy postprzez Cyfrowy Baron » piątek, 6 czerwca 2014, 18:33

O jaką aplikację chodzi?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Symulacja klawiszy na obcym programie

Nowy postprzez Mironas » piątek, 6 czerwca 2014, 18:53

Pisałem na początku: Program do przechowywania haseł
Coś na wzór AnyPassword: http://www.anypassword.com/
tylko z dodatkowymi funkcjami.

Jedną z nich miało być łatwiejsze wstawianie zestawu login+hasło do innych programów i stron www bez dwukrotnego przełączania się pomiędzy aplikacjami i powtarzania kombinacji kopiuj+wklej.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Symulacja klawiszy na obcym programie

Nowy postprzez Cyfrowy Baron » piątek, 6 czerwca 2014, 19:13

Ty piszesz własną aplikację, ale chcesz wyposażyć ją w dodatkowe funkcje automatycznego przesyłania danych do obcych aplikacji?

Przecież, by to działało program musiałby przechowywać nazwy klas i okien tych aplikacji, co dało by się zrobić, gdyż dość łatwo można pobrać nazwę klasy spod wskaźnika myszy, więc można by wskazywać muszą program i automatycznie pobierać te dane. To jednak nie będzie działać ze wszystkimi aplikacjami - na pewno nie zadziała z przeglądarkami gdyż te są tak tworzony, by uniemożliwiać zdalne przejęcie nad nimi kontroli. Nie uda się w przypadku większości aplikacji.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Symulacja klawiszy na obcym programie

Nowy postprzez Mironas » piątek, 6 czerwca 2014, 19:38

Mój pomysł był prostszy.
Ręcznie wstawiam kursor tekstowy do właściwej formatki w obcym programie (poprzez kliknięcie na nim). W tym momencie wystarczyło by skutecznie zasymulować wpisywanie tekstu z klawiatury.

No ale trudno. Myślę że można zakończyć temat - już chyba nic nie wymyślimy.
Dzięki za zaangażowanie.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Symulacja klawiszy na obcym programie

Nowy postprzez Mironas » poniedziałek, 9 czerwca 2014, 18:59

Nie udało mi się zasymulować wpisywania loginu i hasła z klawiatury ale udało się zasymulować skrót klawiszowy ctrl+v. Wcześniej trzeba tylko wstawić wymagany tekst do schowka:
KOD cpp:     UKRYJ  
#include <clipbrd.hpp>
  // tekst do schowka
  Clipboard()->AsText = "login_lub_haslo_;)";

  // wstaw
  keybd_event(VK_CONTROL, 0, 0, 0);
  keybd_event('V', 0, 0, 0);
  keybd_event('V', 0, KEYEVENTF_KEYUP, 0);
  keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Symulacja klawiszy na obcym programie

Nowy postprzez Mironas » środa, 11 czerwca 2014, 13:55

I jeszcze jedna kwestia...
Jak przechwycić i anulować kliknięcie prawym przyciskiem myszki na obcej aplikacji?

Czyli - chciałbym wykryć, że kliknięto prawym klawiszem myszki na obcej aplikacji i wykonać własne operacje (symulacja ctrl+v) ale jednocześnie chciałbym aby nie otwierało się menu kontekstowe w tamtym programie.

Wykrycie kliknięcia nie jest problemem. Można to zrobić w Timerze albo założyć Hook'a na myszkę. Jednak co zrobić aby komunikat o kliknięciu nie dotarł do obcej aplikacji?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Symulacja klawiszy na obcym programie

Nowy postprzez Cyfrowy Baron » czwartek, 12 czerwca 2014, 00:01

Musiałbyś stworzyć keyloggera. Coś jak to: http://programowanie.cal.pl/cyfbar/api4.html#api4
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Symulacja klawiszy na obcym programie

Nowy postprzez Mironas » czwartek, 12 czerwca 2014, 10:15

No tak - ale problemem nie jest zrobienie keyloggera (kook-a) tylko anulowanie kliknięcia. Opisywany keylogger wykrywa kliknięcia ale nie anuluje ich.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 40 gości

cron