среда, 2 марта 2011 г.

Подделываем сообщение клиента.


Продолжаем развивать и закреплять успех, который был достигнут. Что мы уже знаем? Знаем, как подсмотреть за общением сервера и клиента. Знаем, как выглядят сообщения и что конкретно отправляют друг другу сервер и клиент. Даже умеем отправлять какие-то сообщения и пытались принимать ответ от сервера.
Давайте теперь детально разберемся что и, самое главное, как будет отсылать и принимать от сервера. Для этого обратимся к исходному коду main.cpp, котрый является каркасом нашего собственного клиента. В этом коду уже все, что нам нужно есть.
Функция отправки сообщений по выбранному адресу и порту:

sendto(my_sock,(char*) адрес указателя на ваш массив ,strlen(адрес указателя на ваш массив),0, (sockaddr *) &srv_addr,sizeof(srv_addr));

Для этой функции нужно подготовить массив данных, которые будем отправлять.
Как нам уже известно, инициируется соединение клиентом. Он отсылает на сервер данные «EFEF EFEF». Но вот вопрос как эти данные хранить в нашей программе? И что это за буквы такие? Тут нам поможет значение «length», которое определяет количество байтов. Ага. Значит речь идет о байтах. И получается, что это 4 байта. Но у нас 8 символов непонятных. Не будем гадать на кофейной гуще, а лучше проясним ситуацию. Для представления данных в программах может использоваться несколько вариантов типов данных, один из них это шестнадцатеричное представление, в котором числа представляются в виде от 0 до F (соответствует числу 15). Это как раз наш случай, только записать нужно правильно: 0xEF. Соответственно получаем четыре числа - 0xEF 0xEF 0xEF 0xEF. Если же перевести из шестнадцатеричной системы исчисления в десятичную, то получится четыре числа 239.
Вопрос на засыпку, как связаны байты, символы, и числа? Если вы помните, то в компьютере информация хранится в виде битов, которые принимают значение 0 или 1. Эти самые биты принято хранить в виде наборов по 8 штук, а называют их байтами. 1 байт = 8 бит или 256 различных состояний. То есть этот набор битов разрешает хранить какие-то значения, в количестве 256 штук, ими могут быть, например, числа от 0 до 255. Во многих языках есть специальный тип данных byte. А в Си++ для этих целей используется тип char. Да-да, тот самый char, который предназначен для хранения символьных данных. Но мы-то знаем, что символьный тип хранится как число этого символа в кодовой таблице. В итоге получается, что наше первое настоящее сообщение, отсылаемое серверу, будет хранится в виде символьного массива, примерно так:

char hello1[] = { 239, 239, 239, 239 , 0}; //EFEFEFEF
или
char hello1[] = { 0xEF, 0xEF, 0xEF, 0xEF , 0};

После отправки сообщения выведем на консоль сообщение, что делаем и что посылаем:

printf("%s: %s\n", "Send to server ", &hello1[0]);

И будем придерживаться правила, что после отправки или приема сообщения будем выводить соответствующие уведомления на экран.
Ну и что же. Отправили сообщение серверу, в ответ он тоже что-то ответит нам? Хранить это нужно где-то?

char buff[2*1024+1]; // в этот массив будем принимать сообщения, приходящие от сервера

Все уже готово и есть в исходном коде (в самом начале). На всякий случай возьмем массив побольше, чтоб точно хватило. Однако и этого может не хватить, по ходу разработки будет видно.

Функция приема сообщений по выбранному адресу и порту:

int n=recvfrom(my_sock,&buff[0],sizeof(buff)-1,0, (sockaddr *) &server_addr, &server_addr_size);

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

buff[n]=0;

Попробуем вывести то, что прислал нам сервер.

printf("%s: %s\n", "Coming from server ", &buff[0]);

Исходный код:  main.cpp
 
Великолепно, все получилось. Даже не нужно обращаться к Network Protocol Analyzer. Пример того, что должно появиться на экране консольного приложения приведен в самом начале статьи.

