Перейти к содержимому
Korean Random
Dragon armor

Мод "Эмулятор сервера World of Tanks".

Рекомендуемые сообщения

kokle.jpg

 

Я охреневаю с вас программистов наивных с пару человечками которые себя за умных выдают (К примеру Павлуша3333).  

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

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

Послушайте старого читера который не один год смотрит на то как разводят на знания.  

  • Не нравится 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@DWG  не напрягайся это просто бред. Протоколы, пакеты распарсены, я уже с этого начал валятся и ржать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, StranikS_Scan сказал:

Протоколы, пакеты распарсены, я уже с этого начал валятся и ржать. 

ага, все циклично https://habr.com/post/212351/

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, SkepticalFox сказал:

ага, все циклично https://habr.com/post/212351/

 

Ага, 2014 год, с тех пор публикаций не было, где цикличность, брат?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 minutes ago, StranikS_Scan said:

Ага, 2014 год, с тех пор публикаций не было, где цикличность, брат?

может и нигде, а может это её начало

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, SkepticalFox сказал:

может и нигде, а может это её начало

 

Всё может быть, всё может статься,

Всё может также и остаться.

Собака может укусить,

Девчонка может разлюбить,

Но что за "Трактор" бросить пить?!

Такому - ни когда не быть! )))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, StranikS_Scan сказал:

@DWG  не напрягайся это просто бред. Протоколы, пакеты распарсены, я уже с этого начал валятся и ржать.

Скажи лучше, мол ввели же в Total War Arena EasyAntiCheat.. Нету инфы когда они его полностью в танки всунут а не частично? )

  • Не нравится 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, DWG сказал:

Скажи лучше, мол ввели же в Total War Arena EasyAntiCheat.. Нету инфы когда они его полностью в танки всунут а не частично? )

 

Зачем в танках Античит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
(изменено)
14 минут назад, StranikS_Scan сказал:

 

Зачем в танках Античит? 

Тундру проверять и хеши модов, целостность игры :smile:

 

Всё я отчаливаю, меня на предмодерацию поставили на этом сайте. Пойду перезагружать роутер чтобы в игре не забанили… :blush:

Изменено пользователем DWG
  • Не нравится 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, DWG сказал:

Тундру проверять и хеши модов, целостность игры :smile:

 

Всё я отчаливаю, меня на предмодерацию поставили на этом сайте. Пойду перезагружать роутер чтобы в игре не забанили… :blush:

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
8 часов назад, SkepticalFox сказал:

ага, все циклично https://habr.com/post/212351/

Нет, это не при чём. Узнал об этой статье, когда у меня было сделано уже больше, чем там расписано. Автор статьи не смог разобраться с пакетом. Но за эти годы ничего в структуре сетевого протокола не поменялось. Учитывая, что он предпринял первые попытки в 2011, "За отчётные 3 года в схеме входа ничего кардинально не поменялось", то за 7 лет ничего не поменялось (да и почему должно?).

Цитата

Помеченные октеты, судя по тому, что изменяются они мало и более-менее предсказуемо — заголовок пакета

Нет, только первые 2 байта являются заголовком (WORD). А в пакете с флагом 1 ещё и 2 последних, которые указывают начало смещения данных.

Цитата

После них идёт равномерный битовый шум, то есть там уже включается шифрование.

Да, RSA. Но не всё, а только часть, которая содержит авторизацию. Почему не всё, не понятно. Проще было бы весь пакет зашифровать RSA.

Дальше автор пошёл не совсем по правильному пути (на мой взгляд), стал вмешиваться в программу. У меня для перехвата используется mitm, свой приватный RSA ключ. После получения Blowfish key можно расшифровывать весь остальной трафик, который будет после авторизации. Но и там, почему-то, первое сообщение идёт не шифрованным, хоть и не содержит ничего конфиденциального, clientID и serverID.

Цитата

Так WOT клиент только начинает входить в ангар

Создаётся энтити Login. Передаётся в точности то, что указано в секции Properties файла scripts\entity_defs\Login.def с флагами BASE_AND_CLIENT. В данном случае один параметр, как автор и написал

Цитата

После получения Session ID от сервера приезжает пакет, содержащий номер игрока в неожиданно текстовом формате (792067)

Цитата

    <accountDBID_s>
      <Type>    STRING    </Type>
      <Flags>    BASE_AND_CLIENT    </Flags>
      <Persistent>    true    </Persistent>
      <DatabaseLength>    96    </DatabaseLength>
      <Identifier>    true    </Identifier>
    </accountDBID_s>

Второй параметр (loginPriority) не передаётся, потому что у него флаг BASE, т.е. клиенту эти данные не доступны.

Цитата

Во-первых, видно, что все пакеты начинаются либо с 0x48, либо с 0x58, либо с 0x78; какой-нибудь закономерности на этот счёт я ещё не уловил, кроме того, что пакеты с уже известной функцией свой значащий байт не меняют.

