Ĺadny brzuch
Witam
W książce c++ elementarz hakera był przykład biblioteki DLL Oto jej kod:
dll.h
#include <windows.h> #define DllExport extern "C" __declspec(dllexport) DllExport void RunStopHook(bool State, HINSTANCE hInstance);
dllmain.cpp
#include "dll.h" HHOOK SysHook; HWND Wnd; HINSTANCE hInst; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserve ) { hInst = (HINSTANCE)hModule; return TRUE; } LRESULT CALLBACK SysMsgProc( int code, // Kod zaczepu WPARAM wParam, // Znacznik usuwania LPARAM lParam // Adres struktury komunikatu ) { // Prześlij komunikat do pozostałych zaczepów systemu CallNextHookEx(SysHook, code, wParam, lParam); // Sprawdź komunikat if (code == HC_ACTION) { // Pobierz uchwyt okna, które wygenerowało komunikat Wnd = ((tagMSG*)lParam)->hwnd; // Sprawdzenie typu komunikatu. // Czy użytkownik nacisnął prawy klawisz myszy? if (((tagMSG*)lParam)->message == WM_RBUTTONDOWN) { SendMessage(Wnd, EM_SETPASSWORDCHAR, 0, 0); InvalidateRect(Wnd, 0, true); } } return 0; } /////////////////////////////////////////////////////////////////// DllExport void RunStopHook(bool State, HINSTANCE hInstance) { if (true) SysHook = SetWindowsHookEx(WH_GETMESSAGE, &SysMsgProc, hInst, 0); else UnhookWindowsHookEx(SysHook); }
Moje pytanie brzmi dlaczego gdy kompiluję ten kod w Dev c++. Następnie wywołam funkcję RunStopHook nie jest zakładany zaczep, a gdy zastąpie orginalną biblioteką wszystko działa jak powinno? Orginalny kod był chyba w Visual c++ pisany. Dodam jeszcze że gdy do biblioteki dodam inną funkcję to ona działa.
Marsz do FAQ !!!!! ;p (tylko pomin to felix.leg-a bo to kompletne bzdury i brednie. Przeczytaj ten temporala a bedziesz wiedzial ;) )
// edit2 do migajka - a zreszta olac ;)
Użytkownik st3tc edytował ten post 19 grudzień 2005, 19:47
Marsz do FAQ !!!!! ;p (tylko pomin to felix.leg-a bo to kompletne bzdury i brednie. Przeczytaj ten temporala a bedziesz wiedzial ;) )
a co Ci zwraca SetWindowsHookEx ?. Sprawdz czy nie null-ek. Jak nulek wywolaj GetLastError. Sprawdz tez poprawnosc hinstance.
Użytkownik st3tc edytował ten post 19 grudzień 2005, 20:41
a co Ci zwraca SetWindowsHookEx ?. Sprawdz czy nie null-ek. Jak nulek wywolaj GetLastError. Sprawdz tez poprawnosc hinstance.
jezeli uzywasz thread id == 0, to hinstance musi wskazywac na dll-ke (o ile pamietam ;) ). Prosta metoda - GetModuleHandle( "nazwa_tej_dll-ki"). To zwroci handle - ale to to samo co hinstance (scastuj).
// edit - naturalnie pobiez to w dll-ce (handle do samej siebie ;)). Z DllMain byly jakies jazdy - juz nie pamietam dokladnie (nie chce mi sie szukac ;) )
Użytkownik st3tc edytował ten post 19 grudzień 2005, 22:37
jezeli uzywasz thread id == 0, to hinstance musi wskazywac na dll-ke (o ile pamietam ;) ). Prosta metoda - GetModuleHandle( "nazwa_tej_dll-ki"). To zwroci handle - ale to to samo co hinstance (scastuj).
// edit - naturalnie pobiez to w dll-ce (handle do samej siebie ;)). Z DllMain byly jakies jazdy - juz nie pamietam dokladnie (nie chce mi sie szukac ;) )
Ja juz Ci dalem rade - dalej to juz rob jak chcesz ;)
Już sam nie wiem co jest źle. Skopiowałem dokładnie cały kod z książki, skompilowałem w DEVc++. Następnie przeniosłem bibliotekę do katalogu programu głównego i jednak też zaczep nie został założony. Działa tylko skompilowana bibliotkeka ktra znajduje sie na CD tej książki.
a zrobiles jak mowilem ?. Sprawdziles hinstance co idzie do SetWindowHook ?. Jezeli jest null to pobrales wlasnorecznie handle (hinstance) dll-ki i przekazales ?. Czytales helpa z PSDK ? ;). Nie mozna biadolic tylko uwaznie czytac posty :). DllMain wcale nie musi byc DllMain. dll-ka moze miec dowolne "entry".
a zrobiles jak mowilem ?. Sprawdziles hinstance co idzie do SetWindowHook ?. Jezeli jest null to pobrales wlasnorecznie handle (hinstance) dll-ki i przekazales ?. Czytales helpa z PSDK ? ;). Nie mozna biadolic tylko uwaznie czytac posty :). DllMain wcale nie musi byc DllMain. dll-ka moze miec dowolne "entry".
Tylko czemu DllMain sie nie wykonuje?
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
W książce c++ elementarz hakera był przykład biblioteki DLL Oto jej kod:
dll.h
#include <windows.h> #define DllExport extern "C" __declspec(dllexport) DllExport void RunStopHook(bool State, HINSTANCE hInstance);
dllmain.cpp
#include "dll.h" HHOOK SysHook; HWND Wnd; HINSTANCE hInst; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserve ) { hInst = (HINSTANCE)hModule; return TRUE; } LRESULT CALLBACK SysMsgProc( int code, // Kod zaczepu WPARAM wParam, // Znacznik usuwania LPARAM lParam // Adres struktury komunikatu ) { // Prześlij komunikat do pozostałych zaczepów systemu CallNextHookEx(SysHook, code, wParam, lParam); // Sprawdź komunikat if (code == HC_ACTION) { // Pobierz uchwyt okna, które wygenerowało komunikat Wnd = ((tagMSG*)lParam)->hwnd; // Sprawdzenie typu komunikatu. // Czy użytkownik nacisnął prawy klawisz myszy? if (((tagMSG*)lParam)->message == WM_RBUTTONDOWN) { SendMessage(Wnd, EM_SETPASSWORDCHAR, 0, 0); InvalidateRect(Wnd, 0, true); } } return 0; } /////////////////////////////////////////////////////////////////// DllExport void RunStopHook(bool State, HINSTANCE hInstance) { if (true) SysHook = SetWindowsHookEx(WH_GETMESSAGE, &SysMsgProc, hInst, 0); else UnhookWindowsHookEx(SysHook); }
Moje pytanie brzmi dlaczego gdy kompiluję ten kod w Dev c++. Następnie wywołam funkcję RunStopHook nie jest zakładany zaczep, a gdy zastąpie orginalną biblioteką wszystko działa jak powinno? Orginalny kod był chyba w Visual c++ pisany. Dodam jeszcze że gdy do biblioteki dodam inną funkcję to ona działa.
Marsz do FAQ !!!!! ;p (tylko pomin to felix.leg-a bo to kompletne bzdury i brednie. Przeczytaj ten temporala a bedziesz wiedzial ;) )
// edit2 do migajka - a zreszta olac ;)
Użytkownik st3tc edytował ten post 19 grudzień 2005, 19:47
Marsz do FAQ !!!!! ;p (tylko pomin to felix.leg-a bo to kompletne bzdury i brednie. Przeczytaj ten temporala a bedziesz wiedzial ;) )

