...

суббота, 6 апреля 2019 г.

[Из песочницы] В списке угроз: «Игра престолов» – одно из самых популярных прикрытий для киберпреступников

Привет, Хабр! Представляю вашему вниманию перевод статьи «ThreatList: Game of Thrones, a Top Malware Conduit for Cybercriminals» автора Tara Seals.

В то время, как 8-ой сезон Игры престолов готовится к старту, новые исследования демонстрируют, что в прошлом году популярное ТВ-шоу в 17% случаев служило прикрытием для вредоносного программного обеспечения на пиратских площадках.

По мере приближения восьмого сезона сериала «Игра престолов» (англ. «Game of Thrones», GoT) фанаты готовятся к величайшему столкновению живых и мёртвых, огня и пламени, людей и монстров. В то же время они должны быть осторожны с тем, откуда они получают очередную опьяняющую порцию Джона Сноу: последние исследования пришли к выводу, что фантастический сериал является любимой целью киберпреступников для маскировки вредоносных программ под пиратский контент.
Игра престолов насчитывала 17% из всего инфицированного пиратского контента, отслеженного исследователями совместно с Kaspersky Lab, с общим количеством в 20 934 атакованных пользователя – и это несмотря на то, что в 2018 году не было выпущено ни одного сезона. Этот результат показывает, что сериал является самой популярной мишенью в своём роде, вопреки тому, что он, согласно исследованиям, является всего лишь восьмым по популярности на нелегальных платформах; так же сериал не попал в топ 10 по популярности на торрент-трекерах.

Согласно докладу Kaspersky Lab, вышедшему в понедельник (01.04.2019): «Во многих регионах популярные программы распространяются нелегальным путём, таким как торрент-трекеры и стриминговые платформы без авторизации. В отличии от легальных ресурсов, торрент-трекеры и файлообменники могут подтолкнуть пользователя к загрузке вредоносной программы под видом эпизода сериала».

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

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

Опасность кроется не только в новых эпизодах: запойный пересмотр предыдущих сезонов перед премьерой также остается популярным времяпрепровождением. К примеру, первый сезон GoT – «Зима близко» – является наиболее популярной мишенью из всех сезонов сериала, согласно выводам Kaspersky Lab.

Как бы то не было, в 2019 году компания не ожидает упадка доминирования «Игры престолов» по количеству инфицированного контента. Образно говоря, малварь близко.

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

GoT но одинока в своей привлекательности для пиратов (и, следовательно, для киберпреступников). Сериалы «Ходячие мертвецы» (англ. «The Walking Dead») и «Стрела» ( англ. «Arrow») являлись следующими по популярности мишенями для злоумышленников-распространителей вредоносных программ. С их помощью было атаковано 18 794 и 12 163 пользователей соответственно.

«Отчётливо видно, что распространители вредоносных программ используют ТВ-шоу, которые имеют высокий запрос на пиратских сайтах; эти шоу, как правило представляют собой активно прорекламированные драмы или экшн-сериалы» – говорит А.Иванов.

Доклад приводит, что общее количество атакованных пользователей – 126 340, что на одну треть меньше, чем в 2017 (188 769). Это уменьшение, однако, меньше, чем в других сегментах. Kaspersky Lab заявляет, что, для сравнения, количество пользователей, подвергшихся воздействию вредоносного программного обеспечения, доставленного через другие типы контента, включая порнографию, в 2018 году упал на 45 процентов.

«Это снижение может быть связано с некоторыми событиями, потенциально повлиявшими на снижение количества загруженных торрент-файлов» – отмечает докладчик – «Во-первых, в 2018 году Google понизил приоритет более чем 65 000 торрент-трекеров – основному распространителю пиратских ТВ-шоу – делая невозможным их нахождение огромному количеству пользователей при поиске сериала. Активные действия, направленные против торрент-трекеров существенно меняют картину: всё большее и большее их количество блокируется или их деятельность затрудняется. Например, два крупнейших торрент-трекера (Pirate Bay и Demonoid) в последнее время значительно пострадали от функциональных коллапсов, а наиболее давний, Leechers Paradise, был закрыт навсегда».

Для того чтобы исключить возможность стать жертвой вредоносных файлов под видом ТВ-передач, пользователи должны раз и навсегда отказаться от пиратского контента. Если они, всё- таки, не могут избежать загрузки, стоит убедиться, что скачанные файлы имеют расширение avi, .mkv или mp4, а не .exe.

Let's block ads! (Why?)

Global City Hackathon: Нижний Новгород — первый

Нижний Новгород — крайне интересный город с точки зрения IT-ландшафта. Список компаний, офисы которых расположены в нашем городе, реально впечатляет: российский офис Intel, MERA, МФИ Софт, EPAM, Auriga, Five9, NetCracker, Luxoft, Цитадель… У нас в городе создаются частично стандарты 5G, СОРМ, CRM-системы, игры DivoGames aka GI и Adore Games, онлайн редакторы документов, известные на весь мир продукты для работы с видео и аудио и проч. А если погрузиться в мир IT немного поглубже, то можно найти разработчиков мировых проектов, которые работают удалённо из дома — таких как, например, SAP.


Площадь Минина и Пожарского — главная площадь Нижнего Новгорода

Вооот. А в самом городе есть много всего, что улучшать и улучшать — развивать инфраструктуру, мониторинг, вопросы экологии, занятости, образования, здравоохранения и спорта. В общем, типичная жизнь и типичные проблемы города-миллионника с той разницей, что Нижний Новгород имеет уникальные особенности: это туристически привлекательный город с древней историей, это промышленный город с интересными и крутыми предприятиями, теперь это город с отличным стадионом, ну и конечно с уникальным географическим расположением на слиянии Оки и Волги. Ну и ещё мы — неофициальная столица закатов, и тут всё по науке.

Так что за хакатон?

Нижний Новгород стал первым городом в России, в котором стартовал проект Global City Hackathon!


Вам небезразличен наш город? Есть идеи, как сделать его лучше, удобнее, технологичнее?

→ Зарегистрируйтесь и приходите 19 апреля!

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

Решения можно будет разрабатывать в трех направлениях:

  • Доступный город. Доступная городская среда (в том числе для маломобильных граждан), поддержка пожилых людей и лиц с ограниченными возможностями здоровья.
  • Безотходный город. Переход к экономике замкнутого цикла. Эффективность и прозрачность работы по сбору, вывозу и утилизации мусора, повторное использование ресурсов, экомониторинг, экологическое образование.
  • Открытый город. Сбор, хранение, обработка и предоставление данных для обеспечения потребностей городских служб, делового сообщества, горожан и туристов.

Для помощи в проработке решений в Нижний Новгород приедут эксперты по городским сервисам из других городов и стран, а также технологические эксперты в областях, которые могут быть применены (IoT, Big Data, Predictive Analytics, AI, GIS and GPS, Web and Mobile).
Результатом хакатона станет создание прототипов IT-сервисов и продуктов, которые сделают жизнь людей в городе более комфортной, а самые лучшие решения получат поддержку на развитие!

