Schtz

На Пикабу
поставил 1 плюс и 7 минусов
Награды:
5 лет на Пикабу
- рейтинг 18 подписчиков 0 подписок 6 постов 0 в горячем

Деанонимизация, часть 4: наработки, интерфейс, нейросети и боты

В продолжение начатого

часть 1

часть 2
часть 3

На неделе я ничего не писал о своей разработке, и сейчас постараюсь восполнить упущенное.

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

Интересными проблемами были:
- установка соединения,
- последовательность старта компонентов,
- добавление хуков или зацепок в чужой код,
- перенос браузерного js на node.js

Каждый из моментов потянет на целый длиннопост, было бы кому читать, поэтому пока ловите скрины:

База данных (mongodb).
1324-я беседа из 1370 на момент написания поста. В ней 147 сообщений. В базу пишутся только разговоры с количеством реплик больше 10 (так удалось отфильтровать всю рекламу и чужих ботов)

Деанонимизация, часть 4: наработки, интерфейс, нейросети и боты Чат-бот, Нейронные сети, Nektome, Длиннопост

1324-я беседа из 1370 на момент написания поста. В ней 147 сообщений. В базу пишутся только разговоры с количеством реплик больше 10 (так удалось отфильтровать всю  рекламу и чужих ботов)

Веб-интерфейс.
Нагло содран с оригинального чата. Даже стили. Цифры отличают один диалог от другого, каждая надпись открывает вкладку с отдельной беседой.
(Кстати, долго подбирал вкладку на скрин, чтоб поймать простую беседу без клубнички.. или пока еще без клубнички)

Деанонимизация, часть 4: наработки, интерфейс, нейросети и боты Чат-бот, Нейронные сети, Nektome, Длиннопост

Нейросети.

На данном этапе остро стал вопрос анализа полученных данных. Перспектива перечитывать тысячи бесед самостоятельно меня вовсе не радует. По сети гуляла статья об идентификации людей по данным, которые передает мобильный телефон станциям связи (время, координаты, маршруты, сами разговоры, их начало, продолжительность и местоположение). Мне думается, что можно по повторяющимся фразам и связкам фраз создать подобие графа или диаграммы связей между типичными репликами, и уже по ним отслеживать отдельных индивидуумов. Уже начал копать в сторону нейросетей, в частности Brain.js, и пока что актуальна проблема перевода слов и фраз в дробные числа от 0 до 1, так как Brain.js работает только с такими величинами (что однако не мешает ему анализировать картинки и разгадывать капчи). Если у кого есть опыт работы с нейросетями, я бы попросил поделиться. Эта нейросеть также послужит основой для продвинутого чат-бота.

Да, чат-бот.

В качестве отдыха накрапал простенького бота для Tampermonkey, который читает входящие и отвечает на доставучие банальные вопросы.


Вот кусок его словарного запаса.

kagdila:{

regex:["[Кк]ак.+дела","[Кк]ак\\s+оно","ак\\s+настроение"],

ans:["нормально"]

},


Он уже умеет начинать разговор, представляться, писать возраст, место проживания и род занятий.

В качестве итога


Направления работ:

1. Изучение нейросетей

2. Дальнейший сбор информации

3. Допилить перехват беседы и отправку сообщений в веб-интерфейсе.

4. Обучить браузерного бота


Вот варианты следующих постов:

- Работа "сборщика" диалогов

- Код, собственно, его же

- Описание зайдействованного инструментария

- Описание процесса разработки и решенных проблем


Можете выбрать, что хотелось бы увидеть освещенным, на ближайшие 8 часов у меня всё.

Показать полностью 2

Обратная инженерия

На написание этого поста меня сподвигли предостерегающие комментарии одного из здешних обитателей в духе "за тобой следят".

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

Принцип РИ состоит в том, что имея некий "черный ящик" с определенным набором логики или принципов можно составить представление о его устройстве на основе анализа данных на выходе в зависимости от того, что подается на вход. Есть еще вариант разобрать ящик и заглянуть внутрь (как делалось в случае копирования импортных микросхем), но в программировании и работе с удаленными сервисами это не всегда возможно.

Кто же занимается РИ?

Да все. Все и каждый в своей области.

Например, физика как наука. Она строит теории мироустройства, свойств материи и тд. Но! Основывается все же на многочисленных подвержденных опытах по учету следствий определенных воздействий, событий. Многократно отпуская камень и наблюдая его падение, многократно нагревая воду и наблюдая ее кипение, делаются выводы о законах мироздания. Наука пытается "отреверсить" Вселенную. На основе подтвержденных опытов строятся догадки или гипотезы о принципах (законах) природы. Выведенные уравнения не являются абсолютно точными, они совпадают с реальных положением дел лишь до определенного знака и в определенных условиях. У нас все же есть формулы для житейских расчетов, где точность даже до второго знака уже избыточна, но в прецизионных расчетах дело обстоит несколько иначе.

