Обновление: это была проверка концепции, которую я сделал еще в сентябре 2017 года. Я не ожидал такого большого отклика на этот проект. Как отмечают многие, код больше не работает, потому что WhatsApp Web постоянно меняет свой код. Однако я рекомендую вам создать ветку мой проект на GitHub, чтобы он работал для ваших собственных нужд.

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

Для этой конкретной попытки я пытаюсь нарушить одну из функций конфиденциальности, предоставленных вам WhatsApp. Я часто использую WhatsApp, чтобы общаться с семьей и друзьями почти весь день, и это потрясающая программа. Как и многие другие приложения для обмена сообщениями, WhatsApp также дает вам право контролировать свою конфиденциальность. Одна из таких функций - скрыть свой статус «Последний визит» от людей.

И отлично работает! У меня всегда установлено значение «Никто», потому что я не хочу, чтобы люди знали, когда я последний раз был в сети, и я уверен, что миллионы других людей поступают так же. Но так ли это безопасно? Можно не сломать? Хм, вот тогда я и начал углубляться в это.

Оказывается, в WhatsApp также есть веб-интерфейс, с помощью которого можно общаться прямо из браузера. Замечательно! Я могу легко заглянуть в исходный код здесь, чтобы разобраться в нижних слоях того, как все это работает. И вот что я сделал. Я просмотрел все сценарии, обеспечивающие работу WhatsApp Web, и нашел кое-что интересное. Если вы войдете в консоль JS в браузере, когда находитесь на веб-сайте, наберете Store и нажмете клавишу ВВОД, вы увидите определенный вывод. Вот так выглядит WhatsApp Web для хранения и извлечения информации в вашем браузере. У него есть объект Store. Введите Store.Presence.models и вуаля! Теперь вы можете просмотреть некоторые сведения о своих контактах. Одна из этих мелких деталей - проверить, находится ли пользователь в сети, что-то вроде __x_isOnline, и, обнаружив это, я был в восторге от того, что, возможно, нашел обходной путь для функции конфиденциальности «Последний визит», просто регистрация времени, когда пользователь входит в сеть и когда он / она уходит в автономный режим. Но после некоторых экспериментов я обнаружил, что это ненадежный способ. Почему? Потому что параметр __x_isOnline исчез, когда я попытался поиграть с ним с помощью собственного кода JS. (PS. Если вы понимаете, почему это так, скажите, пожалуйста!)

Но я явно не сдавался так легко. Я подумал, что, если я попытаюсь нацелиться только на один контакт за раз и просто поиграю с DOM. Поэтому, когда пользователь входит в сеть, у него / нее есть ярлык онлайн под его / ее именем на веб-странице. Итак, я сделал то же самое и продолжил следить за изменениями DOM и соответственно регистрировать активность. Это сработало! Я мог видеть, когда мой конкретный контакт в WhatsApp подключается к сети и переходит в автономный режим. Таким образом, даже если у него / нее включен параметр конфиденциальности Последний визит, я все равно могу отслеживать, когда он / она подключается к сети и переходит в автономный режим. Это страшно, правда? И это небольшой фрагмент кода, который я написал.

Я называю этот небольшой взлом UhOh, потому что я только что нарушил функцию конфиденциальности Last Seen в WhatsApp, используя его собственный веб-клиент?

Как это работает

Для всех вас, программистов, я использую для этого Puppeteer. Это Chrome Headless Node API, выпущенный самой командой Google Chrome. Я просто автоматизирую процесс открытия страницы браузера, переходя на https://web.whatsapp.com, выбирая контакт, о котором мне нужны данные, и начинаю наблюдать за манипуляциями с DOM. Все это происходит автоматически, и вы получаете логи в консоли. Более подробную информацию о технических деталях можно найти в моем репозитории на GitHub здесь.

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