Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Опкоды, Формулы, Клиент (http://mangos.ytdb.ru/forumdisplay.php?f=9)
-   -   Сниффер (http://mangos.ytdb.ru/showthread.php?t=419)

HuntsMan 03.03.2011 10:59

Такой вопрос: сколько соединений сейчас открывает клиент - 2 или больше?

Йоха 03.03.2011 11:43

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

Йоха 03.03.2011 12:16

а есть где-нибудь список актуальных опкодов ?

Lordronn 03.03.2011 13:35

Цитата:

Сообщение от Йоха (Сообщение 19691)
а есть где-нибудь список актуальных опкодов ?

Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 50 сообщение(ий)):
У вас нет прав чтобы видеть скрытый текст, содержащейся здесь.

RomanRom2 03.03.2011 13:44

кстати, а кто нибудь точно знает, каким опкодом они заканчивались в 1.12.1, 2.4.3 и 3.3.5?
у меня кроме как взять снифы и собрать все что в них встречалось других мыслей нет, как это собрать.

Lordronn 03.03.2011 14:09

Цитата:

каким опкодом они заканчивались
Ласт опкод в листе?

Раньше опкоды были в клиенте(до катаклизма). Если есть экзешники и экстрактор, то можно извлеч листы опкодов и посмотреть. А вообще листы опкодов для этих версий есть в ветке 1.12, 2.4.3 и мастер

RomanRom2 03.03.2011 18:03

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

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

я просто к чему... если делать БК, то 2.4.3, если ВЛК, то 3.3.5, если классик, то 1.12.1, другие билды уже нафиг не нужны и смысла в них ноль.

Йоха 03.03.2011 19:44

Подскажите какой сейчас опкод на смену сидов ? раньше было CMSG_AUTH_NEW_SESSION, но сейчас что-то не найду его в списке

EDIT:

разобрался, это опкод 0x0E4C

srv38 20.04.2011 17:37

У меня пока получилось снифать весь трафик между клиентом и сервером и получать ключ сессии, теперь надо трафик расшифровать, по какому алгоритму он шифруется?:dntknw:

Йоха 20.04.2011 17:44

Цитата:

Сообщение от srv38 (Сообщение 21338)
У меня пока получилось снифать весь трафик между клиентом и сервером и получать ключ сессии, теперь надо трафик расшифровать, по какому алгоритму он шифруется?:dntknw:

Функция расшифровки есть в tiawps, я брал оттуда.
Лично для меня самое сложное было написать алгоритм сборки целых пакетов из кусков raw-потока. На отладку убил пол дня.

HuntsMan 29.04.2011 15:11

Можете подсказать адрес ключа для 4.1.0?

Йоха 29.04.2011 15:40

все есть на форуме. Базу иды выкладывает TOM_RUS, в этой же теме есть сообщение как найти адрес ключа в базе.

HuntsMan 29.04.2011 17:12

Цитата:

Сообщение от Йоха (Сообщение 21599)
все есть на форуме. Базу иды выкладывает TOM_RUS, в этой же теме есть сообщение как найти адрес ключа в базе.

Я видел эти сообщения. Проблема заключается в том, что я до сих пор не пойму как в IDA увидеть адрес того или иного элемента :sorry:

Йоха 30.04.2011 08:53

Вложений: 4
Цитата:

Сообщение от HuntsMan
Я видел эти сообщения. Проблема заключается в том, что я до сих пор не пойму как в IDA увидеть адрес того или иного элемента

Смотри, как описано на предыдущей странице ищем функцию по уникальной строке. Внутри нее есть такой кусок :
http://мангос.рф/attachment.php?atta...1&d=1304141916

Этот момент понятен ?
Тогда заходим в функцию ClientServices__GetCurrent, там видим:
http://мангос.рф/attachment.php?atta...1&d=1304142383

На этот раз переменная переименована в g_clientConnection, что бы увидеть ее адрес нажимаем на нее 2 раза мышью:
http://мангос.рф/attachment.php?atta...1&d=1304142561

Слева ее адрес - .data:00D03F14, он то нам и нужен. .data: - означает что переменная находится в сегменте с именем .data. нас это мало интересует, нам важно смещение внутри сегмента, это число после двоеточия.

Аналогично с функцией ClientServices__GetSessionKey.
Только там мы видим следующее:
http://мангос.рф/attachment.php?atta...1&d=1304142981
Здесь нужное нам число окрашено в зеленый цвет.

Еще вопросы остались ?

HuntsMan 30.04.2011 11:29

Спасибо :) Все понял, все замечательно :) Просто навигация в IDA по-моему малость неудобная. Кстати, если вдруг кому пригодится, то вот хорошенькая книженция

