05.11.2014 Views

ЛУЧШИХ ВИРУСОВ - Xakep Online

ЛУЧШИХ ВИРУСОВ - Xakep Online

ЛУЧШИХ ВИРУСОВ - Xakep Online

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

phreaking<br />

ПРОТОКОЛЫ<br />

МАНЧЕСТЕР И EFM<br />

Допустим, тебе надо по очень длинной линии с кучей помех<br />

(неважно, оптическая она или просто медный провод) передать<br />

кучку единиц. Стартовые и стоповые биты не спасут от обилия<br />

сигналов с «высоким уровнем», и датчик/триггер на том конце линии<br />

просто перестает адекватно воспринимать данные. Поэтому<br />

для сред с высоким уровнем помех используются так называемые<br />

self-clocking модуляции.<br />

Например, в протоколе Manchester (используется в Ethernet) единица<br />

дополняется нулем, а ноль — единицей, поэтому значений<br />

с высоким уровнем на линии столько же, сколько и с низким. К<br />

тому же, так мы сохраняем заряд кабеля. Приемник всегда может<br />

подстроиться на частоту и амплитуду сигнала, и в итоге — потерь<br />

данных меньше.<br />

Что-то подобное используется и в кодировании данных на CD-<br />

ROM, где 8 бит каждого байта по таблице переводятся в избыточные<br />

14 с тем принципом, что любые две единицы разделяются,<br />

минимум, двумя и, максимум, десятью нулями. Вместе с дополнительными<br />

тремя битами, склеивающими байты, мы получаем<br />

равномерно «серую» поверхность диска, поэтому сенсор всегда<br />

явно различает темные (темнее серого) и светлые (светлее серого)<br />

участки.<br />

Википедия предлагает небольшие обзорные статьи по теме:<br />

• http://en.wikipedia.org/wiki/Manchester_code.<br />

• http://en.wikipedia.org/wiki/Eight-to-Fourteen_Modulation.<br />

Google тоже забывать не стоит. Полагаю, протоколы для большинства<br />

пультов уже расшифрованы и лежат в открытом доступе. Будешь читать<br />

алгоритм — не путай низкоуровневые нули и единицы (свечение pulse и<br />

space) с логическими, получаемыми после расшифровки.<br />

îêàçàëèñü. Åñëè ÷åðåç 1.2 ìñ, òî ê íàì ïðèåõàëà åäèíèöà,<br />

à åñëè ÷åðåç 0.6 — òî íîëèê. Çàïèõèâàåì åãî â «êîìàíäíûé»<br />

áàéò íîãàìè âïåðåä (LSB) è èäåì öèêëîì â ìåòêó [Ìåòêà!].<br />

— Êàê ïðèíÿëè 7 êîìàíäíûõ áèò, ïðèíèìàåì 5 àäðåñíûõ.<br />

— Ïî ïðîòîêîëó ÷åðåç 40 ìêñ ïóëüò ïîâòîðÿåò ïîñëåäîâàòåëüíîñòü,<br />

ïîýòîìó åñëè õî÷åøü äîïîëíèòåëüíîé íàäåæíîñòè<br />

— ïðèñòóïàé ê äåéñòâèþ òîëüêî ïîñëå âòîðîé ïîâòîðåííîé<br />

êîìàíäû.<br />

— Íó, à åñëè âñå áèòû ñîâïàëè ñ òåì, ÷òî ìû îæèäàåì, òî<br />

ïðîèçâîäèì äåéñòâèå (íàïðèìåð, ïèùèì ëàìïî÷êîé).<br />

Как-то так. Страшно, но в готовом коде букв будет в разы меньше.<br />

СБОРКА И ИСПЫТАНИЕ<br />

У меня уже была отладочная плата на контроллере ARM7. Вся периферия<br />

— отключена, к одному цифровому входу была привешена OUT-ножка<br />

датчика, а к выходу я временно привесил динамик-пищалку, чтобы не<br />

играться с высоким напряжением раньше времени. Datasheet порекомендовал<br />

мне привесить конденсатор 4.7 мкФ между питанием и землей<br />

датчика, ну а я был как бы не против. Затем я щупал осциллографом<br />

выход ИК-датчика, тыкал в кнопки пульта и пытался найти соответствие<br />

между протоколом и видимым мной на экране. После некоторых правок<br />

и перезаливок кода динамик стал наконец-то пищать, сообщая, что<br />

контроллер распознал мои нажатия.<br />

АПЛОДИСМЕНТЫ!<br />

Теперь ты можешь управлять с обыкновенного пульта дистанционного<br />

управления любой техникой в доме. Одной релюшкой с лампочкой все,<br />

