Zakładanie globalnego haka (WH_CBT).

Zakładanie globalnego haka (WH_CBT).
0

Witam,
Mój problem polega na tym, że hak się zakłada... Ładnie, pięknie, ale tylko na okno procesu mojej aplikacji, a chciałbym założyc go na cały system. Niżej zamieszczam kod funkcji z dll, którą zakładam tego haka.

Kopiuj
 void DLLIMPORT SetHook()
{
    MessageBox(0,"library loaded",0,0);
    hwnd=FindWindow("WinBlOcK","Windows Blocker");
    if(hwnd==NULL) MessageBox(0,"hwnd null",0,0);
    hook=SetWindowsHookEx(WH_CBT,&WindowHook,g_hInst,0);
    if(hook==NULL) MessageBox(0,"hook null",0,0);
} 

Proszę o pomoc w znalezieniu co jest nie tak.

0

podepnij go do explorer.exe ?

0

Mógłbyś mi podac jakiś kod jak to zrobic? Po prostu nie mam pojęcia jak to ma wyglądac.

gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
0

Problem leży chyba tutaj:

Kopiuj
hook=SetWindowsHookEx(WH_CBT,&WindowHook,g_hInst,0); 

Podajesz jako trzeci parametr uchwyt głównego wątku swojej aplikacji. Jak chcesz założyć "hak" na cały system to pozyskaj uchwyt głównego procesu w systemie :)

Nie wiem czy coś tu znajdziesz. Sam teraz to sobie czytam ;)
http://cpp0x.pl/kursy/Kurs-WinAPI-C++/Zaawansowane/Haki/199
Polecam też to:
http://www.vb4all.pl/vbm/czytam/vbm13/data/art12.htm
http://cpp0x.pl/dokumentacja/WinAPI/GetModuleHandle/270

0

Podajesz jako trzeci parametr uchwyt głównego wątku swojej aplikacji. Jak chcesz założyć "hak" na cały system to pozyskaj uchwyt głównego procesu w systemie

Spróbowałem skorzystac z Twojej rady. Użyłem do tego celu GetModuleHandle, jako parametr podałem ścieżkę do explorer.exe, ale teraz dostaję błąd 126: * The specified module could not be found.* I tak jest z każdym modułem jaki chcę załadowac. Błędy nie występują tylko w przypadku biblioteki z hakiem i programu, który go ładuje. Jeszce w razie czego kod:

Kopiuj
 HINSTANCE hI=GetModuleHandle("C:\\WINDOWS\\explorer.exe");
TN
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:1
1

Pomimo 8 lat odświeżam ten wątek, bo teraz samemu mam taki problem i nigdzie nie mogę znaleźć rozwiązania.

Czy właśnie problemem jest trzeci argument? Co tam podać?

several
Aż masz +1 za umiejętność używania szukajek.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:dzień
0

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Zobacz pozostałe 2 komentarze
TN
Tamten link przeniósł mnie na stronę: https://github.com/arlm/Global-CbtHook/tree/master/GlobalCbtHook , gdzie mam napisany przykładowy kod. Wzorowałem się na nim pisząc swój kod. W dllMain mam zatem hInst = hModule; i właśnie to hInst podaję jako 3 parametr tak jak jest to pokazane w tym przykładzie na stronie. Jednak to nie działa. Stąd ten mój wpis na tym forum.
_13th_Dragon
Podałem ci link, przy okazji uczy korzystania z google
TN
Bardzo dziękuję :) Tylko jaki jest sens tego forum skoro na każde pytanie można odpowiedzieć: skorzystaj z google? Z pewnością nie da się już znaleźć takiego problemu w programowaniu, którego by ktoś nie miał i by napisał rozwiązanie na forum. Skorzystałem z google, nie mogę rozwiązać tego problemu już długo. Jeżeli zatem nie masz pojęcia jak to zrobić, albo po prostu nie chcesz powiedzieć to nie musisz dowcipkować ( haha, się uśmiałem po pachy ), że mam googlować. Podesłałem cały projekt na githubie. Skoro korzystając z niego mam problem to nie jest to rzecz oczywista.
_13th_Dragon
Jak chcesz pogadać to do facebooka lub twitera lub coś w tym stylu
TN
Widzę wysoką inteligencję :) Zadałem kulturalnie pytanie. Nie potrafisz na nie odpowiedzieć nie atakując drugiej osoby. Ok, masz wiedzę, ale co z tego, jeśli nie chcesz jej przekazać? Równie dobrze wystarczyłby bot zamiast Ciebie, który by kierował do googla
Stefan_3N
  • Rejestracja:około 6 lat
  • Ostatnio:około miesiąc
  • Postów:145
1

Jeśli hak ma działać tylko w naszym programie, to parametr trzeci ma mieć wartość NULL, a parametr czwarty GetCurrentThreadId().

Jeśli hak ma działać w całym systemie, to należy stworzyć bibliotekę dll. W tej bibliotece umieszczamy procedurę, którą podpinamy do haka.
W programie zakładającym hak ładujemy tę bibliotekę dll i uchwyt do niej (otrzymany np. przez LoadLibrary) podajemy jako trzeci parametr. Parametr czwarty ma być w tym wypadku 0, natomiast parametr drugi, to adres zwrócony przez GetProcAddress (parametrem pierwszym w GetProcAddress będzie uchwyt do załadowanej biblioteki dll, a parametrem drugim będzie nazwa funkcji podpinanej).

Przed chwilą przetestowałem to i działa :-).


