Я был очень удивлен, когда увидел большое количество UDP-трафика на порте 2046. Взглянул на него, но много толку это не дало – порт оказался не из стандартных, так что разбираться предстояло вручную.
Сначала я заподозрил, что эти данные нужны для стриминга телепередач на телевизоры, но размер пакета выглядел мелковатым, даже для единичного видеофрейма.
UDP-пакеты приходили не на мой IP, и я не проводил ARP-спуфинг, соответственно, эти пакеты рассылались всем. Изучив их повнимательнее, я установил, что это пакеты Multicast. По сути, это значит, что пакеты отправляются однократно и одновременно приходят на несколько устройств. Я заметил и еще кое-что: все пакеты были одинакового размера (634 байта).
Я решил написать скрипт для извлечения и анализа этих данных на Python. Начнем с кода, с помощью которого я стал принимать пакеты Multicast. В нижеприведенном фрагменте 234.0.0.2 – это IP, который я получил на Wireshark.
import socket
import struct
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 2046))
mreq = struct.pack("4sl", socket.inet_aton("234.0.0.2"), socket.INADDR_ANY)
s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
while True:
data = s.recv(2048)
print(data)
Дополнительно я использовал binascii, чтобы конвертировать всё это в hex и облегчить себе процесс чтения байтов. Пронаблюдав, как тысячи пакетов сменяют друг друга на моей коносли, я заметил, что первые 15 байтов или около того у всех одинаковы. Эти байты, вероятно, указывали на протокол и ID пакета/команды, но так как мне приходило всё одно и то же, я не сумел ничего расследовать в этом плане.
Стыдно признаться, сколько времени мне потребовалось, чтобы заметить цепочку символов LAME3.91UUUUUUU в конце каждого пакета. Я заподозрил, что это аудиоданные, сжатые MPEG, но, когда для пробы сохранил один пакет как test.mp3, мультиплеер не смог его проиграть, а утилита file определила его только как test.mp3: data. То, что в пакете имеются данные, было и так очевидно, а если бы они представляли собой аудио MPEG, file должна была бы их узнать.
Поэтому я решил написать еще один скрипт на Python, который сохранял бы данные из пакетов со смещением. То есть файл test1 он должен был сохранить, пропустив один байт из пакета, файл test2 – пропустив два байта и так далее. Вот какой я использовал код и вот что из этого получилось:
data = s.recv(2048)
for i in range(25):
open("test{}".format(i), "wb+").write(data[i:])
После этого я запустил file test* и вуаля! Теперь мы знаем, что, чтобы добраться до данных аудио MPEG, нужно пропустить восемь байтов:
$ file test*
test0: data
test1: UNIF v-16624417 format NES ROM image
test10: UNIF v-763093498 format NES ROM image
test11: UNIF v-1093499874 format NES ROM image
test12: data
test13: TTComp archive, binary, 4K dictionary
test14: data
test15: data
test16: UNIF v-1939734368 format NES ROM image
test17: UNIF v-1198759424 format NES ROM image
test18: UNIF v-256340894 format NES ROM image
test19: UNIF v-839862132 format NES ROM image
test2: UNIF v-67173804 format NES ROM image
test20: data
test21: data
test22: data
test23: DOS executable (COM, 0x8C-variant)
test24: COM executable for DOS
test3: UNIF v-1325662462 format NES ROM image
test4: data
test5: data
test6: data
test7: data
test8: MPEG ADTS, layer III, v1, 192 kbps, 44.1 kHz, JntStereo
test9: UNIF v-2078407168 format NES ROM image
while True:
data = s.recv(2048)
sys.stdout.buffer.write(data[8:])
Дальше нам нужно просто непрерывно читать пакеты один за другим, пропуская в каждом по восемь байтов, и тогда всё отлично воспроизведется.
Что же кроется в этом аудио? Следы коварно спрятанного жучка, который подслушивает за мной? Что-то имеющее отношение к умному телевизору в моем номере? Что-то связанное с работой гостиничных систем? Есть только один способ узнать.
$ python3 listen_2046.py > test.mp3
* wait a little to get a recording *
^C
$ mplayer test.mp3
MPlayer (C) 2000-2016 MPlayer Team
224 audio & 451 video codecs
Playing test.mp3.
libavformat version 57.25.100 (external)
Audio only file format detected.
=====
Starting playback...
A: 3.9 (03.8) of 13.0 (13.0) 0.7%
Что за чертовщина? И на это я тратил своё время? Это музыка вызова лифта, её играют в коридорах возле лифтов. Ну ладно, зато теперь я могу слушать ее и у себя в номере.
Комментарии (60)
akakoychenko
00.00.0000 00:00+1Интересно, в случае пожара вместо музыки начнёт проигрываться голос типа "fire alarm!"
at5Fd8NVdfpf
00.00.0000 00:00+27А разослать свою версию пакетов с другой музыкой но такими же заголовками не пробовали ?
Dvlbug
00.00.0000 00:00Скорее всего будет просто какофония, 634 байта не хватит для полноценного звука
А пакеты будут приходить вразнобой
VladimirFarshatov
00.00.0000 00:00+2Сразу видно любознательного молодого программиста ;). Плюсанул статью, спасибки.
SergeAx
00.00.0000 00:00-18Вышедший в топ перевод статьи 2016 года, да ещё и с использованием термина "обратная разработка" вместо "реверс-инжиниринг", в полном соответствии с политикой и курсом партии "Единая Россия". Буду использовать как иллюстрацию деградации российского IT, спасибо.
event1
00.00.0000 00:00+27Действительно, какой ужас. Переводчик использует термины, которые ему больше нравятся. Немедленно запретить! /s
tyomitch
00.00.0000 00:00+1Ну вот, а меня здесь в 2011 заклевали было за варианты "беззамочный" и "беззахватный" в качестве перевода термина lock-free
dom1n1k
00.00.0000 00:00+1Слово "разработка" выглядит довольно уместным переводом, потому что перекликается с разработкой месторождения.
shuhray
00.00.0000 00:00+4Редкий случай, когда согласен с политикой и курсом партии "Единая Россия". Недавно на хабре узнал слово "фичемапа". Надо что-то делать.
SergeAx
00.00.0000 00:00+1Я для себя решил, что надо учить английский язык, потому что IT и software engineering развиваются в основном в англоязычном сегменте, и без возможности брать оттуда всё новое никакого профессионального роста не будет.
EireenK
00.00.0000 00:00+3Удивительно глубокое и своевременное озарение для "создателя и руководителя инженерных команд".
SergeAx
00.00.0000 00:00В смысле, вы подумали, что я это только что решил? Но я с 2019 года работаю в иностранных компаниях с обязательным английским. А решил ещё в школе, которую я закончил, когда вы, скорее всего, ещё не родились)
Это была просто более вежливая версия высказывания типа "если ты не знаешь английский - ты не инженер, а в лучшем случае личинка инженера". Пришлось разжевать, увы, с пониманием намёков у людей обычно так же плохо, как со знанием языков.
event1
00.00.0000 00:00+1Я для себя решил, что надо учить английский язык, потому что IT и software engineering развиваются в основном в англоязычном сегмент
Для этого достаточно читать со словарём
shuhray
00.00.0000 00:00+1На форуме dxdy в программистском отделе переводили слово handle. Перевод всегда состоял из нескольких слов, включая слово "идентификатор". Притом, "handle" - это ручка (от чемодана). Штуковину, за которую удобно таскать файл, англоязычный программист называет "ручкой", а русскоязычный "идентификатором".
tyomitch
00.00.0000 00:00-1"идентификатор" -- это плохой перевод: например, в PROCESS_INFORMATION подряд идут process handle, thread handle, process ID, thread ID.
Я встречал "дескриптор", "манипулятор" и ещё какие-то заумные варианты. Почему никто не пишет просто "ручка процесса", "ручка файла"?
shuhray
00.00.0000 00:00+5"Рукоятка" было бы хорошо. Изредка пытаются переводить (вот переводчик этой статьи написал "обратная разработка" и его тут же обругали). "Зловред" хорошее слово, смешное и по сути дела. Но вообще молодёжь пишет удивительно мутно. Вот недавний пост здесь, на хабре "Сегодня я хочу рассказать про проблему построения оптимального плана выполнения запроса при использовании коллекций в качестве входных переменных запроса и вариантах ее решения." Кто на ком стоял, какой падеж "про проблему и вариантах". Смысл, я так понял, такой "Как сделать, чтобы запрос выполнялся быстрее, если на входе коллекция".
FoxWMulder
00.00.0000 00:00у меня произошло зависание процессов в голове на несколько секунд когда на вход поступила информация что кто-то пытался переводить слово handle. нафига и зачем? чтобы читая статью где это слово будет переведено, мысленно в процессе чтения его ещë раз переводить?
shuhray
00.00.0000 00:00Хочется читать понятный текст. Если человек не знает ни русского, ни английского, он выдумывает слова вроде "фичемапа". Один знакомый математик уже в зрелом возрасте уехал жить в США, там подзабыл русский язык, а английский выучил плохо. И вот он говорит "ещё один релевантный экзампл".
FoxWMulder
00.00.0000 00:00думаю для программистов etc всяко понятней "handle приложения", чем " ручка приложения", как тут его переводили. да и вообще "handle" понятнее всего другого будет.
event1
00.00.0000 00:00+2Редкий случай, когда согласен с политикой и курсом партии "Единая Россия".
К сожалению этот вопрос нельзя решить принятием закона. Люди всё равно будут говорить так, как им нравится
panzerfaust
00.00.0000 00:00+3Это музыка вызова лифта, её играют в коридорах возле лифтов
Не понял, зачем ее броадкастить постоянно. Я думал такие вещи или вшиты в прошивку или загружаются типа раз в день.
Tomasina
00.00.0000 00:00+5Для программиста так было проще, наверное под рукой уже был готовый сниппет кода.
А работу заказчик принимал по функционалу - заявленное в ТЗ работает? Работает. А как оно там внутри реализовано - заказчику пофиг.
usrsse2
00.00.0000 00:00+18В оригинале:
What the hell? I can’t believe I spent time for this. It’s just elevator music. It is played in the hotel corridors around the elevators. Oh well, at least I can listen to it from my room now.
Это не звук прибытия лифта, а музыка, которая просто играет в лифтовом холле (постоянно).
MiraclePtr
00.00.0000 00:00Чтобы в какой-то момент вместо музыки при необходимости можно было транслировать что-то другое? Да, понятное дело, можно было "постоянную" музыку хранить локально, и при этом все равно слушать броадкасты, но это уже больше логики и кода, а тут все максимально просто и прямолинейно, и заодно и мониторинг в комплекте - если музыка у лифта перестала играть, значит что-то сломалось ;)
VADemon
00.00.0000 00:00Броадкасты... судя по всему, где-то по пути разучились пользоваться мультикастом вместо броадкаста. Иначе бы он эти пакеты в Wireshark сходу не увидел.
develmax
00.00.0000 00:00Напоминает очень компьютерные игры, где музыка так же играет в лифтовом холле. Плюс это позволяет синхронизировать музыку одновременно в разных местах, то есть приехал на другой этаж - там музыка продолжает играть, а не "рвется" или сменяется на другую.
ulovka22
00.00.0000 00:00-1Когда-нибудь вместо музыки можно будет транслировать рисунки для ковровых покрытий
Tomasina
00.00.0000 00:00На такой ковер фишку уронишь - и хрен найдешь.
ulovka22
00.00.0000 00:00не в этом дело, я просто представил, как бы автор расшифровывал трафик с картинками для ковров вместо радио
hardim
00.00.0000 00:00Странно что для этого использовалась гостевая сетка. Скорее всего и приватной то нет.
Tomasina
То есть лифт подключен к общей локальной сети? А порулить им?
DMGarikk
скорее динамики рядом с ним подключены и с лифтом не связаны
но в принципе, подключен может быть запросто (если админ особо активный), гостиница не ИТ компания там никто морочиться ИБ не будет
m0tral
Там зачастую ключи от номера Mifare и на открытых ключах либо на известных) что уж заботиться от каких то UDP пакетах для колонок
Tomasina
Но раз по прибытии лифта на этаже играет музычка, которая крутится в UDP, то лифт как-то взаимодействует с блоком воспроизведения. И вряд ли это банальный геркон и магнитик.
artemlight
Это может быть банальный датчик движения, примерно такой же, как и для освещения.
Tomasina
Тогда бы он тренькал даже при транзитном движении лифта. Тут что-то более умное надо.
DMGarikk
да запросто!
может конечно там и не геркон с магнитиком, но запросто этажная релюшка которая по can шине получает сигнал что лифт приехал… типа чтобы какойнить свет включать или еще чего… и на неё зацепили звук.
Я чет не верю что там чтото более технологичное. с этим вне ИТ сектора крайне КРАЙНЕ тяжело