продолжение первого поста:
Вообще я был удивлен теплым приемом пикабу. Ради огромного фанклуба подписчиков опубликую следующий этап.
Разборка кода
У чата оказалась открытая вебморда на jquery. В нее был вынесен весь функционал по отображению сообщений и составлению ответа, интерес представлял сам движок, засунутый автором от любопытных глаз в вот такой массив непонятных строк
var _0x737b = ["\x74\x20\x63\x3D\x5B\x22\x5C\x31\x66\x5C\x4F\x5C .... (очень длинно) .... \x68\x6A\x2D\x72\x74\x2D\x76\x78\x79\x42\x2D\x5A\x5D\x7C\x5B\x31\x2D\x36\x5D\x5C\x77\x29", "\x5C\x62", "\x67"];
с кодом распаковки
eval(function(_0x996ax1, _0x996ax2, _0x996ax3, _0x996ax4, _0x996ax5, _0x996ax6) {
_0x996ax5 = function(_0x996ax3) {
return (_0x996ax3 < 62 ? _0x737b[4] : _0x996ax5(parseInt(_0x996ax3 / 62))) + ((_0x996ax3 = _0x996ax3 % 62) > 35 ? String[_0x737b[5]](_0x996ax3 + 29) : _0x996ax3.toString(36))
...
}
Под этим скрывался следующий слой обертки примерно такого вида:
2 u[c[46]] = 4 V;
1 s = {
ws: 4 W,
init: v() {
x(2 u[c[48]][c[47]] == c[49]) {
3 K = c[50]
};
за ним оказался (наконец-то) читабельный код:
window[onbeforeunload] = onBeforeClosePage;
Socket = {
ws: null,
init: function() {
if (window[location][protocol] == http: ) {
protocol = ws
};
Дальнейший анализ был проще.
Архитектура примерно такова:
Socket создает вебсокет и занимается приемом/передачей сообщений (служебных и текстовых). Входящие пихает в HandlerMessage. Хэндлер отсылает события в GUI. Интерфейс в ответ на действия пользователя обращается к ChatEngine (обертка для отсылки сообщений через Socket).
Отправляемые cообщения бывают нескольких типов:
Авторизация 'AUTH'
Искать собеседника 'SEARCH_COMPANY';
Прервать поиск 'OUT_SEARCH_COMPANY';
Сообщение (текст) 'CHAT_MESSAGE';
Уведомление о прочтении 'CHAT_MESSAGE_READ';
По ид диалога получает сообщения 'GET_MESSAGES_BY_DIALOGS';
Используется при переподключении после обрыва связи
Отключиться 'LEAVE_DIALOG';
Получение количества юзеров онлайн 'COUNT_ONLINE_USERS';
Собеседник печатает!! 'TYPING_A_MESSAGE';
Сам сервер генерирует такие сообщения :
Удачный логин success_auth
Открыт диалог open_dialog
а также "юзер ушел", "диалог закрыт" и "ошибки"
Авторизация
Авторизация все же происходит. Каждый юзер получает свой токен, который отсылается при новом подключении.
Токен приходит в теле html-страницы чата и записывается в глобальную переменную. Поэтому при попытке открыть более двух окон в одном браузере и искать собеседника сразу в нескольких весьма проблематично, ибо сервер "палит" по токену. Можно обойти через Tampermonkey, кстати.
На сегодня пока все. Информации много, в одном посте все не вместить.
Забегая наперед, скажу, что уже получил записи бесед.
За день набегает:
порядка 10 000 диалогов.
Из них примерно 70 имеют от 200 до 1000 сообщений (с охренительными историями).
порядка 60-70 vk/insta/ok/skype id и телефонов, видел даже одного любителя пикабу.
Сейчас стоит проблема анализа записей. Просто читать всю эту ересь не представляется реальным.