a co Ci zwraca SetWindowsHookEx ?. Sprawdz czy nie null-ek. Jak nulek wywolaj GetLastError. Sprawdz tez poprawnosc hinstance.
Użytkownik st3tc edytował ten post 19 grudzień 2005, 20:41
a co Ci zwraca SetWindowsHookEx ?. Sprawdz czy nie null-ek. Jak nulek wywolaj GetLastError. Sprawdz tez poprawnosc hinstance.

jezeli uzywasz thread id == 0, to hinstance musi wskazywac na dll-ke (o ile pamietam ;) ). Prosta metoda - GetModuleHandle( "nazwa_tej_dll-ki"). To zwroci handle - ale to to samo co hinstance (scastuj).
// edit - naturalnie pobiez to w dll-ce (handle do samej siebie ;)). Z DllMain byly jakies jazdy - juz nie pamietam dokladnie (nie chce mi sie szukac ;) )
Użytkownik st3tc edytował ten post 19 grudzień 2005, 22:37
jezeli uzywasz thread id == 0, to hinstance musi wskazywac na dll-ke (o ile pamietam ;) ). Prosta metoda - GetModuleHandle( "nazwa_tej_dll-ki"). To zwroci handle - ale to to samo co hinstance (scastuj).
// edit - naturalnie pobiez to w dll-ce (handle do samej siebie ;)). Z DllMain byly jakies jazdy - juz nie pamietam dokladnie (nie chce mi sie szukac ;) )

Ja juz Ci dalem rade - dalej to juz rob jak chcesz ;)
Już sam nie wiem co jest źle. Skopiowałem dokładnie cały kod z książki, skompilowałem w DEVc++. Następnie przeniosłem bibliotekę do katalogu programu głównego i jednak też zaczep nie został założony. Działa tylko skompilowana bibliotkeka ktra znajduje sie na CD tej książki.
a zrobiles jak mowilem ?. Sprawdziles hinstance co idzie do SetWindowHook ?. Jezeli jest null to pobrales wlasnorecznie handle (hinstance) dll-ki i przekazales ?. Czytales helpa z PSDK ? ;). Nie mozna biadolic tylko uwaznie czytac posty :). DllMain wcale nie musi byc DllMain. dll-ka moze miec dowolne "entry".
a zrobiles jak mowilem ?. Sprawdziles hinstance co idzie do SetWindowHook ?. Jezeli jest null to pobrales wlasnorecznie handle (hinstance) dll-ki i przekazales ?. Czytales helpa z PSDK ? ;). Nie mozna biadolic tylko uwaznie czytac posty :). DllMain wcale nie musi byc DllMain. dll-ka moze miec dowolne "entry".

Tylko czemu DllMain sie nie wykonuje?
