Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_shell_код_Фостер_Дж_

.pdf
Скачиваний:
14
Добавлен:
19.04.2024
Размер:
3.68 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

Многопоточность и параллелизм 191

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-xcha

 

 

 

 

p

 

-x cha

 

 

 

 

 

 

 

 

 

 

В строках 351–353 определяется функция sighandler(). Ее вызывает опе-

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

рационная система в случае возникновения сигналов SIGPIPE èëè SIGALRM. Сигнал SIGPIPE посылается программе, если удаленный хост закрыл свой конец TCP-соединения, а программа пытается писать данные в сокет. Такое может случиться при попытке идентифицировать номер RPC-программы на порту, где протокол RPC не поддерживается. Сигнал SIGPIPE необходимо обработать, поскольку по умолчанию операционная система при его поступлении завершает приложение. Сигнал SIGALRM посылается по прошествии числа секунд, заданного при вызове функции alarm(). Все функции, блокированные в ожидании завершения какой-либо операции, немедленно возвращают код ошибки. Таким образом, мы можем прервать функцию connect(), если времени для ее завершения требуется больше, чем указано в предшествующем ей вызове alarm(). Функция alarm() применяется для той же цели в строке 188 программы rpc1.c.

В строках 360–365 определяется функция usage(). Она печатает сообщение о порядке запуска программы.

В строках 368–438 определяется функция main(). Это главная точка входа в программу. Она обрабатывает заданные в командной строке аргументы, после чего вызывает scan() для выполнения сканирования.

Многопоточность и параллелизм

Для повышения производительности и масштабируемости сетевых приложений бывает полезно организовать несколько потоков. Однопоточное приложение, каковым является rpc1.c, выполняет все операции последовательно. Если некоторые из них требуют много времени, то и вся программа будет работать долго. Поэтому имеет смысл разбить программу на отдельные функции, выполняемые параллельно в нескольких потоках.

Стандартным средством для реализации многопоточности в UNIX и UNIXподобных операционных системах служит библиотека pthread, в которой определено довольно много функций. Наиболее важной из них является функция pthread_create():

int pthread_create (pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);

Эта функция создает новый поток исполнения. Она принимает четыре параметра, из которых второй на практике обычно игнорируется. Первый параметр – это указатель на переменную типа pthread_t, третий – адрес функции, с которой начинает работать новый поток. Четвертый параметр – это

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

192

Глава 3. BSD сокеты

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-xcha

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

нетипизированный указатель, который будет передан начальной функции-x cha

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

потока при ее вызове.

В примере 3.11 демонстрируется исполнение функции test() в отдельном потоке.

Пример 3.11. Многопоточность

1

#include <stdio.h>

2

#include <unistd.h>

3

 

4

#include <pthread.h>

5

 

6 void *test(void *arg)

7

{

8

printf("поток 2!\n");

9

}

10

 

11int

12main(void)

13{

14pthread_t th;

15int ret = 0;

17ret = pthread_create(&th, NULL, test, NULL);

18if(ret != 0)

19{

20printf("ошибка pthread_create().\n");

21return(1);

22}

23

24 sleep(2);

25

26 printf("поток 1!\n");

27

28return(1);

29}

Многопоточность – это полезный инструмент для реализации более эффективных сетевых программ. Такие программы могут выполнять сетевые операции не строго поочередно, а параллельно в разных потоках. Кроме того, многопоточными часто делают диагностические сетевые программы и приложения для проверки безопасности.

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

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

 

m

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

 

e

 

 

 

 

 

 

n

 

 

 

 

 

 

 

Резюме

 

 

 

 

-xcha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Обзор изложенного материала 193

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

API BSD-сокетов – это развитый механизм для реализации обмена данными по сети. API предоставляет базовый набор функций, применяемых почти одинаково для работы по протоколам TCP и UDP. Задавая опции сокетов с помощью функции setsockopt(), можно обеспечить необходимую гибкость

èтонкую настройку.

Âзависимости от того, что вам нужно – быстрое получение результата или создание сложного масштабируемого приложения – можно проектировать программу по-разному. Один из способов повысить производительность – это многопоточность. В сфере сетевой диагностики и информационной безопасности API сокетов оказывается неоценимым средством создания утилит для удаленного сканирования и локального мониторинга.

Обзор изложенного материала

Введение в программирование BSD-сокетов

API BSD-сокетов состоит из функций и типов данных.

