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:prawie 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:ponad 3 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:2 miesiące
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:8 dni
  • 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:8 dni
  • 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:8 dni
  • 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 :-).


TN
Brzmi jak dobry plan. Dzisiaj już tego nie będę robił, ale jutro z pewnością spróbuję. Dziękuję!
TN
Trochę dzisiaj kombinowałem z podmienianiem procedur okna ( ale jeszcze nie w przeglądarkach, a we własnych apkach ). Podmienienie procedury w aplikacji w której wywołuję SetClassLong() działa idealnie. Problem zaczyna się, gdy mam aplikację X i chcę zamienić procedurę okna w aplikacji Y. Otrzymuję wtedy błąd 5 - Access Danied. Spojrzałem na stacka i muszę wywołać tą podmianę w aplikacji Y. Pomyślałem o dllce. Niestety nie wiem jak to ugryźć. Próbowałem w DllMain po prostu wywołać EnumWindows(), w którym sprawdzałbym, czy tytuł okna to tytuł apki Y. Bez problemu znajduje to
TN
okno, lecz podmiana za pomocą SetWindowLongPtr nic nie daje, bo znowu otrzymuję error = 5, czyli znowu nie jest to ten proces. Jak zatem można dotrzeć do procesu aplikacji Y, aby móc podmienić okno?
TN
Znalazłem taką stronę: https://www.codeproject.com/Articles/38453/Inject-My-DLL-Into-a-Process Ale wydaje mi się to trochę aż nadto hakerskie
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.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)