Раскрыта дата выхода Темной темы на TJ

31 декабря 2007 года в 23:00 по Гринвичу.

Разгаданный сабж Денис Ширяев

Обновлено: В комментах Ширяевым обещана Темная тема на мобилках во втором квартале года!

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

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

Давайте рассмотрим поближе картинку, которую приложил Денис:

Увеличение в 128 раз
Денис Ширяев

Сходу можно сделать пару наблюдений: PNG картинка 4 на 4 пикселя без прозрачности может хранить 48 байт информации, при условии, что глубина цвета составляет 24 бита. А ещё последние 3 пикселя данной картинки имеют черный цвет #000000, это значит, что информация вероятно заполнялась по слева-направо, сверху-вниз.

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

// Декодируем PNG, чтобы получить из него только полезную нагрузку, // заголовки, вещающие нам о том, что это картинка нам не нужны! img, err := png.Decode(f) if err != nil { panic(err) } // Основной цикл считывания полезной информации var phase1 []byte for y := 0; y < img.Bounds().Max.Y; y++ { for x := 0; x < img.Bounds().Max.X; x++ { // Читаем цвет пикселя и конвертируем его из 48-битного в 24-битный r, g, b, _ := img.At(x, y).RGBA() r = r >> 8 g = g >> 8 b = b >> 8 phase1 = append(phase1, byte(r), byte(g), byte(b)) } }

Я так и не понял: это нюанс работы Go или Основа опять сделала что-то страшное с картинкой, но все цвета были 48-битными и имели вид а-ля #2С2С31310D0D. Поэтому возвращаем им первоначальный вид, совершив битовый сдвиг на 1 байт.

Окей, информацию считали, что мы получили:

Ряд 1: 1 33 0 222 255 243 117 113 172 240 13 113 Ряд 2: 44 247 117 113 77 247 197 96 187 226 96 163 Ряд 3: 168 175 0 210 8 241 16 36 182 11 78 182 Ряд 4: 45 0 0 0 0 0 0 0 0 0 0 0

Сходу я лично заметил одно: с информацией что-то не так. Что в ASCII, что в UTF-8, что в Win1251 буквы находятся близко, тут же ряд разбросан, 0 потом сразу 222, подозрительно всё это!

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

Впрочем радоваться было рано. Основа походу покорёжила PNG-файл и сайт файлик не кушал.

Image was not encoded with this service, corrupt or invalid password.

Не беда! Начнем реверсить! За две минуты я узнал массу полезной информации о работе сервиса:

  • Текст до 3 букв кодируется 1 цветом без искажений
  • Для кириллицы используется Win1251
  • Текст из 4 и более букв кодируется более непрогнозируемым количеством байт
  • Частое повторение букв практически не приводило к увеличению количества цветов на картинке

Становилось понятно: используется компрессия. Учитывая, что у сервиса есть опциональное шифрование, я понадеялся, что Ширяев не был со мной настолько жесток.

Определить алгоритм компрессии задача сложная, особенно когда у тебя нет магического заголовка. Но я решил просто попробовать парочку популярных. LZW успеха не дал, зато 2 раунда Deflate сработали! К слову именно этот алгоритм используется в самих PNG, выходит что помимо встроенной компрессии, автор прогнал его ещё по самому сообщению, спрятанному в картинке.

// Два раунда декомпрессии по алгоритму Deflate // (да простят меня боги за излишнюю вложенность) phase2, err := ioutil.ReadAll(flate.NewReader(flate.NewReader(bytes.NewReader(phase1)))) if err != nil { panic(err) }

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

// Из ASCII в Win1251 phase3, err := charmap.Windows1251.NewDecoder().Bytes(phase2) if err != nil { panic(err) }

На выходе получаем заветный Base64, о котором заикался Денис:

MDAxMTAwMDEgMDAxMTAwMDEgMDAxMTEwMDEgMDAxMTEwMDEgMDAxMTAwMDEgMDAxMTAxMDAgMDAxMTAwMTAgMDAxMTAwMDAgMDAxMTAwMDAgMDAxMTAwMDA=

Декодим Base64 в строку:

phase4 := make([]byte, base64.StdEncoding.DecodedLen(len(phase3))) _, err = base64.StdEncoding.Decode(phase4, phase3) if err != nil { panic(err) }

Получаем некий набор байтов в двоичном представлении:

