Hook
-
Hallo,
ich versuche grad einen Keyboard Hook zu setzen aber es will net...Hier der Code:
- Exe (keylogger.cpp)
// includes #include <windows.h> #include "keylogger.h" // functions LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); // public HHOOK hHook; // api entry int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd) { // private MSG message; WNDCLASS wc; // init wc ZeroMemory(&wc, sizeof(WNDCLASS)); wc.hInstance = hInstance; wc.lpfnWndProc = (WNDPROC)WndProc; wc.lpszClassName = "hook"; RegisterClass(&wc); // create window HWND hWnd = CreateWindowEx( 0, "hook", "hook", WS_OVERLAPPED, 0,0,0,0, 0, 0, hInstance, 0 ); // loop while(GetMessage(&message, NULL, 0, 0)){ TranslateMessage(&message); DispatchMessage(&message); } return 0; } // the window proc LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg){ case WM_CREATE: typedef void (CALLBACK* pSUC)(); HMODULE hDLL = LoadLibrary("dll.dll"); if(hDLL!=NULL){ pSUC pSetupHook = reinterpret_cast<pSUC>(GetProcAddress(hDLL, "SetupHook")); pSetupHook(); } else MessageBox(0, "ohhhhh", 0, 0); return 0; } return DefWindowProc(hWnd, msg, wParam, lParam); }
- Exe (keylogger.h)
#ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif // clisrv.cpp EXPORT int CALLBACK SetupHook();
- Dll
#include <windows.h> #include "..\keylogger.h" LRESULT CALLBACK KeyboardHookProc(int, WPARAM, LPARAM); HINSTANCE hDllInstance; HHOOK hKeyboardHook; int APIENTRY DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) { MessageBox(0, "Dll entry", 0, 0); hDllInstance = hInstance; return TRUE; } int CALLBACK SetupHook(void) { /*hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProc, hDllInstance, NULL ); if (hKeyboardHook == NULL) { return FALSE; }*/ return 1; } BOOL CALLBACK UnInstallHooks(void) { return UnhookWindowsHookEx(hKeyboardHook); } LRESULT CALLBACK KeyboardHookProc ( int nCode, WPARAM wParam, LPARAM lParam ) { if(nCode < 0) return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); }
Beim Ausführen bekomme ich ein Exception: Access Violation
Es geht bei meinem Problem wahrscheinlich weniger um das Problem Hooks sondern darum wie man Funktion aus DLL's lädDanke!
cu para
[ Dieser Beitrag wurde am 23.11.2002 um 21:30 Uhr von paranoiac.org editiert. ]
[ Dieser Beitrag wurde am 24.11.2002 um 09:57 Uhr von paranoiac.org editiert. ]
-
mach das scheiss CALLBACK vor der Setup Funktion weg. das zerschießt dir den ganzen namen und bringt nix
-
Wow!
Es funktioniert! Ich wusste eigentlich dass es nur ein kleiner Fehler sein kann.
Jetzt frage ich mich aber natürlich wofür ich das CALLBACK dann brauchen würde, also ich möchte einfach mal wissen wofür es gut ist und warum ich es gerade bei dieser Funktion nicht benutzen darf, bei den anderen scheint es ja nichts auszumachen.Danke!
cu para
-
Suchfunktion benutzen, das steht schon mindestens einmal im Forum. Du darfst auch CALLBACK benutzen, aber dann bekommt die Funktionen einen wirschen Namen ala SetupHook@2374082sdfjozg29354u ( <- war übertrieben :p ). Den musst du dann bei GetProcAddress angeben
-
Quatsch.
CALLBACK hat nichts mit dem Namen zu tun.
Es legt die Aufrufkonvention fest, also z.B. in welcher Reihenfolge die Parameter übergeben werden und so was.
-
Auf jeden Fall ändert der Visual C++ Compiler daraufhin den Namen der Funktion! @ Mod :p
-
Das kann nicht am CALLBACK liegen. Oder ist der MSVC++ so komisch, dass es doch daran liegt?
Solange extern "C" vor der Funktion steht, weiß der Compiler dass er den Namen nicht dekorieren darf. Das macht er nur wenn kein extern "C" davor steht.
-
Ich denke mal das es an CALLBACK liegt und jeder Compiler so handeln wird. Du kannst es ja einfach mal ausprobieren.
-
Okay.
int foo(int, char*);
Wird beim vc++ zu ?foo@@YAHHPAD@Z. Soweit logisch.
extern "C" int foo(int, char*);
Das wird zu _foo. Das ist auch logisch.
extern "C" int CALLBACK foo(int, char*);
Das wird zu _foo@8. Okay, ein Kompromiss.
Die Zahl drückt einfach nur die Größe der Parameter aus. Nichts besonderes, und nicht besonders geeignet zum Überladen, da der Typ der Parameter nicht angegeben wird. Aber du hast Recht, der Name wird ein wenig dekoriert.Mit CALLBACK ohne extern "C" wird es wieder zu dem dekorierten Namen ?foo@@YGHHPAD@Z, fast wie oben.
[ Dieser Beitrag wurde am 25.11.2002 um 14:04 Uhr von cd9000 editiert. ]