Йоха 12.05.2011 14:58

Подгонял снифер под 14007 билд, обнаружил любопытную вещь: клиент теперь умудряется открывать 2 соединения на одинаковый адрес:порт. В моей реализации это вызывало сбой, поскольку делалось предположение что пара адрес:ип уникальна.

Lordronn 12.05.2011 15:20

Хм, вот уже 3 дня пишу свой прокси для 4.1.0а. Ниразу не замечал, чтобы был 1 адресс и порт по несколько раз

Йоха 12.05.2011 15:22

Я вчера офигел, сегодня ситуация повторялась. сперва я подумал что это у меня глюк. Открыл окно проксифиера, долго пялился на адреса, действительно было 2 коннекта на одинаковый адрес и порт, даже скрин сделал

HuntsMan 12.05.2011 17:53

Мммм близзы знают толк в извращеньях. Я просто новый класс соединения создаю, и запихиваю его в контейнерный класс.

RomanRom2 12.05.2011 18:10

да почему в извращеньях то? почему вы озадачены подключениями на один и тот же target? раньше ведь все коннектились на какой нибудь localhost:3724 тремя клиентами одновременно и ничего...

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

HuntsMan 12.05.2011 18:11

Если я правильно понял Йоху, то клиент открыл 2 соединения на один и тот же хост и порт, это помоему извращение.

ЗЫ: А у меня сейчас впервые в жизни клиент открыл соединения только с 3724 и 1119 :D обычно ещё на 80 порты соединений 5 откроет :)

alien 12.05.2011 18:32

А в чем извращение то? Я вот тоже не понимаю. Ну подумаешь клиент открывает соединения на один и тотже хост, порт что в этом такого то?

Йоха 12.05.2011 18:50

Цитата:

Сообщение от HuntsMan (Сообщение 22234)
Если я правильно понял Йоху, то клиент открыл 2 соединения на один и тот же хост и порт, это помоему извращение.

Правильно понял, я тоже так думаю -)

Роман смотри как это получается (например):
клиент открывает коннект на адрес 195.12.246.210:3724
потом там с десяток пакетов пробегает, он открывает новое соединение на адрес 195.12.246.213:3724 (или 211 или 212) и закрывает первое.
И в это одно соединение бегают редкие пакетики (наверно варден).
В это время клиент находится в окне выбора персонажей. При входе в мир он открывает еще одно соединение ну там опять же допустим на адрес 195.12.246.212:3724. И получается что у клиента два активных соединения:
195.12.246.212:3724
195.12.246.213:3724

А бывает что после входа в мир остаются два соединения абсолютно одинаковых:
195.12.246.211:3724
195.12.246.211:3724

Хотя бывали случаи что клиент открывает одно соединение и до входа в мир в это одно соединение и работает

Lordronn 12.05.2011 18:52

Цитата:

И получается что у клиента два активных соединения:
195.12.246.212:3724
195.12.246.213:3724
Уверен что они активны? Может он их закрывает, а ты просто не пишешь информацию о закрытии соединения?(у тебя ведь консольный сниффер?)

HuntsMan 12.05.2011 19:09

Подтверждаю слова Йохи:
http://filebeam.com/c1248889bf4b97f6...8049de9656.jpg

Непонимаю только зачем так делать...

Lordronn 12.05.2011 19:14

Глянь в лог проксикапа. Мб он закрыл коннект и потом появился такой-же новый.

HuntsMan 12.05.2011 19:20

Да не закрывает он ничего... Держутся 2 активных соединения на один и тот же хост и порт

Йоха 12.05.2011 19:23

Вложений: 2
Цитата:

Сообщение от Lordronn (Сообщение 22240)
Уверен что они активны? Может он их закрывает, а ты просто не пишешь информацию о закрытии соединения?(у тебя ведь консольный сниффер?)

Уверен! я сперва тоже подумал что глюк моего снифера, потом открыл проксифиер - там была та же картина : те же два одинаковых соединения, и циферки трафика увеличивались по обоим, то есть они не просто были открыты, они были оба активны и по ним передавались данные.

У меня в снифере корректно отслеживаются октрытия/закрытия соединений.

[Добавлено]
Вот сейчас клиент открыл всего 1 соединение до входа в мир, а при входе еще одно, точно такое же, и все прекрасно работает

http://мангос.рф/attachment.php?atta...1&d=1305218185

http://мангос.рф/attachment.php?atta...1&d=1305218185

RomanRom2 12.05.2011 21:02

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

вы должны понимать, что это ВТОРОЕ соединение и работает оно соответствующе, сервер с клиентом это вот понимают. а вы чего? =)

HuntsMan 12.05.2011 21:14

Цитата:

Сообщение от RomanRom2 (Сообщение 22252)
вы должны понимать, что это ВТОРОЕ соединение и работает оно соответствующе, сервер с клиентом это вот понимают. а вы чего? =)

Пытаемся понять а на*** все это :) Думаю что теперь по умолчанию подымается 2 соединения на одном хосте, а потом в зависимости от нагрузки одно из соединений закрывается, и открывается на другом хосте.

RomanRom2 12.05.2011 21:21

странные вы...
второе соединение устанавливается со времен 3.3.5, ну правда тогда оно просто переключалось. не помню с какого момента связь клиента с миром поддерживается двумя соединениями. они даже в клиенте по разному обозначаются и показывают каждый свое latency.

не спрашивайте на*** это все, не знаю =) это нужно принять как свершившийся факт и жить с этим.

Lordronn 12.05.2011 21:28

Йоха, я думал ты имеешь ввиду 2 абсолютно одинаковых коннекта.
Тут же порт клиента разный. адресс 127.0.0.1, а порт то меняется

Йоха 12.05.2011 21:43

Цитата:

Сообщение от Lordronn (Сообщение 22257)
Йоха, я думал ты имеешь ввиду 2 абсолютно одинаковых коннекта.
Тут же порт клиента разный. адресс 127.0.0.1, а порт то меняется

да это все понятно. Раньше такого не было, я сколько снифал всегда коннекты были на разные адреса или порт. Это только с 14007 билда пошла такая фигня что коннекты оказываются на один и тот же адрес порт.
В этом ясное дело нет ничего сверхъестественного, просто именно на 14007 билде мой снифер стал падать, до этого все работало, и это меня и удивило. Я уже исправил недочет, сейчас тоже все снифается без проблем.

HuntsMan 12.05.2011 21:50

Цитата:

Сообщение от RomanRom2 (Сообщение 22256)
странные вы...
второе соединение устанавливается со времен 3.3.5, ну правда тогда оно просто переключалось. не помню с какого момента связь клиента с миром поддерживается двумя соединениями. они даже в клиенте по разному обозначаются и показывают каждый свое latency.

не спрашивайте на*** это все, не знаю =) это нужно принять как свершившийся факт и жить с этим.

Я в курсе про соединения, я эту тему практически наизусть знаю :) Я про то, что клиент раньше подымал 2 коннекта на разных физических серверах, и это было впринципе вполне логично. Но сейчас он подымает 2 соединения, но уже на одном физическом сервере, а дальше переключается уже куда лоад балансер укажет. Я про то, что смысл было это делать, если реализация раньше имхо была более качественная из соображений здравого смысла.

RomanRom2 12.05.2011 22:14

ну судя по предыдущему сообщению не совсем наизусть =)

во первых опечатка, клиент подымает соединения на разных физических серверах... полминуты сообразить пытался =) клиент подымает (инициирует) соедиенения на твоем компе, а не на серверах =) это как бэ немного разные вещи, но я понял о чем речь.

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

после установки второго коннекта лоадбалансер уже ничего не указывает. он уже указал.

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

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

Grinder 22.05.2011 13:57

