
Думаю, многие олды сейчас разделятся на два лагеря: одни будут считать Агент адварью, другие с теплотой вспомнят сей мессенджер, в котором они встретили свою вторую половинку. Для меня он тоже имеет место в воспоминаниях, это была первая программа для общения, с помощью которой я оставался «на коротке» с родителями. Поэтому вооружившись современными языками программирования и минимальным знанием того, как бинарные протоколы вообще работают, отправился восстанавливать Агент.
Разработка протокола и сервера
Реверс-инженеринг начался именно с воспоминаний. Об этой идее два года назад я рассказал своему другу Михаилу @synzr, а он не оказался против вместе со мной отреверсить протокол, с помощью которого программа и общается с сервером.
Первый ресурс, куда мы пошли смотреть - официальная документация к протоколу, любезно выложенная самими Мэйлру, а отправной точкой стали пара клиентов на J2ME и Windows. Вообще, протокол официально называется MMP, но сами Мэйлру активно использовали аббревиатуру MRA (Mail.Ru Agent) или MRIM (Mail.Ru Instant Messenger).
Вместе с документацией поставлялся Header-файл, где были расписаны числовые значения всех команд. И мы начали делать сервер-эмулятор... Он писал на NodeJS, а я своими культяпками писал именно симулятор, чтобы разобраться в протоколе.
Деталей уже не вспомню, к сожалению, но долгое время я не мог разобраться со списком контактов, так как они попросту переусложнены. Хотя если и знать, как оно работает, то на самом деле в них не так и трудно разобраться. Далеко сразу забегать не буду, сразу объясню что да как.
Протокол состоит в основном из UL и LPS. UL - это 32-битный unsigned int с всегда фиксированной длинной в 4 байта. LPS состоит сразу из двух частей: UL с длинной строки и сама строка без завершающего нуля. Из этих двух разных кирпичиков и собирается пакет.
Заголовок состоит из одиннадцати UL'ов.
Примерное значение |
Описание |
0xDEADBEEF |
Магический заголовок. Разделяет пакеты между друг другом. Всегда "мёртвая говядина" |
0x00010008 |
Версия протокола |
0x8 |
Очередь пакета. В некоторых версиях генерируется случайно |
0x1001 |
Сама команда. В примере - `MRIM_CS_HELLO` |
0x4 |
Размер данных без заголовка |
N/A |
IP адрес клиента. В документации он так и описан, но де-факто не используется |
N/A |
Порт клиента, с которого произошёл коннект к серверу. В документации он так и описан, но де-факто не используется |
Неиспользуемое заполняется нулями. Размер заголовка всегда равен 44 байтам. А, ну и порядок байт у них Little Endian. Это главное, что нужно о протоколе знать.
За пару дней мы реализовали самые базовые команды: Приветствие (MRIM_CS_HELLO, отправляет частоту "пинга"), вход в аккаунт, контакты, взаимодействие с ними, поиск и сообщения. Всё это проверялось на Агенте 4.10, в котором был очень скудный функционал.

Интересно то, что в том самом файле заголовка команда для входа и для контактов обозначены как MRIM_CS_LOGIN2 и MRIM_CS_CONTACT_LIST2, т.е. была ещё у них и первая версия. Значительно позже я начал разбираться в этом вопросе, и оказалось, что это действительно так. Агент появился в 2004 году, и к его реализации... очень много вопросов. И в нём пришлось разбираться самому — официальная документация была очень старой и неполной.
Во-первых, первая версия не умела в мессенджер. Вообще. Там были только ссылки на меилрушные сервисы. Он появился только в 1.5 в самом зачаточном виде.


Контакты появились только в 2.0. В их реализации плохо всё. Там страшный бинарный формат.
1. 2560 байт зарезервировано для групп
2. Внутри блока групп - 128 байт информации о ней
3. Контакты идут после 2560 байт
4. Длина контактов тоже фиксирована - 256 байт
В группе идёт флаг группы, пробел, и его название. На 128 байте всегда байт 0xA
В контакте ещё хуже. Там примерно такой формат:
{Флаги пользователя} {Индекс группы} {Почта пользователя} {Длинна ника в HEX}{Ник}
Последние 4 байта контакта - серверный флаг. 0001, значит, контакт авторизован. И наоборот, нули, значит нет.
С выходом Агента 4.2 это безобразие заменили на более элегантный формат, который я описал в своей документации. Но суть в том, что данные теперь нормально разделяются через маски. Они передаются через строку и довольно просто объясняются - u это UL, а s это LPS. В версии 4.10 у групп маска us, а у контактов uussuus. В группах: флаги и название, а у контактов это флаги, индекс группы, почта контакта, имя, флаг авторизации, статус, и номер телефона. В новом крупном обновлении Агента эти маски просто обновляются, а в блоке контакта добавляются дополнительные пункты.
В Агенте 5.0, например, появились Икс-статусы, и соответственно, к маске добавились sssus: uri статуса, заголовок статуса, его описание, маска доступных функций (с помощью них агент определяет, что умеет клиент) и юзер-агент клиента.
В 5.5 добавился функционал микроблога, и к маске контактов добавилось uuusss: 64-битный айди поста в двух UL, время в Unix-time, текст, и два зарезервированных LPS. Суть, думаю, понятна.
В версии Агента 5.1 появилась поддержка Юникода. Но это не простой UTF-8, если бы. Там использовался UTF-16LE, где каждый символ всегда равнялся двум байтам, будь-то это кириллица или латиница.