00110001 00110001 00111001 00111001 00110001 00110100 00110010 00110000 00110000 00110000

Каждый байт придется конвертировать в десятичную систему:

var phase5 []byte for _, b := range strings.Split(string(phase4), " ") { b = strings.Trim(b, string([]byte{0})) i, err := strconv.ParseInt(b, 2, 64) if err != nil { panic(err) } phase5 = append(phase5, byte(i)) }

Ура, число!

1199142000

Пришлось ещё немного подумать, чтобы понять, что это UNIX timestamp. То есть время прошедшее с 1 января 1970 года.

2007-12-31 23:00:00 +0000 UTC

Спасибо за внимание, все свободны, надеюсь было интересно! Ширяев останься, с тебя настоящая дата выхода темной темы!

0
50 комментариев
Написать комментарий...
Драгоценный Кирилл

Чувак, ебать ты умный

Ответить
Развернуть ветку
Московский мангал

Следующая стадия интеллекта — сделать геймбой в Майнкрафте:

Ответить
Развернуть ветку
Denis Shiryaev

Поскольку ты оказался намного трудолюбивее чем я рассчитывал, в Q2 сдаем темную тему в приложениях, для начала там (:

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Yuliy Galkin

Вот стоило только дату задать, так сразу зашевелились. Респект

Ответить
Развернуть ветку
Вольный микроскоп

Денис, где ошибка? Действительно ли Основа исказила цвета PNG? Или зашифрованная дата разгадана верно?

Ответить
Развернуть ветку
Denis Shiryaev

Да, я хуево пошутил (:

Ответить
Развернуть ветку
Вольный микроскоп

Ты просто хотел вернуть 2007-й, понимаю.

Ответить
Развернуть ветку
Блестящий лолипоп

Комментарий недоступен

Ответить
Развернуть ветку
Вольный микроскоп

Но ты не ///

Ответить
Развернуть ветку
Блестящий лолипоп

Комментарий недоступен

Ответить
Развернуть ветку
Вчерашний глобус

Если пересобрать PNG с такими же цветами, то она весит меньше (114 кб вроде, против 131) и тот сайт умеет её декодировать. К слову это можно считать вторым методом разгадки.

Ответить
Развернуть ветку
Московский мангал

Ого, я на твоей обложке и это не бaг.

Ответить
Развернуть ветку
Московский мангал

Отдал честь зеркальными мерами.

Ответить
Развернуть ветку
Блестящий лолипоп

Комментарий недоступен

Ответить
Развернуть ветку
Блестящий лолипоп

Комментарий недоступен

Ответить
Развернуть ветку
Московский мангал

Служу Ширяешеству!

Ответить
Развернуть ветку
Pavel Averyanov

Well played! Я когда эту херню увидел был немного в щи и был уверен, что комитетский сервак все пожал до недекодируемого состояния

Ответить
Развернуть ветку
Блестящий лолипоп

Комментарий недоступен

Ответить
Развернуть ветку
Скучный Денис

Но ведь это не Ширяев.

Ответить
Развернуть ветку
Блестящий лолипоп

Комментарий недоступен

Ответить
Развернуть ветку
Скучный Денис

Ладно, я с вами. Поменяю аватарку, когда появится темная тема.

Ответить
Развернуть ветку
Baileys

А так вот почему вы все аватарки поменяли. А я то думал просто

Ответить
Развернуть ветку
Скучный Денис

Прости, что украли твою аватарку

Ответить
Развернуть ветку
Блестящий лолипоп

Комментарий недоступен

Ответить
Развернуть ветку
Потребительский Гоша

1-4-9-8

Ответить
Развернуть ветку
Блестящий лолипоп

Комментарий недоступен

Ответить
Развернуть ветку
Скучный Денис

Павел хорошо смимикрировал

Ответить
Развернуть ветку
Митя Простомолотов

С детства я не мог уловить значения выражений "Сектор Газа" и "Еврейский вопрос". Если словосочетание "сектор газа " ,благодаря одноименной группе, и рождало какие то ассоциации (я представлял,что в этом секторе все ругаются матом,потому что там газ),то "еврейский вопрос" решительно оставлял меня без каких либо образов и зацепок к осмыслению. Безликая эфемерность "еврейского вопроса" упорно мелькала по телевидению и в прессе,при этом никто не объяснял, в чем он заключается. К шестнадцати годам я пришел к мысли,что это некий антипод русскому вопросу"что делать?". Возможно,ушлые евреи давно знали ответ на вопрос"что делать"...но при этом,зная как ответить на "русский вопрос" они не знали ответ на свой, а не знали они ответа ,поскольку не знали самого вопроса. По всей видимости, евреи пустили какой то слух о существовании "еврейского вопроса", вопроса,ответив на который, все измениться.. и вот их задача найти этот вопрос и ответить на него!
Как нам известно, вся еврейская культура наполнена аллегориями, хохмами и загадками.Мне всегда казалось подозрительным одно название,напрямую отсылающее к евреям..а именно "семь сорок". Я точно не помню,вроде, это как то связано с каким то танцем. Я почувствовал,что танцы тут не причем,в первую очередь это должно было быть связано с еврейским вопросом. Семь и сорок- на первый взгляд, не пересекающиеся цисла. Но только на первый.
33+7=40. Только в этом случае я вижу логику этих цифр. 33- это то невидимое число, которое всегда скрывалось под тенью семи и сорока. 33-именно столько лет, по еврейским сказаниям, было последний раз Иисусу Х. доводим 33 до абсолюта: 3+3=6.
Короче, "еврейский вопрос"решен..
ОТВЕТ: 6

Ответить
Развернуть ветку
progeras

Доллар стоит 66. Никите уже 16 и он в 11 классе. 66 - 16 - 11 = 39.
2019 - 39 = 1980. В 1980 году Игорь Николаев окончил Московский институт культуры.
Неспроста это, ох неспроста. Задумайтесь.

Ответить
Развернуть ветку
Baileys

Еврейский вопрос это:

КАК НАМ ПОЛУЧИТЬ БОЛЬШЕ ДЕНЕГ? КАК НАМ ПОЛУЧИТЬ БОЛЬШЕ ВЛАСТИ?

https://www.youtube.com/watch?v=vh_LuJ02694

Ответить
Развернуть ветку
Вчерашний глобус

Совсем забыл. Реп с исходниками, кому интересно, можно найти здесь: https://github.com/L11R/shiryaev-date-extractor

Ответить
Развернуть ветку
Это не шутки

Где ты пропадал, когда на Аляску ARG подкинули, там твой талант был бы как никогда кстати https://tjournal.ru/alaska/61587 https://tjournal.ru/alaska/61683 https://tjournal.ru/alaska/61775 https://tjournal.ru/alaska/61823

Ответить
Развернуть ветку
Вчерашний глобус

Хз, первый раз вижу эти посты(
Видимо тогда чем-то сильно занят был.

Ответить
Развернуть ветку
artur krugliy
могут спокойно перейти шутить в комментарии

Темная тема - это не тема для шуток

Ответить
Развернуть ветку
Вольный микроскоп
черный цвет #FFFFFF

Это белый. Чёрный — #000000.

Ответить
Развернуть ветку
Вчерашний глобус

Точно! Спасибо, исправил.

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Нежный франт

Охуенно сработано и не хуже расписано, спасибо!

Как раз минут 15 назад досмотрел "Игра в имитацию", так что читать было вдважды интересней

Ответить
Развернуть ветку
Мади Абдрахманов

ЯННП

Ответить
Развернуть ветку
Осторожный рубин

На ТЖ новый флешмоб с аватарками Ширяева?

Ответить
Развернуть ветку
Скучный Денис

Это протест

Ответить
Развернуть ветку
Скучный Денис

Верните стену

Ответить
Развернуть ветку
Блестящий лолипоп

Комментарий недоступен

Ответить
Развернуть ветку
Осторожный рубин

Нет, я участник другого протеста

Ответить
Развернуть ветку
Блестящий лолипоп

Комментарий недоступен

Ответить
Развернуть ветку
Вчерашний глобус

Хм. И в правду видел где-то подобное. Я просто бекендщик, мы тут обычно используем Base64, чтобы в JSON'ках гонять.

Ответить
Развернуть ветку
Страховой ключ

Вполне хорошая идея малую картину так закодировать, чтобы лишнее соединение не создать из-за неё

Ответить
Развернуть ветку
Mattur
Обновлено: В комментах Ширяевым обещана Темная тема на мобилках во втором квартал года!
во втором квартал года!

Я бы ещё раз обновил.

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Читать все 50 комментариев
null