вторник, 1 марта 2011 г.

Как пользоваться инструментом сетевого анализа?


Первая радость несколько поостыла и теперь самое время разобраться как правильно пользоваться Network Protocol Analyzer. Как вы уже поняли, между клиентом и сервером происходит общение посредством передачи сетевых пакетов. Но возникает вопрос, как и самое главное что смотреть, чтобы узнать, а что все-таки передают друг другу эти программы. Возвращаемся к главному окну захвата «Loopback» пакетов.

Как видно, на вкладке «Packet View» много строчек, каждая из которых что-то да значит. Давайте разбираться, как читать эти строки. Чтобы действительно понять, что в них содержится нужно прокомментировать, что означает заголовок каждого столбца.
№ - ну, тут понятно, что это порядковый номер пойманного пакета с данными.
Process – отображает имя процесса, к которому относятся пакеты.
Time – пока нам это поле кажется не таким уж и важным.
Local Address – локальный адрес.
< = > - хитрое поле, которое для нас является пожалуй самым значащим. Это поле определяет кто кому отправил пакет, либо от сервера к клиенту или наоборот.
Remote Address – удаленный адрес.
Length – длина сообщения в байтах.



Теперь попробуем прочитать первое сообщение, применив полученные знания. Для этого будем выделять мышкой нужное сообщение. Нам понадобится три поля. Local Address, <=>, Remote Address. Ну, и что можно сказать про этот пакет?


Отправлен он нашим сервером с Local Address (0.0.0.0:12300, где первая часть до двоеточия это IP адрес, а вторая это порт) какому-то ПО по Remote Address 38.112.120.110 и чего-то там еще (кстати, у вас может быть и другой адрес). А откуда мы узнали, что отправлял наш сервер, а не наоборот? За это отвечает стрелочка => в поле «<=>». А что это за ПО, которое сидит по Remote Address? Это специальное ПО, которое является тоже сервером, но его функциями является лишь организация оповещения всех потенциальных игроков через Интернет, что вот еще один сервер доступен для игры. В общем и целом первый пакет нам не интересен. И в дальнейшем такие пакеты мы не будем рассматривать, потому что общение нашего сервера с удаленным сервером нам не интересно.

А вот второй пакет более интересен. От кого и кому? Игровой клиент с адрема Remote Address 127.0.0.1 и порта 12350 послал сообщение серверу на Local Address 0.0.0.0 и порт 12300. Это то, что нужно! Наш игровой клиент послал какие-то данные серверу. Но какие? Понятно, что это 4 байта. И если выделен пакет с номером 2 то в окошке ниже «Packet View» мы увидим: «EFEF EFEF». Это оно и есть.

Третий пакет уже отправляет сервер в сторону игрового клиента (стрелка =>). А само сообщение выглядит; «CFCF CFCF».

Дальше уже можно и без подсказок пробежаться по пакетам и посмотреть на общение двух программ – клиента и сервера.

В итоге получается, что общение с сервером начинается с сообщения «EFEF EFEF», в ответ на которое сервер говорит «CFCF CFCF». Осталось только попробовать и посмотреть, что получится.

понедельник, 28 февраля 2011 г.

Первое сообщение серверу нашими руками.

В прошлый раз мы остановились на самом интересном месте. Вот только все началось получаться. Разобрались с программой для отлова сетевых сообщений и даже поймали несколько. Вот только непонятно, а что дальше? А дальше нужно определиться, как принимать и отсылать сообщения по сети. Но прежде чем это сделать необходимо узнать, а как вообще строится общение сетевых приложений. По стандарту или в терминах Интернет сообщества по спецификации существует два вида коммуникационных пакетов передаваемых по сети. Один с гарантированной доставкой и называется TCP/IP, а второй это UDP/IP. Хотя на самом деле здесь видно три протокола обмена информацией IP, TCP, UDP. IP протокол предназначен для организации взаимодействия компьютеров с помощью специальных Интернет адресов. TCP и UDP, в свою очередь, предлагают методы для общения между компьютерами, первый с гарантированной доставкой (правильнее будет сказать, с возможностью контроля доставки), а второй для доставки пакетов без какой-либо гарантии, что эти пакеты будут доставлены. Почему это важно знать, хотя бы в общих чертах? Ну потому, что для написания программы с поддержкой UDP будет нужно использовать совсем другие функции, чем для ПО с поддержкой TCP.
Но какой же протокол нужен нам?