За ним пошла реализация передачи файлов, микроблога, аватарок, и отдельных моментов и поведения некоторых клиентов. В зачаточном виде осталась реализация групповых чатов (конференций). Для реализации некоторых функций пришлось реверсить клиенты, шуршать интернет, или подглядывать �� чужие реализации (например, в Miranda NG и myagent-im).

Патчер и установщик
Потом, нам надоело постоянно копаться в реестре и файле hosts, просто чтобы всё перебросить на наш сервер. Поэтому вместе с юзером n0cha3 сделали патчер, который подменяет мёртвые айпишники и доменные имена на наши собственные.
В Windows это делается довольно просто. Через DLL хукается функция gethostbyname для получения домена из WinSocks, и её аргументы просто заменяются на собственные. Кашпировскому, кстати, такой модифицированный файл не понравился, и он его считает трояном.

Вместе со встроенным установщиком лезло всякое г... Нерабочий Спутник@Mail.ru или Guard@Mail.ru. Без моего участия ещё два моих товарища, @Eversiege и motionarium сделали кастомный установщик на основе Inno Setup, в котором всё было заранее пропатчено, вырезано лишнее, и добавлено немного нашего контента. Дизайн установщика делал chelka0.
Запуск на публику
Под новый год 2026 года запустили в публичный доступ проект Renaissance. Открыли сайт, исходники сервера на GitHub и выложили документацию (более полная, чем то, что нам давали сами Mail.ru).
Довольно быстро скриншоты рабочего Агента разошлись в Твиттере. Как я упоминал в начале статьи, люди разделились на два лагеря: на ненависть и на любовь.


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


Что по итогу?
В ретроспективе протокол Агента — это буквально то, на чём даже сейчас построены продукты VK. Недавнее расследование по поводу MAX это и подтвердило, пакеты составляются схожим образом, как и в MRIM, только данные уже составляются через MessagePack. Там тоже есть версия протокола, команды и последовательность:‑)
Разбирать его было интересно. На удивление, это довольно простой протокол, в сравнении с тем же OSCAR: всего лишь два типа данных и минимальный набор команд для работы клиентов. Если вы смогли осилить MRIM, то и всё остальное будет даваться легко.
Некоторые решения меня, поражают до сих пор. Ясно было видно, что Агент пытался со старым протоколом идти в ногу со временем, и на некоторых командах была сотня костылей.
Если вдруг стало интересно, то вы можете зарегистрироваться на нашем сервере. Если хотите поднять его на локалке, то все исходники и инструкции выложены на GitHub, там же можно покопаться в протоколе. Вэлком!
Комментарии (37)

Wohlstand
12.03.2026 15:25Те, кто говорит, что "рекламная хрень", путают наверняка с "браузером Амиго" (навязчивость которого породила тьму мемов в своё время!), который в самом деле полз везде и всюду, когда его не просили. А вот Агент в своё время был во истину хорошим и годным продуктом от МылРу (и скорее всего единственным на мой взгляд годным программным продуктом). Потом он стух, когда решили переделать его полностью в районе 2013го года (версия 6.x), из-за чего многие тогда слиняли в другие мессенджеры.

Wohlstand
12.03.2026 15:25Для меня Агент - мессенджер моего детства, в конце нулевых общался через него с большинством моих знакомых, и мне Агент нравился сильно больше, чем Аська и по функциям, и по стабильности. А также мне лично не везло со знакомыми, кто был фанатом Аськи, не самые адекватные индивиды попадались, но были и исключения. Параллельно использовал Скайп и потом освоил XMPP, и даже свой сервер поднял.

StrFrc
12.03.2026 15:25Я был фанатом Аськи на QIPе, так как Агент на моём Pentium 4 с 512мб RAM работал тяжело. А ещё у меня был GPRS интернет с тарификацией 8 рублей/мегабайт. QIP "съедал" какие то килобайты, а Агент тянул данные почти непрерывно. Дорого было на нём сидеть.