Впервые API BSD-сокетов появился в операционной системе BSD UNIX в начале 1980-х годов. Теперь он реализован почти во всех UNIX-по- добных системах и поддерживается на платформе Microsoft Windows (Winsock).

API BSD-сокетов широко используется в программах на языке C для реализации работы с протоколами TCP и UDP.

Клиенты и серверы для протокола TCP

Хотя протокол TCP сложнее, чем UDP, да, пожалуй, и все остальные протоколы в семействе TCP/IP, но именно он является наиболее популярным протоколом передачи данных в сети Интернет.

Клиенты и серверы для протокола TCP

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

UDP – это не потоковый протокол, отправленные данные приходят единым блоком, который называется датаграммой.

В заголовке протокола UDP есть всего четыре поля: порт получателя,

порт отправителя, длина и контрольная сумма.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

194 Глава 3. BSD сокеты

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

-xcha

 

 

.c

 

 

 

p

 

 

 

Опции сокетов

 

 

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Функция setsockopt() позволяет модифицировать параметры на различ- ных уровнях протокола. Для адресного семейства AF_INET можно изменять как опции самого сокета, так и некоторые аспекты связанных с ним протоколов, а именно: IPv4, UDP, TCP, ICMP.

Чаще всего модифицируются параметры на уровне сокета, в том числе: механизм обработки ошибок, буферизации, интерпретации адресов, а также величины таймаутов при передаче и приеме данных.

Сканирование сети с помощью UDP-сокетов

Протокол SNMP широко применяется для получения и модификации разного рода административных параметров компьютеров и устройств, подсоединенных к сети. Для этой цели в нем определены запросы GetRequest è SetRequest, инкапсулируемые в UDP-датаграммы.

Сканирование сети с помощью TCP-сокетов

Протокол RPC дает возможность разбить программу на части, работающие на нескольких компьютерах.

Служба отображения портов прослушивает TCP и UDP-порт 111. Удаленные хосты могут передать этой службе номер конкретной программы и получить в ответ номер TCP или UDP-порта, на котором она работает. Это стандартный способ обнаружения RPC-программ.

Если служба отображения портов отключена или недоступна из вашей сети, то путем проверки открытых портов в заданном диапазоне все же можно определить, какие RCP-сервисы работают.

Многопоточность и параллелизм

Библиотека pthread – это стандартное средство реализации многопоточности в UNIX-подобных системах.

Важнейшей из всех функций в этой библиотеке является pthread_create.

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

 

m

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

 

e

 

 

 

 

 

 

n

 

 

 

 

 

 

 

Ссылки на сайты

 

 

 

 

-xcha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Часто задаваемые вопросы 195

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Более подробную информацию вы можете найти на следующих сайтах:

www.applicationdefense.com. На сайте Application Defense имеется большая подборка бесплатных инструментов по обеспечению безопасности в дополнение к программам, представленным в этой книге;

http://www.iana.org/assignments/port-numbers. На сайте Агенства по выделению имен и уникальных параметров протоколов Internet (Internet Assigned Numbers Authority – IANA) опубликован полный список официально выделенных портов. Это прекрасное подспорье как для на- чинающего специалиста по безопасности, так и для хакера;

http://www.private.org.il/tcpip_rl.html. Портал Юрия Раца (Uri Raz) посвящен семейству протоколов TCP/IP.

Часто задаваемые вопросы

Следующие распространенные вопросы, на которые отвечают авторы книги, призваны помочь вам оценить, насколько хорошо вы поняли идеи, изложенные в данной главе, и возможные их применения на практике. Если вы хотите задать авторам вопрос, зайдите на страницу www.syngress.com/solutions и заполните форму Ask the Author. Заодно вы получите доступ к тысячам других FAQов на сайте ITFAQnet.com.

Â: Как получить более подробную информацию об ошибке при программировании BSD-сокетов?

Î: На платформе UNIX такую информацию можно получить с помощью переменной errno. Если какая-либо функция из API сокетов возвращает –1, то в глобальной переменной errno будет находиться целочисленное значение, индицирующее тип ошибки. Проанализировав код ошибки, программист сможет предпринять адекватные действия. Возможные значения errno определены в заголовочном файле errno.h, который обычно находится в каталоге /usr/include. Чтобы получить доступ к переменной errno, достаточно вклю- чить этот файл в свою программу, например: #include <errno.h>.

Â: Одинаков ли интерфейс к BSD-сокетам на всех платформах UNIX?