Ответом на вопрос станет вышеприведенное изображение. Под столбцом с названием «protocol» ясно видно, что написано UDP. При этом если посмотреть весь процесс общения клиента с сервером, то есть прокрутить и посмотреть все пакеты, то видно, что используется везде протокол UDP. Теперь-то с уверенностью можно приступать к созданию нашего клиента для общения с сервером.

Исходный код main.cpp

Копируем код программы, которая должна представлять собой каркас нашего будущего клиента, и позволяет принимать и отправлять сообщения.
Этот код нужно скопировать и вставить вместо вашего кода в файле main.cpp. Осталась маленькая деталь. Для того, чтобы код заработал нужно в файл проекта (*.pro) нужно добавить строку:
LIBS += "путь к файлу "
А что это за путь до файла и самое главное до какого файла? Все просто вам нужен заголовочный файл для работы с Winsock библиотекой. Где найти этот файл и как он называется?
Файл называется «libws2_32.a» и найти его можно в папке где установлено QT, в папке mingw, а проще всего сделать это с помощьб стандартного поиска файлов. Затем скопировать путь до файла.
В результате должно выйти что-то типа:
LIBS += "C:\Qt\2010.05\mingw\lib\libws2_32.a"

Ну а теперь пробуем запустить. Если все правильно сделали, то появится консольное окно, которое зависнет. Это пока нормально. Закрываем его.
Ну и как теперь посмотреть, получилось или нет? Точно также, как мы смотрели общение между сервером и клиентом, то есть в окне Network Protocol Analyzer.


Великолепно. Мы отправили наше первое сообщение серверу.

воскресенье, 27 февраля 2011 г.

Грозовые ворота. Часть 2.


Но отбросим предубеждения. Смотрим дальше. Ничего не предвещало беды. Вдруг оказалось, что этот пятачок самое главное место северного Кавказа и почти все боевики-террористы собираются куда-то двигаться, а путь их обязательно должен пройти через этот пятачок. Вот оно начало роста героев фильма. Именно отсюда они начинают мужать и внушать гордость. И даже шикарный клип, повествующий о жизни простого русского паренька с рублевки, который не знает куда себя в жизни не может пристроить не может остановить нарастающую гордость. Особенно запомнился острейший социальный накал, показанный в воспоминании будущего героя бывшего простого паренька из элитной семьи. Подруга постоянно унижала его, называла несмелым и признавалась, что ей «нравится с ним только спать», а так по жизни он тряпка. Ну, в пятнадцать или семнадцать-то лет «просто спать», а по-русски, сексом заниматься это неплохо. Совсем неплохо. Особенно, если целевой зритель это молодежь от 10 до 25. То есть готовим заранее детей и не только к подвигам. Но это полбеды. Далее скорая на ногу подруга подначивает мальчишку на некрасивый поступок, ворваться на выступление депутата и облить его кетчупом. Но это не все. После этого юная особа врывается в квартиру к своему бойфренду-тряпке и начинает отчитывать его очтима, будущего депутата, за непонятно что, при этом тыкая взрослому мужчине. Финалом стала феерическая сцена признания отчимом своей неправоты в чем-то и, здесь самый сильный момент в фильме, выливания на свою рубашку кетчупа. Победа. Дальше уже не так интересно.