Можно приходить с уже готовой командой или присоединиться к команде на площадке.

Несколько советов от автора этого мини-поста — как потратить время хакатона с пользой?


  • Заранее подумайте о том, какая проблема из тематики вам ближе. Соберите информацию, изучите российский и зарубежный опыт. Выпишите основные идеи, которые вас вдохновили — не рассчитывайте на голову, всё вылетит в самый неподходящий момент.
  • Возьмите с собой ноутбук, смартфон(ы), резервную точку доступа к интернету (свисток или пакетный тариф на мобильном), зарядные устройства. Самое обидное, когда в разгаре и жаре разработки что-то резко отрубается и перестаёт работать.
  • Попробуйте посмотреть на проблему под разными углами: как житель, как потребитель услуги-продукта-проекта, как городские власти — не должно быть конфликта интересов или, например, допущений нарушений чего-либо (ПДД, закона, административных правил).
  • Быстро проверьте, не была ли идея уже реализована — с кем не бывало, когда очумело и вдохновенно начинаешь разработку и — опа! — всё придумано до нас.
  • Если вы работаете командой, распределите роли и обязанности заранее. Совет кроме шуток — возьмите с собой кого-то, кто будет обеспечивать жизнеспособность команды: таскать чай и воду, заряжать устройства, общаться с организаторами и просто выступать «критиком-дилетантом». Такие люди бесценны.
  • Не забудьте пару ручек и блокнот. Лишних не бывает, даже если выдают.

И огромной вам удачи! Этому городу нужен свой герой :-)
Когда? 19 апреля 2019 12:00

Где? НИЖНЕВОЛЖСКАЯ НАБЕРЕЖНАЯ, 9/3

→ Регистрация здесь

Let's block ads! (Why?)

Исследование: средняя стоимость коммутаторов снижается — разбираемся почему

Цены на коммутаторы для дата-центров в 2018 году снизились. Аналитики ожидают, что тенденция продолжится и в 2019-м. Под катом разбираемся, в чем причина.


/ Pixabay / dmitrochenkooleg / PD

Тренды


Согласно отчёту исследовательской организации IDC, мировой рынок коммутаторов для дата-центров растёт — в четвёртом квартале 2018 года объём продаж Ethernet-свитчей увеличился на 12,7% и составил $7,82 млрд. Несмотря на рост спроса цена устройств за 2018 год снизилась. Значительнее всего стоимость упала для 100GbE: на конец 2017 она составила $532 за порт, а на конец 2018 — уже $288 за порт. Цена снизилась и для 40GbE — с $478 до $400 за порт.

Данные IDC подтверждает и отчёт Crehan Research. Согласно их исследованию, за 2014–2018 год стоимость ethernet-свитчей упала в среднем на 5%. Снижение цен отмечают и эксперты Gartner: в прошлогоднем отчёте они посоветовали дата-центрам переходить с технологий 10GbE и 40GbE на 100 GbE из-за снижения стоимости на оборудование. Эксперты говорят о нескольких причинах.

Высокая конкуренция


Производители коммутаторов вынуждены снижать цены на свои устройства из-за конкуренции со стороны whitebox-решений. Все чаще компании и дата-центры отдают предпочтение «безбрендовым» свитчам из-за более широких возможностей кастомизации таких устройств — они работают с большим числом разных операционных систем и NFV-решений.

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

Сегодня whitebox-устройства выпускают даже крупные ИТ-компании. В марте свой коммутатор представила Facebook — он имеет 100GbE и 400GbE-порты. Его спецификацию передадут проекту Open Compute и сделают полностью открытой.

Чтение по теме в нашем корпоративном блоге:

Распространение виртуализации


По данным Statista, к 2021 году будут виртуализированы 94% рабочих нагрузок ЦОД. При этом внедрение виртуальных сетевых устройств — одно из трех наиболее приоритетных направлений для операторов дата-центров в Европе и Северной Америке. Этот тренд приводит к снижению спроса на физические коммутаторы и распространению SDN-решений.

Ожидается, что в последующие три года объем трафика, проходящего через SDN-системы дата-центров, вырастет более чем в два раза: с 3,1 зеттабайт до 7,4 зеттабайт. Аналитики говорят, что это опять же, вызовет рост спроса на whitebox-маршрутизаторы.

Зрелость технологий


Снижение стоимости связано также с активным развитием Ethernet и появлением новых стандартов. В 2018 году производители сетевых устройств начали переход на 400GbE: коммерческие 400-гигабитные продукты представили Cisco, Juniper и Arista.

Развитие нового стандарта приводит к падению цен на предыдущие поколения Ethernet. Самым значительным в прошлом году стало снижение стоимости устройств 100GbE. Оно оказалось неожиданным даже для аналитиков — по словам представителей исследовательской группы Dell’Oro, снижение цен до уровня конца 2018 года эксперты прогнозировали только на последний квартал 2019-го.

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


/ Wikimedia / Alexis Lê-Quôc / CC BY-SA

Что происходит на других рынках оборудования для ЦОД


Серверы, в отличие от коммутаторов, становятся только дороже. Повышение связывают с ростом стоимости процессоров: в 2018 году рынок столкнулся с нехваткой чипов от Intel из-за резкого увеличения спроса на CPU со стороны дата-центров. В условиях дефицита процессоров их стоимость у некоторых ритейлеров выросла в полтора раза.

Ожидается, что нехватка чипов сохранится минимум до третьего квартала 2019 года. Спрос при этом продолжает расти: многие ЦОДы заменяют старые модели чипов на новые, защищённые от уязвимостей Spectre и Meltdown. Вероятно, цены на процессоры и серверы в такой ситуации будут увеличиваться и дальше.

Если рассматривать сферу хранения данных, то здесь наблюдается снижение стоимости твердотельных накопителей (SSD). По оценке Gartner, цена SSD с 2018 по 2021 год упадёт в 2,5 раза. Если это произойдет, эксперты говорят, что твердотельные накопители начнут активно вытеснять жесткие диски из дата-центров. HDD занимают слишком много места и менее надежны по сравнению с SSD. Если для твердотельных накопителей интенсивность отказов составляет 0,5%, то для жёстких дисков этот показатель равняется 2–5%.

Выводы


В целом, можно сказать, что снижение стоимости связано с бурным развитием рынка оборудования для ЦОД. В будущем цены могут упасть и на другое «железо» для дата-центров.

Все большую популярность приобретают whitebox-решения и в серверном сегменте. Если этот тренд сохранится, то цены на серверное оборудование могут начать меняться в меньшую сторону.

Посты по теме из нашего блога на Хабре:

Let's block ads! (Why?)

Коктейль для здорового питания — его делает стартап из акселератора Университета ИТМО