Не все, не всегда. Два байта (а не один, как у автора), как уже написал - это флаги пакета. Поэтому не 0x58, а 0x458, точнее, добавляется флаг 1 << 10, означающий, что в пакете есть номер пакета, который был получен (был помечен, как надёжный, FLAG_IS_RELIABLE, 0x1).

Цитата

Во-вторых, почти в каждом пакете есть один или несколько счётчиков сообщений

Всё верно и логично.

Цитата

например, в keep-alive и ответах на них этим занимается третий и четвёртый байт в заголовке

Нет, это tickSync, служащий для синхронизации времени. Первый байт - номер пакета (0x13), второй - однобайтовый счётчик. Каждый тик сервера он увеличивается на единицу.

Цитата

кроме того сам пакет содержит ещё счётчик сообщений общий (включая keep-alive)

Да, это и есть то, что он написал.

Цитата

и какой-то специфический (считающий пакеты без учёта количества keep-alive)

А вот это мне долго было не понятно. Это некий Channel, увеличивается на 1, когда пакет не содержит флага FLAG_IS_RELIABLE. Иначе остаётся неизменным.

Про шифрование он верно написал.

Цитата

А вот пакет, который начинается на 0x78 0x00 на первом скриншоте — особо интересен. Сочетание сигнатуры 0x80 0x20 вкупе с тем, что перед каждым строковым литералом в нём стоит 0x55 и байт длины строки, а после каждого 0x71 находится возрастающий номер, должно насторожить опытных питонщиков — это же, чёрт побери, Python Pickle со своим запихиванием всего подряд в мемо!

Вот за это ГИГАНТСКАЯ благодарность автору. До прочтения этой статьи мне было непонятно, что это.

Цитата

В следующей части, если она заинтересует уважаемых обитателей Хабра, я расскажу о том, как в протоколе WOT передаются файлы, размеры которых намного больше реалистичного размера UDP пакета и MTU. И о том, что эти файлы оказывается сжатыми zlib'ом а внутри у них всё тот же Python Pickle с разными неожиданными вещами.

Следующей статьи не вышло, дополню автора. Если размер пакета больше, чем MTU для UDP (но в протоколе меньше, примерно 1276 байт полезной нагрузки), в пакет добавляется флаг FLAG_IS_FRAGMENT 1 << 5, в конец пакета добавляются два номера, один - с какого пакета начинается пересылка, второй - каким закончится, эти номера неизменны. И, собственно, пересылаются все данные. Каждый пакет, естественно, так же содержит всю служебную информацию, заголовок, порядковый номер.

Есть ещё одна возможность передать данные, размер которых больше MTU, это в пакете resourceFragment. Отправляется он как результат выполнения функции doCmdInt3 (все доступные можно посмотреть в файле ClientCommandsPort.def, секция BaseMethods, с тегом Exposed), в результате приходит ответ и вызывается функция onCmdResponse, где параметр resultID == RES_STREAM (1). Отличие этого метода пересылки в том, что пакеты приходят с каждым тиком сервера (т.е. один раз в 100 мс). Пакеты с флагом FLAG_IS_FRAGMENT идут один за другим с минимальным интервалом.

 

Цитата

github.com/Camelion/jts-tanks
уже давно разобрали и пилится эмулятор

А вот это никак не помогло.

Цитата

А вот так он себя ведёт уже находясь в ангаре.

На скриншоте показано количество игроков на сервере/всего. Это вызов функции doCmdInt3 с cmd == CMD_REQ_SERVER_STATS, когда нужный пакет придёт, будет вызвана функция receiveServerStats, содержащая SERVER_STATISTICS (значения можно посмотреть в alias.xml).

Цитата

  <SERVER_STATISTICS>    FIXED_DICT      <Properties>
      <clusterCCU>
        <Type>    UINT32    </Type>
      </clusterCCU>
      <regionCCU>
        <Type>    UINT32    </Type>
      </regionCCU>
    </Properties>
  </SERVER_STATISTICS>

 

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

Хотя, судя по скринам, сетевой протокол немного изменился за последние 4 года. У автора нет пакета 0x13, вроде бы в то время это 0xd.

  • Нравится 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
8 часов назад, DWG сказал:

меня на предмодерацию поставили на этом сайте

Правильно сделали, таких как ты особенных еще поискать.

  • Нравится 2
  • Не нравится 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
17 часов назад, Dragon armor сказал:

Приветствую всех.

