Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Špiónská aplikace v C# - 1. díl

Vítejte u prvního dílu mého tutoriálu, ve kterém vám ukážu své mistrovské dílo. Dobrá, to možná přeháním... V tomto tutoriálu vám prostě ukážu, jak naprogramovat takovou „špiónskou“ aplikaci v C#.

Co to bude umět

V době psaní prvního dílu této série můj program už umí sledovat kameru, mikrofon a sledovat stisknuté klávesy, ovšem našim cílem bude, aby aplikace nakonec uměla:

  • sledovat libovolnou webkameru
  • odposlouchávat libovolný mikrofon
  • sledovat stisknuté klávesy
  • sledovat uživatelskou plochu a virtuálně na ní klikat (což nám v praxi umožní ovládat vzdálený počítač)
  • vzdáleně spouštět příkazy (cmd)
  • přetahovat soubor sem a tam
  • trošku uživatele "potrolit" zobrazováním libovolných zpráv
  • zobrazit nějaké základní informace o vzdáleném počítači

Články sem budu postupně dávat - každý týden jeden. Nejprve si napíšeme na použití co nejjednodušší server a klienta, pak si ho nějak šikovně obalíme, abychom si vytvořili takovou základnu, na které budeme moci snadno stavět. Jednotlivé špiónské funkce si rozdělíme na „moduly“, se kterými budeme pak moci díky základně snadno a jednotně pracovat a snadno si díky ní budeme moci doprogramovat nové funkce. Budeme tedy mít modul na sledování kamery, modul na odposlouchávání mikrofonu atd.

Jeden z hlavních důvodů, proč chci tento svůj výtvor ukázat světu, je ten, že jsem celou aplikaci udělal bez použití jakýchkoli Invoke či používání DirectShow, pouze za použití čistého C# a managed knihoven. Používání Invoků opravdu nemám rád a všechny projekty co obalovaly DirectShow, na které jsem narazil, byly buď mizerně dokumentované, nebo staré. Naštěstí jsem ale narazil na tento článek na stránkách CodeProject (http://www.codeproject.com/…am-C-library), který dělá přesně to, co potřebuji: prostě vrací Bitmapy. Přenos videa si tedy uděláme (i když zdaleka ne tak hospodárně jako s DirectShow, zato ale snadno) po svém. U mikrofonu jsem narazil také na skvělou knihovnu NAudio, která opět prostě vrací (a pak zase umí přehrát) pole bajtů a u keyloggeru pak na tento projekt na CodePlexu (https://keyboardmousehooks.codeplex.com/). Za pomoci těchto knihoven tedy naprogramujeme naši špiónskou aplikaci. Nuže vrhněme se na první část, na server a klienta!

Jak to uděláme

Základem naší aplikace bude spolehlivý a na použití jednoduchý server a klient. Než ale začneme psát kód, musíme si trochu promyslet, jak bude vlastně naše komunikace vypadat. Server a klienta jsem během vývoje několikrát upravoval, právě kvůli tomu, že jsem předělával strukturu zpráv. Současná podoba ale myslím docela vyhovuje. Zpráva bude mít pochopitelně hlavičku a tělo, hlavička bude obsahovat délku těla a dva bajty nesoucí další informace.

Každou zprávu v naší komunikaci tedy budeme odesílat a číst takto:

  • Přečte se 8 bajtů jako long, ten nám bude značit jak dlouhá je naše zpráva
  • Přečte se další bajt, který nám říká, která část programu zprávu poslala (a tedy které části programu má být předána), např. zdali ji poslal modul na sledování kamery, či keylogger
  • Přečte se další bajt, který nám říká, co je vlastně tělem zprávy, např. zdali je to snímek z kamery, či nastavení.
  • Přečte se tolik dalších bajtů, kolik nám říká long, který jsme přečetli na začátku

Dále si musíme ustanovit jednotné kódování stringů. Já použil UTF-8. Server i klient musí také pochopitelně běžet ve více vláknech, budeme tedy mít vlákno odesílací a vlákno naslouchací, které vytvoří (po připojení) pro každého klienta jeho vlastní vlákno, které ho bude obsluhovat. A protože nejspíše nechceme, aby nám naše supertajné zprávy někdo četl, budeme to celé šifrovat. K tomu použijeme SslStream, což nám napovídá, že budeme používat asymetrické šifrování za pomoci protokolu SSL. Pokud nevíte, co že je to asymetrické šifrování, hned to vysvětlím. Nejsem sice žádný expert na kryptografii, ale spočívá to v tom, že (na rozdíl od symetrického) máme dva klíče, šifrovací a dešifrovací. Šifrovacím klíčem (jak název napovídá) data zašifrujeme, ale přečíst je můžeme jen dešifrovacím. Šifrovací klíč můžeme tedy beze strachu nechat veřejně přístupný a nikdo nám naši komunikaci stejně nepřečte.

Pro znázornění jsem použil tento obrázek z Wikipedie:

Špiónská aplikace v C# .NET

Nuže vše jsme si rozmysleli, ale musíme si ještě pro zprovoznění šifrování vygenerovat SSL certifikáty.

Generování certifikátů

Zní to sice možná kdovíjak vznešeně, ale takový certifikát není nic jiného, než soubor, který obsahuje klíče, se kterými budeme šifrovat. K jeho vytvoření použijeme program OpenSSL podle tohoto tutoriálu:

Link pro stažení na stránkách OpenSSL už bohužel není, ale tu samou stránku lze najít zde:

http://slproweb.com/…OpenSSL.html

Zde si stáhněte 64 nebo 32 bitovou verzi tohoto programu, nainstalujte, přidejte cestu k němu do systémové proměnné PATH (aby se nám s ním lépe pracovalo) a podle zbytku videa vygenerujte a někam schovejte svoje certifikáty.

Když máme náš veřejný a privátní certifikát vytvořený, můžeme se vrhnout na kód. Založíme si tedy ve Visual Studiu nový solution a v něm nový projekt Class Library a nějak ho pojmenujeme. Já si ho pojmenoval SharpNet.

Byl jsem donucen článek rozdělit na dva díly, neboť i se zdrojáky byl moc veliký, v příštím dílu už tedy nebudeme plánovat, ale vrhneme se rovnou na kód a naprogramujeme si server.


 

Všechny články v sekci
Špiónská aplikace v C# .NET
Článek pro vás napsal jiri.sada
Avatar
Uživatelské hodnocení:
11 hlasů
Autor se věnuje programování v C#, stříhání a úpravou videí a efektů do nich, trollení svých kamarádů drobnými viry a obecně všemu okolo počítačů a elektroniky s Androidem
Aktivity