Î: В основных чертах программный интерфейс совместим на всех UNIXплатформах. Но имеются и некоторые различия, которые надо учитывать при написании переносимых программ. Они касаются значений констант, имен заголовочных файлов и ряда функций. Например, в системах, ведущих

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

i

 

 

 

F

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

t

 

P

D

 

 

 

 

 

 

 

 

o

 

P

D

 

 

 

 

 

 

 

 

o

 

 

 

 

NOW!

r

 

 

 

 

 

NOW!

r

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

196

Глава 3. BSD сокеты

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

o

 

w Click

 

 

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

df

 

 

 

 

e

 

 

 

 

p

df

 

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

происхождение от операционной системы BSD UNIX, имеется функция-x cha

 

 

 

 

 

getifaddrs(), которая позволяет перечислить все сетевые интерфейсы на данном компьютере. В системе Linux такой функции нет, и для достижения аналогичного результата приходится прибегать к функции ioctl().

Â: На примере каких программ можно научиться программированию BSD-сокетов в интересах обеспечения безопасности?

Î: Две самых распространенных программы такого рода – это NMAP и Nessus. NMAP применяется для сканирования сетей TCP/IP в поисках работающих хостов и служб. Nessus – это бесплатный, поставляемый с исходными текстами сканер безопасности, позволяющий, помимо сканирования сетей, еще и удаленно проверять наличие уязвимостей, которыми может воспользоваться хакер.

Оба проекта – хорошее пособие по применению BSD-сокетов в сфере информационной безопасности, организации атак и противодействия атакам. Их можно загрузить со следующих сайтов:

NMAP – http://www.insecure.org/nmap/;

Nessus – http://www.nessus.org.

Â: Где можно получить детальную информацию о семействе протоколов TCP/IP и программировании BSD-сокетов?

Î: Мы рекомендуем следующие книги на эту тему:

W.R. Stevens «TCP/IP Illustrated, Volume 1»;

W.R. Stevens «UNIX Network Programming, Volume 1: The Sockets Net-

working API».

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

Глава

Сокеты на платформе Windows (Winsock)

Описание данной главы:

Обзор Winsock

Winsock 2.0

Программирование клиентских приложений

Программирование серверных приложений

Написание эксплойтов и программ про проверки наличия уязвимостей

Примеры См. также главы 3 и 5

Резюме

Обзор изложенного материала

Часто задаваемые вопросы

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

4

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

198 Глава 4. Сокеты на платформе Windows (Winsock)

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

 

e

 

 

 

 

 

 

n

Введение

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

В прошлом система Linux, не будучи единственной на рынке, пользовалась особым предпочтением у хакеров. В те времена почти все эксплойты писались на платформе Linux и только на ней могли быть откомпилированы. С тех пор платформа Microsoft Win32 стала гораздо чаще применяться в корпоративных системах и уже почти сравнялась с Linux в части количества созданных на ней эксплойтов. Чтобы написать эксплойт в среде Microsoft Win32 или защититься от него, нужно хорошо разбираться в API WinSock 1 и, что еще более важно, WinSock 2.

Интерфейсы программирования WinSock 1 и WinSock 2 предназначены для написания сетевых программ. WinSock 2 использует библиотеку ws2_32.dll для взаимодействия со слоем Winsock или с интерфейсом сервис-провайдера (Service Provider Interface – SPI), который общается с физической аппаратурой. Поскольку программисты работают только на уровне Winsock 2 API, то об аппаратуре они могут ничего не знать. Цель Winsock API – предоставить программисту средства для максимально полного управления тем, что посылается физическому устройству и приходит от него, не заботясь при этом о том, что представляет собой само устройство. Производители аппаратуры должны придерживаться спецификации Windows SPI, если хотят, чтобы старые и новые программы могли работать с их оборудованием.

Абсолютное большинство программ для Windows, влючающих работу с сокетами, так или иначе используют API Winsock или более новую его версию Winsock 2. По сравнению с Winsock или Winsock 1.1, версия Winsock 2 предоставляет гораздо более развитую функциональность.

Примечание

Код, представленный в этой главе, был написан и протестирован в среде Visual Studio 6 для Windows 2000 и XP.

Обзор Winsock

Первая версия Winsock была выпущена в 1993 году. Она была ограничена в том смысле, что могла работать только с семейством протоколов TCP/IP. Winsock 2 поддерживает и многие другие протоколы. С Winsock связаны две динами- чески загружаемых библиотеки (DLL), выбираемые в зависимости от того, для какой – 16или 32-разрядной платформы пишется приложение. Для

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

 