На рынке функционального питания появляется все больше производителей. Проект Foyt, основанный в акселераторе Университета ИТМО Future Technologies, попробует стать полноправным игроком в этой нише.


Фото © Foyt

Можно сказать, что рост интереса к этой сфере идет еще с начала нулевых. Тогда в России появился даже специальный ГОСТ Р 52349-2005, который дал определение функциональным продуктам. Всего через несколько лет после его ввода была подписана «Доктрина продовольственной безопасности». Она предписывает нарастить производство «функциональной еды» — продуктов, способных стать альтернативой полноценного обеда или ужина — безвредного для здоровья.

Foyt — пример продукции такого типа. Это — витаминный напиток с жирными кислотами (омега-3 и омега-6) и клетчаткой. Он утоляет чувство голода на несколько часов и восполняет силы как при физической, так и при умственной нагрузке.

Как делают коктейль


«Разработчики» делают Foyt из натуральных ингредиентов: в нем нет стабилизаторов, консервантов и даже сахара. Основа напитка — сывороточный белок и семена чиа, которые содержат полезные микроэлементы и витамины.

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

Какие есть аналоги


На рынке функционального питания работают такие крупные компании, как Soylent (США), Ambronite (Финляндия), Huel (Великобритания). Однако они не представлены в России официально. Есть и другие фирмы — Prana Food, Energy Diet и Herbalife — но все они отличаются от Foyt по составу. В коктейле Foyt баланс БЖУ (белки, жиры, углеводы) достигается за счет комбинации растительных и животных белков. В результате потребитель получает дневную норму омега-3 и омега-6. Без растительных сырьевых источников сделать это сложно.

В чем Foyt пока проигрывает конкурентам, так это в ассортименте. Сейчас купить можно только ванильно-сливочный коктейль. Однако такой вкус довольно нейтрален, поэтому клиенты могут экспериментировать: добавлять в напиток ягоды, фрукты и даже кофе. Компания уже разрабатывает целую линейку вкусов. В будущем появятся банановый и шоколадный напитки.


Фото © Foyt

Потенциал в России


Российский рынок функционального питания оценивается в 60 миллиардов рублей. Эксперты прогнозируют, что эта цифра будет увеличиваться. Однако скорость роста зависит от нескольких игроков: крупных пищевых производств и самих потребителей.

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

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

«Если сравнить нас с Европейскими странами, то мы проигрываем им лет на 10–15. На Западе ассортимент функциональных продуктов настолько обширный, что там открываются специализированные магазины, — говорит основатель проекта Foyt Артем Лепешкин. — Ситуация постепенно изменяется, но предстоит проделать еще много работы».


Материалы для дополнительного чтения в нашем блоге:
  • Умный стетоскоп — проект стартапа из акселератора Университета ИТМО. Респираторные заболевания — одна из самых частых причин обращения в поликлинику. Команда стартапа Laeneco разработала умный стетоскоп, использующий алгоритмы МО для определения заболеваний легких по аудиозаписи. Уже сейчас его точность составляет 83%. В статье рассказываем о возможностях гаджета и его перспективах для врачей и пациентов.

Let's block ads! (Why?)

[recovery mode] Стеганография мимо файлов: прячем данные прямо в секторах

Небольшое предисловие


Стеганография, если кто не помнит, — это сокрытие информации в каких-либо контейнерах. Например, в картинках (обсуждалось тут и тут). Можно также скрыть данные в служебных таблицах файловой системы (об этом писалось тут), и даже в служебных пакетах протокола TCP. К сожалению, у всех этих методов есть один недостаток: чтобы незаметно «вкрапить» информацию в контейнер, нужны хитрые алгоритмы, учитывающие особенности внутреннего устройства контейнера. Да и с устойчивостью контейнера к манипуляциям возникают проблемы: например, если чуточку подредактировать картинку, скрытая информация теряется.

Можно ли как-то обойтись без хитрых алгоритмов и тонких манипуляций с данными, и при этом все-таки обеспечить работоспособность контейнера и приемлемый уровень сохранности скрытых данных? Забегая вперед скажу — да, можно! И даже утилитку предложу.

Кровавые подробности метода


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

Достоинство такого метода очевидно: мы не зависим ни от формата файлов, ни даже от типа используемой файловой системы.

Недостатки тоже, думаю, очевидны:

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

Теперь перейдем к частностям.

Понятно, что если просто размазать секретные данные по всему диску, то скрыты они будут только от невооруженного взгляда. Если вооружить взгляд, скажем, редактором диска, то данные предстанут во всей красе. Поэтому данные неплохо бы зашифровать, чтобы не отсвечивали. Шифровать будем простенько, но со вкусом: по алгоритму aes256-cbc. Ключ шифрования спросим у пользователя, пусть хороший пароль придумывает.

Следующий вопрос — в том, как нам отличить «правильные» данные от испорченных. Тут нам поможет контрольная сумма, да не простая, а SHA1. А что? Для git'а она достаточно хороша, значит, и нам подойдет. Решено: снабжаем каждый сохраненный фрагмент информации контрольной суммой, и если после расшифровки она совпала — значит, расшифровка удалась.

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

Проверяем метод на практике


Для проверки возьмем самый распространенный носитель — флэшку. У меня нашлась старенькая на 1 Гб, что вполне подойдет для экспериментов. Если вам, как и мне, пришла в голову мысль не париться с физическими носителями, а потестировать на файлике — образе диска, то сразу скажу: не выйдет. При форматировании такого «диска» линукс создает файл заново, и все неиспользуемые сектора будут заполнены нулями.

В качестве машины с линуксом, к сожалению, пришлось воспользоваться валяющейся на балконе метеостанцией на Raspberry Pi 3. Памяти там негусто, поэтому большие файлы прятать не будем. Ограничимся максимальным размером в 10 мегабайт. Слишком маленькие файлы тоже прятать смысла нет: утилитка пишет данные на диск кластерами по 4 Кб. Поэтому снизу ограничимся файлом в 3 кб — он влезает в один такой кластер.

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

  1. Быстрое форматирование в формате FAT16 с размером кластера 16 кб. Это то, что предлагает сделать Windows 7 с флэшкой, на которой отсутствует файловая система.
  2. Заполнение флэшки всяким мусором на 50%.
  3. Заполнение флэшки всяким мусором на 100%.
  4. «Долгое» форматирование в формате FAT16 (с перезаписью всего).

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

Total clusters read: 250752, decrypted: 158
ERROR: cannot write incomplete secretFile

Как видим, удалось успешно расшифровать только 158 кластеров (632 килобайта сырых данных, что дает 636424 байта полезной нагрузки). Понятно, что 10 мегабайт тут никак не наберется, а ведь среди этих кластеров явно есть дубликаты. Даже 1 мегабайт таким образом уже не восстановишь. Но зато можно гарантировать, что 3 килобайта секретных данных мы восстановим с флэшки даже после того, как ее отформатируют и запишут под завязку. Впрочем, опыты показывают, что с такой флэшки вполне возможно извлечь файл длиной 120 килобайт.