Громыхают танки, взрываются мины, стреляют пулеметы, в кадр попадают Турчинские, по пять раз по одной и той же местности пролетают два вертолета, боевики выскакивают то тут, то там, Пореченков дерется на кулаках с полуглавным злодеем. Финалом всей этой вакханалии является взятие боевиками высоты и этого пятачка. Но как оказалось горстка русских солдат героев умирали не просто, а для великой победы. Они стали всего лишь приманкой в большой игре и сумели заманить в капкан более 2000 террористов. Но, как и полагается, финал дерущий душу, главный русский берет на себя всю ответственность и вызывает огонь артиллерии на себя, чтобы всех боевиков разнести в клочья.

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

суббота, 26 февраля 2011 г.

Грозовые ворота. Часть 1.


Неожиданно подкралось послеобеденное время праздничного дня 23 февраля. День хороший. Время поздравлений. Хороший праздничный обед. Череда концертов и выступлений была прервана неожиданно начавшимся фильмом. Почему неожиданно? Потому, что уже на протяжении многих лет этот праздник носит  непонятный характер, непонятно кого и за что поздравлять. Была советская армия, которая прославилась на весь мир подвигами и победами. А вот российская армия еще не так славна. И фильмы показываемые в этот день, так сказать для воодушевления и воздания почестей защитникам отчизны, обычно ничего патриотического не показывали или показывали, но откровенное старье, на которое чихать хотела нынешняя молодежь. А тут что-то новенькое. Фильм называется «Грозовые ворота». Начало стандартное. Смешиваются разные люди с разными судьбами. При этом вроде как фильм начинается с середины, ну чтобы интереснее было и непонятнее. А по ходу дела будет раскручиваться линия жизни каждого персонажа в ракурсе текущих событий с оглядкой в мутное прошлое. А сюжет просто как три копейки. Наша доблестная российская армия прославилась могучими боевыми действиями на фронте, который находится внутри страны, если точнее на северном Кавказе. То есть армия прославилась успехами в боевых действиях внутри страны своей.

Итак, есть набор персонажей, которые по замыслу должны расти в своих глазах, глазах своих близких, ну и, конечно же, телезрителей. Отправляется сия команда защищать интересы государства на Кавказ. Местом действия является горная гряда с удобным открытым пятачком на этой горной гряде, куда все тропы сходятся. Тропы, по которым ходят бандиты толпами, те, что в начале 90-х терроризировали весь Кавказ России. 
Так вот на этом пятачке и размещается горстка русских солдат. Почему-то сразу вспомнился великолепнейший патриотический фильм «9 рота». Но пока речь не об этом. По ходу дела создатели фильма нас знакомят с будущими героями России, рваными кусками проникая в их прошлое. У каждого была своя причина, чтобы попасть в эту мясорубку. Кто-то не мог достичь продвижения по службе, но его бросила жена.

Кто-то был тряпкой и тюфяком по жизни, живя за родительскими связями и деньгами. Ну, всех не перечесть. Но вот стойкий привкус розовых киселей и вычурного блеска, начинает набивать рот, знакомо по «9 роте».

пятница, 25 февраля 2011 г.

Выбор инструментария: исследование сетевого трафика для соединения «loopback» в ОС Windows.