Wohlstand
12.03.2026 15:25Я помню как-то пользовался то Miranda-IM, то тоже QIP-ом, а потом и вовсе Pidgin-ом, куда я повесил и Агента, и ICQ. На официальных клиентах ICQ я почти не гонял, ибо и реклама тогда была, и сами клиенты глючили у меня. У меня тогда вообще были либо исторический Pentium MMX 133 МГц 64 МБ ОЗУ, либо Pentium III 866 МГц и 512 МБ ОЗУ. Агент использовал старой версии 4.6, последняя какая работала из под Windows 98, а на WinXP потом гонял более новые версии. Потом и раздобыть себе "пни4", но оперативки поставил хотя бы гиг, ибо 512 уже мало стало.

subjrs
12.03.2026 15:25Аську (найди её различия последних редакций от мха) сами мэйлру закрыли почти недавно, и ой такое же изделие спустя пару лет

olgherd
12.03.2026 15:25Когда я стал активно общаться в аське, я сразу же ушёл на альтернативный клиент. А потом появился qip 2005, ванлав на все времена. Он прекрасно работал на туалатинах с 256 мб памяти, был красивым и удобным, и на его фоне агент воспринимался тяжёлой неповоротливой фигнёй с рюшечками для девочек.
С одной стороны, ностальгические чувства штука сильная, я бы с удовольствием пользовался (наверное) телеграмм с интерфейсом qip. С другой - по нынешним меркам это всё ужасно нефункционально. Как сейчас жить без групповых чатов, простой пересылки файлов, без реакций? А отсутствие единой истории сообщений напрягало ещё 20 лет назад! Помнится, чтобы это обойти, я запускал qip на сервере и подключался к нему по rdp с разных устройств. Потом пытался реализовать синхронизацию хистори между разными клиентами, но что-то пошло не так...

astenix
12.03.2026 15:25Я в 2004-м парадигменно сломался, когда ВНЕЗАПНО осознал, что мой собеседник в аське с телефона…
Вопшэ, верните мне Miranda, смеяться не буду.

playstation_f_a_n
12.03.2026 15:25Аська закрылась. А сейчас бы была популярна. У неё в последней версии были голосовые звонки.

VADemon
12.03.2026 15:25А то что оба продукта принадлежат одной компании -- ничего?

Wohlstand
12.03.2026 15:25Аська за всю историю ходила по рукам, и закончила свою жизнь как раз в руках прямого конкуретна - МылРу. Её изначально создали в Израиле, создав стартап Mirabilis, и потом они попали к жадной жабе AOL, которая также владела и Скайпом, и WinAMP они захавали, и когда WinAMP закрывалась, авторы высказались про то, что AOL мегазабюрократизированная компания, жаждущая деньги и прибыль. И вот на этом они и прогорели в итоге. Аську они продали нашему МылРу, потому что на тот момент аудитория из СНГ была крупнейшей в сети Аське, как я помню.

Devastator82
12.03.2026 15:25Мейлру за всё берется смело
Всё превращается в г@вно
А если за г@вно берется
То просто тратит меньше сил