Последнее испытание, к сожалению, показало, что флэшка перезаписалась вся:

$ sudo ./steganodisk -p password /dev/sda
Device size: 250752 clusters
250700 99%
Total clusters read: 250752, decrypted: 0
ERROR: cannot write incomplete secretFile

Ни одного кластера не сохранилось… Печально, но не трагично! Попробуем перед форматированием создать на флэшке раздел, а уже в нем — файловую систему. Кстати, с завода она пришла именно с таким форматированием, так что ничего подозрительного мы не делаем.
Вполне ожидаемо, что доступное пространство на флэшке немного уменьшилось.

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

Total clusters read: 250752, decrypted: 405

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

Ну и весть о последней, 4-й проверке, на этот раз радостная: полное форматирование такой флэшки не привело к уничтожению всей информации! 120 килобайт секретных данных прекрасно влезло в неиспользуемое пространство.

Сводная таблица по тестированию:

Немного теоретизирования: о свободном месте и неиспользуемых секторах


Если вы когда-то разбивали жесткий диск на разделы, то могли обратить внимание, что далеко не всегда получается отвести все свободное пространство на диске. Первый раздел всегда начинается с некоторым отступом (обычно это 1 мегабайт, или 2048 секторов). За последним разделом тоже, бывает, остается небольшой «хвост» из неиспользуемых секторов. Да и между разделами иногда остаются промежутки, хотя и редко.

Другими словами, на диске есть сектора, к которым нет доступа при обычной работе с диском, но данные-то в эти сектора записать можно! А значит, и прочитать тоже. С поправкой на то, что есть еще таблица разделов и код загрузчика, которые как раз и расположены в пустой области в начале диска.

Отвлечемся на время от разделов и посмотрим на диск с высоты, так сказать, птичьего полета. Вот есть у нас на диске пустой раздел. Создадим в нем файловую систему. Можно ли сказать, что какие-то сектора на диске остались незатертыми?

И-и-и — барабанная дробь! Ответ практически всегда будет — да! Ведь в большинстве случаев создание файловой системы сводится к тому, что на диск записывается только несколько блоков служебной информации, а в остальном содержимое раздела не меняется.

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

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

Утилита для экспериментов


Исходники утилиты можно пощупать здесь

Для сборки потребуется Qt версии 5.0 и выше и OpenSSL. Если что-то не собирается — возможно, придется подправить файл steganodisk.pro.

Можно поменять размер кластера с 4 Кб на, скажем, 512 байт (в secretfile.h). При этом вырастут расходы на служебную информацию: заголовок и контрольная сумма занимают фиксированные 68 байт.

Запускать утилиту нужно, естественно, с правами пользователя root, причем с осторожностью. Никаких вопросов перед перезаписью указанного файла или устройства не будет!

Наслаждайтесь.

Let's block ads! (Why?)

Ненормативная схемотехника: семисегментный индикатор на ATtiny13

Мы простых путей не ищем.

image

Предыдущая, она же первая моя публикация вызвала резонанс среди пользователей Хабра. Решил не останавливаться. Продолжаем выжимать невозможное из ATtiny13. Сразу же предупреждаю, описанные решения снова нестандартны, и у кого-то могут вызвать негодование и когнитивный диссонанс («И в чём тогда смысл статьи? Показать, что можно соединять элементы?»). Мало того, такое решение ещё и действительно нецелесообразно, о чём я подробнее напишу ниже. Но так уж повелось, что стандартные решения давно известны, и читать о них не всегда интересно, а писать- неблагодарно.
Очень уж мне нравится этот малыш- ATtiny13. Мозгов у него вполне достаточно для решения многих бытовых задач (включить свет, вентиляцию, в магазин за пивом сбегать). И цена просто смешная. Вот только ножек мало, а ручек и совсем нет. Поэтому приходится идти на всяческие ухищрения, чтобы решить проблему нехватки ног.

В процессе изучения программирования микроконтроллеров (в среде Ардуино, только не говорите никому) я, как многие, прошёл этап подключения ультразвукового датчика расстояния, примерно такого:

image

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

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

Картинка
image

21 сегмент от 5 ног контроллера. Здорово! Мне столько даже не нужно, хватит и двух знаков, плюс точка, итого 15 сегментов. А если четырьмя ногами? Тогда получится максимум 13 сегментов, не хватает. При виде схемы сразу возникло желание собрать и попробовать, хотя алгоритм работы составить не просто. Но при более внимательном взгляде понимаешь, что собрать не получится, таких семисегментников не существует в природе (скорей всего). Изготовить можно, конечно, но это уже другой уровень. Тогда идея была отложена до лучших времён.

Оффтоп: Почему нет семисегментных индикаторов со встроенной логикой? Куда смотрят разработчики? Насколько удобно в монтаже и управлении- две ножки питания и 3 (1, 2) ноги данных. И ведь были же даже в СССР: 490ИП1, 490ИП2. Внутри самого заурядного индикатора на 2...4 разряда полно места для размещения кристалла микросхемы, а цена сдвигового регистра 0,064 у.е вместе с корпусом. Ну да ладно.

И вот я снова задумался, как же уменьшить количество ног для работы с семисегментным индикатором? Выходы контроллера могут принимать три состояния (на самом деле 4, но сейчас это не важно). Можно ли как-то это использовать? Если два состояния по отношению к светодиоду можно трактовать только как светит-не светит, то с тремя немного интересней. Я ещё не сообразил, как этим пользоваться, но пришла в голову такая схема:

image

Если выход контроллера в состоянии нуля, светодиоды не светятся (что очевидно).

Если выход в состоянии единицы, то светодиоды светятся, что тоже понятно.

А вот если выход вовсе не выход, а включён на вход, то через цепь из двух резисторов и светодиод HL1 протекает ток, создающий на точке соединения резисторов падение напряжения примерно (5-1,7)/(2,2+1,5)*1,5+1,7=3,0 В. Этого недостаточно для того, чтобы ток пошёл через цепь VD1_R3_HL1 (нужно примерно 3,4 В). VD1- это дополнительный светодиод, используемый в качестве стабилитрона (стабистор правильней), поэтому мы не будем считать его светодиодом, чтобы не путаться. При этом неважно, включён ли подтягивающий резистор внутри микроконтроллера, его сопротивление (20 кОм) практически не влияет на ситуацию. К таким номиналам я пришёл не сразу, до этого пробовал с обычным диодом в качестве VD1, также вполне сносно работает с одинаковыми резисторами R1 и R2. Но лучше, чтоб R2 был примерно в полтора раза больше, чем R1. И чуть не забыл самое главное: всё описанное возможно только при использовании красных светодиодов и в индикаторе, и дополнительных. В крайнем случае или индикатор, или дополнительные светодиоды можно применить зелёные. И при напряжении питания от 4,5 В до 5 В.