TN
Bardzo dziękuję za odpowiedź. Błąd był dość śmieszny -stworzyłem dllkę za pomocą QTa i prawdopodobnie podałem złe dyrektywy. Ściągnąłem dev c++ i jak za dotknięciem czarodziejskiej różdżki, zaczęło działać. Mam inny problem - nie działają mi haki założone na przeglądarki (edge,chrome). Próbowałem uruchomić program z prawami administratora - nie pomogło. Zarówno dllka jak i przeglądarki są 64 bitowe. Czy jest zatem coś w przeglądarkach, co sprawia, że nie działają one z hakami? W programie tylko zmieniam nazwę okna na który założyć hak - dla innych aplikacji wszystko działa.
TN
Jeszcze tylko nadmienię, że od strony kodowej pomimo, że ustawiam na dobrym oknie SetWindowsHookEx ( sprawdzam, czy jest nullem i nie jest ) to program "nie wchodzi" do funkcji CALLBACK cbtHookProc( int code, WPARAM wParam, LPARAM lParam ). Jednakże, gdy działam na tym oknie ( przeglądarka ) to działa ono ( i tylko ono ) bardzo wolno ( np. czas oczekiwania na minimalizację okna wynosi 3 sekundy ). Jakby hook był założony, ale coś blokowało przed wykonaniem funkcji cbtHookProc.
TN
Tzn. tą funkcję się wykorzystuje wewnątrz funkcji hookowej ( w moim przypadku cbtHookProc ). Problem jest taki, że mój kod w ogóle nie wchodzi do tej funkcji. Mam tylko problem z oknami przeglądarek - inne aplikacje są skutecznie "hookowane".
Stefan_3N
  • Rejestracja:około 6 lat
  • Ostatnio:około miesiąc
  • Postów:145
1

Z opisu tej funkcji (CallNextHookEx) wynika, że jeśli jest założony hak i wewnątrz tego haka nie wywołamy tej funkcji, to następne (ewentualne) haki nie zostaną wywołane. Ta funkcja zapewnia ciągłość wywoływania kolejnych haków (to tak samo jak z subklasowaniem klasy okna i wywoływaniem CallWindowProc).
Czyli gdyby autorzy przeglądarki chcieli zapobiec podłączaniu zewnętrznych haków, to mogliby po prostu podłączyć swój hak i nie wywołać tej funkcji.
Nie wiem, czy tak jest, ale być może ze względów bezpieczeństwa tak to jest zrobione. I w tej sytuacji po prostu nie da się podłączyć kolejnego haka.
Ale możesz spróbować dodać tę funkcję w swojej funkcji hakującej. Może pomoże.

Napisz coś więcej, co chcesz osiągnąć. Może da się zrobić inną metodą.


edytowany 1x, ostatnio: Stefan_3N
TN
Rzeczywiście ma to sens i pewnie tak jest. Bardzo dziękuję za pomoc!
TN
Właściwie nie mam większego celu ( nie jest to projekt na studia / do pracy ). Po prostu zastanawiało mnie, czy będę w stanie przejąć kontrolę nad przeglądarką i zablokować jej np. możliwość minimalizacji / maksymalizacji okna za pomocą WH_CBT i HCBT_MINMAX.
Stefan_3N
  • Rejestracja:około 6 lat
  • Ostatnio:około miesiąc
  • Postów:145
1

Możesz dla sportu znaleźć nazwę klasy głównego okna przeglądarki. Następnie za pomocą FindWindow znaleźć uchwyt głównego okna. I potem za pomocą SetClassLong() i GCL_WNDPROC podmienić procedurę okna. Przechwyć komunikat WM_SYSCOMMAND i zwróć 0.
Pozostałe komunikaty wpuść do CallWindowProc. Pierwszym parametrem będzie adres oryginalnej procedury, który otrzymasz w wywołaniu SetClassLong.
Może zadziała :-).


Zobacz pozostałe 4 komentarze
Stefan_3N
Szczerze powiedziawszy nie miałem potrzeby podmiany procedury okna w innym procesie. Ale wygląda na to, że znalazłeś rozwiązanie w podanym linku.
TN
Właśnie ten drugi sposób też znalazłem i z niego skorzystałem. Stworzyłem taką aplikację GUI tmp, która nic nie robi - udało mi się podmienić jej procedurę okna. Próbowałem identycznie postąpić z przeglądarką, ale tutaj już się nie udało. I teraz pytanie: czy wszystko zrobiłem dobrze? W DLLce mam funkcję, którą wywołuje z zewnętrznego programu, która z grubsza robi tylko SetWindowsHookEx(). Teraz w callbacku, który podaję jako 2 arg do SetWindowsHookEx() mam SetWindowLongPtr. W callbacku NewWndProc() mam już to, co chcę zrobić. Znowu SetWindowsHookEx nie jest nullem, ale
TN
mój kod nie trafia do cbtHookProc ( callback podany jako 2 arg do SetWindowsHookEx ). Zatem jest chyba CallNextHookEx nie jest wywoływany w haku stworzonym wcześniej przez twórców przeglądarki. Chyba, że zrozumiałem coś źle i powinienem to zrobić inaczej? Z jednej strony to nie mogę wywoływać SetWindowsHookEx skoro i tak nic to nie da ( brak CallNextHookEx ), ale z drugiej dzięki temu SetWindowsHookEx jest w ogóle odpalana dllka dla przeglądarki.
Stefan_3N
Wydaje mi się, że przeglądarka może być zabezpieczona przed tego typu działaniami. I dobrze, bo przecież można byłoby założyć hak i przechwytywać wrażliwe dane.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.