Цитата:
Сообщение от Konctantin
Ностальгия...
Мне вот интересно, кто-то уже реализовал проксю или сниффер, или все сделано только в теории?
|
ну, как минимум, мой реализован и работает.
у других, думаю, тоже есть. вот только делиться и тем более выкладывать в паблик тут "почему-то" непринято
Цитата:
Сообщение от Konctantin
В даном случае использован проксификатор, с правилами следуещего содержания:
Если приложение wow.exe соединяется с конечной точкой 213.248.127.130:1119,
тогда перенаправить его на 127.0.0.1:9998 (Login - сервер)
иначе если приложение wow.exe соеденяется (адресс не указан, тобиш 0.0.0.0:0),
тогда перенаправляем его на 127.0.0.1:9999 (World - сервер)
|
лишние сложности.
у меня, например, нет разделения на login/world.
всё, что не начинается с нужного пакета - просто и тупо перекидывается без обработки. ну или можно на диск писать, если желание есть.
Цитата:
Значит, нам надо создать прокси, который бы создал 2 соединения, это соединение с клиентом и соединение с сервером:
* Соединение с клиентом, прокси выступает в качестве сервера и общается с клиентом
* Соединение с сервером, прокси выступает в качестве клиента и общается с сервером (Login - сервером)
но это все у нас пока процесс общения сервером авторизации. (213.248.127.130:1119)
Мы просто выступаем посредником и пересылаем пакеты при этом слушая их.
Но, клиент же должен подключится к World - серверу.
По этому, когда приходит пакет AUTH_REALM в котором приходит IPAdressort сервера к которому надо подключится,
запоминаем этот IPAdressort.
|
повторяю - лишние сложности!
для упрощения начать с такой конфигурации:
1. клиент у нас ровно одна штука, в начальный момент времени загружен, но не залогинен.
2. прокси запускается строго перед логином
в таком случае - какая разница, какой там адрес отдал клиенту сервер авторизации???
интересующее нас соединение, один черт, начнется с SMSG_AUTH_CHALLENGE
больше оно в нашем раскладе ни с чего начаться не может!
значит:
0. открываем (bind) сокет на нужном порту и ждем подключений (listen) от проксификатора
1. принимаем (accept) соединение от проксификатора
2. разбираем socks4 запрос, подключаемся (connect) к указанному адресу, отдаем проксификатору socks4-ответ "ОК"
3. тут я прошлый раз неправильно написал.
нужно делать так:
ждем, пока клиент что-нибудь пошлет, проверяем у этого "чего-нибудь" 3й+4й байты - и если они не равны опкоду CMSG_AUTH_SESSION (а не SMSG_AUTH_SESSION - такого опкода вообще нету) - забиваем на это соединение. ничего интересного тут не предвидится.
естественно продолжая прокидывать через него данные в обе стороны
5. если таки интересующие нас байты найдены - то ВЫВОДИМ НА КОНСОЛЬ МНОГО РАЗНОЦВЕТНЫХ БУКВ И РАДУЕМСЯ, ЧТО НАКОНЕЦ ЧТО-ТО ПОЛУЧИЛОСЬ.
пишем поток на диск (естественно каждое направление в свой файл. разделять на отдельные пакеты не нужно.)
6. летим подальше от любимого даларана, желательно в сторону пристани Моа'ки а оттуда - на самую дальнюю льдину, какую получится найти.
7. выходим из игры и смотрим на то месиво, что записалось в файлы.
ничего осмысленного, т.к. данные пошифрованы.
и скорее всего запишется очень мало данных, т.к. SMSG_SECOND_CONNECTION приходит почти сразу.
но прервый шаг уже сделан, в соединение вклинились!!!
вот так выглядит функция, занимающаяся пересылкой данных:
http://paste2.org/p/878723 (шаги 2-3)
это, конечно, не C#, но представление дает
на yield не смотреть, они для реализации со-процедур (самопальной и весьма корявой, но "и так работает").
на read_session_key() и вытаскивания сидов из SMSG_AUTH_CHALLENGE не смотреть, она осталась со времен, когда по этим сидам я генерил крипто-состояния сам, а не читал их готовыми из памяти. не судьба убрать, "и так работает".
разбиение на пакеты, расшифровка пакетов, расшифровка вардена, логика, шифровка вардена, шифровка пакетов, сборка пакетов в поток - они все в WorldFilter
код коряв и страшен, как моя жизнь. однако "и так работает"
))