Что мы имеем в итоге? Три состояния: не светит ни один светодиод (0), светит HL1 (1), или светят HL1 и HL2 (2). Очень напоминает троичную систему. Но мы не можем засветить HL2 без HL1, об этом нужно помнить. Зато теперь при помощи четырёх ног микроконтроллера можем управлять восемью светодиодами (хотелось так думать).

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

image

Четыре пары сегментов, в каждой большой буквой обозначен доминирующий сегмент, который может работать сам, второй может только с ним вместе. Можно заметить, что сегмент «а» мутит сразу с двумя, а бедной точке вообще никто не достался. Как это похоже на жизнь!

Зато этими парами можно отобразить (почти) все цифры:

Картинка
image

Каждая пара раскрашена своим цветом. Внимательный зритель заметил, что с двойкой что-то не то. Не будем пока акцентировать на этом внимание. Перепробовал ещё несколько вариантов группировки сегментов, лучше не придумал. Может, кто предложит. Возможно, нейросеть справилась бы.

На втором этапе экспериментов мне пришлось применять индикатор с общим анодом. Поэтому итоговая схема получилась такая:

Схема
image

Кто-то может спросить: куда подевались резисторы 100 ом? Давно известно (и активно используется), что при правильно сделанной динамической индикации можно обойтись без токоограничивающих резисторов. Даже если с выхода контроллера на последовательно соединённые два светодиода по ошибке постоянно подавать напряжение, микроконтроллер и светодиоды нормально это выдерживают, ток ограничивается сопротивлением перехода внутри МК. И ещё о резисторах. Максимальный ток через HL1 по предыдущей схеме около 2 мА, а через HL2 достигает 25...40 мА (предположительно, позже я скажу, откуда взялись эти цифры). Значит, и светоотдача у разных сегментов будет разная. Но поскольку будет использоваться динамическая индикация, это легко можно решить за счёт разного времени отображения сегментов.

Все эксперименты я проводил на Arduino Nano в среде Arduino IDE. Отличная плата для прототипирования, хорошо становится в breadboard, прошивается по USB без заморочек. Что-то не получилось? Исправил скетч и через минуту залил новую прошивку. А когда отладил код, можно перейти к прошивке в ATtiny13, это всё-таки занимает чуть больше телодвижений.

Кстати, тоже прошиваю с помощью Arduino и в среде Arduino, это практически исключает возможность залочить МК неправильными фьюзами, да и проще намного.

Вот пример отображения цифры 4 в коде:

pinMode(f_a, INPUT); // ножку подключения сегментов f_a делаем входом
digitalWrite(f_a, 1); // зажёгся сегмент F
pinMode(d_e, OUTPUT); // ножку подключения сегментов d_e делаем выходом
digitalWrite(d_e, 1); // ставим её в состояние 1, при этом не светят D и E
pinMode(b_a, INPUT); // ножку подключения сегментов b_a делаем входом
digitalWrite(b_a, 1); // зажёгся сегмент B
pinMode(c_g, OUTPUT); // ножку подключения сегментов c_g делаем выходом
digitalWrite(c_g, 0); // ставим её в состояние 0, зажглись и C, и G
delayMicroseconds (150); // F, B, C, G cветят ещё 150 микросекунд
pinMode(c_g, INPUT); // ножку подключения сегментов c_g делаем входом
digitalWrite(c_g, 1); // теперь сегмент G потух, светится только сегмент С
delay (time_2); // F, B, C cветят ещё 2 миллисекунды 

В принципе, всё должно быть понятно даже тем, кто не знаком с Arduino, но немного понимает в контроллерах. Цифры 150 микросекунд и 2 миллисекунды подобраны экспериментально по яркости сегментов. В окончательном коде их нужно вынести в отдельные переменные, чтобы можно было изменить при отладке. Из этих цифр можно приблизительно определить порядок различия токов через два сегмента в одной паре. Поскольку сегмент G светится примерно в 13 раз меньше времени, чем остальные, и обеспечивает такую же яркость, можно предположить, что ток через этот сегмент в 13 раз больше, чем через другие. На самом деле зависимость яркости от тока нелинейная, поэтому ток может быть больше и в 25 раз, то есть 50 мА. Что при такой скважности вполне безопасно для выхода МК. Кстати, эта разница в токах сыграла на руку при решении проблемы цифры 2. Как я писал выше, сегмент G можно засветить только вместе с сегментом C. Но если подать 0 на ножку МК, отвечающую за C и G, на 150 мксек, а после 2 мсек держать на ней 1, то сегмент G «отработает» на полную яркость, а сегмент С за те же 150 мксек успеет лишь чуть подсветиться. Получаем почти полноценную двойку. Таким образом мне удалось нарушить правило, которое я сам же установил. Что не сделаешь от безысходности.

Итак, цифру четырьмя ножками МК мы зажгли. Собственно, я этот этап для себя пропустил, сразу выводил два знака. Для этого отсоединяем вывод общего анода одного из разрядов индикатора от плюса питания, и подсоединяем к ещё одному выводу МК, и анод другого разряда- к следующему выводу (уже 6 ножек). Теперь по очереди выставляем 1 на аноде младшего разряда, отображаем цифру младшего разряда, дальше 1 на аноде старшего разряда, и отображаем цифру старшего разряда, и так по кругу. Этот эксперимент я проводил с Arduino Nano, у неё ног достаточно. Весь код отлаживал на ней, далеко не с первого раза. И вот всё заработало, как надо.

Схема
image

Поскольку аноды подключаются поочерёдно, при помощи простой доработки можно освободить ещё один вывод МК. Вот итоговая схема:
Схема
image

Итого используем 5 ног МК для отображения двухзначного числа. На этом этапе уже можно попробовать с крошкой ATtiny. Что я и сделал. Но не сразу. Скомпилированный в среде Arduino скетч для ATtiny13 занял примерно 1,7 кБ памяти при 1 кБ доступной. Чтобы уменьшить размер, пришлось обратиться к портам напрямую, что я и так собирался сделать позже. Кстати, на Arduino я использовал те же порты, что собирался использовать на ATtiny, очень удобно. Они уже обозначены на последней схеме. После обработки код похудел на килобайт.

Вот итоговый код для ATtiny13:

Код

#define  time_2  2 // время отображения неярких сегментов, миллисекунд
#define  time_3  150 // время отображения ярких сегментов, микросекунд