Тема создана, главным образом, для обсуждения. Мне было бы интересно почитать, кто что думает об этом, потому что у меня нет идей, что делать дальше, логический тупик, else {assert(FALSE);}.
Не так давно меня привлекла эта игра. Очень было интересно гонять на первых уровнях, ничего в тот момент не понимая, не зная, куда ехать, просто едешь, шмаляешь. Вместе с этим мне было интересно узнать, что внутри. Не моды, скрипты и то, что лежит на поверхности, а глубже, гораздо глубже. Для online-игры на уровень сетевого протокола, как именно происходит обмен сообщениями, что отправляет и получает клиент. Время шло и всё больше мне становилось известно. Например, используя информацию, что мне была известна на тот момент, у меня получилось распарсить 100к реплеев и достать интересующую меня информацию. Конкретной цели у меня не было, в соответствующей теме уже писал, что просто поделился той информацией, что мне удалось достать. А потом мне пришла идея написать свой сервер. Хотя мне это и казалось невозможным, но игра всё больше и больше раздражала, секреты и скрытые механики, странные непробития и летящие в неизвестность снаряды, поэтому, решил неспешно попробовать. Изначально хотелось создать что-то предсказуемое, убрать такое огромное влияние рандома, чтобы точно знать, почему произошло это и вот то, почему поджёг или засветили, когда в кустах стоял, чтобы не было секретных механик, скрытых параметров, ненужных прокачиваний (прекрасно понимаю, для чего это сделано), если захотел на каком-то танке покатать, чтобы была зависимость от скила, а не рандома. И у меня кое-что получилось.
Вот об этом и хотел бы пообщаться. А нужен ли эмулятор сервера? Первоначальная цель достигнута, уже сейчас можно загружаться в ангар. Если продолжать, нужно ещё очень много сделать. Но, если продолжать, то зачем?
На данный момент использую версию 0.9.22.0.1, это последняя версия перед патчем 1.0, потому что, начиная с 1.0 были какие-то изменения в сетевом протоколе, а мне не хочется разбираться, что именно поменяли. Всё ещё очень сырое, работает до первой внештатной ситуации, абсолютные пути прописаны прямо в коде, запуск из отладчика и прочие радости debug версии. Реализовал загрузку ангара, добавил почти всю технику и экипаж к ней. Много каких-то непонятных для меня ошибок, т.к. не мододел и с питоном достаточно плохо знаком. Например, при создании техники шведских ПТ с осадным режимом, возникает ошибка создания на сервере. При выборе в ангаре некоторой техники, возникает ошибка уже в клиенте, что, в некоторых случаях, странно, потому что выбираю существующую в игре технику, например, ELC EVEN 90 или 268/4. В логе ошибка "list index out of range", а отладчик питона к клиенту не умею цеплять. Что забавно, Waffentrager E100 выбирается без проблем. А VK168.02 Mauerbrecher опять с той же ошибкой. Или ещё недочёт, на 10 уровне у техники не исследованы модули, этого, видимо, ещё не реализовал для команды CMD_SYNC_DATA, а может это ещё где-то содержится.
Много времени уходит на то, чтобы понять, что и где содержится и откуда это достать. С созданием техники провозился очень долго, мне, как сишнику, крайне не привычен питон, в котором любой объект содержит всё, что угодно, и понять, что именно, надо долго искать, где он создаётся, что в него записывается. А в итоге строка вида "for veh_item in vehicles.g_list.getList(i).values()", чтобы достать compactDescr. Ах да, ещё и распарсить надо, items.parseIntCompactDescr, хотя где-то лежат уже нужные нация и id техники.
Надо ли продолжать дальше, а если надо, то зачем? Кто-то действительно запустит по локальной сети/интернету с друзьями покатушки на несколько часов? Это же не BigWorld, никакого кластера не будет, один сервер - одна карта. Но, в отличие от, например,  Counter-Strinke или Left4Death, здесь всё рассчитывается на сервере, а это уже не маленькая нагрузка, хотя даже приблизительно на данный момент не могу прикинуть, Барышников в своей лекции об BigWorld говорил что-то о 3.5 боёв, видимо, на одном ядре. Кто-то будет держать свой неслабый сервер для того, чтобы другие присоединились? Ведь гонять 1-на-1 наскучит быстро. А ещё статистики не будет, много ли кто будет просто так гонять, не похвалиться же.
Обновления для клиента невозможны, это давно не поддерживаемая версия. Графика устаревшая, хотя вряд ли это проблема, 8 лет играли с такой графикой, а с новой отвалились те, у кого не тянет.  Ошибки клиента никто уже не будет исправлять, даже теоретически, если только самому разбираться (это если возникнут, конечно же).
На скринах стату показывать бесполезно, там 0 боёв и 100500 рейтинга, как и везде, чего мелочиться-то. Она не из CMD_SYNC_DOSSIERS берётся, видимо, а из CMD_SYNC_DATA. Сейчас только ангар. И прогресс моих ЛБЗ на момент записи трафика.

error_268.4.PNG

shot_027.jpg

shot_023.jpg

shot_024.jpg

shot_026.jpg