В прошлый раз, при попытке получить доступ к самому интимному месту сетевой игры – сетевым пакетам, перед нами возникло неожиданное препятствие, которое, как оказалось, преодолеть с помощью Wireshark не удастся. В результате чего был произведен поиск и анализ инструментов для работы с сетевыми пакетами, которые бы работали под Windows, умели работать с loopback, да еще были бы бесплатными. Из трех десятков программ разного калибра и фасона, так и не нашлось достойного кандидата. Тогда под руку попался SoftPerfect Network Protocol Analyzer – очень даже неплохой инструмент. Конечно если бы наше занятие было профессиональным и оплачиваемым, а не развлечением для интересаи псевдонаучного исследования, то т огда выбор без сомнения пал бы на CommView от Tamosoft.
Но вернемся к выбору нужной программы. Для этого скачиваем по ссылке демонстрационную версию программы
благо ограничение стоит лишь на период использования, в отличие от того же CommView (http://www.tamos.com/download/main/), который показывает содержимое лишь половины полученных пакетов.
Процессов установки незамысловат, в основном сводится к нажатию кнопки продолжить. Если вдруг предложат установить дополнительные драйверы, то с радостью соглашайтесь. Ну и в случае необходимости проведите перезагрузку компьютера.
Итак, инструмент готов к использованию. Запускаем программу, пробуем найти нужный нам сетевой адаптер

Но что такое, опять обман? Не видно «loopback» и все тут. Но хитрость разработчиков данного ПО нас не смутила и через минуту можно ликовать, нужное нам найдено в меню Tools -> Loopback Monitor. Ну что, уже неплохо. Запустим наш сервер. А теперь вновь вернемся к окну перехвата сетевого трафика. В выпадающем окошке с гордым названием «Process filter» выбираем процесс, за которым мы собираемся наблюдать, то есть исполняемый файл сервера «TM.exe» и нажимаем кнопку «Start capture». Ну, а теперь, в предвкушении потирая руки, запускаем игру. Заходим в меню сетевой игры, вносим поле настроек сервера заветное «127.0.0.1:12300» и, затаив дыхание, подключаемся к сетевой игре. После окончания загрузки данных, для пущей важности стрельнув во врага, покидаем игру. Открываем окно Network Protocol Analyzer и выдыхаем. Все получилось.

Теперь можно приступать к настоящему взлому.

четверг, 24 февраля 2011 г.

Анализ сетевого трафика с помощью WireShark.


Приступим к изучению подопытного. Для это запускаем сначала сервер, а потом и клиент игры.

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

Ищем строку «ServerPort = 12300», ага, вот он голубчик и попался. Это значит сервер принимает сообшения на порту номер 12300. Ну что ж, уже что-то. Значит в окне WireShark вносим данные в поле «Filter» - «udp.port == 12300 || tcp.port == 12300», что на русском означает, что мы хотим увидеть все сетевые пакет приходящие и уходящие на порт с номером 12300. Но почему-то в окне захваченных пакетов пусто. Ну, ничего, бывает. И тут вспоминаем, что в настройках подключения мы указывали адрес «127.0.0.1:12300», а это значит, что подключались к локальному компьютеру через  виртуальный сетевой адаптер «loopback». Значит осталось лишь найти такой сетевой адаптер в списке адаптеров. После недолгих поисков, которые не увенчались успехом, пробуем найти ответ на официальном сайте.


Откуда следует, что виртуальный сетевой интерфейс Windows в WireShark не поддерживается, а попытки решить проблему через рекомендуемые действия опять не привели к успеху.


Добавленная виртуальная сетевая карта не решила проблему.

Остается только вариант с подключением через Интернет к своему собственному серверу. То есть процесс в идеале должен выглядеть следующим образом. Ваш клиент обращается к удаленному серверу, а этим сервером является опять же ваш сервер. Соответственно все сетевые пакеты проходят через сетевую карту, соответственно все действия сетевой карты регистрируются  WireShark и мы получаем, то что хотим. Но есть ограничения для сервера, который требует наличия «белого» IP адреса. Но увы и ах, большинство сегодняшних провайдеров не балуют своих пользователей. С другой стороны, если вы находитесь в локальной сети и интернет раздается каким-либо устройством внутрь это сети, то сервер опять не сможет взаимодействовать с внешними подключающимися клиентами.

Что, мы потерпели фиаско? И да и нет. Данный пример лишь наглядно продемонстрировал, что была допущена ошибка. Ошибка заключалась в выборе инструмента. К сожалению, он не подошел для данного случая, когда нет «белого» IP адреса и подключение происходит к собственному локальному серверу.

Инструмент анализа сетевого трафика не подошел, будем искать другой.