globaler keyboard hook geht nicht
-
...
// EDIT : schon wieder zweimal auf Absenden geklickt
...
-
merker schrieb:
Welche Meldung wird angezeigt wenn Du "Keylogger_starten ()" aufrufst ?
hook erfolgreich gesetzt
-
Seltsam, die DLL ist grundsätzlich ok.
Probier mal ob Du die Funktionen dynamisch zu fassen kriegst, in etwa so:// Funktionspointer BOOL (WINAPI *KL_starten) (); BOOL (WINAPI *KL_stoppen) (); HINSTANCE instDLL; ... // initialisieren instDLL = LoadLibrary((LPCTSTR) "hook.dll"); KL_starten = (BOOL (WINAPI *)()) GetProcAddress(instDLL, "Keylogger_starten"); KL_stoppen = (BOOL (WINAPI *)()) GetProcAddress(instDLL, "Keylogger_stoppen"); ... // aufrufen KL_starten (); MessageBox (0,"KL_starten ()","",0); KL_stoppen (); MessageBox (0,"KL_stoppen ()","",0);
-
nee geht auch nicht.
kann ja auch eigentlich nicht der grund sein oder? -denn die Keylogger_starten / Keylogger_stoppen Fkts werden ja aufgerufen und erzeugen brav ihre MessageBoxen.
Ich hätte jetzt noch 2 Vermutungen.
1. Könnte es sein das ich einen Virus hab, der sich in die Hook Chain immer vor mich einträgt und dann nicht die CallNextHookEx Fkt aufruft, also meine fkt aus der chain wirft?
2. Kann es sein das an der dll irgendwas nicht stimmt. und windows die deswegen nicht laden kann. z.b. wegen zugriffsrechten oder weil sie schon geladen ist oder sonst was?bin eucht echt super dankbar wenn sich jemand damit auskennt und mir was schreibt, auch wenns nur ne vermutung ist.
-
achso da fällt mir gerade noch etwas auf. das Handle auf die instanz der dll (hInstance) ist immer 10000000.
kann es sein das dieser Wert falsch ist?
muss ich vllt hInstance von der aufrufenden exe nehmen?
-
Auweiha, das habe ich eben erst gesehen.
Kommentiere mal aus der "KeyboardProc" alles aus, so dass nur noch folgendes übrigbleibt :LRESULT CALLBACK KeyboardProc (int code, WPARAM wParam, LPARAM lParam) { static int nPos; // <- nPos nicht initialisiert MessageBox (NULL,"in KeyboardProc", "logged", 0x00200000L); return CallNextHookEx(hKeyboardHook, code, wParam, lParam); }Dann probiere nochmal.
-
ich merk gerade das handle das im Parameter hinstDll von DllMain übergeben wird ist das gleiche wie ich es erhalte wenn ich GetModuleHandle(0) aufrufe. bei GetModuleHandle steht allerdings in der msdn: "The returned handle is not global or inheritable. It cannot be duplicated or used by another process."
damit hat es doch ganz sicher etwas zu tun.
gibt es sonst noch eine möglichkeit das handle der dll zu ermitteln (außer im hinstDll Paramter oder GetModuleHandle oder LoadLibrary) ?
-
merker schrieb:
Auweiha, das habe ich eben erst gesehen.
Kommentiere mal aus der "KeyboardProc" alles aus, so dass nur noch folgendes übrigbleibt :
...
Dann probiere nochmal.hab ich. geht trotzdem nicht

-
0x0001 schrieb:
damit hat es doch ganz sicher etwas zu tun.
Nein, hat es nicht. Die DLL wird (soll) ja vom Betriebssystem in jeden laufenden Prozess geladen werden. Da können die Adressen schon unterschiedlich sein.
Hast Du die DLL neu kompiliert ? Mir kommt es so vor, als ob der Hook zwar installiert wurde, aber die MessageBox wird nicht angezeigt.
-
merker schrieb:
Hast Du die DLL neu kompiliert ?
ja hab ich.
merker schrieb:
Mir kommt es so vor, als ob der Hook zwar installiert wurde, aber die MessageBox wird nicht angezeigt.
kommt mir auch so vor, da SetWindowHookEx keinen fehler zurückliefert
-
Setz mal einen Zähler in die "KeyboardProc" und prüfe ob der hochgezählt wird / wurde.
-
ich hab ein vb programm geschrieben welches in einem timer ( 1 millisekunde) Keylogger_start aufruft.
dadurch wird immer wieder die nachricht "hook erfolgreich gesetzt" angezeigt. wenn ich dann die entertaste kurze zeit gedrückt halte ( die nachricht wird ganz oft weggeklickt) dann erhalte ich dann immer im wechsel "hook erfolgreich gesetzt" und "KeyboardProc"
-
ich seh gerade mit dem timer hat das doch nichts zu tun, eh geht auch ohne timer, aber nur in dem vb programm... komisch
-
0x0001 schrieb:
geht auch ohne timer, aber nur in dem vb programm...
Na also, der Hook funktioniert.
Du darfst aber "Keylogger_start ()" nur einmal aufrufen. Dann wird die DLL in jeden Prozess geladen. Wenn das VB-Programm beendet wird, dann wird auch der Hook beendet.
Schreib das VB-Programm mal so um, dass es zwei Buttons hat (start und stopp) und probier nochmal.
-
ja das hatte ich eh schon gemacht. der hook geht jetzt auch. nur das entladen ist irgendwie noch komisch.
wenn ich Keylogger_stoppen aufrufe passiert nix. wenn ich das programm beende ist der keylogger auch beendet.
liegt sicher daran das dann auch die dll entladen wird. aber wie kann ich den keylogger anhalten ohne das programm zu beenden?
-
Zeigt "Keylogger_stoppen ()" eine Meldung ?
Nebenbei bemerkt : Wenn das mit dem VB-Programm klappt, dann klappt es auch mit jedem anderen Programm.
-
merker schrieb:
Nebenbei bemerkt : Wenn das mit dem VB-Programm klappt, dann klappt es auch mit jedem anderen Programm.
ja, das es nicht an der Programmiersprache liegt war mir auch schon klar.
ich bin gar nicht so schlecht in proggen/win32 api wie man vermuten muss, wenn man mein problem hier betrachtet
naja, also mein GROßER Fehler war anscheinend, dass ich die hook.dll aus eienm service heraus aufrufen will, ich denke das ich das problem. das funktioniert übrigens bis jetzt noch nicht.
wenn ich die dll mit dem vb programm benutzt, wird sie 1 mal geladen. wenn ich sie mit dem service programm lade wird sie allerdings 2 mal geladen und direkt im anschluss 1 mal wieder entladen und dann noch einmal beim beenden des services.
das ist auch ganz schön suspekt.
( also mit geladen und entladen mein ich, dass die DllMain mit dwReason DLL_PROCESS_ATTACH bzw DLL_PROCESS_DETACH aufgerufen wird)
-
0x0001 schrieb:
ich bin gar nicht so schlecht in proggen/win32 api wie man vermuten muss, wenn man mein problem hier betrachtet
Niemand vermutet hier irgendwas.
Wenn ich das jetzt richtig verstanden hab, dann funktioniert die hook.dll mit dem VB-Programm, aber nicht wenn sie aus einem Service heraus geladen wird ?
// EDIT : Name vergessen
-
merker schrieb:
Wenn ich das jetzt richtig verstanden hab, dann funktioniert die hook.dll mit dem VB-Programm, aber nicht wenn sie aus einem Service heraus geladen wird ?
ja