byte in1_;
byte in2_;
int disp_;
int d_ = 0;
void setup()
{
}
void loop()
{
  d_ = d_ + 1;
  if (d_ > 150) { // просто раз в 150 циклов увеличиваем число на 1
    d_ = 0;
    disp_ = disp_ + 1;
    if (disp_ > 99)(disp_ = 0); // считаем от 0 до 99
  }
    in2_ = disp_ / 10; // пишем в левый разряд - цифру делёную на 10
    in1_ = disp_ % 10; // пишем в правый разряд цифру оставшуюся от деления на 10
  }

  switch (in1_) {
    case 0:
      DDRB = B00001111;
      PORTB = B00010000;
      delayMicroseconds (time_3);
      DDRB = B00000001;
      delay (time_2);
      break;
    case 1:
      DDRB = B00000111;
      PORTB = B00000110;
      delay (time_2);
      break;
    case 2:
      DDRB = B00011111;
      PORTB = B00000010;
      delayMicroseconds (time_3);
      DDRB = B00010011;
      PORTB = B00010010;
      delay (time_2);
      break;
    case 3:
      DDRB = B00011011;
      PORTB = B00000110;
      delayMicroseconds (time_3);
      DDRB = B00000011;
      delay (time_2);
      break;
    case 4:
      DDRB = B00010101;
      PORTB = B00001110;
      delayMicroseconds (time_3);
      DDRB = B00000101;
      delay (time_2);
      break;
    case 5:
      DDRB = B00011011;
      PORTB = B00001100;
      delayMicroseconds (time_3);
      DDRB = B00001001;
      delay (time_2);
      break;
    case 6:
      DDRB = B00011111;
      PORTB = B00001000;
      delayMicroseconds (time_3);
      DDRB = B00001001;
      delay (time_2);
      break;
    case 7:
      DDRB = B00001111;
      PORTB = B00010110;
      delayMicroseconds (time_3);
      DDRB = B00000111;
      delay (time_2);
      break;
    case 8:
      DDRB = B00011111;
      PORTB = B00000000;
      delayMicroseconds (time_3);
      DDRB = B00000001;
      delay (time_2);
      break;
    case 9:
      DDRB = B00011011;
      PORTB = B00000100;
      delayMicroseconds (time_3);
      DDRB = B00000001;
      delay (time_2);
      break;
  }

  switch (in2_) {
    case 0:
      DDRB = B00001111;
      PORTB = B00010001;
      delayMicroseconds (time_3);
      DDRB = B00000001;
      delay (time_2);
      break;
    case 1:
      DDRB = B00000111;
      PORTB = B00000111;
      delay (time_2);
      break;
    case 2:
      DDRB = B00011111;
      PORTB = B00000011;
      delayMicroseconds (time_3);
      DDRB = B00010011;
      PORTB = B00010011;
      delay (time_2);
      break;
    case 3:
      DDRB = B00011011;
      PORTB = B00000111;
      delayMicroseconds (time_3);
      DDRB = B00000011;
      delay (time_2);
      break;
    case 4:
      DDRB = B00010101;
      PORTB = B00001111;
      delayMicroseconds (time_3);
      DDRB = B00000101;
      delay (time_2);
      break;
    case 5:
      DDRB = B00011011;
      PORTB = B00001101;
      delayMicroseconds (time_3);
      DDRB = B00001001;
      delay (time_2);
      break;
    case 6:
      DDRB = B00011111;
      PORTB = B00001001;
      delayMicroseconds (time_3);
      DDRB = B00001001;
      delay (time_2);
      break;
    case 7:
      DDRB = B00001111;
      PORTB = B00010111;
      delayMicroseconds (time_3);
      DDRB = B00000111;
      delay (time_2);
      break;
    case 8:
      DDRB = B00011111;
      PORTB = B00000001;
      delayMicroseconds (time_3);
      DDRB = B00000001;
      delay (time_2);
      break;
    case 9:
      DDRB = B00011011;
      PORTB = B00000101;
      delayMicroseconds (time_3);
      DDRB = B00000001;
      delay (time_2);
      break;
  }

  DDRB = B00011111;//пауза между отображениями
  PORTB = B00011110;
  delay (5);
}




Приведённый код позволит вашей ATtiny13 считать от 0 до 99. Правильнее было бы предусмотреть возможность переназначения ножек МК. Гуру программирования могли бы уменьшить код в несколько раз (Где предел минимального Hello World на AVR?).

Вы можете добавить в код нужную функцию, чтобы МК отображал что-то осознанное. Правда, у Тиньки уже все ножки заняты. Есть ещё ножка сброса, которую можно использовать как порт ввода-вывода. Но воспользоваться ней оказалось сложней, чем я думал. Поэтому для себя оставлю «на потом». Но есть интересная особенность, о которой не все знают. На эту же ножку выведен аналоговый вход ADC0, и он работает! Правда, при напряжении на нём менее 1/4 от напряжения питания МК переходит в режим сброса. Зато от 1/4 и до напряжения питания вполне можно измерять напряжение на входе. Этим я и воспользовался:

Код

#define  time_2  2 // время отображения неярких сегментов, миллисекунд
#define  time_3  150 // время отображения ярких сегментов, микросекунд

byte in1_;
byte in2_;
int disp_;
int d_ = 0;
void setup()
{
}
void loop()
{
  d_ = d_ + 1;
  if (d_ > 50) { // раз в 50 циклов...
    d_ = 0;
    disp_ = analogRead(A0) / 10; // ...измеряем напряжение на входе, делим на 10, чтобы вложиться в диапазон.
    if (disp_ > 99)(disp_ = 99);
    in2_ = disp_ / 10; // пишем в левый разряд - цифру делёную на 10
    in1_ = disp_ % 10; // пишем в правый разряд цифру оставшуюся от деления на 10
  }

  switch (in1_) {
    case 0:
      DDRB = B00001111;
      PORTB = B00010000;
      delayMicroseconds (time_3);
      DDRB = B00000001;
      delay (time_2);
      break;
    case 1:
      DDRB = B00000111;
      PORTB = B00000110;
      delay (time_2);
      break;
    case 2:
      DDRB = B00011111;
      PORTB = B00000010;
      delayMicroseconds (time_3);
      DDRB = B00010011;
      PORTB = B00010010;
      delay (time_2);
      break;
    case 3:
      DDRB = B00011011;
      PORTB = B00000110;
      delayMicroseconds (time_3);
      DDRB = B00000011;
      delay (time_2);
      break;
    case 4:
      DDRB = B00010101;
      PORTB = B00001110;
      delayMicroseconds (time_3);
      DDRB = B00000101;
      delay (time_2);
      break;
    case 5:
      DDRB = B00011011;
      PORTB = B00001100;
      delayMicroseconds (time_3);
      DDRB = B00001001;
      delay (time_2);
      break;
    case 6:
      DDRB = B00011111;
      PORTB = B00001000;
      delayMicroseconds (time_3);
      DDRB = B00001001;
      delay (time_2);
      break;
    case 7:
      DDRB = B00001111;
      PORTB = B00010110;
      delayMicroseconds (time_3);
      DDRB = B00000111;
      delay (time_2);
      break;
    case 8:
      DDRB = B00011111;
      PORTB = B00000000;
      delayMicroseconds (time_3);
      DDRB = B00000001;
      delay (time_2);
      break;
    case 9:
      DDRB = B00011011;
      PORTB = B00000100;
      delayMicroseconds (time_3);
      DDRB = B00000001;
      delay (time_2);
      break;
  }

  switch (in2_) {
    case 0:
      DDRB = B00001111;
      PORTB = B00010001;
      delayMicroseconds (time_3);
      DDRB = B00000001;
      delay (time_2);
      break;
    case 1:
      DDRB = B00000111;
      PORTB = B00000111;
      delay (time_2);
      break;
    case 2:
      DDRB = B00011111;
      PORTB = B00000011;
      delayMicroseconds (time_3);
      DDRB = B00010011;
      PORTB = B00010011;
      delay (time_2);
      break;
    case 3:
      DDRB = B00011011;
      PORTB = B00000111;
      delayMicroseconds (time_3);
      DDRB = B00000011;
      delay (time_2);
      break;
    case 4:
      DDRB = B00010101;
      PORTB = B00001111;
      delayMicroseconds (time_3);
      DDRB = B00000101;
      delay (time_2);
      break;
    case 5:
      DDRB = B00011011;
      PORTB = B00001101;
      delayMicroseconds (time_3);
      DDRB = B00001001;
      delay (time_2);
      break;
    case 6:
      DDRB = B00011111;
      PORTB = B00001001;
      delayMicroseconds (time_3);
      DDRB = B00001001;
      delay (time_2);
      break;
    case 7:
      DDRB = B00001111;
      PORTB = B00010111;
      delayMicroseconds (time_3);
      DDRB = B00000111;
      delay (time_2);
      break;
    case 8:
      DDRB = B00011111;
      PORTB = B00000001;
      delayMicroseconds (time_3);
      DDRB = B00000001;
      delay (time_2);
      break;
    case 9:
      DDRB = B00011011;
      PORTB = B00000101;
      delayMicroseconds (time_3);
      DDRB = B00000001;
      delay (time_2);
      break;
  }

  DDRB = B00011111;//пауза между отображениями
  PORTB = B00011110;
  delay (5);
}



