company_banner

WhatsApp, что внутри?

    В продолжение направления публикаций исследований нашей компании о внутренних механизмах крупнейших в мире мессенджеров. Сегодня будем смотреть на WhatsApp в его актуальном состоянии. На самом деле внутренности не сильно изменились за последние три года, изменения там скорее косметические.

    В этой статье мы подробно посмотрим как можно изучать протокол работы мессенджера, ответим на вопрос «может ли WhatsApp читать нашу переписку?» и приложу весь необходимый код на языке PHP.

    Общая информация


    В качестве формата сообщений WhatsApp использует доработанную версию протокола XMPP. Все сообщения сжимаются посредством замены часто используемых слов на 1 или 2 байтные токены (например вместо «message» — записываем байт 0x5f), таким образом получается то, что названо FunXMPP.

    Некоторые пакеты могут быть дополнительно сжаты zlib. Полученный пакет шифруется AES GCM 256-бит и передаётся на сервер.

    Для получения ключей шифрования клиент выполняет хэндшейк noise protocol. Вот здесь хорошо описано. От воплощения в коде все разработчики открытых реализаций почему-то отказались и повесили плашку «end of support», мы это поправим.

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

    WhatsApp поддерживает сквозное шифрование с использованием libaxolotl (Signal Protocol), в коде реализованы две версии — сначала они просто сделали шифрование, а потом добавили выравнивание и назвали это v2. Тут есть только одна проблема — т.к. это централизованная система, то и передача ключей идёт через сервера WhatsApp, так что чисто технически нет никаких препятствий для разработчиков мессенджера передать подставные ключи шифрования и полностью читать переписку. Но это не имеет обратной силы, — прочитать сообщения задним числом не получится.

    Кстати, при получении сообщения от не авторизованного контакта — в мессенджере отображается кнопка «пожаловаться на спам», нажав на неё мы не только заблокируем контакт, но и перешлём по защищенному каналу (уже в открытом виде!), текст сообщения. Без изучения кода приложения целиком нет возможности гарантировать, что этот функционал не используется в каких-либо других случаях.

    Для проверки аутентичности ключей шифрования в приложении WhatsApp можно зайти в карточку контакта, выбрать пункт «Шифрование», после чего приложение предложит просканировать QR-код на устройстве получателя. Таким образом, кстати, можно сделать кастомное приложение на базе протокола WhatsApp, которое будет постоянно следить за статусом ключей шифрования и выдавать красивые плашки «АНБ следит за вами» или «Вы в безопасности»: учитывая многообразие мессенджеров, — заменить один из них на такое приложение будет даже полезно.

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

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

    Регистрация учетной записи


    Регистрация проходит в три https-запроса на домен v.whatsapp.net (их можно подсмотреть любым известным способом, например burp или mitmproxy, в приложении используется certificate pinning, который обходится при помощи ssl kill switch).

    v.whatsapp.net/v2/exists?cc=код_страны&in=телефон&id=id_устройства&lg=en&lc=zz
    не делает ничего полезного, раньше, скорее всего, служил для проверки не зарегистрирован ли уже этот номер (скорее всего до момента, пока кто-то не стал перебирать их базу)

    v.whatsapp.net/v2/code?method=sms&cc=код_страны&in=телефон&token=токен&sim_mcc=mcc&sim_mnc=mnc&id=id_устройства&lg=en&lc=zz&параметры_сквозного_шифрования
    Собственно запрашивает код sms активации. Так же может использоваться аналогичный запрос для получения звонка. Параметры сквозного шифрования не обязательны, — их можно настроить при дальнейшем подключении. Токен получается так:

    md5("0a1mLfGUIBVrMKF1RdvLI5lkRBvof6vn0fD2QRSM" . md5("21752") . "телефон")

    Первая строка — это зашифрованная строка landscape, что бы это не значило. Версию приложения (21752) можно подставить любую (самые любопытные могут попробовать зарегистрироваться ещё не вышедшей версией), в самом коде приложения хэш от версии зашит готовый, но что-то похожее на md5-хэш довольно быстро подбирается.

    v.whatsapp.net/v2/register?cc=код_страны&in=телефон&code=код_из_смс&id=id_устройства&lg=en&lc=zz
    Этот запрос, соответственно, подтверждает регистрацию с кодом полученным по смс или звонку.

    В запросах используется User-Agent: WhatsApp/2.17.52 iPhone_OS/7.1.2 Device/iPhone_4. Правильный агент скорее всего обязателен, для корректной верификации токена.

    MITM


    Всё это известно не первый день, — есть несколько реализаций протокола WA16 (Chat-API, Yowsup), от текущего WA20 отличие заключается по-сути только в Noise Protocol. Обладая этой информацией мы можем разработать локальный MITM для просмотра расшифрованного трафика приложения. Т.к. изначально протокол приложения XMPP — то всё что там происходит будет вполне понятно сразу из расшифрованного трафика, поэтому погружаться в дебри дизассемблера особой нужды нет.

    Для запуска MITM — мы представимся настоящим сервером WhatsApp, выполним полный хэндшейк, после чего наше приложение будет прослушивать трафик перенаправляя его на оригинальный сервер whatsapp и обратно. Для этого нам понадобится изменить оригинальное приложение:

    Все операции проводятся в следующей конфигурации: iPhone 4, iOS 7.1.2, IDA 7, WhatsApp 2.17.52.

    Патчим приложение


    1. Мы будем выполнять полный хэндшейк при каждом подключении, это существенно упростит нам жизнь. В методе -[NoiseHandshakeManager initWithLoginPayload:clientStaticKeyPair:serverStaticPublicKey:] при наличии serverStaticPublicKey выполняется ResumeHandshake, а при отсутствии FullHandshake.





    В регистре R0 как раз хранится serverStaticPublicKey и при его отсутствии выполняется переход к FullHandshake. А мы сделаем этот переход безусловным. Для этого заменим два байта



    на



    Результат



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



    2. Мы отключим проверку подписи сервера, т.к. у нас нет закрытых ключей оригинального сервера. Без этого изменения прослушать трафик будет невозможно. Для этого внесём изменения в метод (bool)-[NoiseHandshakeManager validateNoiseCertificate:serverHandshakeStaticPublicKey:].



    Нам необходимо чтобы функция всегда возвращала единицу. Сейчас результат проверки сертификата из регистра R6 кладется в R0.



    Сделаем так чтобы в R0 записывалась единица



    В результате получаем



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

    iOS 7.1.2 не проверяет аутентичность бинарных файлов приложений, поэтому все изменения можно сделать прямо в файле приложения. В более поздних версиях iOS можно сделать эти же изменения в памяти запущенного приложения.

    Пишем код...


    Далее при помощи IDA и долгих кропотливых усилий подготавливаем код успешно выполняющий NoiseHandshake на серверах WhatsApp. Затем реализуем фейковый сервер — делаем все те же операции шифрования, но в обратном порядке (звучит просто, но если не занимаешься этим каждый день — та ещё головная боль). Готовый код лежит здесь.

    Скачиваем на компьютер приложение MITM полученное по ссылке выше. Устанавливаем PHP 5.6 (подойдёт и другая версия, в моей конфигурации использовалась именно эта версия). Так же понадобится ещё две библиотеки:
    первая
    вторая

    Перехватываем соединение


    Остаётся только заставить приложение подключаться к нашему серверу, вместо настоящего. Приложение выполняет подключение к одному из серверов e%d.whatsapp.net (где %d — число от 1 до 16, например e5.whatsapp.net), каждый из которых резолвится на несколько IP-адресов, каждый раз — разных, в сумме больше 300 серверов. Проще всего будет подменить DNS-ответ сервера и направить его на наш компьютер с MITM.

    Для этого помещаем телефон и компьютер в одну сеть (буквально любой маршрутизатор wifi подойдёт), на телефоне выставляем DNS на наш компьютер на котором устанавливаем bind9 со следующим хостом:

    $TTL	86400
    @	IN	SOA	ns.whatsapp.net.	admin.whatsapp.net. (
    	2017100500
    	28800
    	7200
    	1209600
    	86400)
    @	IN	NS	@
    @	IN	A	ВАШ_АЙПИ
    v	IN	A	184.173.136.86
    v	IN	A	174.37.243.85
    *	IN	CNAME	@
    

    Смотрим трафик


    Далее отредактируем mitm.php — нужно подставить свой номер телефона в поле username и содержимое файла cck.dat (находится в директории с приложением) в поле password.
    Запускаем php mitm.php. Запускаем приложение WhatsApp и видим следующую картинку:



    На скриншоте видно два пакета от сервера — сообщение об успешной авторизации и какие-то настройки. Таким образом выглядит абсолютно весь трафик приложения, — всё читабельно и дополнительно разбирать приложение, в большинстве случаев, не требуется.

    Алгоритм превращения FunXMPP в читаемый текст есть во всех библиотеках работы с WhatsApp. Внутри простейшая машина состояний, дополнительно расписывать его здесь не буду.

    Выводы


    Приложение сделано качественно, использует современные протоколы шифрования, однако глубоко внутри лежит XMPP оставшийся от изначально используемого ejabberd. Использовать protobuf, судя по текущему вектору развития приложения, — было бы логичнее, однако историческое наследие слишком дорого.

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

    Чисто технически нет ничего сложного в таком алгоритме, разработчикам других мессенджеров (привет, Viber, — получаю спам не реже раза в месяц), — стоит взять этот приём на заметку.

    Спасибо за прочтение, надеюсь читать про это было так же весело и интересно, как и проводить исследование.
    Бринго 170,84
    Компания
    Поделиться публикацией
    Похожие публикации
    Комментарии 76
    • 0
      Никто не в курсе, они API уже открыли? Я лично видел целую систему IVR одного банка, но так и не нашел как это сделали (неужели такими же методами как в статье?)
      • 0
        Нет, не открыли. И не собираются, насколько я могу судить.

        Скорее всего использовали готовую библиотеку, либо обратились к специалистам.
    • 0
      Оно конечно может слегка не по теме, но может кто нибудь понимает — почему в web.whatsapp (и помоему десктопной) нельзя просто так взять и добавить человека в список контактов?
      Кому вообще это может быть удобно — даже для того чтобы 1 раз отправить сообщение человеку, нужно взять телефон и ручками забить номер в телефонный список контактов.
      Тут какие то архитектурные ограничения или жирный пробел юзабилити?
      • 0
        Пробел в юзабилити. Техническая возможность отправки сообщения пользователю не в контактах — есть. Возможно они так борятся с рассылками.
        • +1
          А может подскажете лайфхак как отправлять пользователю не-в-контактах? Меня просто вымораживает что для того чтобы перекинуться фразой с человеком на ПК нужно обязательно лезть в телефон. А телеграмм многие не умеют
          • 0
            Если прям очень надо, и у вас имеется синхронизация контактов с гугло-аккаунтом, то заходите на google.com/contacts — и там добавляете контакт. Через какое-то время он появляется в телефоне, об этом узнаёт Whatsapp и вот он уже есть у вас в списке контактов.
            • 0

              Спасибо за наводку! На iOS тоже в теории должно работать.

            • 0
              Я говорю про техническую возможность — протокол поддерживает, если вы программно отправите — всё сработает.

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

              Я не знаю как это сделать в рамках интерфейса.
              • 0
                Можно открыть чат с любым номером по ссылке
                faq.whatsapp.com/en/android/26000030/?category=5245251
              • +2
                Так вотсап — один большой пробел в юзабилити. А заодно в энергосбережении.
                • +5
                  Не понимаю почему вас заминусовали.
                  Не удобно ни файлы пересылать, ни общаться.
                  Файлы каждый раз пересылаются, тратя трафик.
                  На несколько устройств не поставить.
                  Клиентов под операционки нет.
                  Продолжать не хочется перечислять минусы этого недомессенджера.
                  • 0
                    К сожалению в текущих реалиях мало шансов, что у нас будет альтернатива.
                    Под телеграмм уже греют воду в котле, вотсап крайне популярен, вайбер имеет те же недостатки + просто огромное количество спама! Просто помойка. Других популярных альтернатив нет
                    • 0
                      Да, к сожалению. Я тестирую клиенты matrix, пока в узком кругу, косяков многовато.
                      До телеграма очень далеко, но riot.im ближе всех по функционалу к нему.
                      • 0
                        Аналогично, тестирую. А можно подробнее про найденные косяки? Я пока ни с одним серьёзным не столкнулся.
                        И что в Telegram такого хорошего есть, чего не хватает в Riot?
                        Мне лично в этой системе пока не хватает лишь одного: верификации ключей по простым механизмам типа QR или bluetooth.
                      • +1
                        Вайбер, по крайней мере, не требует запущенного приложения на телефоне для общения через компьютер.
                        • 0
                          А кто требует?
                        • 0
                          Тем не менее время от времени на десктопе просит отсканировать QR-код мобильным приложением. А после удаления мобильного приложения через некоторое время перестаёт работать десктопное.
                      • 0
                        > Клиентов под операционки нет.
                        Под осх и винду нативные клиенты есть. Правда, они требуют телефон «в поле зрения», как и веб-клиент.
                        • +4
                          Я вам такой «нативный» клиент за две минуты сделаю из любого сайта с помощью FireWork.
                        • 0
                          С точки зрения протокола при отправке мультимедиа — файл загружается на сервер и передаётся только ссылка. Причём протокол не запрещает переиспользовать ссылку и это даже корректно работает.
                          Вопрос пересылки файлов — исключительно интерфейсный, — они могут в любой момент начать пересылать ссылку, стоит только захотеть.
                          Чем обусловлено такое решение, — действительно не очень понятно.
                    • 0
                      В интернете встречал статьи, где такая возможность описана. Ну то есть в каких-то старых версиях она была, потом выпилили. Думаю намеренно, чтобы вынудить дать права ко всей телефонной книге.
                      • +2
                        Да вообще в плане браузерной и десктопной версии мессенджер чрезвычайно убогий. Ладно регистрация с привязкой к телефону, чтоб ботов не наплодить, но блин какого-то хрена нельзя просто брать и пользоваться мессенджером без телефона, ну бред же.
                        • +1
                          Потому что сообщения хранятся только в телефоне, и, так как несколько активных клиентов не поддерживается, подозреваю, что отправка тоже происходит через телефон. Веб-версия — это просто морда к настоящему клиенту в телефоне (а десктопная — та же самая веб с node.js в комплекте).
                          • +1

                            А как удобно с архивом!
                            Телефон потеряешь и все, нет истории

                            • 0
                              История по-умолчанию на Google Drive же складывается, разве нет? Это вам не LINE, где о такой возможности узнаёшь уже когда всё потеряно…
                              • +1

                                По умолчанию сложно было бы сложить — нужно явное разрешение доступа к Google Drive.
                                Там сделано по-другому, всплывает незакрываемое окно "выберите куда бэкапить сообщения". И там есть очень неочевидный прикол, на который я и мои друзья попадались: если выбрать "бэкапь на карту памяти" он успешно будет бэкапить, но восстановить можно будет только на этом же телефоне, при смене девайса ключи расшифровки теряются. И можно говорить пока истории.

                                • 0
                                  Зашибись бэкап. :) А можно хоть ключи-то выдернуть, пока все работает? Или их потом не примет софт на новом железе?
                                  • 0
                                    Пока что все это выглядит как «Купи у нас квартиру, а потом построй ее сам»
                          • 0
                            Причина в умолчальном end-to-end шифровании, возможно. В телеграмме, например, этот функционал задействуется через «секретный чат». И на декстопной версии этой возможности нет. Есть в неофициальном клиенте под линукс telegram-cli. Но при этом это две разных переписки с одним и тем же контактом.
                        • 0
                          привет, Viber, — получаю спам не реже раза в месяц

                          Мне спам уже давно не приходит, только "официальный".

                          • +1
                            Там так же есть кнопка блокировки, просто далеко спрятанная. Если рассылку компании много людей блокирует, — у компании случается блокировка имени.
                            • +1
                              Да не спрятанная, в плашке вверху сообщения «Why am I seeing this?», при тапе по которой можно отписаться
                              • +1

                                Только они потом опять подписываются сами (привет, Спортмастер), а еще куча спама от всяких такси и т.п., клиентом которых точно не являлся…


                                В общем пришлось убить Viber

                          • 0
                            А про telegram / viber есть планы написать подобную статью?
                            • 0
                              У Telegram открытое API вроде? — Проблемы у него будут те же самые, — вся беда от централизации.

                              В случае Viber всё намного сложнее, — там вся логика зашита в нативный код, так что процесс реверсинга там намного сложнее.
                              • 0
                                Есть желание препарировать Discord?
                                • 0
                                  Возможно через год вернёмся к этому вопросу. Пока он нам не интересен.
                                  • 0
                                    А почему вам вотсап интересен? Это связано с проф.деятельностью (расскажите подробнее) или увлечение?
                                    • 0
                                      Да, проф. деятельность. Discord интересен, но не настолько сильно, чтобы его препарировать.
                                      • 0
                                        А вот мне интернесно. Есть ли легковесный не «жрущий» тонны драгоценной ОЗУ клиент под Windows? Если нет, хотелось-бы узнать как проходит авторизация и обмен сообщениями.
                                        • 0
                                          Нет же. :) Но зато есть плагин для Миранды, его за деньги по запросу писали. :) С зимы его не трогал, на тот момент он был жутковат, но текст уже как-то работал.
                                • 0
                                  Вроде у Telegram приватные чаты децентрализованы?
                                  • 0
                                    Поделитесь ссылочкой?
                                    • 0
                                      core.telegram.org/api/end-to-end

                                      Я, конечно, мог и неправильно понять…
                                      • 0
                                        Пробежался через строчку, — не нашел ничего про децентрализацию. Ключи генерируются по DH, хранятся только на клиенте, а работает всё через сервер.
                                        Если сервер скомпрометирован — переписка не будет в безопасности.
                                        • 0
                                          Т.е. ключи генерируются сервером?
                                          • 0
                                            Нет, только открытая часть передаётся через сервер.

                                            Посмотрите на википедии, там хорошо объяснено.
                                            • 0
                                              Я просто не понимаю, почему при компрометации сервера будет небезопасно (извините, я не из ИБ)… С DH поверхностно знаком, я не могу понять, что именно тут. Если закрытый ключ все-таки клиентский… Открытый ключ может быть подменен? Спасибо.
                                              • +2
                                                В чистом виде алгоритм Диффи-Хеллмана уязвим для модификации данных в канале связи, в том числе для атаки «Человек посередине», поэтому схемы с его использованием применяют дополнительные методы односторонней или двусторонней аутентификации.
                                                Википедия.

                                                Для обмена сообщениями в Телеграме вам не нужно дополнительно по независимому каналу передавать какую-либо информацию, т.е. дополнительная аутентификация не используется. Т.е. уязвимо уже по определению.

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

                                                Именно таким образом, кстати, устроен MITM в примере из статьи.

                                                Подобный сценарий возможен как при содействии администрации сервера, так и в следствие хакерской атаки (предположительно очень сложной атаки).
                                                • 0
                                                  Спасибо! Видимо, примерно это я и представлял под «подменой открытого ключа».

                                                  Просто, вроде как, открытый ключ в мессенджерах мы получаем единожды (допустим, до компрометации сервера). И, если мы будем сверять открытый ключ с изначальным, то все описанное Вами остается?

                                                  А в статье патчили клиентское ПО, все-таки…
                                                  • 0
                                                    Да, потому что у меня нет закрытого ключа сервера — поэтому необходим был патч. А если скомпрометирован сервер — патчить ничего не нужно…

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

                                                    Соответственно механизм обновления ключа обязательно есть в протоколе. И да, можно отображать время последнего обновления ключа, например. Но широкому пользователю это не будет интересно.
                                                    • +1
                                                      В Телеграм нет смены ключа у закрытого чата.
                                                      Новый ключ можно получить только явно начав новый чат с тем же абонентом -> Оба абонента будут явно предупреждены о том, что это новый чат с новым ключом и ключ нужно снова сверять…
                                                      Т.е. если кто-то получил контроль над сервером уже после начала секретного чата между абонентами, единственный его вариант провести MITM — «убить» секретный чат. В этом случае абоненты попытаются (сознательно) снова установить соединение. Если они при этом не проведут верификацию ключей через сторонний канал — то они попадутся со своими котиками.
                                                      Но форсировать незаметную для пользователей перегенрацию ключей нельзя.
                                                      Если клиентские части приложения не патчить, конечно.
                                                      • 0
                                                        Если так, то они большие молодцы. Просто я не активный пользователь этого приложения, поэтому не в курсе.
                                    • 0

                                      Вы путаете end2end с p2p.

                                • +1
                                  Спасибо за статью.
                                  Есть чуток вопросов:
                                  1) Можно поподробнее про момент с certificate pinning, это все же их недосмотр или нет? Другими словами, что бы им следовало «по уму» сделать, чтобы улучшить безопасность?
                                  2) Показалось, что XMPP чем-то не устроил, так ли это, и если да, то почему? :)
                                  3) Почему дискорд не интересен, мало людей или низкая безопасность в целом (нечего ломать типа)?
                                  • 0
                                    1. Нет, закрытие исходников в принципе не повышает безопасность (есть много статей на тему неэффективности security though obscurity). Использование certificate pinning нужно для защиты от прослушки организациями уровня гос. структур.
                                    2. В чистом виде — он кушает много места. В виде FunXMPP он кушает много ресурсов.
                                    3. Мало людей, про безопасность пока ничего сказать не можем.
                                    • 0

                                      ИМХО дискорд не мессенджер а скорее конференции, так что людей там то много, но они локализировались по своим конференциям и не пересекаются. Личный пример — дискорд используется вместо окончательно скурвившегося скайпа как конференция-бродкаст (держать толпу друзей, шарить ссылки, собирать желающих по сетке набежать во что-то).

                                      • 0
                                        Угу, там даже нельзя тупо добавить незнакомого человека в свой лист. :) Только через конфу.
                                        • 0
                                          А Ventrilo чем людей устраивать перестала?.. — Десять лет её пользовался, никаких проблем…
                                          • 0
                                            Да как бы та же фигня, что и с остальными — сервер нужен. Причем там еще и лицензия свыше 8 человек, проприетарь, ну его такое. :) Мамбл еще куда ни шло.
                                            А дискач привлек народ агрессивной ХАЛЯВОЙ.
                                            Но не надо думать, что я его защищаю, мне в дискаче нравится только одно — качество звука, чем и завлекли. :) Ну и куча народу там интересного тусуется теперь, переползли коллективами с ирки и жабира.
                                            • 0

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


                                              Кроме конфы для друзей в дискорде рядом живет рейд-конфа вова (20+ человек в войсе), и дискорд позволяет поддерживать полную инфраструктуру для рейда — права пользователей, раздельные чат каналы (для тактик, для анонсов, для рендомного трепа), принудительные пуш-ту-ток каналы.


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

                                              • 0
                                                Кстати, насчет электрона — есть оплаченная в том году каким-то фанатом разработка плагина под Миранду. :) С зимы его не трогал, но текст уже как-то работал, нет ли подобного опыта, но посвежее?
                                                • 0

                                                  Неа, вообще не в курсе про плагины, тем более для миранды (использую пиджин для всего остального).

                                                • 0
                                                  Про 8 человек никто никогда сильно не заморачивался вроде, — пара байтиков и пользуйтесь… По крайней мере так было раньше.

                                                  В остальном, — получается сделали просто удобнее. Молодцы. Принудительный PTT — вообще прекрасно.
                                                  • 0

                                                    Опять же те-же проблемы современной разработки — в плане интерфейса ПТТ реализован… никак. Тебе выдается мини-предупреждение что с войс активацией этот канал не работает и отключает микрофон — надо самому лезть в настройки и включать ПТТ, а потом — переключать обратно на другом канале. Но судя по их реквесту фич — рано или поздно до ума доведут.

                                        • 0

                                          А в Signal тоже самое?

                                          • 0
                                            Предположительно да, не приходилось пользоваться этим мессенджером.
                                          • 0
                                            Я правильно понял?
                                            1) Все ключи выдаются сервером вацапа
                                            2) Все сообщения и прочее ходит через сервера вацапа в зашифрованном виде

                                            Если всё это хранить и совмещать, то легко можно расшифровывать переписку или нет?
                                            • 0
                                              Вы про сквозное шифрование, верно? — Нет, неправильно поняли.

                                              Ключи генерируются на устройстве и передаётся через сервер приложения только публичный ключ. Так что в чистом виде администраторы сервера не могут прочитать вашу переписку. Однако у них есть техническая возможность передать вместо ключа собеседника — свой ключ, и таким образом организовать активный MITM.

                                              Т.е. у каждого пользователя, если сильно упростить, есть два ключа: приватный и публичный. Публичный он через сервера приложения передаёт всем своим собеседникам. Когда ему кто-то хочет написать — он шифрует сообщение публичным ключом получателя. Расшифровать публичным ключом невозможно, — расшифровать может только приватный ключ.
                                            • 0
                                              Было бы интересно узнать, например, более подробно про авторизацию. Как был среверсен алгоритм генерации ключей (файл keystream.class.php) хотя бы.
                                              • 0
                                                У меня нет такого файла. Спросите поточнее, что вы хотите узнать?
                                                • 0

                                                  Так вот в статье вы ссылаетесь на исходники на github, я полез изучать вызовы, которые делает Login.php, и увидел много магии :)

                                                  • 0
                                                    Вы не в те исходники полезли. Я на два гитхаба ссылаюсь, один Chat-API — ко мне имеет пространное отношение, просто там хорошо описано, а я не стал копипастить (хотя, наверное, стоило?). Второй, — mitm-research, — там всё моё и совсем никакой магии.

                                                    К вопросу в целом, как реверсится алгоритм генерации ключей, — там HKDF — он довольно стандартный.
                                                    В простом случае открыв приложение в декомпиляторе и найдя нужный фрагмент кода, — увидишь сразу вызов метода «HKDF» с нужными параметрами и реверсить ничего не нужно.
                                                    В сложном случае, если библиотека вкомпилена в приложение, а имена обфусцированы, — увидишь вызов непонятной функции. Будешь переименовать переменные, выставлять структуры данных до тех пор пока не поймёшь назначение кода. Поняв что делает код — либо скопируешь его как есть, либо подключишь соответствующую библиотеку.

                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                              Самое читаемое