dmn13
12.03.2026 15:25Почему-то нигде не упоминается замечательный мессенджер Odigo, в котором была поразительная и до сих пор нигде не реализованная функция поиска собеседника на том же сайте, на котором вы находились в тот момент. Помимо собственного протокола можно было общаться с контактами Yahoo!, ICQ и AOL Instant Messenger.
milkground
Забавно, что на Хабре всё время ненавидили эти изделия от Майл.Ру, а теперь слёзы ностальгии пускают. Похоже на какую-то биполярочку. Видимо, когда-нибудь будет подобная статья про Макс.
oleg_umnik
Скорее всего это разные люди. Те, у кого ностальгия по Агенту, скорее всего, люди по-моложе, пришедшие в интернет во второй половине-конце нулевых. А ненавидят те, у кого "золотые годы" и юность пришлись на старую аську - это конец 90-х и самое начало нулевых. Для них Агент всегда был лишним и абсолютно не нужным новоделом.
milkground
Аську + QIP до сих пор считаю эталоном удобства и простоты, которых не достиг ни один современный мессенджер. Это был тот софт, которым управляет пользователь и настраивает под себя, а не софт, который диктует условия пользователю. Чего только стоил невидимый режим + отключение уведомлений о наборе текста без санкций - т.е. ты у себя отключал то, что не хотел передавать, но продолжал это видеть у всех. А куча плагинов? А смайлики колобки и отсутствие эмодзи косатки и небоскрёба?
Ну и справедливости ради стоит сказать, что у агента была одна действительно крутая фишка - можно было бесплатно отправлять SMS на добавленный контакт.
eteh
а мне psi+ заходил, ранее миранда) qip старый только был нормальным, после обновления и став комбайном уже был таким себе. имхо.
ssj100
Говоря про QiP мы имеем ввиду тот который потом стал Classic
briabeegost
Фух, хорошо что нигде такого сейчас нет, а то тот же "недавно" в Телеграме очень много вопросов вызывает к людям, которые это используют
milkground
Напомните, почему я должен сообщать всем время своей последней активности в мессенджере с точностью до минуты?
hqqddy
Например, чтобы понять, жив ли ты. Ну ок, интересоваться этим фактом может не только семья, но тем не менее.
oleg_umnik
А что подразумевается под "живостью"? Уже не 90-е годы, когда "выходили в Интернет" (каждый был оффлайн по-умолчанию), ждали зеленую ромашку напротив контакта и услышав "тук-тук-тук" проверяли, кто это появился в контакт-листе. Сейчас по-умолчанию считается, что человек в онлайне (хорошо это или плохо). Нужны более надежные способы определения, тогда уж.
Недавно нужно было написать в Телеграм человеку - контактирую с ним очень редко. Смотрю - был онлайн последний раз 13 дней назад. Думаю - может не имеет смысла писать (реакция была нужна в течении 1-2 дней)? Написал - и через 10 минут получил ответ. Просто ему редко кто пишет и как следствие Телеграм он почти не открывает.
Я и раньше не особо понимал смысл этих "был последний раз", а теперь совсем не обращаю внимания.
Artyomich
Вот именно, это больше работает с теми, кто онлайн там как минимум раз в сутки, и отсутствие изменения статуса на более длительное время можно рассматривать как один (но не единственный) из пунктов обратить внимание, что что-то не так. Впрочем, как и любое внезапное изменение поведения/состояния.
hqqddy
А вот у меня в херсоне и внезапно иране друзья. И кроме как определить что они живы я могу лишь вот так по сетевой активности. А в случае с тегераном не могу никак уже.
Про китайское приложение я жив или как там пока речи не идет. Вряд ли мы готовы в нему, а при отключении связи толку не будет ни от какого приложения или активности в телеге, если ни позвонитьь ни написать.
achekalin
А мне вот ранняя телега таким эталоном кажется, хотя Miranda, конечно, в свое время рулила, а потом qip.
osmanpasha
Регулярно с теплотой вспоминаю про смайл, бьющийся головой об стену, как же его не хватает в современных emoji.
BSOZ
А XMPP казался перспективным. Какова идея, когда IM не привязан к одной компании и с аккаунта google ты можешь писать пользователю с домена apple.com или в твитер, не регистрируя сотню аккаунтов и не отслеживая переписку в каждом (и не устанавливая сотню мессенджеров на смартфон, в каждом из которых по полтора контакта). Прям как в электронной почте, один стандартизованный и общепринятый протокол, как тот же SMTP для всего веба.
Но популярность того или иного IM всегда была пропорциональна вкачанным в PR средствам. А в опенсоре и деньгами не пахло и коммерческий интерес гигантов отсутствовал. Поэтому случился вендорлок.
milkground
Потому что позволял делать то, что хочет пользователь, а не то, что хотят корпорации, чтобы он делал. Если приглядется к современному софту, то практически везде используется такая философия в отличии от софта из прошлого.
BSOZ
Коммерческие интересы в любое время двигали индустрию. В продуктах AOL была монетизация на показе рекламы. С пиратством издатели медиаконтента всегда боролись, пересекая границу разумного (какова идея с пластиковыми видеокассетами с лимитом просмотров из какого-нибудь обычного ABS пластика, который тоннами шёл в мусор).
jerom
У xmpp, как и у email: огромные проблемы с детектированием спама. Уже из-за этого ему было бы очень тяжело взлететь.
BSOZ
Каптча на начало нового диалога всё решала, некоторые клиенты умели присылать каптчу в ответ на первое сообщение от неизвестного контакта (я тебя не знаю, докажи, что ты человек). Если бы это стало общим паттерном, то рассылка спама утратила бы всякий смысл — уж очень трудозатратно по тем временам было взламывать каптчи только ради отправки рекламы с низкой конверсией. Для почты тоже было бы полезной фичей, если бы автоматические сообщения не стали нормой (впрочем достаточно добавить атрибут, маркирующий автоматические сообщения не просто по адресу с noreply и отдельный каталог с запросами на начало диалога с такими адресатами: оверпрайс-ритейл и ещё 45 корреспондентов желают начать с вами новые диалоги, подтвердить/игнорировать?).
qvvah
Никакой биполярочки. Продукты можно (и нужно) обходить стороной, а код - наоборот, лучше знать в лицо, в исследовательских целях, чтобы понимать с чем имеем дело. Плюс чисто ностальгические мотивы - такие же, как у тех кто сервера ICQ поднимает, ради общения через "те самые" программы с ретро-вайбом.
Лучше читать материалы по реверсу, чем очередной нейрослоп про "успешный успех" или "свежую версию" никому ненужной проги.