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.

 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.

0

Problem leży chyba tutaj:

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:

 HINSTANCE hI=GetModuleHandle("C:\\WINDOWS\\explorer.exe");
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ć?

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 :-).

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ą.

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 :-).

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