Опыт показывает, что показания индикатора можно уменьшать аж до 21, только потом МК переходит в режим сброса, и начинает работать при возврате примерно до 25 и выше. Так что можно сделать очень неправильный «показометр» для индикации напряжения от 25 до 99 вольт, естественно, с делителем на измерительном входе.

Теперь о практическом применении. Изначальная идея отображать данные с датчика расстояния отложилась до лучших времён из-за нехватки одного цифрового входа. Для чего ещё можно применить схему, пока идеи не приходят. Ещё нюанс: ни о какой экономичности не может быть и речи. Даже если погасить все сегменты, через резистор R2 (по первой схеме) будет протекать ток 2,5 мА, в сумме 10 мА на индикатор, плюс управление транзистором добавляет ещё около 5 мА. Я не упомянул, транзистор практически любой p-n-p современный.

О целесообразности. Самый дешёвый вариант вывода на семисегментник- ATtiny13 плюс 74HC595. Два SMD корпуса обойдутся мне примерно в 0,50 у.е. Самый простой- ATmega8 (и всё, ни резисторов, ничего больше), это 0,68 у.е. И описанный выше вариант- стоимость ATtiny, 9 резисторов, 4 светодиода, транзистор (всё SMD)- это около 0,46 у.е., правда поштучно всё дороже в разы. К тому же собрать всё в кучу сложней, чем в предыдущих вариантах.

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

В общем, несколько дней я потратил зря.

Кроме критики, жду предложений по улучшению кода и упрощению схемы. Или улучшению функциональности без усложнения. Больше всего меня интересует, как зажечь точку, это бы расширило область применения. А вот если бы ещё и освободить один вывод из 5 задействованных, то можно было бы разгуляться.

Буду рад, если моё нестандартное решение принесёт пользу кому нибудь, не сейчас, так когда-нибудь.

Let's block ads! (Why?)

[Из песочницы] Новый баг в Telegram позволяет прочитать последнее сообщение

Недавно я обнаружил в Telegram очень интересный баг. Он позволяет читать удалённые сообщения. И как сторонник и фанат культовых продуктов — тут же отправил сообщение о баге саппорту Telegram. Со спокойной совестью демонстрировал коллегам на работе, найденный баг. «Хочешь восстановлю твоё последнее сообщение в Telegram?» — говорил я и принимался за дело, наблюдая удивленные лица коллег.
telegram bug

В прочем не будем медлить и перейдем к делу


Версия Telegram Desktop 1.6.3(последняя возможная на сегодня)

Шаги для воспроизведения

  1. Отправляем «секретное» сообщение Бобу
  2. Чистим чат сообщений с Бобом, кнопочка «Clear history»
  3. Отправляем новое любое сообщение Бобу
  4. Удаляем сообщение из контекстного меню «Delete message» (ставим галочку — удалить у Боба тоже)

Ожидания

Все сообщения удалены и чат полностью пуст.

Реальность

Появилось наше «секретное сообщение», которое было удалено.

Дальнейший ход моих мыслей


Первым делом, хотелось понять — это сторона сервера или сторона клиента. Поэтому аналогичным образом я попытался воспроизвести багу на клиенте Telegram под Android. К сожалению, на сотовом бага не воспроизвелась и оптимизм уже поубавился. Стало понятно, что перед нами скорее всего косметический фикс: напутали с индексами и из локального кэша достается чуть больше записей.

Так как Telegram Desktop является open source и лежит на github. Я нашёл свою версию Telegram, открыл код и попытался понять что к чему. Код оказался достаточно тривиальным и понятным. Всё начинается с подвешивания обработчика для команды. Он всего лишь показывает диалоговое окошечко с параметрами для удаления и дальше идёт очистка чата. Лично я визуально глазом ни за что не зацепился и вроде всё работает правильно. Нужно развернуть environment, отладить и сразу станет понятно, что к чему.

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

Если вам понравится данная статья и будет много комментариев, я обязательно напишу следующую статью: «Как я исправил баг в Telegram». А так же расскажу подробно, как развернуть environment для desktop версии Telegram. Спасибо за внимание!

Let's block ads! (Why?)

Оружие для VR — [ RAILGUN TUTORIAL]

image

Вступление

Задача для оружия была сформулирована одновременно с задачей о персонажах. Оружие изготовлено для sci-fi сетевого шутера под VR платформы. Стиль оружия был выбран под впечатлением дизайна 90-х годов, c небольшим уклоном в Retro design. Проект является VR экспериментом и находится в разработке.
image

Замысел линейного снайперского оружия

Проект позволил мне создать оружия из далекого 2000 года. В это время моя душа была принадлежала такими играми как Unreal tournament и Quake. Целью было передать ощущение старого доброго Railgun. 
В центральной части оружия с помощью острых углов, треугольников и помятостей создал визуальное напряжение, похожее на сжатую пружину, именно в этом месте находится генератор энергии. Резкие углы и рубленые линии визуально говорят о том, что выстрел быстрый и оружие агрессивное. Если вести взгляд по стволу в сторону дула, то деталей становится меньше, поверхность чище и ровнее. Визуальное напряжение в сторону дула слабеет и функционально тут вырывается заряд. Советую книгу.

