Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #48, НОЯБРЬ 2004 г.

Одиссея программиста

Hi-Tech

Спецвыпуск: Хакер, номер #048, стр. 048-054-3


С системной частью закончили, теперь приступим к работе с сокетами.

//Будем использовать TCP

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

//Переменная со свойствами

SOCKADDR_IN addr_Sock;

addr_Sock.sin_family = AF_INET;

addr_Sock.sin_addr.s_addr = htonl(INADDR_ANY);

//Слушаем на порту 42448

addr_Sock.sin_port = htons(42448);

Далее нам надо как-то совместить свойства сокета (порт и т.д.) с самим сокетом. Сделать это можно так:

if (bind(listet_Sock,(LPSOCKADDR) addr_Sock, sizeof(struct sockaddr))) return 0;

Таким образом, если порт уже используется или возникли другие проблемы с сокетом, «return 0» закроет функцию, которая работает с ними, а поскольку она у нас единственная, бедняга сервер просто склеится :).

Завершающим аккордом будет открытие порта:

if(listen(listet_Sock, 1)) return 0;

Здесь цифрой 1 обозначено допустимое количество коннектов. Бывает, соединения завершаются некорректно, например, при неожиданном отключении от интернета, и в этом случае часто создается ситуация, что сервер как бы поддерживает процесс соединения, которого нет, и при очередной попытке подсоединиться – эффект известен ;). Во избежание этого надо ввести тайм-аут на соединение. Далее необходимо позаботиться о том, чтобы команды принимались постоянно и чтобы сервер после исполнения полученного не вырубался, а отправлял новый сокет (обзовем его new_sock), для чего засунем разрешающую коннект функцию accept в так называемый CommandLoop.

Самой удобной структурой команды для многозадачного трояна будет такая: «имя_команды параметры». Таким образом, для начала надо определиться, какие команды будет выполнять наш сервер. Давай условимся, что он будет выполнять команды cmd.exe, вызывая его, и записывать в C:\boot.ini всякую чушь (деструктивное действие :)). Пусть началом команды cmd.exe «команда» будет «с», а функция порчи boot.ini – завязана на «f». Для приема нам понадобится создать еще одну функцию, назовем ее recv (сокращение от recive), которая будет принимать команды из new_sock и выполнять их. В ней создадим два буфера: один размером 2 байта, в который будет записываться первый символ: c или f, и второй размером 126 байт, в который будет записываться параметр функции. Например, если мы передадим «с notepad.exe», c запишется в буфер 1, сравнится с имеющимися в наличии обозначениями команд, обнаружится, что это не что иное, как запрос на выполнение команды, записанной в следующих 126 байтах, записанных в buff2[126] (кстати, если хватать не будет, ты можешь расширить буфер), и вызовется команда cmd.exe /c notepad.exe. По сути, системные команды вызываются так: ShellExecuteA(NULL, "open", "cmd.exe", buf2_cmd, NULL, SW_HIDE).

Можно было пренебречь вызовом cmd.exe с флагом и вместо cmd.exe написать notepad, но предложенный мной принцип тебе пригодится для написания дальнейших функций (каких именно, нетрудно понять из других статей номера). Особое внимание стоит уделить параметру SW_HIDE: именно он помогает скрыть от глаз юзера действия программы (в данном случае - открытие окна cmd.exe).

Назад на стр. 048-054-2  Содержание  Вперед на стр. 048-054-4