Разщбираюсь со снифером! Как образец взял tiawps.
Добился получения процесса!
Но блин упорно не хочет читать SessionKey :(

В tiawps делают вот так:

PHP код:

DWORD number_of_read_bytes=0;

    
char pointer***91;4***93; = {'\0'};
    
ReadProcessMemory(wow_process_handle, (LPCVOID)CONNECTION_PTR_OFFSETpointer4, &number_of_read_bytes);

    if(
number_of_read_bytes != 4)
    {
        
printf("couldn't read pointer, just read %u bytes instead of 4\n"number_of_read_bytes);
        
CloseHandle(wow_process_handle);
        return 
FALSE;
    }
    
// convert bytes to pointer
    
unsigned int sessionKeyPosition 0;
    
memcpy(&sessionKeyPositionpointer4);
    
printf("Got pointer: %#X\n"sessionKeyPosition);

    
number_of_read_bytes 0;
    
ReadProcessMemory(wow_process_handle, (LPCVOID)(SESSIONKEY_OFFSET+sessionKeyPosition), sessionKeySESSIONKEY_LENGTH, &number_of_read_bytes);
    
CloseHandle(wow_process_handle);
    if(
number_of_read_bytes != SESSIONKEY_LENGTH)
    {
        
printf("couldn't read sessionkey, read %u bytes instaed of %u\n"number_of_read_bytesSESSIONKEY_LENGTH);
        return 
FALSE;
    } 

Это забил в enum'е чтобы не передавать параметры

PHP код:

SESSIONKEY_LENGTH 40
SESSIONKEY_OFFSET 
0x508
CONNECTION_PTR_OFFSET 
0x00D03F14 

Для проверки делал вывод в консоль на равенство
PHP код:

if(number_of_read_bytes != SESSIONKEY_LENGTH

В итоге плучил что number_of_read_bytes = 0!!!!! Где косяк?

zergtmn 22.05.2011 14:30

Win7? ASLR?

TOM_RUS 22.05.2011 14:31

Цитата:

Сообщение от Grinder (Сообщение 22774)
Разщбираюсь со снифером! Как образец взял tiawps.
Добился получения процесса!
Но блин упорно не хочет читать SessionKey :(

В tiawps делают вот так:

PHP код:

DWORD number_of_read_bytes=0;

    
char pointer***91;4***93; = {'\0'};
    
ReadProcessMemory(wow_process_handle, (LPCVOID)CONNECTION_PTR_OFFSETpointer4, &number_of_read_bytes);

    if(
number_of_read_bytes != 4)
    {
        
printf("couldn't read pointer, just read %u bytes instead of 4\n"number_of_read_bytes);
        
CloseHandle(wow_process_handle);
        return 
FALSE;
    }
    
// convert bytes to pointer
    
unsigned int sessionKeyPosition 0;
    
memcpy(&sessionKeyPositionpointer4);
    
printf("Got pointer: %#X\n"sessionKeyPosition);

    
number_of_read_bytes 0;
    
ReadProcessMemory(wow_process_handle, (LPCVOID)(SESSIONKEY_OFFSET+sessionKeyPosition), sessionKeySESSIONKEY_LENGTH, &number_of_read_bytes);
    
CloseHandle(wow_process_handle);
    if(
number_of_read_bytes != SESSIONKEY_LENGTH)
    {
        
printf("couldn't read sessionkey, read %u bytes instaed of %u\n"number_of_read_bytesSESSIONKEY_LENGTH);
        return 
FALSE;
    } 

Это забил в enum'е чтобы не передавать параметры

PHP код:

SESSIONKEY_LENGTH 40
SESSIONKEY_OFFSET 
0x508
CONNECTION_PTR_OFFSET 
0x00D03F14 

Для проверки делал вывод в консоль на равенство
PHP код:

if(number_of_read_bytes != SESSIONKEY_LENGTH

В итоге плучил что number_of_read_bytes = 0!!!!! Где косяк?

GetLastError() и смотрите код ошибки...

Grinder 22.05.2011 14:33

Цитата:

Сообщение от zergtmn (Сообщение 22775)
Win7? ASLR?

Да, Win7

Konctantin 22.05.2011 14:54

попробуйте так:
http://ru-mangos.ru/showpost.php?p=12460&postcount=4


Текущее время: 15:42. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS