November 7, 2019

Информация по сокетам

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

До версии 2.6 запросы на сервер отправлялись циклично. Внутри APK был код, который через каждые N миллисекунд отправлял запрос на сервер. Приложение само запрашивало у сервера данные, следовательно его можно было обмануть. К примеру, "ускорить" время с помощью таких программ, как GameGuardian или GameKiller. В этом случае побеждал тот, у кого больше запросов к серверу.

Разработчики это прекрасно понимали, и начиная с версии 2.6 они перешли на протокол связи в режиме реального времени - проще говоря, WebSocket.

Тут хорошо подходит аналогия с мессенджером: мистер xxx пишет сообщение, и отправляет его мистеру yyy. К сожалению, мистер ххх пишет сообщения очень медленно, но это никак не исправить. Ты не можешь заставить собеседника печатать быстрее, если он не в состоянии это делать. То же самое и с клиентом. Клиент не может заставить сервер отправлять ему сообщения в более ускоренном темпе. Тут-то как раз и появляются флексы с серверами, точнее с их портами. Я не спец в этом деле, не могу сказать, что есть 100% рабочий метод заставить сервер быстрее отсылать сообщения, только если это не скомпрометированный сервер.

Я скажу лишь о тех моментах, которые связаны с получением данных через Socket протокол. Для удобства анализа всё будет представлено в виде Java-кода, а не smali. Java более проста для понимания сложных алгоритмов.

Итак, преступим:

Сначала стоит поискать по ключевому слову "Socket"

Результаты поиска

Нашло 46 результатов. Теперь еще раз сделаем выборку. На этот раз по слову "taxoid". Там и вовсе 2 класса:

  1. c.c.a.d.b.a.l.java

Я изменял эти переменные еще в самом начале изучения Taxoid-а. Объясню, что тут происходит:

Присваиваются несколько переменных.

Класс d.b.b.e объявляется как переменная e

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

В дальнейшем коде идут запросы на сервер, с твоими данными локации, логином-паролем и т.д.

Код коннектов к серверу. Класс d.b.b.e

А где же сокеты?

При ошибке подключения используется сокетное оповещение

2. c.c.a.d.c.e.java

Глядим здесь упоминание сокетов:

Здесь:

Устанавливается сокетное соединение с уже данным хостом и портом

Устанавливается таймаут в 10 секунд

Начинается чтение данных с сокетного соединения

Устанавливается флаг коннекта в положение true. Скорее всего, чтобы не коннектиться каждый раз по новой.

А сам адрес, откуда берутся данные:

Круг замкнулся. Осталось только посмотреть, что за данные он отдаёт

Об этом чуть позже.