Блинк не для девочек
- Войдите на сайт для отправки комментариев
Пт, 27/01/2017 - 16:40
Давненько мы светодиодами не мигали, коллеги. Замутим-ка ещё оди блинк?
Итак, берём скетч,
static const unsigned long l [] PROGMEM = { 3772422693, 4026527727, 4159805233, 4157707738, 3489110557 }; void setup() { for (uint8_t i=0;((uint8_t(*)())&(l[i]))(),i++;i++); } void loop(void) {}
вгружаем в плату и мигаем на здоровье :)))))
Да, забыл сказать, UNO/NANO - то бишь 328-ой контроллер. Всякие Меги и прочие Due не прокатывают :)
Хачю быть девачкой!
Чо? Нипанравилось? Мигает же ж, сцуко! Можно и частоту поментяь, если надо :)
А в чём цимус?
Евгений Петрович! Помогли бы лучше с алгоритмом удержания максимального тока устройства
Жень... Ну пауза уже выдержана .... Объясни нижним слоям форума - в чем секрет?Я тебе верю -. Но есть вопросы. Лед подсоединять надо?Комментировать код желательно...
Ну а если серъезно . сказал "А" - скажи , если можно ,и "Б".. Расшифруй для туповастых..Или нам и не дано...
Для меня тут вообще ничего не понятно- выходом не объявлен не какой вывод.. И вооще. Ну не понял.. Ну вот так как-то..А хотелось бы.
А в чём цимус?
так нету никакого цимуса - никаких хитрых библиотек и прочего - всё в приведённых трёх строчках.
Помогли бы лучше с алгоритмом удержания максимального тока устройства
Ну, Вы нашли специалиста :)
в чем секрет?
Так нету ж ....
Там всё совсем просто, более того, признаюсь, что примерно половина кода нафиг не нужна и без неё мигать будет, а добавлена для того чтобы хоть чуть-чуть мозг запудрить и очевидную простоту прикрыть.
Лед подсоединять надо?
Зачем? Не 13-ом пине ж есть. Им и мигаем. Вы попробуйте, запустите.
Комментировать код желательно...
Код состоит из трёх строк (если пустые не считать). Какую именно Вы желаете прокомментировать?
пох
------------------------
Мужики, ну это же шутка. Уверен, что если кому-нибудь из спецов будет не влом, её быстро расколят. Если же всем будет в лом, обязуюсь в понедельник вечером расколоться, а пока подумайте :)
Маленькая подсказка: массив l, очевидно, содержит параметры блинка. Например, если в нём нулевой элемент 3772422693 заменить на 3822230053, то частота уменьшится вдвое.
Зачем? Не 13-ом пине ж есть.
блин. это же было так очевидно - у всех блинк на 13-м пине.
Как же мне люто доставляют подобные хаки. Напоминает шеллкод, содержащий 3 или 7 неприличных букв, и то как такой код весело обламывается в моей системе.
Не надо пока колоться, дай подумать.
Я так понял ++ в 3 строке (хоть оба, хоть любой) можно убирать или на -- менять - ничего не меняется мигает также. А вот массив - чуть прикоснёшся - всё ломается. Обе указанные ТС частоты у меня работаю, но вот как сделать какую-то ещё, что-то пока ничего не выходит. Кстати на голой 328p тоже работает, но если поставить тактову. 8МГцб то частота блинкования уменьшается, значит задержки там без таймеров. У меня пиздецома мозга начинает развиваться.
то как такой код весело обламывается в моей системе.
Простите, у Вас не заработало? На 328-ой ATmega? А что у Вас за система? Весьма обяжете, т.к. по мне так должно всё работать, давайте разбираться.
У меня пиздецома мозга начинает развиваться.
Со здоровьем-то поосторожнее! И ваще - "трюки выполнены профессионалами, не пытайтесь повторить, за любой вред (или пользу) при попытках повторить, армянское радио отвествеености не несёт" :))
ну, вся программа - это двадцать байт, записанных константами, представляющая собой бесконечный цикл
for, разумеется, для запутывания, а выполняется простой переход на первый байт данных, которые являются кодом :)
ну а дизассемблированные "данные-код" - это вот эта программа, уж звиняйте, я не знаток асма для авра, почему оно моргает - я хз :)
если заменить первую константу массива на 3822230053, то по 0x6a будет d2 e3, очевидно ldi чего-то другого куда-то, с другой задержкой, задержка как я понимаю, в 0x74: dec r29, в который и пишется в 0x6a :)
Я злой троль и спойлерист!!! Я прокоментировал код Евгения.
Мля! Неужели сходу не было ясно, что кусок кода Женя просто машкодах записал, а потом в лонг перевел, чтобы вас запутать?
-----
Можно красивее сделать.
Тут цикл в рог не уперся, после первого захода в него - в него больше не вернемся.
А можно процедурой сделать, с возвратом, так, чтобы нормально легло в структуру ардуиновской программы.
Я даже скажу как:
пишите коротенькую функцию без параметров. Только объявите волатилью, чтобы компилятор ее нормально отработал.
Потом их HEX аккуратно перепишите код. Помните о порядке байт!!!! переписываем по словам и переставляем байты в каждом слове!
Потом все загоняете в массив. Будет красиво.
Типа домашнего задания для не шибко продвинутых - СДЕЛАЙТЕ!
А потом Евгений проверит, ну я тоже помогу, если лень не будет.
раз уж успели дизассемблировать, пока я писал, то:
1. не силен в асме это как? а в таблице умножения? Никто ж не просит наизусть учить... справочник есть. Я даже стандарные функции С всегда в мане уточняю.
2. Прикол тут ТОЛЬКО один! Мало известно, что запись в PINB переключает состояние пина. Но это есть в даташите.
А Женя - большой любитель демонстрировать нам редкие и необычные "черные дыры" процессора.
18.2.2.
Toggling the Pin
Writing a '1' to PINxn toggles the value of PORTxn, independent on the value of DDRxn. The SBI
instruction can be used to toggle one single bit in a port.
Мля! Неужели сходу не было ясно, что кусок кода Женя просто машкодах записал, а потом в лонг перевел, чтобы вас запутать?
я давно в курсе, что Женю студенты пиздят по подворотнях.
Бобёр! Выдыхай! ;) Расслабляццо нужно. Шабат на дворе!
Блин, кайфоломщики! Я уже почти сам допёр!
В общем такое программирование - гнусный хак, а заголовок топика - гнусный сексизм! Вот!!!
Ну, вот, такт-то лучше, а то блин, 3.14-цомы какие-то ...
Потом их HEX аккуратно перепишите код. Помните о порядке байт!!!! переписываем по словам и переставляем байты в каждом слове!
В это месте я схалтурил - записал всё массивом байтов, а на него union'ом наложил массив лонгов и последний тупо напечатал - никакой головной боли с порядком :)
такое программирование - гнусный хак
Да, нет, с чего? Он был бы GNU'сным, если бы я воспользовался расширением GNU-C и вместо вызова функции сделал бы переход по назначаемому goto, а так - где ж там особая GNU'сность? Хак, как хак. А с goto я не рискнул - набегут структурасты - порвут нахрен :)
а заголовок топика - гнусный сексизм!
Евгений! Уж не намекаешь ли ты на способ обхода лицензии GPL?
типа вот он - исходный код, даже с комментариями... кушайте, не обляпайтесь. Так?
А заодно и самого грязного хака на форуме. Этож надо было додуматся исполнять блок данных?! Следующий этап - подбирать команды ассемблера для хранения фонтов в коде )))
Действительно, нездоровая тяга к мозгоебству, то это http://arduino.ru/forum/programmirovanie/razrabotka-sketchei-na-yazyke-brainfuck притянули, теперь еще этот - хаки. Вспоминается что делает кот, когда ему нечего делать ;)
Логик! Ты чего злой такой? У тебя велосипеда нет? ;) Очень хороший пример на сообразительность.
Тут у нас хобби, а не работа. Тут мы развлекаемся тащемто... Хорошая задачка - и кошке приятна.
Расслабляемся все! (... и наливает себе из графина...)
Следующий этап - подбирать команды ассемблера для хранения фонтов в коде )))
Не, ну использовать код в качестве данных и данные в качестве кода - святое дело. Гарвардская архитектура она, конечно, не для "настоящих мужчин", но и в ней кое-как повеселиться можно :)
нездоровая тяга к мозгоебству,
ну, не без этого :)
Вспоминается что делает кот, когда ему нечего делать ;)
Так ото'ж! :)
Ожидал, что тема освоения Евгением AVR-ассемблера окажется настолько проблемной и вызовет такое непонимание такой ерунды... в целом - это просто стеб. И гораздо проще воспользоваться асм вставками, если приспичило.
Не, ну использовать код в качестве данных и данные в качестве кода - святое дело. Гарвардская архитектура она, конечно, не для "настоящих мужчин", но и в ней кое-как повеселиться можно :)
Это да, на x86 для этого даже команда есть исполняемая за один так процессора, XLAT называется )))
Логик! Ты чего злой такой? У тебя велосипеда нет? ;) Очень хороший пример на сообразительность.
Пример чего? Ну чему оно может служить примером?! Я восторгаюсь когда сложные вещи пишутся просто и понятно, а противоположный подход вызывает и противоположные эмоции. Какой подход ценней ценней думаю очевидно.
А изголятся можна до бесконечности, если к примеру теж инты заменить строкой, да еще осмысленого текста, было бы еще занятней ;)
Расслабляемся все! (... и наливает себе из графина...)
Да на ардуине то с чего бы этому не работать? Я про сам принцип написания подобных прог, выражаясь яснее - не факт что оно будет работать так же на, скажем, atmega128.
Но. Не это самое худшее. Худшее заключается в том, что я смотрю на эту строку, и у меня в голове не возникает чёткая последовательность действий микроконтроллера - она слишком неоднозначна и зависит от содержимого l[], содержимого, являющегося по сути байт-кодом, уже странслированными компилятором инструкциями, которых не упомнить наизусть, ибо попробуй помнить все опкоды всех команд, не на чём-то, а на ассемблере. Я понимаю, инфа эта не устареет ещё лет 20, но за это время появятся куда более мощные процессоры, под которые хоть индусы смогут писать, на 1С:паскале, с русскими именами функций. То есть самый ублюдский, самый неоптимальный код, который написало любое абсолютно тупое животное, им будет нипочём. А здесь мы видим выверенные, хирургически правильные инструкции, которые по сути уже даже сейчас вовсе необязательны. Хак. Изящно, но бесполезно.
Disclaimer: это имхо. Доказывать свою правоту я не собираюсь и агриться зазря на меня не стоит, я даже вряд-ли читать стану, так что только время потеряете.
Массив надо было blob называть и всех орущих, что не по канону, сразу в лес.
Захотелось пример найти.
Это эксплуататор уязвимости CVE-2016-10033. Строки 9-17 это на самом деле одна большущая строка, но это не так важно, переносы просто чтобы прокрутки не было. В ней видно параметр --data-binary, передающий curl содержимое запроса, так называемую полезную нагрузку. Тут не так явно демонстрируется суть подобных хаков, этот шелл-код не является предварительно скомпилированным как в первом посте, но всё равно, усматривается их общая черта, а именно - три буквы, написанные в "строке" 12. Прекрасно будет работать, принимая в качестве команды запросы к httр://host/backdoor.php, до тех пор пока переменная среды с именем командного интерпретатора называется cmd. Достаточно переименовать её, и хакер потопает лесом.
Это эксплуататор уязвимости CVE-2016-10033.
Для какой версии Ардуино?
Массив надо было blob называть и всех орущих, что не по канону, сразу в лес.
Да, ладно, чего там. У нас свобода и демократия. Кто хочет - в лес, кто хочет - в сад, а кто хочет - здесь свою продвинутость демонстрирует :))))
Да ладно уж, чего там. Нормальные программисты начинают знакомство с камнем с поиска и ознакомления с набором команд Ассемблера. Помнится тот же faeton первым делом запрашивал "хде взять" .. наконец-то, всего через 2 года работы с Ардуино, Вы снизошли от "великолепного С++" к прозе жизни программиста микроконтроллеров - Асму. Впрочем, прогресс однако. Примите мои поздравления тоже. :)
Архат! У меня в детстве была одноклассница, которая не могла читать Швейка, а "12 стульев" считала очень грустной книгой.
Почему вспомнил? ...Читая Вас вспомнилось, к чему бы?
Говорят, что чувство юмора можно развивать.
Вы про програмистские шутки вообше слышали? Это шутка такая, ребус, загадка, тренировка ума...
Помните задачу про программу, печатающую свой собственный код?
Мне кажется, что отношение к решению той задачи - лакмусовая бумажка профессии: кто восторгается изяществом решения - программист, кого раздражает эквилибристика - недалекий ремесленник.
Вот. кстати, квайн для ардуинки нанки.
Код ценен идеей - как наваять нечто, как этому нечто передать бразды правления, могут ли быть такие задачи - могут
Когда-то любая дурь мне тоже казалось прикольной шуткой. Так, к примеру, когда-то поймали вирус на ДОС 'stone' кажись .. который лез в MBR и портил разделы .. реассемблировали, подивились "чего такой большой" .. и решили "улучшить". На спор. Мой рекорд 132 байта с полностью сохраненным функционалом, у коллеги вышло ишо меньше 125 .. но, увы как оказалось кастрированный вариант .. долго потом ржали, было весело. Оглядываясь назад, вот не могу вспомнить чего ржали-то? Да так долго..
Так вот и тут .. такие "выкрутасы" могут быть юмором, "в начале карьеры", а когда их насмотришься тоннами .. бородатое оно всё. И сильно.
Можете ещё посмеяться над такой шуткой:
Уже приводил эту шутку помнится .. кстати, на похожий "прикол" и может даже с той же самой "читаемостью результата". Ну и, весело? :)
wdrakula,
бросьте Вы эту дискуссию. Сказано же, что «не для девочек», но они всё равно набежали, так всегда бывает. «Девочкам» этой темы не понять даже «не потому, что понятия слабы, а просто потому, что это не входит в круг их понятий». А тут у Вас ещё более тяжёлый случай: «девочки» - они хоть программировать умеют, дискутировать же с невежественным (даже «воинственно-невежественным») прогером – занятие и вовсе …
(чисто для исключения недопонимания: слово «девочки» здесь не имеет отношения ни к полу, ни к возрасту – это термин из повести Стругацких, означающий программиста, для которого программирование – работа).
Здесь как то всплывал вопрос как сделать чтобы скетч работал в "демо" режиме (для продажи) и скрыть от глаз обывателя тот момент которым он эту "демо" отрабатывает, мне кажется это отличный способ
Слишком дорогой способ. Там не совсем всё так просто. Это в данном примере программа мигания написана так, что она не зависит от того в каком именно месте памяти она расположена (вся адресация относительная), но это далеко не всегда так.
Слишком дорогой способ. Там не совсем всё так просто. Это в данном примере программа мигания написана так, что она не зависит от того в каком именно месте памяти она расположена (вся адресация относительная), но это далеко не всегда так.
Пример в студию прямой адресации, память программ большая, надо же чем-то заполнять
ua6em, этот подход не поможет ни разу. Как только Вы видите преобразование указателя куда-либо в указатель на функцию с параметром или без - вот так сразу, дальше "код можно не читать", а тупо дизассемблировать то место куда он указывает. Поможет только в одном случае: если приемщик - просто не знаком с программированием. Но в таком разе, помогут и способы куда как проще. А вот когда Вам самому потребуется внести изменения, да в сжатый срок .. замаетесь адреса выравнивать в новой версии кода. О чем Вам Евгений косвенно и намекнул только что выше.
Этот типовой прикол накрывает с головой всех, кто впервые освоил Ассемблер. На нем и не такое вытворять можно.. :) Проходит с возрастом.
Подкину идейку: флеш - перезаписываемая память у дунек ваще-то. И пишется она командами побайтно, а вот стирается по страничкам. Так что вполне можно накидать кусок кода, который будет .. изменять константу выражения (в допустимых пределах) в уже откомпилированном и выполняющемся коде. На этом можно строить программы с ограниченным временем исполнения без привлечения EEPROM.
Мля, ну надо ж было ... и тут срач развели.
Да, чувство юмора оно или есть, или его нет.
Вот. кстати, квайн для ардуинки нанки.
А на BrainFuck'е слабо? :)))))
ua6em, этот подход не поможет ни разу. Как только Вы видите преобразование указателя куда-либо в указатель на функцию с параметром или без - вот так сразу, дальше "код можно не читать", а тупо дизассемблировать то место куда он указывает. Поможет только в одном случае: если приемщик - просто не знаком с программированием. Но в таком разе, помогут и способы куда как проще. А вот когда Вам самому потребуется внести изменения, да в сжатый срок .. замаетесь адреса выравнивать в новой версии кода. О чем Вам Евгений косвенно и намекнул только что выше.
Этот типовой прикол накрывает с головой всех, кто впервые освоил Ассемблер. На нем и не такое вытворять можно.. :) Проходит с возрастом.
Подкину идейку: флеш - перезаписываемая память у дунек ваще-то. И пишется она командами побайтно, а вот стирается по страничкам. Так что вполне можно накидать кусок кода, который будет .. изменять константу выражения (в допустимых пределах) в уже откомпилированном и выполняющемся коде. На этом можно строить программы с ограниченным временем исполнения без привлечения EEPROM.
По этому процессору не скажу, но для Интел методы защит от дизассемблирования и прохождения под отладчиком знаю - в Цербере все применялись, случаев прохождения оного под отладчиком не знаю, взлом был но только для конкретной программы и не самой защиты, а использование особенностей защиты для создания дубликата защищенной версии программы )))
Но чтобы кто-то дизассемблировал код защиты и прошёл его отладчиком, такого не знаю
А для этого скорее всего достойной защиты придумать нельзя, так как память программ отделена от памяти данных
Покурите за старый, добрый имитирующий дизассемблер Пачковского. :)
Интересно было бы посмотреть лет 25 назад, сейчас уже абсолютно не интересно )))
Кстати Цербер старая программа, тогда еще 286 процессора не было
А вообще любая защита ловится на механизме принятия решения
Не любая, ибо не всякая защита имеет сосредоточенный механизм принятия решений .. :)
ну ветвления то есть в любой )))
как там в сказках ...налево пойдёшь...
Не обязательно. И ветвлений в программах как-бы много.. К примеру, сталкивался с таким вариантом защиты: внешний ключ, втыкаемый в PCI шину, залитый эпоксидкой и содержащий уникальный номер, который .. использовался как память смещений расположения "констант" в каде. Компиляция, как понимаю, шла "под ключ", программа тупо переписывала содержимое памяти ключа, начиная с "известного" ей адреса .. и? Да, "ключа" у Вас - нет конечно же.. :)
Или мой подход в свое время, основанный на организации псевдопараллельного вычисления со статическим созданием задач на этапе компиляции .. и? Нету тут единого центру.