shot_020.jpg

shot_011.jpg

shot_017.jpg

shot_018.jpg

shot_020.jpg

shot_021.jpg

shot_010.jpg

Продолжайй в том же духе,сделаешь локальный серв и все точно забъют на вот:rq_laugh:.Ставлю лойс)

  • Нравится 1
  • Не нравится 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
(изменено)
7 часов назад, Dragon armor сказал:

Да, RSA. Но не всё, а только часть, которая содержит авторизацию. Почему не всё, не понятно. Проще было бы весь пакет зашифровать RSA.

 

Задавал себе этот вопрос когда писал парсер реплеев, могу вот такую цитату привести.

 

Chapter 28. Encrypting Client-Server Traffic

BigWorld guarantees the security of the client-server session in two important ways:
 The login handshake is RSA-encrypted using a public key stored in the client resources.
 The client-proxy channel is symmetrically encrypted using Blowfish.
As a result, it is impossible for an attacker to:
 Steal a player's password
 Hijack a player's session
 Inject upstream packets into the player's traffic to disrupt his/her session

28.3. Customising the symmetric encryption algorithm
The Client-Proxy Channel is encrypted using 128-bit Blowfish by default. 
This encryption method was selected as it was the most secure, high-performance 
symmetric cipher offered in the standard OpenSSL distribution. Should you wish 
to use a different encryption algorithm, you should be able to edit 
src/lib/network/encryption_filter.cpp to change the encryption algorithm without 
needing to modify any header files.

https://gist.github.com/Monstrofil/939b6b16d95fab3fe16f8003093c1aa9

Цитата из вот этой документации, не думаю что со времен bw2.0 там что-то существенно меняли.

Изменено пользователем Monstrofil

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@maksroker ОК.

@Monstrofil Как у них сейчас устроено, мне известно. Просто не понятно, почему не шифруется всё? А то заголовок, clientID не шифрованы, потом шифрование и последние 2 байта вновь не шифрованы. Кстати, для реплеев используется только Blowfish.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
(изменено)
2 часа назад, Dragon armor сказал:

Как у них сейчас устроено, мне известно. 

А не разобрался случайно как происходит подгрузка информации из def-файлов и (главный вопрос - каким образом назначаются exposedId для пропертей и методов)? Мне приходится эту информацию для каждой версии из памяти клиента выдергивать, было бы круто иметь возможность "отвязаться" от клиента игры вообще.

 

Цитата

Просто не понятно, почему не шифруется всё? А то заголовок, clientID не шифрованы, потом шифрование и последние 2 байта вновь не шифрованы. 

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

Изменено пользователем Monstrofil
  • Нравится 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
10 минут назад, Monstrofil сказал:

А не разобрался случайно как происходит подгрузка информации из def-файлов и (главный вопрос - каким образом назначаются exposedId для пропертей и методов)? Мне приходится эту информацию для каждой версии из памяти клиента выдергивать, было бы круто иметь возможность "отвязаться" от клиента игры вообще.

 

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

ВО-во:blinky:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
(изменено)
1 час назад, Monstrofil сказал:

А не разобрался случайно как происходит подгрузка информации из def-файлов

Разобрался.

1 час назад, Monstrofil сказал:

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

Не знаю, что имел в виду этот человек, что даже заскринил моё сообщение, но именно из-за того, что мне нужны были def файлы, мне и требовались скрипты (scripts.pkg), притом, оригинальные, не изменённые.

1 час назад, Monstrofil сказал:

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

Это больше риторический вопрос. У программистов BigWorld была причина так сделать.

1 час назад, Monstrofil сказал:

каким образом назначаются exposedId для пропертей и методов

Попробую объяснить.

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

 

Заодно, надо распарсить alias.xml, потому что нужны будут размеры аргументов. Сейчас набросаю примерный план действия.

Изменено пользователем Dragon armor

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
(изменено)
25 минут назад, Dragon armor сказал:

Заодно, надо распарсить alias.xml, потому что нужны будут размеры сообщений. Сейчас набросаю примерный план действия.

Парсинг alias/.def я давно сделал, не заморачивайся. В принципе я уже сейчас могу весь реплей "проиграть" сторонней тулзой, включая создание Entity, вызов методов и изменение в ней proretries.

 

Мне интересны пакеты 0x7 и 0x8, там вторым параметром приходит messageId, по которому клиент определяет какой метод вызвать/какую property установить. Вот его сейчас приходится тянуть из памяти клиента, а хотелось бы получать автоматически при парсинге def-файлов.

Изменено пользователем Monstrofil

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

@Monstrofil Пока что печатаю. Но для 1.0 и выше в движке что-то изменили, поэтому, если надо для этих версий, то не получится.

Например, вот пакет. 95 должно быть chatCommandFromClient, а определяется неправильно.

 

Изменено пользователем Dragon armor

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×