Обзор Winsock 199

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

p

 

-x cha

 

 

 

 

 

 

 

-xch16a

-разрядных

приложений предназначена библиотека winsock.dll, а для

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

32-разрядных – wssock32.dll. Еще одним заметным недостатком Winsock была невозможность запустить одновременно более одного экземпляра. Эти ограничения следует считать не столько дефектами, сколько компромиссом, на который пришлось пойти, чтобы программисты могли пользоваться сокетами в ранних операционных системах Microsoft.

Из-за ограничений, присущих первой версии Winsock, сегодня стандартным API для программирования сокетов в Windows является Winsock 2. Эта версия впервые появилась в ОС Windows 98 и Windows NT 4.0. С тех пор она включается во все операционные системы Windows.

Примечание

Представленные в этой главе программы, не будут ни компилиро ваться, ни работать, если на компьютере отсутствует библиотека ws2_32.dll, поскольку именно она содержит всю функциональность Winsock 2. Загрузить эту библиотеку можно с сайта Microsoft.

Спецификация Winsock 2 ориентирована только на 32-разрядную платформу, следовательно, в Windows 3.11, NT 3.51 или более ранних 16-разряд- ных ОС она работать не будет. Однако, программы, написанные для старых ОС с использованием Winsock 1.1, будут работать и в новых системах, поскольку Winsock 2 обратно совместима почти без ограничений. Единственное исключение – это использование точек подключения (hook) при блокировках; они в Winsock 2 не поддерживаются. К числу новых по сравнению

ñWinsock 1.1 возможностей относятся:

Дополнительные протоколы. Asynchronous Transfer Mode (ATM), Internetwork Packet Exchange (IPX)/Sequenced Packet Exchange (SPX) è Digital Equipment Corporation Network (DECnet);

Условный прием соединения. Возможность отвергнуть запрос на соединение;

Многоуровневые сервис-провайдеры. Возможность добавлять сервисы к существующим провайдерам транспортного уровня;

Многоточечные соединения и групповое вещание. Зависимые и независимые от протокола API;

Множественные пространства имен. Выбор протокола, по которому разрешать имена хостов и находить службы;

Поддержка нескольких протоколов. Архитектура открытых систем Windows (Open Systems Architecture) позволяет сервис-провайдерам

встраивать (plug-in) и надстраивать (pile-on) новые возможности;

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

200 Глава 4. Сокеты на платформе Windows (Winsock)

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-xcha

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

e

 

Ввод/вывод с перекрытием и объекты-события. Распространение ñó--x cha

 

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ществующих механизмов Windows на сокеты для повышения производительности;

Качество обслуживания (QoS). Мониторинг и настройка полосы пропускания, доступной сокету;

Ввод с объединением и вывод с распределением (scatter-gather). Возможность собирать отправляемый пакет из нескольких буферов и разносить принятый пакет по нескольким буферам;

Разделение сокетов. Несколько процессов могут совместно пользоваться одним сокетом;

Независимость протокола транспортного уровня. Возможность выбрать протокол в зависимости от необходимой службы;

Механизм расширений производителями. Фирмы-производители могут добавлять собственные API.

Winsock 2.0

Прежде всего, откройте Visual Studio 6.0. Эксплойты пишутся исключительно как консольные приложения, то есть предназначены для запуска из окна команд Windows, похожего на терминал в UNIX. Как и командные утилиты в UNIX, консольное приложение может принимать параметры. Для создания нового рабочего пространства, содержащего пустое консольное приложение, выполните следующие действия.

1. ìåíþ File (Файл) выберите пункт New (Создать).

2.Выберите из списка пункт Win32 Console Application, присвойте новому проекту имя и нажмите OK.

3.Выберите An empty project (Пустой проект) и нажмите кнопку Finish, чтобы начать работу.

4.Èç ìåíþ File выберите пункт New.

5.Выберите вариант C/C++ Source File (Исходный текст на C/C++) и нажмите OK.

6.В этот момент на экране должно появиться пустое окно для ввода исходного текста программы.

В программу следует включить заголовочный файл Winsock 2 директивой #include <winsock2.h>. Кроме того, для работы Winsock 2 программа должна быть скомпонована с соответствующей библиотекой, иначе компоновщик не сможет отыскать необходимые функции. В Visual Studio 6.0 для компоновки с некоторой библиотекой есть два способа: