Wykrycie zlapania uchwytu przez inny program

0

Cześć,
mam do Was nietypowe pytanie. Wiem w jaki sposób złapać uchwyt okna innego programu.

Zastanawiam się czy jest możliwość wyłapania tego w drugą stronę. Czyli, że program, którego okno jest łapane jest w stanie to wykryć.

Czy istnieją takie metody?

pozdrawiam!

1

Ciekawe pytanie. Musiałbyś ustawić globalny systemowy hook na FindWindow(Ex) itp. i sprawdzać (wywołać oryginalne FindWindow(Ex)) czy ktoś używa tych funkcji i jeśli wykryjesz, że zwracany jest uchwyt twojego okna, zwracać NULL. Samo szukanie okien nie wywołuje żadnych komunikatów w pętli tego wyszukiwanego okna, więc nie ma żadnych powiadomień. Być może są inne metody, ale o nich nie słyszałem, w sumie pierwszy raz takie pytanie widzę.

Jeśli chcesz się chronić przed tym, że ktoś pobierze uchwyt twojego okna przez te funkcje, to niektóre programy losowo generują tytuł okienka i czasami nazwę klasy. Może nie jest to zbyt eleganckie rozwiązanie, ale działa.

1

A czy aktualne Delphi umożliwia w ogóle wybranie nazwy klasy, którą to potrzebuje np. FindWindow?

Z tego co mi wiadomo, starsze Delphi miały hardkodowaną nazwę klasy dla wszystkich okien; Podobnie pod Lazarusem - nazwa klasy wszystkich okien jest zapisana na sztywno w kodzie biblioteki standardowej (nie wiem jak to nazwać) i nie ma możliwości jej zmiany/wyboru - za każdym razem jest to po prostu Window;

Pisząc swój projekt, a konkretniej zabezpieczenie przed uruchomieniem kolejnej instancji, miałem z tym problem; Jaką nazwę klasy bym nie podawał to za każdym razem okna nie znajdowało; Wyczaiłem nazwę klasy dopiero w programie testowym, który pobrał tytuły i nazwy klas wszystkich okien (za pomocą EnumWindows); Okazało się, że wszystkie okna programów kompilowanych w Lazarusie mają taką samą nazwę klasy... Wewnętrznie, bo nazwa klasy formularza np. TMainForm nie sprawia, że funkcja FindWindow znajdzie okno, jeśli w pierwszym parametrze dostanie ciąg TMainForm.

1

Jeżeli chcesz zablokować pobierania uchwytu do twojego okna to możesz stworzyć okno na osobnym Desktopie.

1

Bart ma rację to chyba jedyna metoda. Jednak oozostaje tutaj też kwedtia ewentualmego wykrywania nowych procesów w systemie i zastosowania hooka w ramach tych nowych procesów. Bo o ile wiem nie ma skutecznej metody zaaplikowania hooka bez uwzględniania pojawiających się procesów. Inaczej te nowe nie będą objęte jakby naszą kontrolą. Fakt, że są rozwiązania oparte o Hook na Createwnd ale nie każdy prces tworzy okno. Poza tym zawsze należy taki hook wywoływać własnym loaderem z dllki. A przynajmniej z takich rozwiązań skutecznie korzystałem. Pomijam pisanie driverów, na tym się nie znam i chyba nie jest to do ogarnięcia w żadnum Delphi.

Co do hooków jeszcze to nalż\ało by uniemożliwić pracę funkcjom enumerującym także okna i okna potomne oraz ewentualnie procesy. Oczywiście w odniesieniu do naszej aplikacji. Bo i nimi da się uzyskać uchwyty. Co do zmiany klasy okna to wydaje się mi że da się to zawsze zrobić. W razie czego Hook na CreateWindow w ramach naszego prrocesu, co powinno soę udać. A najleiej zrbić jak w Operze 12.X. Wszystkie kontorlki jako jedna klasa, ale nie wiem jak się to odbywa od strony kodu.

3
furious programming napisał(a):

A czy aktualne Delphi umożliwia w ogóle wybranie nazwy klasy, którą to potrzebuje np. FindWindow?

Z tego co mi wiadomo, starsze Delphi miały hardkodowaną nazwę klasy dla wszystkich okien; Podobnie pod Lazarusem - nazwa klasy wszystkich okien jest zapisana na sztywno w kodzie biblioteki standardowej (nie wiem jak to nazwać) i nie ma możliwości jej zmiany/wyboru - za każdym razem jest to po prostu Window;

W Delphi standardowo nazwą klasy jest nazwa formatki z przedrostkiem T ale jeżeli ktoś chciałby losowo zmieniać nazwę klasy okna to nie ma problemu można do tego wykorzystać CreateParams.

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WinClassName:= 'Test';
end;
1

No niestety, pod Lazarusem nazwa klasy okien jest naprawdę hardkodowana i nie da się jej zmienić nawet przez CreateParams; Dlatego też aby znaleźć okno, w pierwszym parametrze konieczne jest podanie ciągu Window.

1

Okno to najmniejszy problem ;), jak ktoś się postara to wykryje proces po wielu elementach, np. tak:

user image

A jak ktoś się naprawdę uprze to zrobi enumerację procesów, zczyta ich pamięć i sprawdzi wzory bajtów w kodzie dla specyficznych procek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1