естественно, не ограничивается, и ты волен привесить на контроллер<br />

какие угодно функции, хватило бы фантазии и усидчивости. Да, минусы<br />

в моем проекте тоже есть. Во-первых, устройство не умеет снаружи<br />

конфигурироваться через USB или UART. Захочешь поменять кнопку, на<br />

которую будет реагировать контроллер, — перекомпилируй и перепрошивай<br />

все по новой. Сам контроллер тоже слишком крут для таких задач.<br />

Я его выбрал за универсальность, но в готовом «серийном» устройстве,<br />

висящем в шкафу на стенке, понятно, придется использовать что-нибудь<br />

подешевле. Надеюсь, сидя на диване и руля техникой в доме, ты не<br />

заработаешь геморрой. Мой тебе совет, пока не поздно — выбрось пульт<br />

вместе с телевизором в окно и иди гулять. Весна, как-никак. z<br />

АЛГОРИТМ<br />

У меня оказался пульт от телевизора Sony ХХХ, поэтому прошивку для контроллера<br />

я писал, исходя из местного протокола. За «единичный интервал»<br />

берем 0,6 мс, тогда стартовый ноль — это 4 интервала, единица занимает<br />

1+2 интервала, а ноль — 1+1. Последовательность действий в моем случае<br />

примерно такова:<br />

— Ñòàâèì ïðåðûâàíèå íà ñðàáàòûâàíèå â 0 (êîãäà äàííûå íå<br />

ïåðåäàþòñÿ, òðàíçèñòîð â äàò÷èêå çàêðûò, íà íîæêå åäèíèöà).<br />

— Îêàçàâøèñü âíóòðè ïðåðûâàíèÿ, ñáðàñûâàåì è çàïóñêàåì<br />

òàéìåð.<br />

— Ñòàâèì ïðåðûâàíèå íà 1. Ñòàðòîâûé íîëü äîëæåí áûòü äëèíîé<br />

2.4 ìñ.<br />

— Âíóòðè ïðåðûâàíèÿ çàìåðÿåì, ñêîëüêî íàòèêàë òàéìåð:<br />

— Åñëè íàòèêàëî îêîëî 2.4 ìñ, òî ìû ïîéìàëè ïîëåçíûå äàííûå;<br />

— Åñëè íåò, òî ïîéìàëè ÷òî-òî íå òî.<br />

— [Ìåòêà!]  ëþáîì ñëó÷àå, ñòàâèì ïðåðûâàíèå ñíîâà íà 0,<br />

äà ê òîìó æå ñáðàñûâàåì ñ÷åò÷èê (åñëè ïðîäîëæàåì ïðèíèìàòü<br />

ïàêåò).<br />

— Ñðàáîòàòü îíî äîëæíî ïðèìåðíî ÷åðåç 0.6 ìñ. Åñëè ïðåðûâàíèå<br />

íàñòàëî ÷åðåç äðóãîé ïðîìåæóòîê âðåìåíè, òî ñáðàñûâàåì<br />

ñîñòîÿíèå. À åñëè ÷åðåç 0.6, — òî ìû ïîéìàëè îäèíî÷íóþ<br />

åäèíèöó. Ñëåäóþùàÿ ïîñëåäîâàòåëüíîñòü íàêîíåö-òî<br />

ñîîáùèò íàì, ÷òî èìåë â âèäó ïóëüò. Ñáðàñûâàåì ñ÷åò÷èê è<br />

ñòàâèì ïðåðûâàíèå íà 1.<br />

—  íåì ñìîòðèì, ÷åðåç êàêîé ïðîìåæóòîê âðåìåíè ìû òóò<br />

XÀÊÅÐ 04 /124/ 09<br />

АППАРАТНЫЕ<br />

ПРЕРЫВАНИЯ<br />

Любое ядро любого процессора как-то должно реагировать на<br />

внешние раздражители, например, на приход сигнала с какойнибудь<br />

ножки. Первый способ — банально написать программу,<br />

периодически опрашивающую периферию на предмет изменения<br />

состояния. Но это затратно, несинхронно и, вообще, немодно. Поэтому<br />

еще на заре компьютеростроения был изобретен механизм<br />

прерываний. Специальный периферийный контроллер содержит<br />

список функций (обработчиков), на которые нужно совершать переход,<br />

если произошло какое-либо событие. Если оно происходит,<br />

контроллер прерываний насильно сохраняет текущие значения<br />

регистров в стеке и перебрасывает процессорное ядро на новый<br />

адрес с обработчиком. Последний исполняется и сбрасывает флаг<br />

прерывания, сообщая, что оно обработано и можно двигаться<br />

дальше.<br />

101

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!