Литературные критики анализируют труды и биографию автора и выносят свои предположения и суждения о том, что сподвигло его на написание тех или иных строк, раскрывая детали собственно личности писателя.

Дети. Короли РИ. Они не обладают каким-либо знанием или теориями, но отлично усваивают причинно-следственные связи, учитывая даже невербальные сигналы родителей и окружения. Они быстро вырабатывают методики достижения своих желаний (хотя пока и примитивных), причем они во много схожи с методами взлома: брутфорс через непрекращающийся крик, эксплуатация уязвимостей через использование слабостей родителей (типа онжеребенок, яжмать и тп.), сбор информации через наблюдение и тп.

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

Геймеры. Это вообще непаханное поле. Ни один из действующих игровых движков не реализует принципы и законы природы достаточно точно, поэтому приходится во время игры выяснятьособенности каждого из движков и делать выводы о дальнейших действиях не на основе жизненного опыта, а на основе знания об устройстве движке и условиях срабатывания определенных событий, триггеров и тп. Обширное поле для такой деятельности мозга предоставили и предоставляют РПГ и ММОРПГ со своими системами прокачки навыков и развития персонажа. Кто-то даже публикует формулы расчета, например, урона, которые использует сама игра. Знание движка дает серьезное преимущество для победы. Часто развиваются до читеров.


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

Законодательная часть.


"Гражданский кодекс Российской Федерации (часть четвертая)" от 18.12.2006 N 230-ФЗ


Статья 1280. Право пользователя программы для ЭВМ и базы данных

3. Лицо, правомерно владеющее экземпляром программы для ЭВМ, вправе без согласия правообладателя и без выплаты дополнительного вознаграждения воспроизвести и преобразовать объектный код в исходный текст (декомпилировать программу для ЭВМ) или поручить иным лицам осуществить эти действия, если они необходимы для достижения способности к взаимодействию независимо разработанной этим лицом программы для ЭВМ с другими программами, которые могут взаимодействовать с декомпилируемой программой, при соблюдении следующих условий:


1) информация, необходимая для достижения способности к взаимодействию, ранее не была доступна этому лицу из других источников;


2) указанные действия осуществляются в отношении только тех частей декомпилируемой программы для ЭВМ, которые необходимы для достижения способности к взаимодействию;


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

Без крайней необходимости нам не позволяют "разбирать" чужие творения. Результатом декомпиляции/реверс-инжиниринга будет псевдокод или алгоритм, из которого родится уже новый исходный код. Если записи об обратной разработке недоступны, то доказать неоригинальность кода становится непосильной задачей (особенно если код перенесен на другую платформу). Opensource в этом случае вообще предлагает открытые исходники для всех желающих заглянуть "под капот" приложения.


На правах итога.

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

Показать полностью

Архитектура браузерного клиента

часть 1
часть 2

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

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

Архитектура браузерного клиента Nektome, Программирование, Длиннопост

Сам движок чата "зашифрован" в chatwss.js
Оранжевым и сиреневым отмечены модули графического интерфейса.

Архитектура

Делая своего клиента для чата, я сначал хотел переиначить "под себя" архитектуру сервиса, но с каждой новой попыткой ввести что-то новое понимал, что автор сего творения уже предложил весьма неплохую, мне надо только вклиниться в нее.

Примерно так работает веб-клиент чата (андроид-клиента я не разбирал, но, думаю, примерно так же устроен и он):

Пользователь  работает с GUI, нажимает кнопочки, набирает сообщения. На кнопках висят события, которые, как правило, дают задания ChatEngine.


ChatEngine  в свою очередь является подобием обертки для работы с сокетом. Он формирует и отсылает сообщения на сервер, параллельно передавая команды в GUI.


HandlerMessage - приемник сообщений. Передает новые сообщения и уведомления (о прочтенных сообщениях, о наборе текста, об отключении собеседника) на отрисовку в окне чата.

Архитектура браузерного клиента Nektome, Программирование, Длиннопост

Один из методов ChatEngine:

searchCompany: function(_1) { //на вход принимает данные поиска

_1[action] = SEARCH_COMPANY; //указывает тип действия

stepShow(search_company_step); //несколько команд интерфейсу

$(# closeDialogBtn)[removeClass](disabled);

$(# search_company_loading)[css](visibility, visible);

Socket[send](_1) //отсылка сообщения

},

Сервер получает вот такое сообщение, а в окне запускается поиск собеседника:

{

my_sex: "M",

wish_sex: "F",

my_age_from: "25",

my_age_to: "35",

action: "SEARCH_COMPANY"

}

Пример сообщения от сервера (юзер печатает текст):

{

message: {

dialog_id: 35703950,

typing: true,

uid: 4564686

},

notice: "user_typing_a_message"

}

Отсылка команд на обработку. Не очень безопасно, но весьма практично. Берется  значения поля notice  и запускается метод хэндлера с таким же именем.

ws[onmessage] = function(_E) {  //прием сообщения от сервера

var _6 = JSON[parse](_E[data]); //разобрка принятой строки в JSON-объект

if (HandlerMessage[_6[notice]]) { //проверка наличия метода в хэндлере

if (_6[request_id]) {  

HandlerMessage[_6[notice]](_6[message], _6[request_id])  // вызов 1

} else {

HandlerMessage[_6[notice]](_6[message]) //вызов 2

}

}

};

Примерно так выглядит обмен сообщениями на сокете. Зеленым обозначены исходящие сообщения, остальное - принимаемые.

Архитектура браузерного клиента Nektome, Программирование, Длиннопост

Начинается с авторизации, затем поиск, открытие диалога. Кстати, идет постоянный спам сообщениями о количестве онлайн-пользователей.

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

P.S. как тут код отформатировать? Пробелы в начале строки отрезает

Показать полностью 3

Лирическое отступление для подписавшихся

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

Оговорка для тех, кому мои идеи не по нраву:

В анон чате большинству все равно, что их переписку могут читать третьи лица (я сам спрашивал).
Свои переписки участники разговоров могут сохранять и так же показывать третьим лицам, делать скрины и публиковать.
Те, кто дает свои контакты незнакомым, уже знают, что дают их неизвестно кому, и совсем не ясно, как эти данные будут использоваться второй стороной.
Хотелось бы накидать сюда каких-то смешных моментов из переписок, но по большей части диалоги настолько убогие, что после часа поисков понимаешь, что эти логи годятся только для обучения бота, и то лишь на ранних стадиях.

P.S. процентов 10 диалогов принадлежат рекламным ботам. Иногда они друг друг что-то продвигают).

Для подписчиков:

Деятельность разветвилась на несколько направлений, каждое из которых в принципе интересно и требует детального изучения.

1. Подробный анализ веб-сервиса. Лично мне понравилось, как реализована авторизация и защита от множетвенных подключений.

2. Собственно разработка приложения. Пишется на Nodejs, имеет пока только запись в логи и никакой интерактивности.

-- 2.1 Изучение Nodejs
-- 2.2 Развитие и переработка кода.
-- 2.3 Освоение инструментария.
-- 2.4 Архитектура клиента.

3. Анализ полученных данных. Непаханное поле. Пока есть только grep. После переноса хранения с логов на mongodb c анализом будет поинтереснее, идет работа над методикой группировки полученных данных и их сопоставления, анализ последовательностей и так далее. Может вылиться в изучение нейросетей и анализ графов.

4. Намечающееся направление создания прототипа бота, который бы обучался из скормленных ему диалогов.

5. Финал, понимание конечного результата и сам результат.

Просьба написать, что именно (какие-то из указанных направлений или свой вариант) вы бы хотели увидеть освещенным более детально. Вплоть до графиков и диаграмм.

Показать полностью

Деанонимизация в чате

продолжение первого поста:

Вообще я был удивлен теплым приемом пикабу. Ради огромного фанклуба подписчиков опубликую следующий этап.

Разборка кода


У чата оказалась открытая вебморда на 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 и телефонов, видел даже одного любителя пикабу.

Сейчас стоит проблема анализа записей. Просто читать всю эту ересь не представляется реальным.

Показать полностью

Деанонимизировать через чат

Дошел до небезызвестного чатика некто.ми


Об "анонимном общении" здесь уже все расписано вдоль и поперек, кто-то даже приводил процентное соотношение публики (адекваты/неадекваты, распределение по возрасту и полу и тп). После некоторого времени с толпой озабоченных и депрессивных сам собой напросился вопрос: "А не вывести ли их на чистую воду?"

Деанонимизировать через чат Nektome, Деанонимизация, Чат, Разработка

Можно ли деанонимизировать человека через общение в чате?


Анонимный чат на то и назван так, чтобы каждый мог действовать свободно и беспалевно. И чтоб по лицу не получить.

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

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

Количество диалогов.


Либо общаться самому, либо писать бота. Самому - долго. Хорошего бота еще надо обучить разводить на контакты, что тоже долго. Идеально, конечно, было бы получать просто сами записи. Пачками. С сервера.

Ботоводство.


Я начал работать над ботом, который бы запускался из Tampermonkey и вел стандартную беседу (превед/кагдила и далее по списку). После анализа интерфейса чата и написания первого бота, который отслеживал входящие, имитировал набор текста и мог отсылать сообщения из заданного массива, уткнулся в обфусцированный код движка этого самого чата. Не очень сильно скрыт, но подолбаться пришлось изрядно. После его анализа появилась новая идея. Бот не нужен. Можно получать готовые диалоги.


ПАЧКАМИ.

Пилю сейчас сборщик разговоров в реальном времени. Уже есть успехи.

Будет интересно - продолжу писать дальше. А меня с первым постом!

Показать полностью 1
Отличная работа, все прочитано!