Это копия, сохраненная 14 декабря 2018 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Этот тред будет являться неким дневником разработки.
О себе: принимал участие в разработке Lineage 2, Perfect World, Aion. Но никогда не работал с сетевой частью. Настало время вкатиться, так сказать, и сделать всё с нуля.
Приглашаю анонов поучаствовать во всем этом.
Правило: если у вас есть ко мне вопрос и вы хотите получить ответ именно от меня, то зашифруйте придуманную контрольную фразу ниже к вопросу публичным ключом и залейте куда-нибудь.
В ответе я укажу эту контрольную фразу - так вы поймете, что отвечающий - это я и никто другой.
Инструкция:
Сайт: https://8gwifi.org/rsafunctions.jsp
Публичный ключ:
-----BEGIN PUBLIC KEY-----
MFswDQYJKoZIhvcNAQEBBQADSgAwRwJATIRDG0NRp+MVYNLx1dGlQ/cuJT+dgRV9
x/5o04jL2QA3k+dWeYS7VDSdogkq+5yYro6hM/EvYv6RBrRlvW87FQIDAQAB
-----END PUBLIC KEY-----
Инструкция: https://imgur.com/a/1YQJp
Сам как то хотел сделать что-то типа онлайн игры, а потом понял что сделать что-то более сложное чем пошаговая стратегия у меня не получится, поэтому остановился на банальной проходилке.
Отсюда вопрос. На чем будешь делать сервер? Как будут клиенты конектится к серваку? Как будет проходить сериализация данных? Объекты(абстракции) на клиенте и серваках будут одинаковыми? Что ты знаешь про синхронизацию стейтов игры на разных клиентах? Готов к трудностям синхронизации? потом будут ещё вопросы.
День первый. Добываем информацию.
Качаем себе ЗАПУСКАТР, ставим на компутер себе это всё.
Пытаемся запустить R2 напрямую, видим ошибку - Используйте запускатр.
Заходим на сайт и пытаемся понять, как он связан с приложением, установленным на компе.
Беглый профессиональный взгляд подсказывает (точнее ошибки в консоли в хроме), что используется websocket технология.
На данном этапе цель - узнать как именно он запускает EXE
Заходим в Службы в винде - видим, что программа видит там, отключаем. Запускаем на прямую - не запускается, крашится. Странно, почему же так.
Открываем IDA - закидываем туда 4game-service, начинаем смотреть внимательно шаг за шагом, что же оно делает и почему не запускается.
Сразу загружаем strings и просматриваем все строки в файле.
Случайно увидел строки --install --start --console, отследил где они вызываются, F5, похоже на ключи при запуске, но Службы не передают никаких ключей. Странно.
Опыт подсказывает, что это параметры для запуска EXE, создаю ярлык с параметром --console , ибо оно было в списке - вуаля, запустилось окно и не закрывается.
Опытным путём установил, что никакие другие ключи кроме --console не работают. Открыл снова Strings - увидел просто слово start, судя по тексту функции - это тоже ключи. Но почему-то всё через пизду на этом этапе.
При запуске --console заходим на сайт - пытаемся войти в игру - выдает сайт ошибку 704. Пиздец странно.
Реверсим дальше. И тут случайно понимаю (используя гугл и гугля там константы и винапи функции), что оно использует суперправа СЛУЖБ для запуска, если запущено не как СЛУЖБА, то хрен тебе на рыло, а не приложуха 4гейма.
По идее, это говно должно сохранять лог файл куда-то, ну логично же, нет?
Вижу в exe путь //zptr/.., только куда он ведёт явно не указано. Но должна быть папка ZPTR. Качаем ProcessExplorer, запускаем прогу как Службу, смотрим какие файлы использует с помощью поиска - видим в папке с Windows - папку zptr, открываем. вуаля, вот наш лог файл. Смотрим, что он делает при запуске игры -
cmd : "C:\Program Files (x86)\4game\3.6.2.265\4game-launcher.exe" "C:\Games\Installed\R2 Online\Frost\frostUpdater.exe" " -frostGameNameType r2online_live -frostLauncher r2_launcher.exe -frostGame ..\R2Client.exe "LoginName XD13tvazcvvb -frostZone ru""
Он вызывает CMD с этим текстом, и игра запускается. Очевидно ключ посылает сайт и он по факту является временным токеном.
Кстати, потом только я заметил, что оно ведёт на сайт с конфигом, в котором указаны параметры для запуска, после всех этих манипуляций.
Ну что, берём ярлык к r2client.exe, присобачиваем параметр -frostZone ru
пау! заходим и видим ошибку авторизации, что указанного пользователя не существует.
Следующий этап - отвязать FROST, чтобы не мешался, а то глаза мозолит.
Открываем r2client.exe в ИДЕ, ищем где функция запуска фроста - патчим nop-ами, запускаем - фрост не вызвался, да и хуй с ним.
Осталось для отладки нормальной отвязать от запускатора.
Эти 4геймовцы чето с файлом намутили, что пришлось в дебри спускаться, и менять логику на такую: если 4гейм запущен, то ошибка запускатора, если не запущен, то нет ошибки. Решение временное, да и до пизды, наша задача преодолеть окно логина, попасть на выбор сервера.
День первый. Добываем информацию.
Качаем себе ЗАПУСКАТР, ставим на компутер себе это всё.
Пытаемся запустить R2 напрямую, видим ошибку - Используйте запускатр.
Заходим на сайт и пытаемся понять, как он связан с приложением, установленным на компе.
Беглый профессиональный взгляд подсказывает (точнее ошибки в консоли в хроме), что используется websocket технология.
На данном этапе цель - узнать как именно он запускает EXE
Заходим в Службы в винде - видим, что программа видит там, отключаем. Запускаем на прямую - не запускается, крашится. Странно, почему же так.
Открываем IDA - закидываем туда 4game-service, начинаем смотреть внимательно шаг за шагом, что же оно делает и почему не запускается.
Сразу загружаем strings и просматриваем все строки в файле.
Случайно увидел строки --install --start --console, отследил где они вызываются, F5, похоже на ключи при запуске, но Службы не передают никаких ключей. Странно.
Опыт подсказывает, что это параметры для запуска EXE, создаю ярлык с параметром --console , ибо оно было в списке - вуаля, запустилось окно и не закрывается.
Опытным путём установил, что никакие другие ключи кроме --console не работают. Открыл снова Strings - увидел просто слово start, судя по тексту функции - это тоже ключи. Но почему-то всё через пизду на этом этапе.
При запуске --console заходим на сайт - пытаемся войти в игру - выдает сайт ошибку 704. Пиздец странно.
Реверсим дальше. И тут случайно понимаю (используя гугл и гугля там константы и винапи функции), что оно использует суперправа СЛУЖБ для запуска, если запущено не как СЛУЖБА, то хрен тебе на рыло, а не приложуха 4гейма.
По идее, это говно должно сохранять лог файл куда-то, ну логично же, нет?
Вижу в exe путь //zptr/.., только куда он ведёт явно не указано. Но должна быть папка ZPTR. Качаем ProcessExplorer, запускаем прогу как Службу, смотрим какие файлы использует с помощью поиска - видим в папке с Windows - папку zptr, открываем. вуаля, вот наш лог файл. Смотрим, что он делает при запуске игры -
cmd : "C:\Program Files (x86)\4game\3.6.2.265\4game-launcher.exe" "C:\Games\Installed\R2 Online\Frost\frostUpdater.exe" " -frostGameNameType r2online_live -frostLauncher r2_launcher.exe -frostGame ..\R2Client.exe "LoginName XD13tvazcvvb -frostZone ru""
Он вызывает CMD с этим текстом, и игра запускается. Очевидно ключ посылает сайт и он по факту является временным токеном.
Кстати, потом только я заметил, что оно ведёт на сайт с конфигом, в котором указаны параметры для запуска, после всех этих манипуляций.
Ну что, берём ярлык к r2client.exe, присобачиваем параметр -frostZone ru
пау! заходим и видим ошибку авторизации, что указанного пользователя не существует.
Следующий этап - отвязать FROST, чтобы не мешался, а то глаза мозолит.
Открываем r2client.exe в ИДЕ, ищем где функция запуска фроста - патчим nop-ами, запускаем - фрост не вызвался, да и хуй с ним.
Осталось для отладки нормальной отвязать от запускатора.
Эти 4геймовцы чето с файлом намутили, что пришлось в дебри спускаться, и менять логику на такую: если 4гейм запущен, то ошибка запускатора, если не запущен, то нет ошибки. Решение временное, да и до пизды, наша задача преодолеть окно логина, попасть на выбор сервера.
>На чем будешь делать сервер?
Rust. Показался достаточно простеньким по сравнению с C++, мне главное пакеты отправлять и многопоточность. Хотел GO, но как ознакомился с проблемой многопоточности - так передумал сразу.
>Как будут клиенты конектится к серваку?
Очевидно, что устанавливая TCP и (возможно) UDP соединение. UDP пакетов в игре не заметил при первом запуске wireshark. Хотя странно, игра поточная - по идее должна пакеты UDP отправлять в игровом мире. Не знаю, я сейчас не на этом этапе.
>Как будет проходить сериализация данных?
Современные игры для передачи своего состояния используют пакеты. Посмотри сорцы почти любой мморпг, увидишь - что общение идет через пакеты с инфой. Кстати, найти декрипт пакетов - как по мне самое сложное.
>Объекты(абстракции) на клиенте и серваках будут одинаковыми?
Не совсем понял о чем речь
>Что ты знаешь про синхронизацию стейтов игры на разных клиентах?
пакеты-пакеты-пакеты-пакеты
Например пакет в Aion, который ответственен за перемещение всего существующего в мире и передачу информации на клиента:
https://github.com/ghostfur/Aion-Lightning-4.9-SRC/blob/master/AL-Game/src/com/aionemu/gameserver/network/aion/serverpackets/SM_MOVE.java
>Готов к трудностям синхронизации?
Поживем - увидим
на самом деле у меня крайне мало опыта вообще во всём этом, просто интересно сделать что-нибудь
Спасибо, анон! Я даже чё-то понял. Даже сам вдохновился идеей пакетов. По ссылке вижу что в пакете есть что-то подобноее Model-Controller-Network системы, но там как я понял серв вообще на Java.
окей пакет блять.
Но соединение то по TCP, никакого няшного http.
Как ты планируешь в TCP запихнуть этот самый пакет?
Лол, ты совсем зелёный что ли? Почитай про основу основ, протокол IP.
рекомендую ознакомиться с моделью OSI, сразу многое станет понятно.
Например, что TCP - это транспортный протокол,
а http - прикладной протокол и писать сервер на протоколе http можно, только если это API
>Как ты планируешь в TCP запихнуть этот самый пакет?
Что такое пакет, по факту - просто набор байтов (правильней говорить фреймы, сегменты, но я говорю пакеты, привычней), которые будут переданы более низкому уровню по модели OSI, соответственно из TCP (транспортного уровня) будет навешана дополнительная информация (инкапсуляция пакетов. смотри не обосрись от сложных слов, но это реально основы работы сети) и с TCP передано на сетевой уровень (IPV4/ipv6) , который уже навешает еще один слой - куда и кому отправлять - далее передаст этот уже ПАКЕТ на еще низкий - канальный - навешает на него еще информации всякой и передаст пакет по технологии Ethernet (internet, ethernet, wan - разные вещи), на этапе ETHERNET будут уже не пакеты с байтами, а биты (нолики и единички)
и последний уровень - уровень оборудования - это физика, например пучок света по оптоволокну. И потом происходит после доставки - декапсуляция - возвращение пакета в первоначальное состояние.
То есть что такое TCP frame по факту - набор байтов. Мы просто устанавливаем TCP соединение (смотри википедию про TCP handshake), и отправляем любые байты - которые захотим, а клиент уже сам поймет, что это за байты и куда они нужны.
Следи за дневником, тут будет разбор пакетов, если я найду как происходит ебучий декрипт ебучих пакетов
Уже хотел зарепортить залетыша из гд со своими ДНЕВНИЧКАМИ, но блин, вроде годнота, да еще и на расте. Когнитивный диссонанс. Хочу ненавидеть опа, но не могу.
Это не геймдев, это ревёрс-инжинеринг уже существующего продукта.
У нас есть клиент, но нет сервера, нужно восстановить сервер по клиенту (и снифая пакеты с сервера)
>Хотел GO
А почему бы и нет.
да здравствует языкосрач
Хотя тебе виднее.
Просто о многопоточночти и что она не вшита в язык.
По идее GO как раз выигрывает у раста в этом плане, так как хорошо что многопоточности нет в языке, потому что это проблема не языка а машины на которой программа работает. То есть надо найти фреймворк для GO под операционку под которую ты будешь писать воооот. Чтобы он подконектился к ядрам проца.. хз короче. так как если многопоточность, зашита в язык может генерировать ошибки. А если у тебя будет отдельно модуль с многопоточностью ты сможешь его поменять или отключиь.
На Dlang не смотрел?
нет.
просто по опыту, самые бесячие и скрытые баги случаются именно по вине мультипоточности. ну это когда пишешь для клиента и жопа горит. Когда пишешь для себя, можно с чувством с толком с расстановкой ими наслаждаться.
Интересно, я такой низкоуровневой разработкой не занимался - все больше вебня, но сейчас даже возникло желание вместе с тобой пописать. Как бы это организовать?
>я такой низкоуровневой разработкой не занимался - все больше вебня
да все уже поняли что на дваче макаки одни
Зашифруй дискорд канал с помощью открытого ключа в старте топика, я подключусь
>>163554
Не люблю джава со времен айона, слишком много ёбли с версиями, и слишком много ёбли с потребляемой памятью. Посмотрим, не могу сейчас так далеко заглядывать в будущее
>>163556
Смотрел, отказался. В Rust больше простого, когда увидел этот match - просто обкончался радугой.
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8IiFyABmFJdOljhw6cSgxEvLQ
ITPsbWux0JIZReSPd+RBUbTntrtjG4Kf6L1BQUL8DKCmYBe6qTNzdUgePYGbShd1
YmQw9WbPcIPeUUZfAE8ZqU4Mp1z7K7Dz4CjQRsPvi99uR0w2AOlrZdDoMHlsB/8X
O57df3KceM8hZjCHiwIDAQAB
-----END PUBLIC KEY-----
iGSn6tQID2mA9ztAgPNAp5SoHf+H83p/bPQT6DgQj5Htdp5CBigKi4p5GHyeu0qLDo0l3DeNwHv0rZfEd7Dx+MtcNVooDIeF2NlwpzAD1rscc7c+C5bkZrqCMBcPSJ1yQKn53/C83cQjaVfX5mX9OSMJ4S9iNx9aWq5Ayl4kuV8=
я хз правда как ты это будешь расшифровывать - этот сайт во второй вкладке у меня падает на декрипте метода
я хз че за ключ ты использовал,
мой ключ не позволяет такие длинные сообщения писать
кидай в открытую, я пристально слежу за тредом ради тебя
все сообщение - https://discord.gg/q2n5S6K
(при чем, что меня поразило - когда я делаю ctrl+a на поле с публичным ключем шифрованное сообщение меняется)
Тут работы непочатый край. Мало верится в успешном завершении начатого.
Скорее всего законченный сервак не сможет держать много игроков онлайн.
а в чём именно предвидится сложность?
Если у нас (уже нас двое) не хватит скилла по хайлоду, то всегда есть другие люди, которые могут помочь в окружении профессиональном.
>>163913
У меня нет цели сделать 100% рабочий сервер, да это и невозможно всё время гнаться за официальным. Мне бы просто преодолеть окно авторизации для начала. А дальше - посмотрим.
После того, как отвязали внутренние защиты издателя, можно спокойно запустить Wireshark и посмотреть что происходит при подключении клиента к серверу.
Видим пакеты:
Два на хендшейк, а третий с Data длиной 204. Начинается на CC 00 00 01 4F ........ и ещё 199 байтов
После - клиент отправляет три пакета подряд, с оффсетом (это все один пакет, просто разбит на три) и еще что-то происходит, что неважно на самом деле сейчас.
При запуске IDA, ставим breakpoint, что после WinAPI функции recv(), видим, что в память записался целиком пакет после получения IP адреса (geo.r2online.ru, еще байты какие-то, а после уже наш пакет).
Дальше - в случае долгого отсутствия ответа, (ну да, пока трейсинг запустится, начнет обход совершать, сервер закроет соединение) - "Соединение прервано". В случае если все быстро прошло, то "Пользователь не найден". Вот как он понимает, что пользователь НЕ НАЙДЕН?
Просматривая регистры во время исполнения инструкций, я понял, что после функции recv() он поднимается в функцию, которая проверяет пакет на длину, так как recv() в случае удачи возвращает длину полученного пакета
Так как CC = 204, и у нас пакет 204 байта, то он еще вычитает из CC - 2 = CA, и вроде бы еще 2, это опкод скорее всего.
Дальше он вызывает с помощью call eax функцию, которую можно отследить только во время отладки, которая зачем-то зануляет указатель на адрес *a = 0 и возвращается в функцию.
Дальше происходит функция memmove() и он возвращается в функцию, связанную с событиями WSANetworkEvents
Подозреваю, что западло случается на функции memmove(),
думаю, что после memmove надо установить breakpoint на памяти и посмотреть, что происходит. Какая именно сука обращается к тому участку памяти.
Нужно дальше копать.
У меня тоже есть желание написать сервер для одной не очень популярной игры. Уже достаточно далеко продвинулся, т.к. есть скилл реверс-инжиниринга. У меня полностью расшифрован сетевой протокол. Осталось решить несколько фундаментальных и очень важных вопросов в протоколе, но уже сейчас могу читать всё, что игра отправляет-получает. А вот с написанием сервера проблема. Т.к., во-первых, у меня си головного мозга, во-вторых, лень, а в-третьих, не знаю, с чего начать. Всё, что сделано на данный момент, это возможность логиниться. И клиент игры успешно соединяется с сервером. А дальше не знаю, чего делать. Как создавать пакеты? Вроде легко, но нужно продумать, как это делать. Один сетевой пакет может содержать множество сообщений. Это надо как-то реализовать, нужно собирать сообщения в один пакет, добавить служебные сообщения, заголовок, отправку по таймеру, обработку ошибок (а именно, подтверждение доставки UDP и повторную отправку в случае отсутствия подтверждения, которое в сетевом протоколе реализовано, но мне не до конца понятно), разбивку пакетов, если сообщение слишком длинное и прочее. Но дальше ещё много чего нужно будет делать помимо сетевого протокола. Нужно будет разобраться с картами, загружать их геометрию в физический движок, модели туда же. Хотя с этим полегче, потому что находил несколько утилит для просмотра карт и моделей.
можно заказывать что угодно с большого количества магазинов (ебей, амазон) за >30 долларов, и тебе вернется ровно 50 долларов на баланс
(немного напиздел, но суть такая)
Копай, анончик, уж очень нравится, как ты пишешь. Как будто остросюжетный роман читаю.
Достаточно утомительное занятие - разбор сетевого протокола. Ида и Wireshark - очень хорошие инструменты для неспешного статического анализа, когда уже знаешь, где смотреть. А для поиска того места нужен будет отладчик. Хотя Ида снабжена отладчиком, мне он показался очень неудобным. Гораздо лучше использовать OllyDbg, если у тебя 32-битное приложение. Версия 2.01 как-то поприятнее, чем предыдущая 1.10, но под неё меньше плагинов (возможно, было). Но, если приложение не шифровано/криптовано и не содержит антиотладочных механизмов, то плагины не нужны.
>При запуске IDA, ставим breakpoint, что после WinAPI функции recv(), видим, что в память записался целиком пакет после получения IP адреса (geo.r2online.ru, еще байты какие-то, а после уже наш пакет).
Не помню, как выглядит получение IP адреса, но это очень похоже на него, т.е. что-то типа gethostbyname. Сначала сделай статический анализ, посмотри импорт, какие функции в приложении используются для отправки/получения пакетов. Это может быть send/recv, так и WSASend/WSARecv. Кстати, там TCP или UDP? Тогда могут быть функции sendto/recvfrom. И если UDP, то, как и в той малоизвестной игре, будут использоваться механизмы контроля доставки, такие как, например, счётчик сообщений и некие каналы (UDPChannel), с которым никак не разберусь, хотя есть исходники от 2009 года и документация от 2012.
>Вот как он понимает, что пользователь НЕ НАЙДЕН?
Ты пропустил запрос/ответ или не на то брекпойнт поставил. Wireshark должен же эту сетевую активность отловить.
>и вроде бы еще 2, это опкод скорее всего
А может быть и флаг для всего пакета. А опкодов может быть много в одном пакете.
>Дальше он вызывает с помощью call eax функцию, которую можно отследить только во время отладки
Если клиент написан на C++, это вызов виртуальной функции. Хотя и на C может быть похожее. Нужно смотреть на регистр ecx, в него в C++ перед вызовом заносится указатель на класс. В C такого нет. Найти таблицу виртуальных функций просто, достаточно перейти в отладчике на адрес, из которого присваивается регистру eax, это конструкция вида mov eax, [esi + 4]. Достаточно посмотреть, на что указывает (к примеру) esi, а дальше в Ida переходишь по этому адресу. Если нужно восстановить структуру класса, то поднимаешься выше и по перекрёстной ссылке (почему то надо жать Ctrl+X, а не просто X) выходишь на место, где указатель заноситься на место виртуальных функций класса (это нулевой элемент, если рассматривать его как массив). Элементарно же (когда знаешь, как делать, потому что попадёшь в конструктор, а надо будет ещё на уровень выше переходить, там и узнаешь размер класса).
>он возвращается в функцию, связанную с событиями WSANetworkEvents
Мне кажется, ты слишком глубоко полез.
Вот что мне очень понравилось и крайне удобно для анализа - это написание плагина-диссектора для Wireshark. Это долго, утомительно, но полностью окупается последующей лёгкостью анализа. Wireshark мегаудобен для подобного (ещё бы), у него множество функций и своих дополнительных диссекторов (тот же JSON можно смотреть прямо в пакете, как на скринах выше) для анализа. Для представления данных у него есть огромное количество своих предопределённых форматов, такие как IP адрес (который красиво отформатирует его), даты, целых и float всех возможных форматов (1, 2, 3, 4, 8 байт, со знаком, без знака, big-endian, little-endian), строк, битовых полей и всё это в одном пакете в любом порядке. Когда каркас напишешь, потом смотришь сдампленный трафик и сразу же добавляешь и уточняешь структуру, а в некоторых местах можно даже без запуска игры понять.
>>166753
>Давай дискорд сюда, я свяжусь с тобой
Да не, это типа мотивации было для тебя.
Достаточно утомительное занятие - разбор сетевого протокола. Ида и Wireshark - очень хорошие инструменты для неспешного статического анализа, когда уже знаешь, где смотреть. А для поиска того места нужен будет отладчик. Хотя Ида снабжена отладчиком, мне он показался очень неудобным. Гораздо лучше использовать OllyDbg, если у тебя 32-битное приложение. Версия 2.01 как-то поприятнее, чем предыдущая 1.10, но под неё меньше плагинов (возможно, было). Но, если приложение не шифровано/криптовано и не содержит антиотладочных механизмов, то плагины не нужны.
>При запуске IDA, ставим breakpoint, что после WinAPI функции recv(), видим, что в память записался целиком пакет после получения IP адреса (geo.r2online.ru, еще байты какие-то, а после уже наш пакет).
Не помню, как выглядит получение IP адреса, но это очень похоже на него, т.е. что-то типа gethostbyname. Сначала сделай статический анализ, посмотри импорт, какие функции в приложении используются для отправки/получения пакетов. Это может быть send/recv, так и WSASend/WSARecv. Кстати, там TCP или UDP? Тогда могут быть функции sendto/recvfrom. И если UDP, то, как и в той малоизвестной игре, будут использоваться механизмы контроля доставки, такие как, например, счётчик сообщений и некие каналы (UDPChannel), с которым никак не разберусь, хотя есть исходники от 2009 года и документация от 2012.
>Вот как он понимает, что пользователь НЕ НАЙДЕН?
Ты пропустил запрос/ответ или не на то брекпойнт поставил. Wireshark должен же эту сетевую активность отловить.
>и вроде бы еще 2, это опкод скорее всего
А может быть и флаг для всего пакета. А опкодов может быть много в одном пакете.
>Дальше он вызывает с помощью call eax функцию, которую можно отследить только во время отладки
Если клиент написан на C++, это вызов виртуальной функции. Хотя и на C может быть похожее. Нужно смотреть на регистр ecx, в него в C++ перед вызовом заносится указатель на класс. В C такого нет. Найти таблицу виртуальных функций просто, достаточно перейти в отладчике на адрес, из которого присваивается регистру eax, это конструкция вида mov eax, [esi + 4]. Достаточно посмотреть, на что указывает (к примеру) esi, а дальше в Ida переходишь по этому адресу. Если нужно восстановить структуру класса, то поднимаешься выше и по перекрёстной ссылке (почему то надо жать Ctrl+X, а не просто X) выходишь на место, где указатель заноситься на место виртуальных функций класса (это нулевой элемент, если рассматривать его как массив). Элементарно же (когда знаешь, как делать, потому что попадёшь в конструктор, а надо будет ещё на уровень выше переходить, там и узнаешь размер класса).
>он возвращается в функцию, связанную с событиями WSANetworkEvents
Мне кажется, ты слишком глубоко полез.
Вот что мне очень понравилось и крайне удобно для анализа - это написание плагина-диссектора для Wireshark. Это долго, утомительно, но полностью окупается последующей лёгкостью анализа. Wireshark мегаудобен для подобного (ещё бы), у него множество функций и своих дополнительных диссекторов (тот же JSON можно смотреть прямо в пакете, как на скринах выше) для анализа. Для представления данных у него есть огромное количество своих предопределённых форматов, такие как IP адрес (который красиво отформатирует его), даты, целых и float всех возможных форматов (1, 2, 3, 4, 8 байт, со знаком, без знака, big-endian, little-endian), строк, битовых полей и всё это в одном пакете в любом порядке. Когда каркас напишешь, потом смотришь сдампленный трафик и сразу же добавляешь и уточняешь структуру, а в некоторых местах можно даже без запуска игры понять.
>>166753
>Давай дискорд сюда, я свяжусь с тобой
Да не, это типа мотивации было для тебя.
>ради вас
А ты часом не админ чухача и создатель сервера по майнкрафту в /mc/?
Хотя нет, вроде более-менее адекватный слог, не похоже на него. Либо ты шифруешься, либо правда не ты.
Чтоб ты понимал, этот индивид отличался тем, что ответом на ЛЮБУЮ критику у него всегда было неизменное "я делаю это для анона, и делаю это бесплатно, и поэтому мне похуй и я буду продолжать делать всё через жопу"
Причём критиковал я только вторую его инкарнацию, а первую просто со стороны смотрел как критикуют другие.
Хуя вы там говно ебаное. Нет бы помочь человек или самому взять и сделать как надо. КРИТИКУЕТ ОН БЛЯДЬ СУКА ОРУ НААХУЙ С ГОВНААААААААА))))
>Нет бы помочь человек или самому взять и сделать как надо
Там человек всё знает лучше всех, на помощь ему насрать.
>КРИТИКУЕТ ОН БЛЯДЬ СУКА ОРУ НААХУЙ С ГОВНААААААААА))))
Не хочешь критики — держи свои высеры у себя на харде. Так всегда было и будет.
бредовая позиция, комьюнити знает как лучше делать, а не один отдельный человек.
конечно разработчик должен принимать решения, но зачастую игнорируя советы товарищей можно наклепать такое говно
>>179334
живее всех живых
Но я застрял, уже по инструкциям все расковырял, шаг за шагом, вижу где что передается, где как и куда заходит, но чето толку нет особо. Надо еще посидеть
> игнорируя советы товарищей можно наклепать такое говно
бля лол. просто лол. просто лол, больше ничего не скажешь
Это и без расшифровки очевидно.
>Это долго, утомительно
Это не долго и не утомительно, если использовать https://github.com/diacritic/wssdl и подобные
Это подходит только для очень простого протокола, в котором последующее состояние не зависит от предыдущего. Такое можно даже в 010Editor'е сделать для быстрого анализа. В играх, например, это не всегда так. Если взять тот же WOT, то один и тот же опкод может соответствовать разным типам пакетов. А задаётся он либо в одном из предыдущих пакетов, либо (чаще всего) в предыдущем сообщении в том же пакете. И как такое можно с помощью этой либы сделать?
Ещё один момент. Хочется знать, кому соответствуют, например, ID техники. Это можно узнать только из учёта предыдущих сообщений. И тут подходим к главном сложности, вокруг которой у меня нагорожен ужасный костыль - необходимость некоторым сообщениям в пакете знать предыдущее состояние, но не последующее. Тут уже можно щёлкнуть на любой пакет, чтобы узнать, что в нём. У Wireshark есть такая возможность, при запуске диссектора он последовательно проходит по всем пакетам со сброшенным флагом visited (не знаю, насколько хорошо проверять подобный флаг, всё-таки это внутренние структуры, которые могут поменяться в следующих версиях). Если так не делать, то нужно будет последовательно щёлкать все пакеты, начиная от 1 и до того, который интересует.
>>181348
Он на офсервер перебрался, поэтому кина не будет.
Каков функционал реализован на данный момент?
Создан тред на дваче.
Пакеты-пакеты-пакеты, Rust со своим синтаксисом ебаное говно. Почему не Си спрашивать даже не буду. У самого имеется опыт реверс-инжиниринга 1.5 года и СИ/C++ ровных 3. Имел дело и имею даже сейчас с модификацией многоанимационных игр, а в точности и сетевой синхронизацией игроков. Так что советую писать на С++ как можешь, к тому же, RakNet библиотека вполне себе возможна к освоению, если ты до этого не кривлялся только в PHP или Javaмакакстве каком-нибудь.
> но зачастую игнорируя советы товарищей можно наклепать такое говно
Никакие товарищи при разработке не требуются. Именно на разработчике лежит вся ответственность за то, как он видит своими глазами то, что он делает и что с этого выйдет. Ответственность за то, чтобы потом результат понравился всем. Имея несколько товарищей ты скорее будешь не разработкой занят, а решением, кто же из них прав. Разработчик на то и разработчик, что должен мудрено принимать самостоятельно решения, которые в результате никого не обидят. Но с твоим долбоебством ты ничего не поймешь из того что я написал.
Нормальному человеку синтаксис важен всегда, если тебе не важен, то пиздуй на петухе кодить, тебе подойдет.
>Нормальному смузихлебу синтаксис важен всегда, ведь главное в технологии - это чтобы код симпатично смотрелся с моей цветовой схемой в атоме)))0
Починил, не благодари.
хотя нет, сорян, синтаксис и правда важен, я долбоящер, умываю ноги твои патлами своими, анон, который сказал что синтаксис важен всегда и везде. ведь не удивительно что я на паскале лучше всех в школе кадирывал
А как ты будешь писать северную часть игровой логики?
Это дохулиард кода(миллионы строчек)
Можно надеяться на то, что, написав нечто хоть как-то функционирующее, придут энтузиасты и будут реализовывать логику. Если нет, то останется опыт, который, может быть, когда-то пригодится.
>>192908
Кстати, вопрос. У меня всё пишется на чистом C. В качестве сетевой библиотеки использую libevent, но мне кажется, что не ту библиотеку выбрал. С UDP в этой библиотеке приходится работать на низком уровне, потому что она всё-таки для TCP, а ещё лучше для чего-то поверх TCP, типа HTTP(S). Но, может выбрать что-то, с чем будет лучше или более подходящую? Мне нужно не так и много на данный момент: отправлять пакеты всем клиентам через заданный интервал времени. А чтобы не городить велосипеды: обработка доставки пакетов, что-то типа пула сообщений, из которых будет собираться пакет. RakNet на C++, написать обёртки для сишки не проблема, но это надо делать, а пока почитаю документацию. Очень не хочется сетевую часть самому делать.
Не ОП.
Тебе, как я понял, нужно что-то сишное.(https://github.com/librg/librg). Уже есть достаточно примеров использования этой библиотеки и справляется с работой она вроде нормально. Использовал эту библиотеку сам, но решил начать использоваться ракнет.
Проект, работающий на этой библиотеке, известен мне только один, но он может послужить для тебя примером, если ты не ленив в чтению исходников. https://github.com/gtaco-op/vc-coop
Посмотрел librg и RakNet. Обе библиотеки не подходят в чистом виде. Либо нужно будет частично изменять исходники. Возможно, лучше сделать что-то простое (хотя бы для начала), лишь бы работало. Но у меня возникла такая мысль. Клиент игры существует, мне нужно сделать сервер. И мне не понятно, как лучше сделать сетевую часть. Сейчас рассматриваю два варианта. Первый - как и задумал, сделать свой велосипед, напрямую общение клиента и сервера как в оригинале. Второй - с помощью одной из тех двух библиотек (либо найти что-то другое) сделать взаимодействие клиента и сервера по своему протоколу или пустить трафик от клиента внутри другого протокола. Для того, чтобы клиент понимал сервер, сделать небольшую программу-прокси, с которой и будет общаться сервер. А программа будет уже подготавливать трафик для клиента. Второй вариант выглядит сложнее. Но из-за чего его рассматриваю, так это будет возможность добавить нестандартные решения, которые не получится сделать, если делать один-в-один как в оригинале, типа работа через прокси, сжатие (не zlib с первой степенью, а что-то посущественнее, тут уже будет возможность выбрать) или назначение мастер-сервера одним из игроков, чтобы можно было обойтись без единого центрального сервера (что-то типа P2P).
А толку-то от голой библиотеки? У меня сейчас libevent используется для этого. Но всё остальное (контроль доставки, пул сообщений, его отправка и прочее) надо реализовывать самому. Или взять готовое. И на данный момент мне не понятно, что лучше.
Зачем? ОП пропал, а мне пока что не о чем писать. Решил выбрать совсем другую библиотеку Enet, потому что librg и RakNet обладают излишней функциональностью. Мне не нужно это, достаточно избавиться от необходимости писать код, связанный с созданием очереди на отправку и подтверждением получения для некоторых пакетов. Только вот Enet добавляет свой служебный трафик на каждый пакет и достаточно много. На первое время сойдёт, а дальше как получится, может своё сделаю.
ОП, как дела? У меня получилось. Загрузился до ангара. Сейчас всё очень не стабильно, но работает. Необходимые данные взял из своего клиента (синхронизация данных, магазина и досье, CMD_SYNC_DATA, CMD_SYNC_SHOP и CMD_SYNC_DOSSIERS), поэтому на всякий случай немного замазал (вдруг у картошки длинные руки, а мне ещё тестировать и тестировать, чтобы добиться более-менее похожего поведения как у оригинала, не просить же аккаунт у кого-то).
Не понятно, почему не запрашивается количество игроков на сервере/кластере (слева сверху где ES). Там должно быть гордое 1/1, а сейчас крутится обновление пинга. Надо будет поправить.
Так зачем тебе Rust? Ты лучше Java возьми и Netty добавь, да!
>>225959
Для всего подобного нужно немного знать ассемблер, уметь работать с Ida и отладчиком. Программа не шифрована, отладке не сопротивляется. Поэтому крутого тут ничего нет если это не сарказм был.
Глоток свежего воздуха в помойке, в закладки кинул, только бля не слейся на самом интересном месте как всегда в подобных случаях.
>то он пропал уже несколько месяцев как.
>только бля не слейся на самом интересном месте как всегда в подобных случаях.
Да сука! А я как раз дочитал до этого интересного места. Оффсервер, блядь. Вот же пидор. Самому не стрёмно браться за что-то и бросать потом. Лох. Сгорела жопа.
У меня картошкины танчики. Это совсем не то, что было у ОПа.
Лол!
Ну по идее, картофаны изначально делали игру с экономией серверных ресурсов. На днях видел в интервью как у них работает матчмейкер и это просто деревянный метод. Так что вполне вероятно что какой-нибудь офисный сервак сможет держать нормальный онлайн хотя бы в сотку игроков.
Люди уже давно хотят чтобы танки шли по другому пути развития, но их не слушают. Если получится все сделать, то в дальнейшем можно, например, угодить тем кто не любит артилерию и одной галкой в клиенте создать режим без арты, немного переработав матчмейкер. Хотелось бы тебе чем нибудь помочь, но я не программист, хотя и есть некоторые навыки программирования. Ну, а дальше донатики по цене в два раза меньше, платные переносы аккаунтов с оффа и все в таком роде, весьма важная вещь из-за которой многие игроки не уходят из вот в тундру или ав это накопленное имущество, которое влом снова фармить в другой игре.
Помню тоже танки разбирали когда-то, лет так пять назад. Написали аутх сервер, туда-сюда по мелочи и тоже забили:)
Если есть желание, то запили сурс куда-нибудь на битбакет и раскидай линки на тематических форумах, типа, ragezone/zone-game/..., возможно кто-то подхватит разработку.
Это копия, сохраненная 14 декабря 2018 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.