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

C# .NET Pro pokročilé Š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:

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.


 

  Aktivity (4)

Článek pro vás napsal jiri.sada
Avatar
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

Jak se ti líbí článek?
Celkem (9 hlasů) :
4.666674.666674.666674.666674.66667


 


Miniatura
Předchozí článek
Jak zabíjet Windows Update
Miniatura
Všechny články v sekci
C# - Pro pokročilé

 

 

Komentáře

Avatar
David Podeszwa:

Něco takového už jsem vytvořil sice ne s klikáním na plochu, přesuny souborů, a vykonáváním CMD ale fungovalo mi to docela dobře možná že začnu s tebou paralelně psát lepší verzi toho mého. Rád se na tento seriál podívám.

 
Odpovědět 22. dubna 11:18
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Také jsem na tento seriál velmi zvědavý. Napsat pořádnou aplikaci tohoto druhu není zrovna legrace, takže se těším, jak budeš řešit různé problémy, které se při vývoji vyskytnou.

Odpovědět  +4 22. dubna 12:52
2 + 2 = 5 for extremely large values of 2
Avatar
Dominik Gavrecký:

Ešte keby sme nemuseli čakať celý tyzden :D

Odpovědět  +3 22. dubna 12:56
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Odpovídá na Martin Dráb
David Podeszwa:

No nevím jde tam spíše o té komunikaci mezi serverem a vzájemné komunikace mezi moduly a nějakým "jádrem" toho programu ale jinak si myslím že stejně na většinu věcí jsou knihovny(Keylog­ging,Webka atd.). Spíše bude hodně težké si to nějak rozumně rozvrhnout a poskládat ale jinak s tebou souhlasím nebude to legrace.

 
Odpovědět 22. dubna 14:54
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na David Podeszwa
Martin Dráb:

Komunikace je jedním s problémů. Ale ty knihovny mohou být také problém kvůli jejich omezením (popř. je třeba je použít trochu speciálně, aby opravdu dělaly 100 % to, co mají). Ale to nechci právě předbíhat...

Otázka samozřejmě je, zda SSL je správná volba. ALe myslím, že to také uvidíme později.

Odpovědět 22. dubna 15:27
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
David Podeszwa:

No a to bude právě na tomto seriálu zajímavé :D

 
Odpovědět  +1 22. dubna 19:07
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.