Набросок и Высоко полигональная модель

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

image

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

Коррекция наброска

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

image

Первый 3d набросок я делаю очень быстро. Ровная топология сетки не на первом месте, так как особое внимание я уделяю только формам и дизайну, на набросок трачу не больше 2-3 часов. За один рабочий день я перебираю до 4-5 разных вариантов.

image

Для игры с real-time материалами я использую визуализацию Marmoset toolbag. Он дает представить какие могут быть текстуры. Качество render из Marmoset достаточно, для презентации заказчику с минимальным overpaint.

image

Сетка для высоко полигональной модели

Что бы уложиться в сроки, пришлось пожертвовать качеством subdivision сетки и не тратить время на разводку всех звёзд. Не для всех проектов такой подход является нормой, но тут сделал исключение.

image

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

image

В результате получились неплохие hard surface поверхности. Также у проекта имелись аналоги качества hi_poly, и они давали хороший ориентир о том где можно не тратить время на сетку. (keyshot Rendering)

image

Основные инструменты моделирования в Modo

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

image

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

imageimageimageimageimageimageimageimageimageimage

Низко полигональная модель

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

image

Любую Re-topology последние 5-6 лет я делаю в modo. Для ре-топологии пользуюсь инструментами: 
Topology mode(hot key ‘O’) — этот checkbox включает режим прозрачной сетки для верхнего item(layers) в окне item.

image

Pen (hot key) — это быстрый инструмент для создания полигонов на поверхностях.

image

Для snapping прилипания полигонов к нижнему слою, следует активировать вкладку, в настройках Mesh constraints -> Background.

image

Проверка Normal Map и Low poly в Unreal Engine

Normal Map проверял не посредственно в редакторе. Так выглядит low_poly модель в редакторе UE4. Модель имеет только Normal map и AO map.

image

UV развертка

Каждый элемент стараюсь развернуть максимально квадратным. Это важно, если требуется занять всю площадь текстуры. У такого метода есть своя особенность, где на краях квадрата будет искажается повторяющаяся текстура и зеркальное отражение текстуры будет иметь шов. Такую особенность можно поправить, сделав квадратными только те стороны, которые не находятся на стыках зеркального отражения. Чтобы выровнять одну сторону uv куска, необходимо выделить линию точек или грани. После чего нажать на стрелку Align UV c нужной ориентацией, во вкладке UV.

image

Процесс развертывания модели

Для кусков uv с равным количеством полигонов, хорошо работает инструмент UV Rectangle. Такой uv кусок он преобразует самостоятельно в квадрат.

Весь процесс развёртки выглядит так: Выделение куска полигонов, маскировка всего лишнего или выделение замкнутой линии-граней по телу модели. Полученные куски требуется выровнять и применить UV Relgx. инструмент Relax имеет настройки. Меня интересует только одна настройка Mode -> Adaptive. Этот метод разглаживая сетки. Он разглаживает uv кусок, учитывая форму и геометрию модели. Нужно помнить, не для всех кусков, это удачное решение использовать Adaptive.

image

Еще один важный инструмент, обычный Transform c активным checkbox Tear off. С его помощью можно отсоединять выбранные куски полигонов от UV.


Для удобства я размещаю элементы одного объекта рядом друг с другом. Процесс текстурирования становится комфортнее и не возникает путаницы в поиски нужного элемента. Я формирую маленькие условные квадраты, из мелких частей развёртки. Так удобнее и плотно укладывать uv map в квадрат все части развёртки.

Группы сглаживания

Low Poly модель разбиваю по группам сглаживания только после uv map. В дальнейшем это не позволяет путаться и мне становиться легче отделить часть UV для hard edges. Потом сложнее собирать не логичные мелкие куски в кучу. 


Работа с smooth group in modo. Первое что я делаю, выставить правильный угол сглаживания под gamedev. Зайти в properties материала, выставить угол сглаживания 180 градусов. По умолчанию угол выставлен в 40 градусов. Ниже цветами помечены разные группы сглаживания на модели оружия.

image

image

Инструменты для групп сглаживания

После этого я могу выделять полигоны или куски UV map и назначать противоположную smooth group.

Для этого требуется зайти в Geometry -> Polygon -> Set Smoothing Group. В окне требуется назвать новую Smoothing Group.
! Обязательно! назначаю горячую клавишу для этого инструмент, например: shift+G.

image
image
image

В любом случае, все швы и hard edges стараюсь прятать и не наносить на видные и лицевые места модели.

Текстура в Substance paint

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

image

Low_poly модель для запекания и текстурирования главным образом всегда немного отличаются друг от друга. Это связано с симметрией объекта и некоторыми деталями. Базовое разрешение текстур для модели 4096x4096.

image

Текстурирование разбито на условные подгруппы: Цвет / Грязь / Инфографика / Ручная работа. Я редко пользуюсь заготовленными материалами, мне нравится самому их настраивать.

image

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

image

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

Прицел


Ршено было отделить от модели. И подготовить как отдельный asset, в дальнейшим, для возможности переставлять его на другое оружие. Мне потребовалось исправить развертку и перезапечь текстуры с меньшим разрешением 512x512.

image


Модель была одобрена и загружена в проект. По прошествию нескольких дней ее вернули для добавления трансформации. Scope должен был прятаться во внутрь оружия. Для этого я нарезал low_poly модель с минимальными искажениями для текстуры. И добавил morph трансформаций.


Все искажения на uv map спрятал, новые куски uv наложил на темные места в текстуре.

Morphing в Modo

Что бы создать morphing на модели. Достаточно зайти во вкладку Lists -> Morph Maps и двойным кликом нажать на строчку ( new map).
В окне ввести имя новой Morph map. После этого любые перемещения полигонов и объекта будут сохранены в morph искажения.

image

Снаряд

Модель снаряда нужна для декалей при попадании в стену или преграду. И иногда снаряды могут падать на пол. Мы немного экспериментировали с цветом и свечением на проекте. Хотели понять как будет эффектнее, потому что в VR играх различные спец эффекты выглядят чрезвычайно хорошо.

image

image

ЗАКЛЮЧЕНИЕ

image

Следует обязательно закончить первый геометрический набросок. Не имеет значение какого качества он будет. Загрузить его в UE или Marmoset toolbag, включить тени назначить материалы и посмотреть в общем. Это вам поможет увидеть 3д модель с Другова ракурса и не закопаться в деталях, понять зачем нужны будут детали и где. У меня в этот момент экспериментов с render появляется много новых идей.

Это связано с базовым не эффектным освещение в 3д редакторе к которому быстро привыкаешь.

image

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

Работа от маленьких студиями расслабляет

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

image

Режим работы

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

image

Контакты и ссылки

Let's block ads! (Why?)