Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

articles:cd.sf.censored [2017/09/05 02:55] (текущий)
Строка 1: Строка 1:
 +====== cd.sf.censored ======
 +<​sub>​{{cd.sf.censored.odt|Original file}}</​sub>​
 +
 +====== копирование без границ\\ или передовые методики защиты CD\\ или CD неподвластный копированию ======
 +
 +крис каперски ака мыщъх
 +
 +**копировщики лазерных дисков совершенствуется с каждым днем, но и разработчики защитных механизмов не дремлют,​ тем не менее, новые защиты тут же ломаются. почему?​ вашему вниманию предлагается обзор наиболее популярных ошибок и конструктивных просчетов с рекомендациями по их устранению,​ а так же описывается законченный алгоритм чрезвычайно стойкой защиты,​ не копируемой никаким копировщиком.**
 +
 +===== введение =====
 +
 +Хакерская мудрость гласит:​ "​взломать можно все, это только вопрос времени"​. Валовый программный продукт,​ ориентированного на массовый рынок, такая ситуация вполне устраивает. Какой-то процент пользователей покупает программу,​ какой-то нет. Но для специализированных программных комплексов (расчет прецизионного литья или звездных спектров),​ количество пользователей которых измеряется какими-то тысячами,​ такой подход уже неприемлем. Потенциальный рынок настолько мал, что каждая нелегальная копия чувствуется весьма болезненно. Значит,​ надо защищать так, чтобы не взломали,​ но как?
 +
 +У нас две новости — хорошая и не очень. Надежные защиты все-таки существуют,​ но их разработка требует больших усилий и знания реалий. Это довольно заковыристая предметная область и с одной лишь теоретической подготовкой в нее не войдешь. Тем не менее, спрос рождает предложение и автор статьи делиться своим многолетним опытом по созданию стойких защитных комплексов.
 +
 +===== основные концепции защиты =====
 +
 +Главное свойство защиты — это надежность (не путать со стойкостью ко взлому). Защита должна уверенно работать на всем спектре программно-аппаратного обеспечения с заранее непредсказуемыми свойствами. Антиотладочные приемы следует использовать с большой осторожностью или не использовать вообще,​ поскольку от них слишком много проблем. К тому же защита должна быть проста в реализации и отладке. Например,​ если часть функционала вынесена в микроконтроллер,​ смонтированный на отдельной печатной плате, подключаемой через PCI-шину или COM/​USB/​LPT-порт,​ взлом становится не только нерентабельным,​ но и практически невозможным,​ конечно,​ при условии,​ что микроконтроллер не позволяет считывать ПЗУ (некоторые приемы аппаратного взлома можно найти на страничке Сергея Скоробогатого:​ http://​www.cl.cam.ac.uk/​~sps32/​),​ однако,​ отладить такой комплекс будет намного сложнее,​ чем взломать,​ поэтому для практического применения он непригоден. В идеале,​ защита вообще не должна требовать никакого "​внешнего"​ оборудования,​ а это значит,​ что ее код заведомо будет заведомо доступен для анализа и модификации.
 +
 +Рисунок 1 электронный ключ…
 +
 +Рисунок 2 …и его взлом, путем считывая содержимого EEPROM под микроскопом с увеличением 500х
 +
 +Защита не может отталкиваться ни от серийных номеров,​ ни от ключевых файлов,​ поскольку всегда найдется пользователь,​ пожелавший разделить себя с миром и, в общем-то по своему он будет прав. Черные списки,​ "​засвеченных"​ серийных номеров и прочие организационные меры, как показывает практика,​ недостаточно эффективны и со своей задачей не справляются.
 +
 +Так же недопустимо привязываться к оборудованию,​ поскольку потребители очень не любят, когда ограничивают их свободу,​ к тому же, если стоимость защищенного комплекса составляет хотя бы 500$, хакеры могут клонировать весь компьютер целиком,​ особенно если это будут китайские хакеры (цены на оборудование в Азии намного ниже европейских). Наиболее популярным объектом привязки служит серийный номер жесткого диска и MAC-адрес сетевой карты, которые легко изменить (для жесткого диска можно воспользоваться комплексом PC-3000 от ACE Laboratory — www.acelab.ru,​ а для сетевой карты — утилитой ipconfig, запущенной из-под LINIX). Остальные же характеристики "​железа"​ еще менее уникальны и в пределах одной партии практически идентичны друг другу. К тому же, нельзя забывать про виртуальные машины (VMWare, Virtual PC и т. д.), привязка к которым лишена всякого смысла. Можно, конечно,​ распознать наличие виртуальной машины и отказаться работать под ней, только это не выход. Виртуальных машин существует великое множество и каждая из них детектируется по-своему,​ к тому-то для большинства из них существуют специальные "​патчи",​ предотвращающие детектирование. В общем, вложенные в защиту усилия,​ окажутся нерентабельными.
 +
 +Привязываться можно только к //​**носителю**//​ — дискете,​ лазерному или DVD-диску,​ карте FLASH-памяти и т. д. Это в наименьшей степени ущемляет права потребителей и практически не создает непреодолимых неудобств,​ к тому же, качественно защищенный носитель чрезвычайно трудно скопировать. Существует множество хакерских групп, специализирующихся на взломе программного кода, но очень немногие разбираются в устройстве носителей на профессиональном уровне.
 +
 +Весь вопрос в том — какой носитель выбрать?​ Дискеты отбросим сразу. Их время уже прошло. DVD-диски только набирают силу и требовать обязательно наличия DVD привода на целевом компьютере по меньшей мере негуманно. Тоже самое относится и к FLASH-картам. Остается только CD. Вот к нему-то мы и будем привязываться.
 +
 +===== >>>​ врезка:​ детектирование VMWare =====
 +
 +Автору известны по меньшей мере три способа обнаружения VM-Ware. Во-первых,​ по оборудованию:​ виртуальные машины несут на своем борту довольно специфический набор железа,​ практически не встречающийся в живой природе. Это:
 +
 +  - видеокарта VMware Inc [VMware SVGA II] PCI Display Adapter;
 +  - сетеваякарта:​ Advanced Micro Devices [AMD] 79c970 [PCnet 32 LANCE] (rev 10);
 +  - жесткиедиски:​ VMware Virtual IDE Hard Drive и VMware SCSI Controller.
 +Опросив конфигурацию оборудования,​ защищаемая программа сразу поймет,​ куда ее занесло.
 +
 +Во-вторых,​ виртуальные сетевые карты имеют довольно предсказуемый диапазон MAC-адресов,​ а именно:​ 00-05-69-xx-xx-xx,​ 00-0C-29-xx-xx-xx и 00-50-56-xx-xx-xx. Защите достаточно выполнить команду "arp -a", чтобы распознать хакерские планы.
 +
 +В-третьих,​ VM-Ware имеет коварный backdoor, оставленный разработчиками для служебных целей и управляемый через порт 5658h, при этом в регистре EAX должно содержатся "​магическое"​ число 564D5868h. Ниже приведен фрагмент кода червя Agobot, определяющий версию VM-Ware:
 +
 +mov eax, 564D5868h ; VMWARE_MAGIC
 +
 +mov ecx, 0Ah ; Get VMware version
 +
 +mov edx, 5658h ; VMWARE_PORT
 +
 +ineax, dx
 +
 +Листинг 1 определение версии VMWare
 +
 +Для маскировки виртуальной машины,​ Костей Кортчинским (KostyaKortchinsky) был написан специальный патч, изменяющий идентификационные строки оборудования,​ MAC-адреса и магический номер backdoor'​а (__http____://​____honeynet____.____rstack____.____org____/​____tools____/​____vmpatch____.____c____).__
 +
 +Подробнее о способах детектирования виртуальных машин можно прочитать в подборке статей **Know****your****Enemy**(на английском языке):​ __www.honeynet.org/​misc/​files/​papers.tar.gz__;​
 +
 +===== обзор популярных средств защиты =====
 +
 +Механизмы привязки к CD-ROM можно разделить на три большие группы. В первую (и наиболее древнюю) попадают защиты,​ внедряющие ключевую метку в служебные структуры данных,​ не копируемые штатными копировками. Это может быть и область пред-зазора первого трека (firstpre-gap),​ и субканальные данные,​ так же называемые данными подканалов (subchanneldata) и т. д. Достоинства — высокая совместимость с различными моделями приводов и предельная простота программной реализации. Недостатки — при подготовке диска к тиражированию придется долго объяснятся с сотрудниками завода. Обычно им передают готовый диск или образ, содержащий только пользовательские данные (он же образ типа ISO9660, хотя это название не вполне корректно),​ здесь же требуется "​сырой"​ (RAW) образ в формате 2352/96, который поддерживает далеко не всякое оборудование! Зачастую,​ производитель игнорирует наши требования и вопреки всем обещаниям и договорам с "​конвейера"​ сходят диски, записанные стандартным образом,​ то есть без ключевых меток, а для заказчика это катастрофа! (Поверьте,​ моему горькому опыту, это довольно часто встречается). Но это все равно напрасно,​ поскольку такие защиты уже давно копируются специализированными копировщиками. Исключение составляет ключевая метка в Q-подканале аудио-трека. Без спецоборудования она не копируется в принципе! Как-нибудь мы об этом поговорим.
 +
 +Вторая группа защитных механизмов основана на нестандартных форматах диска (необычная длина сектора,​ нестандартные номера треков,​ искаженные заголовки и т. д.). Все они крайне конфликтны и отказываются идти на многих моделях приводов,​ к тому же при тиражировании дисков возникают очень серьезные проблемы,​ намного более серьезные,​ чем в первом случае. Как правило,​ требуется специальное (и весьма дорогостоящее!) оборудование,​ оправдывающее себя только на больших тиражах. Но эти вложения вряд ли окупятся,​ поскольку копировщики защищенных дисков уже давно справились с нестандартными форматами,​ так что не будем на них останавливаться и двинемся дальше.
 +
 +Третью группу возглавляют защиты,​ привязывающиеся к физической структуре носителя. Их можно разделить на две подгруппы. Первая выделяет на диске некоторые более или менее уникальные характеристики,​ к которым,​ собственно,​ она и привязывается. Вторая же, не собираясь ждать милости от природы,​ самостоятельно формирует трудновоспроизводимые дефекты на диске. Возьмем известную защиту Laser Lock,​ которую легко опознать по наличию крошечной "​дырки",​ проделанной лазером точно посередине спиральной дорожки (аналогичный способ был широко известен еще во времена дискет,​ причем их дырявили не только лазером,​ но еще и гвоздем). На первый взгляд тут должен образоваться BAD-сектор,​ однако,​ практика показывает,​ что диск читается без проблем. А как же дыра? Все дело в кодах Рида-Соломона,​ корректирующей способности которых вполне хватает для исправления "​дыры"​. Но если отключить коррекцию ошибок,​ то в секторе сразу же обнаружатся "​дефективные"​ биты, причем начало разрушенной области будет соответствовать позиции дырки в секторе. Это если объяснять на пальцах.
 +
 +На самом деле все намного интереснее и сложнее. Структура хранения данных на лазерном диске такова,​ что физически смежные биты расположены значительном удалении друг от друга, зачастую даже в различных секторах! Информация как бы "​размазывается"​ вдоль спиральной дорожки,​ чтобы противодействовать царапинам и дефектам. Дело в том, что корректирующие коды Рида-Соломона отлично справляются с одиночными ошибками,​ но намного хуже с групповыми. Чтобы ослабить влияние дефектов пришлось прибегнуть к перемешиванию. А это значит,​ что "​дыра"​ затрагивает не один сектор,​ а целую группу секторов! Это дает возможность распознавать "​виртуальные"​ BAD-сектора,​ имитируемые копировщиками. Поразительно,​ но ни одна из коммерческих защит такой проверки не выполняет! Тем не менее, копировщики защищенных дисков уже давно научились обходить Laser-Lock, имитируя даже такие "​тонкие"​ эффекты как увеличение времени чтения "​продырявленных"​ секторов и т. д., так что такой прием подходит только для борьбы со штатными копировщиками. К тому же, очень трудно найти завод, располагающий соответствующим защитным оборудованием. Вообще-то,​ в отсутствии лазера,​ можно воспользоваться и обыкновенным маркером,​ однако,​ он подходит только для крошечных тиражей.
 +
 +Рисунок 3 лазерный диск, защищенный Laser Lock ("​снимок"​ получен сканером HP 1200)
 +
 +Остается последний тип защиты — измерение физических характеристик спиральной дорожки (так же называемый снятием топологии). По такому принципу,​ в частности,​ работают CD-Cops, SecureROM 4x, Star-Force и некоторые другие защиты. Методика отработанная,​ можно даже сказать вылизанная до зеркального блеска,​ и неплохо себя зарекомендовавшая. Судите сами. В образ защищенного диск не вносится никаких изменений и для его тиражирования можно использовать абсолютно любое оборудование,​ в том числе и бытовой CD-R/RW рекордер. Скопировать физическую структуру спиральной дорожки нереально (на CD-R/RW дисках уже нанесена предварительная разметка,​ причем у каждого типа болванок своя), и хотя ее можно проэмулировать,​ от эмуляторов легко защититься (чуть позже мы покажем как). По правде говоря,​ существует возможность подбора болванки с похожей спиральной структурой,​ однако,​ если привязываться не к одной, а нескольким физическим характеристикам,​ вероятность подобрать "​правильный"​ диск будет крайне мала.
 +
 +В принципе,​ можно воспользоваться готовым защитный пакетом,​ но во-первых,​ за него придется платить. Во-вторых,​ все вышеперечисленные защиты легко копируются в режиме эмуляции копировщиками Clone CD и Alcohol 120%. Исключение составляет Star-Force Professional Edition,​ непосредственно скопировать который еще никому не удалось,​ однако (и это в третьих!),​ защита слишком агрессивно вгрызается в операционную систему,​ вызывая множество проблем у легальных пользователей. Разработчики характеризуют себя как людей с хакерским прошлым,​ сильных в системном программировании. Что касается прошлого — с этим можно согласиться. Операционную систему они знают лучше, чем свой задний двор. Но вот программировать умеют едва ли. Программирование — это в первую очередь проектирование. А проектирование — это учет рисков. Никакой конструктор не позволит себе стоить мост по непроверенным формулам или проводить на нем научные эксперименты,​ гадая — произойдет обрушение на этот раз или не произойдет. Программа,​ ориентированная на массовое применение,​ просто не может пользоваться недокументированными возможностями и прочими приемами нетрадиционного программирования (в народе именуемых хаками). У себя в заднем дворе делайте,​ что хотите,​ но вот пользователю требуется нормальный продукт.
 +
 +А давайте запрограммируем защиту самостоятельно! Ядро измерителя структуры спиральной дорожки занимает всего несколько строк на Си. Вместе с обвязочным кодом выходит около десятка… Полный цикл разработки вместе с отладкой легко укладывается в пару недель. Так стоит ли за это платить?​
 +
 +===== star-force своими руками =====
 +
 +Спиральная дорожка лазерных дисков очень похожа на грампластинку,​ только начинается не снаружи,​ а изнутри,​ наматываясь от центра к краю. Оптическая головка,​ удерживаемая в магнитном поле "​звуковой катушки",​ движется на "​салазках"​ поперек спиральной дорожки. Сама дорожка состоит из секторов с данными и каналов подкода. Номера секторов находятся как в заголовках самих секторов,​ так и в каналах подкода,​ "​размазанных"​ вдоль спиральной дорожки. Для грубой наводки не требуемый сектор используются салазки и каналы подкода,​ а для точной — отклонение в магнитном поле и секторные заголовки.
 +
 +Просто взять и измерять структуру спиральной дорожки нельзя,​ но можно сделать вот что: допустим,​ головка считывает сектор X, а следом за ним сектор Y. Если угол XOY, образованный центром (O) диска, секторами X и Y составляет порядка ~15 град,​ а сами сектора расположены на соседних витках спирали,​ то приводу достаточно всего лишь немного отклонить головку и через мгновение сектор Y сам падает в руки, как перезревшее яблоко — диск ведь вращается! Если же угол XOY составляет менее ~15 град,​ тогда за время перемещения головки,​ сектор Y уже "​уплывет"​ и приводу придется ждать целый оборот лазерного диска, пока он не достигает оптической головки!
 +
 +Рисунок 4 когда угол между секторами X и Y составляет ~15 град. при переходе на соседний виток, сектор Y сразу же "​подлетает"​ к оптической головке (рисунок слева),​ при меньшем значении угла сектор Y успевает уплыть и головка вынуждена ждать целый виток
 +
 +Замеряя время чтения различных пар секторов,​ мы можем приблизительно определить их взаимное расположение на спиральной дорожке. У каждой партии диска для заданных секторов X и Y оно будет своим (ведь степень "​закрутки"​ спирали неодинакова и варьируется от одного производителя к другому). Чтобы побороть упреждающее считывание (которым "​страдают"​ многие приводы),​ защита должна читать сектора в порядке убывания их LBA-адресов. Так же она должна измерять скорость вращения привода,​ чтобы во-первых,​ определить постоянство временных замеров (пляшут ли они как пьяные человечки или нет), а во-вторых скорректировать формулу для вычисления угла, ведь как легко показать,​ чем быстрее вращается диск, тем скорее "​уплывает"​ сектор.
 +
 +Исходный текст "​измеряющей"​ программы приведен ниже:
 +
 +//​-[чтение сектора с диска]---------------------------------------------------
 +
 +// ARG:
 +
 +//​CDуказатель на строку с именем провода (например,​ "​TEAC"​),​
 +
 +//​адрес на ASPI-шине (например,​ "​1.1"​) или имя диска("​\\.\G:"​);​
 +
 +//​первые два варианта работают через ASPI, последний через SPTI;
 +
 +//
 +
 +//​bufуказатель на буфер SECROR_SIZE*2
 +
 +//
 +
 +//​sectorномер сектора в LBA-формате
 +
 +//
 +
 +// RETURN:
 +
 +// 0успешно
 +
 +//​-1ошибка
 +
 +read_from_cd(char *CD, unsigned char *buf, long sector)
 +
 +{
 +
 +int stat;
 +
 +stat=cd_raw_sector_read(CD,​ buf, SECTOR_SIZE,​ sector, ONE_SECTOR, W_USER_DATA);​
 +
 +if (stat == SCSI_OK) return 0; return -1;
 +
 +}
 +
 +//​-[чтение TSC-счетчика]------------------------------------------------------
 +
 +unsigned int A()
 +
 +{
 +
 +__asm{
 +
 +_emit0xF; RDTSC
 +
 +_emit0x31
 +
 +}
 +
 +}
 +
 +#define argCDv[1]
 +
 +// КОНФИГУРАЦИЯ
 +
 +//​----------------------------------------------------------------------------
 +
 +// номер первой точки измерения (LBA-адрес)
 +
 +// данная утилита измеряет топологию только по одной точке,
 +
 +// что не есть хорошо,​ т.к. легко подобрать похожий диск
 +
 +// для уверенности следует выбрать несколько точек:
 +
 +// в начале,​ середине и конце диска
 +
 +#define _CFG_BGN_SEC_17699
 +
 +// кол-во секторов для измерения
 +
 +// должно быть не меньше утроенного кол-ва секторов на виток в данной
 +
 +// точке измерения (см. _CFG_BGN_SEC_ )
 +
 +// число витков спирали N с поперечной плотностью D витков/​мм
 +
 +// от радиуса R1 до радиуса R2 определяется формулой:​ N = (R2- R1) * D
 +
 +#define _CFG_LEN_SEC_0x669
 +
 +// максимальный шаг приращения
 +
 +// в принципе должен быть равен удвоенному кол-ву секторов
 +
 +// на данном витке спирали,​ что увеличивает точность измерений
 +
 +// но можно использовать и  значение _CFG_LEN_SEC_
 +
 +#define _CFG_LEN_DEL__CFG_LEN_SEC_
 +
 +// начальный шаг приращения (должен быть по возможности мал)
 +
 +#define _CFG_BGN_DEL_0x2
 +
 +// приблизительное кол-во секторов на данном витке спирали
 +
 +// (в данной версии программы это значение мало на что влияет)
 +
 +#define _CFG_xWHELL_27
 +
 +// конечный сектор для проверки
 +
 +#define _END_SEC_ (_CFG_BGN_SEC_+_CFG_LEN_SEC_)
 +
 +// конечныйшаг
 +
 +#define _END_DEL_ (_CFG_BGN_DEL_+_CFG_LEN_DEL_)
 +
 +#define FB(b) (##b = (##b + 1) % _END_DEL_);//​ приращениешага
 +
 +// шапка цикла
 +
 +#define FH(a,b) for (##​a=_END_SEC_,##​b=_CFG_BGN_DEL_;​ ##a > _CFG_BGN_SEC_;​ ##a-=##b)
 +
 +main(int c, char** v)
 +
 +{
 +
 +int a, b; int x=0; int i=0; int A1, A2;
 +
 +unsigned char buf[SECTOR_SIZE];​
 +
 +
 +
 +// проверка аргументов командной строки
 +
 +if (c < 2) {
 +
 +fprintf(stderr,"​USAGE:​sf.exe CD\n\n"​);​
 +
 +printf( " ​ SCSI_INQUITY via ASPI32\n"​\
 +
 +"​-------------------------------------\n"​);​
 +
 +read_from_cd("?​.?",​ buf,0); return 0;
 +
 +}
 +
 +
 +
 +// этап первый
 +
 +//​-----------------------------------------------------------------------
 +
 +// читаем случайные сектора для разгона привода
 +
 +fprintf(stderr,"​%s\n",​_TEXT_SPINEUP_);​
 +
 +for (a = 0; a < 0x69; a++)
 +
 +{
 +
 +read_from_cd(argCD,​ buf,​rand()%_END_SEC_);​
 +
 +fprintf(stderr,"​\r%02d%%",​a*100/​0x69);​
 +
 +}
 +
 +
 +
 +// этап второй
 +
 +//​------------------------------------------------------------------------
 +
 +// определяем кол-во секторов на дорожке и стабильность вращения привода
 +
 +// **алгоритм определения кол-ва секторов**:​ читаем сектора задом наперед,​
 +
 +// с циклически увеличивающимся шагом, наименьшее значение шага
 +
 +// при котором время чтения секторов будет минимальным - и будет равно ​
 +
 +// кол-ву секторов на данном витке спирали
 +
 +// (fixit: пока не реализовано,​ кол-во секторов взято на глазок)
 +
 +//
 +
 +// **алгоритм определения стабильности**:​ читаем сектора с шагом, равным
 +
 +// кол-ву секторов на данном витке спирали,​ и оцениваем разброс;​
 +
 +// если разброс будет слишком большим (превышает 10%-15%), следует
 +
 +// уменьшить скорость привода (как это сделать показано в CD.snail.c)
 +
 +fprintf(stderr,"​\r%s\n",​_TEXT_TEST_);​
 +
 +for (a = _END_SEC_; a > _CFG_BGN_SEC_;​ a-=_CFG_xWHELL_)
 +
 +{
 +
 +A1=A(&​c);​read_from_cd(argCD,​ buf,​a);​A2=A(&​c);​
 +
 +fprintf(stderr,"​\r%02d%%",​(_END_SEC_-a)*100/​_CFG_LEN_SEC_);​
 +
 +}
 +
 +
 +
 +// этап третий (важнейший!)
 +
 +//​------------------------------------------------------------------------
 +
 +// производим,​ собственно,​ измерения
 +
 +// fix1: добавить "​сглаживание"​ полученных данных
 +
 +fprintf(stderr,"​\r%s\n",​_TEXT_ANGLE_);​
 +
 +
 +
 +//  выводим шапку таблицы
 +
 +printf("​delta:"​);​ FH(a,b) { printf("​\t%d",​a);​ FB(b); } printf("​\ntime:"​);​
 +
 +
 +
 +// измеряем и тут же выводим результаты
 +
 +FH(a,b)
 +
 +{
 +
 +A1=A(&​c);​ read_from_cd("​TEAC",​ buf,a); A2=A(&​c);​
 +
 +printf("​\t%d",​(A2-A1)/​100);​
 +
 +fprintf(stderr,"​\r%02d%%",​(_END_SEC_-a)*100/​_CFG_LEN_SEC_);​
 +
 +FB(b);
 +
 +} printf("​\n"​); ​
 +
 +
 +
 +// всемуконец
 +
 +fprintf(stderr,"​\r%s\n",​_TEXT_END_);​ return 0;
 +
 +}
 +
 +Листинг 2 макет программы sf.c для снятия топологий
 +
 +Программа использует библиотечку SCSIlib, разработанную автором для низкоуровневого управления приводами с прикладного уровня. Ее можно бесплатно скачать с ftp-сайта автора.
 +
 +===== запуск программы =====
 +
 +При запуске без аргументов,​ программа выдаст краткую справку по ключам,​ а при наличии ASPI-дравйера автоматически просканирует системную шину и выведен адреса и названия всех обнаруженных приводов.
 +
 +Это может выглядеть,​ например,​ так:
 +
 +>sf.exe
 +
 +USAGE:​sf.exe CD
 +
 + ​SCSI_INQUITY via ASPI32
 +
 +-------------------------------------
 +
 +0.0 <-- ELBY  DVD-ROM ​ 1.0  (5)
 +
 +1.0 <-- ST380011A ​ 3.06 (0)
 +
 +2.0 <-- IBM-DTLA-307015 ​ TX2O (0)
 +
 +2.1 <-- TEAC  CD-W552E ​ 1.09 (5)
 +
 +3.0 <-- AXV  CD/​DVD-ROM ​ 2.2a (5)
 +
 +3.1 <-- AXV  CD/​DVD-ROM ​ 2.2a (5)
 +
 +3.2 <-- AXV  CD/​DVD-ROM ​ 2.2a (5)
 +
 +Листинг 3 результат запуска программы без ключей
 +
 +Ключ "​СВ",​ отвечающий за выбор привода,​ задает не только сам привод,​ но и интерфейс взаимодействия.
 +
 +Если имя привода выглядит как название устройства (т. е. начинается с префикса "​\\.\"​),​ то управление будет осуществляться через интерфейс SPTI. Для этого вы должны иметь Windows NT/​2000/​XP и права администратора.
 +
 +Если имя выглядит как адрес устройства на шине или как часть идентификационной строки привода,​ то управление будет осуществляться через интерфейс ASPI, для работы через которой необходимо установить ASPI-драйвер (его можно бесплатно скачать с сервера копании Adaptec — www.adaptec.com).
 +
 +Например,​ "​sf.exeTEAC"​ (или "​sf.exe 2.1"​) , заставляет программу работать с приводом TEAC (адрес на ASPI-шине — 2.1) через ASPI-интерфейс,​ а "​sf.exe \\.\G:"​ — с приводом "​G:"​ через SPTI-интерфейс.
 +
 +Программа выводит данные в форме таблицы,​ предназначенной для импорта в MSGraph, причем,​ вывод оптимизирован для перенаправления в файл (на экране все выглядит кошмарно),​ поэтому правильный вызов выглядит примерно так: "​sf.exe \\.\G:​ >​ C:​\1.txt"​.
 +
 +По окончании работы программы запускаем MS Word, открываем меню "​Вставка",​ там будет "​Рисунок"​ и "​Диаграмма"​. В меню "​Правка"​ находим "​Импорт",​ "​тип файлов"​ – "​*.txt",​ "​формат данных"​ — "с разделителем",​ "​начать импорт"​ со строки 1, "​далее >>",​ "​Символом разделителя является":​ "​[x] символ табуляции",​ "​далее >>",​ "​формат данных"​ — "​общий"​ и жмем кнопку "​готово"​. Далее действуем по своему вкусу, то есть по обстановке.
 +
 +===== сбор топологий испытания защиты и обсуждение результатов =====
 +
 +Вставляем подопытный диск в привод (пусть это будет, например,​ диск, прилагаемый к журналу "​Компьютер пресс"​ 2005/07, условно обозначенный нами как диск "​А"​) и снимаем с него топологию (см. рис. 5). Мы получаем характерную "​пилу",​ точки минимума и максимума которой указывают на то, что данная пара секторов лежит на одной прямой.
 +
 +Рисунок 5 топология диска "​А"​
 +
 +Очевидно,​ что на других дисках те же самые сектора будут иметь совсем другой угол, поэтому минимумы и максимумы сместятся на некоторое расстояние. Берем диск Microsoft Visual Basic 2005 (обозначенный нами как "​B"​),​ прилагаемый к тому же самому журналу и запускаем программу еще раз (см. рис. 6).
 +
 +Пилообразная кривая действительно сместилась приблизительно на половину периода. Так же слегка изменилась и амплитуда колебаний,​ но нас она не интересует. Будем отталкивается не от абсолютных,​ а от относительных значений,​ т. е. от LBA-адресов "​изломов"​ кривой (абсолютные значения находятся в прямой зависимости от "​окружающей среды"​ и потому ненадежны). Учитывая,​ что положения максимумов/​минимумов зависят не только от топологии диска, но еще и от скорости вращения привода,​ необходимо расширить доверительный интервал до нескольких секторов.
 +
 +Рисунок 6 топология диска "​B"​
 +
 +А теперь возьмем диск с другого номера "​Компьютер Пресс"​ (диск "​C"​) и сравним его топологию с диском "​A"​ (см. рис. 07).
 +
 +7 сравнение топологий дисков "​A"​ и "​C"​
 +
 +Топологии обоих дисков полностью совпадают! Это означает,​ что диски "​Компьютер Пресс"​ штамповались на одном заводе,​ а диск с Visual Basic на другом! Любопытное,​ наблюдение,​ не правда ли? С помощью этой программы мы можем не только защищаться от копирования,​ но и проводить интересные исследования (кстати,​ эта программа была специально написана мной по заказу американского полицейского управления,​ занимающегося борьбой с пиратством. Обычная история — продавец заказывает партию лицензионных дисков и затем перемешивает их с "​пираткой"​. Как установить факт обмана?​ Вот тут-то структура спиральной дорожки и выручает!).
 +
 +Демонстрационная программа снимает топологию только в одной точке (на участке между адресами 27532 и 18082. Разумеется,​ это ненадежно и при желании можно подобрать диск с похожей топологией (для этого достаточно взять приблизительно 10 болванок от разных производителей). Для усиления защиты настоятельно рекомендуется снимать топологию по меньшей мере в трех точках — начале,​ конце и середине диска. В этом случае,​ найти похожий диск будет намного труднее.
 +
 +===== >>>​ врезка полезный совет =====
 +
 +Перед снятием топологии скорость привода рекомендуется уменьшить хотя бы до 16x-24х. Как это сделать показано в утилите CD.snail.c, исходный текст которой можно бесплатно скачать с ftp автора.
 +
 +===== защита от анализа =====
 +
 +Существует по меньшей мере два способа взлома:​ копирование диска специализированными копировщиками или анализ защитного кода с последующий модификацией (он же bithack). Создать некопируемый диск это только полдела. Еще необходимо защитить свою программу от анализа.
 +
 +Обычно анализу противостоят шифровкой кода/​данных,​ однако,​ это не слишком-то удачное решение,​ ведь перед выполнением программы ее все равно приходится расшифровывать. Хакеру остается всего лишь дождаться этого момента и снять дамп. Можно, конечно,​ расшифровывать программу по частям или использовать несколько независимых расшифровщиков,​ но трудоемкость разработки защиты в этом случае практически не отстает от сложности взлома.
 +
 +В последнее время большое распространение получил некрасивый,​ но убойный подход,​ основанный на генерации "​мусорного кода",​ внедряемого в защищаемую программу. Похожая техника используется во многих полиморфных вирусах,​ из которых можно "​выдрать"​ уже готовые "​движки"​ (engine). Мусорный код чрезвычайно затрудняет анализ,​ делая его практически невозможным. Допустим,​ ключевая функция программы компилируется в тысячу машинных команд. Исходя из "​крейсерской"​ скорости дизассемблирования 1 команда в секунду,​ хакер сможет "​прочесть"​ (только прочесть! не проанализировать!) весь код за ~15 минут,​ но после разбавления функции миллионом мусорных инструкций,​ чтение листинга потребует свыше 10 суток напряженной работы,​ а полный анализ растянется на долгие годы.
 +
 +Звучит прекрасно,​ но без подводных камней не обходится. Во-первых,​ если перестараться,​ то скорость программы упадет в разы, причем,​ нужно учитывать,​ что далеко не у всех стоит Pentium-4, поэтому "​замусоривать"​ можно только редко вызываемые функции. Во-вторых,​ мусорный код должен быть достаточно нетривиальным,​ чтобы его "​мусорность"​ не бросалась в глаза. Использование XCHG EBX,​EBX или MOV EAX,​EAX легко отсекается анализаторами. В-третьих,​ в некоторых случаях анализ защитного алгоритма необязателен и хакер может взломать программу и так (см. "​защита от мониторов шины"​),​ поэтому,​ линия обороны должна быть хорошо продуманной и однородной на всем своем протяжении. Бронебойные ворота бесполезны,​ если вокруг них стен.
 +
 +Еще лучше применять P-код, реализовав "​виртуальную машину"​ и написав свой собственный интерпретатор. Поскольку,​ программировать в P-коде очень непроизводительно и неудобно,​ рекомендуется реализовать транслятор,​ "​пережевывающий"​ исходный текст, написанный на Паскале или Си и выдающий последовательность инструкций Машины Тьюринга,​ Сетей Петри, Стрелки Пирса и т. д. Чем ниже уровень абстракции,​ тем лучше для нас и хуже для хакера. Программа,​ состоящая из нескольких сотен строк, превращается в десятки тысяч или даже миллионы инструкций Тьюринга,​ декомпиляторов с которой не существует! Как компромиссный вариант можно использовать Форт, транслирующий исходный текст в шитый код. Это легко (и с комфортом) программируется,​ быстро работает,​ но долго ломается. Тем не менее, трудоемкость взлома порядка на два ниже, чем у Машины Тьюринга или Стрелки Пирса.
 +
 +===== >>>​ врезка ссылки по теме запутывания кода =====
 +
 +  - **Анализ запутывающих преобразований программ:​**
 +    - теоретическая статья,​ рассматривающая основные методы "​замусоривания"​ кода и проблемы его "​прополки"​ (на русском языке):​ __http____://​____www____.____citforum____.____ru____/​____security____/​____articles____/​____analysis____/​__;​
 +  - **A Taxonomy of Obfuscating Transformations:​**
 +    - еще одна статья,​ посвященная "​замусориванию"​ кода с большим количеством примеров (на английском языке):​ www.cs.arizona.edu/​~collberg/​Research/​Publications/​CollbergThomborsonLow97a/​
 +  - **Virtual Machine Design and Implementation in C/C++  by Bill Blunden:**
 +    - реализация виртуальных машин на Си/​Си++ — отличная бумажная книга на английском языке, электронная версия по-видимому недоступна;​
 +===== защита от эмуляторов =====
 +
 +Структуру спиральной дорожки невозможно скопировать,​ но легко проэмулировать. Вместе с копировщиками защищенных дисков,​ как правило,​ поставляются программы-эмуляторы,​ создающие виртуальный CD-ROM/DVD привод. Копировщик проделывает ту же самую операцию,​ что и защита – снимает топологию с защищенного диска и передает ее эмулятору.
 +
 +Можно ли это противостоять?​ Разработчики Star-Force использовали прямой доступ к IDE-контроллеру в обход всех установленных драйверов,​ в том числе и драйвера-эмулятора. А как быть, если у пользователя установлен не IDE-привод?​ Тогда Star-Force вынуждена работать через уже установленные драйвера. Чтобы обойти защиту достаточно выдернуть шлейф со своего привода или отключить соответствующий канал IDE-контроллера на "​лету"​ и Star-Force падет. Не очень-то сильная защита,​ да к тому же трудно реализуемая.
 +
 +Рисунок 8 виртуальный диск VirtualCloneCD в "​Моем Компьютере"​
 +
 +Мы же пойдет другим путем. Если открыть стандарт по SCSI или ATAPI устройства (их черновые версии лежат на www.t10.org и www.t13.org соответственно),​ можно обнаружить десятки "​мультимедийных"​ команд,​ поддерживаемыми практически всеми современными приводами. В эмуляторах же реализована лишь малая часть. Поэтому,​ чтобы защититься от эмуляторов,​ достаточно задействовать хотя бы половину SCSI/​ATAPI-команд (попутно это "​убьет"​ мониторы шины и прочие анализаторы).
 +
 +Даже если последующие версии эмуляторов поумнеют и будут имитировать весь "​лексикон"​ привода целиком,​ они навряд ли смогут воспроизвести все особенности каждой команды и их комбинаций. Впрочем,​ не будем забегать вперед. Эмуляторы совершенствуются медленно и качественных рывков с их стороны пока не ожидается.
 +
 +===== защита от мониторов шины =====
 +
 +Для взлома защиты не всегда требуется дизассемблировать код. Вместо этого можно запустить монитор шины для перехвата обмена программы с приводом. Анализируя последовательность вызовов SCSI/ATAPI команд,​ вполне реально разгадать алгоритм защиты,​ определив к каким именно характеристикам диска она привязалась.
 +
 +Большой популярностью пользуется монитор Bus Hound, ознакомительную версию которого можно бесплатно скачать с сайта http://​www.perisoft.net/​bushound. Он не только позволяет перехватывать USB 1.0/2.0, SCSI/​ATAPI/​IDE/​SATA,​ FireWire, Bluetooth, FibreChannel порты, но еще и отображает относительное и абсолютное время выполнения запросов,​ что существенно облегчает исследование защит, основанных на временных характеристиках.
 +
 +Наша защита никак не противодействует мониторам шины (Star-Force,​ кстати говоря,​ тоже), поэтому все команды видны как на ладони и алгоритм привязки становится понятным с первого взгляда (см. рис. 10).
 +
 +Рисунок 9 исследование защиты с помощью монитора шины
 +
 +Как "​ослепить"​ монитор?​ Можно, конечно,​ использовать прямой доступ к IDE-контроллеру или разнообразные антиотладочные (точнее,​ "​анти-мониторные"​) приемы,​ только… все это сложно,​ потенциально конфликтно и вообще ненадежно. Лучше "​разбавлять"​ наши команды большим количеством "​мусорных"​ SCSI/​ATAPI-команд,​ чтобы затеряться на их фоне. Алгоритм станет неочевидным и анализ потребует намного больше времени и усилий. Один нюанс: "​мусорные"​ команды ни в коем случае нельзя генерировать на случайной основе,​ в противном случае,​ хакер снимет несколько дампов,​ выделит в них постоянную часть, а все остальное отбросит за ненадобностью. А вот основные команды лучше выбирать случайным образом. В частности,​ для чтения сектора можно использовать и READ 10/​12,​ и READ CD и READ CD MSF,​ и некоторые другие.
 +
 +===== удаленный прожиг =====
 +
 +Ключевые лазерные диски хорошо подходят для "​коробочного"​ ПО, но для программ,​ распространяемых преимущественно через Интернет,​ они создают множество трудностей. Рассылка дисков это огромная головная боль, но ведь не передавать же лазерный диск по модему. А почему бы и нет? Современные технологии еще и не такое способы!
 +
 +Пользователь скачивает клиентскую программу,​ которая просит вставить чистый CD-R диск в пишущий привод,​ прожигает одну сессию,​ заполненную незначащими данными,​ снимает топологию и по криптографическому протоколу передает эту информацию серверу. Сервер "​зашивает"​ топологию внутрь защищаемой программы и отсылает ее клиентcкой программа,​ которая либо записывает программу на диск, либо устанавливает на винчестер.
 +
 +Конечно,​ такая схема взаимодействия существенно ослабляет защищенность программы. Ведь во всей партии болванок структура спиральной дорожки одинакова и потому,​ оплатив только одну копию, нечестный пользователь сможет тиражировать ее чуть ли не в промышленном масштабе. Чтобы этого не произошло,​ следует использовать аддитивную защиту,​ комбинирующую привязку к топологии с нестандартным форматом диска, например. Конечно,​ нестандартный формат — плохая штука (и об этом мы уже говорили в начале статьи),​ но с некоторыми предосторожностями использовать его все-таки можно. Тем более, что прожиг на CD-R снимает проблему тиражирования — клиентская программа самостоятельно управляет пишущим приводом и может свободно использовать все нестандартные режимы на которые он только способен. Большое количество разнообразных защитных приемов описано в моей книге "​Техника защиты лазерных дисков от копирования",​ демонстрационную версию которой можно найти на моем ftp.
 +
 +===== >>>​ врезка:​ полезные советы =====
 +
 +  - положите на ключевой диск файл с заманчивым названием user_name.key и выполняйте над ним различные запутанные операции,​ это слегка умерит прыть хакера и остановит его на какое-то время;
 +  - вносите на диск несколько //​**принципиально**////​**различных**//​ ключевых меток, но проверяйте только часть из них, а часть — оставьте для последующих версий программы (или ее обновлений),​ тогда хакеру придется каждый раз придется проводить утомительные исследования,​ подолгу зависая над монитором шины, дизассемблером и отладчиком;​
 +  - помните,​ что даже тщательно оттестированная защита в силу некоторых причин может не сработать,​ "​обругав"​ легального пользователя;​ поэтому,​ необходимо использовать по меньшей мере три независимых защитных механизма,​ основанных на различных характеристиках носителя,​ и если срабатывают хотя бы два из них, проверка считается пройденной;​ в данной статье мы рассмотрели всего лишь один такой механизм,​ остальные — в следующий раз.
 +===== >>>​ врезка nezimiftp =====
 +
 +**Мыщъх поднял экспериментальный ****ftp****-сервер,​ раздающий свои авторские материалы:​**
 +
 +IP-адрес:​ 83.239.33.46;​
 +
 +доменное имя: nezumi.org.ru;​
 +
 +порт: 21 (стандартный),​
 +
 +логин: WASM,
 +
 +пароль:​ не требуется;​
 +
 +папка: /pub,
 +
 +канал: 500 мегабит;​
 +
 +приблизительное время работы:​ с 14:00 до 06:00 (мыщъх ночной зверь),​ при возникновении проблем рекомендуется установить пассивный режим ftp-клиента;​
 +
 +===== заключение =====
 +
 +Разработка собственных защит от копирования — это реальность. Забудьте о широко разрекламированных готовых пакетах. Всякая серийная защита притягивает внимание сотен тысяч хакеров со всего света, которые быстро находят более или менее универсальный способ взлома,​ такой, что им может воспользоваться даже простой обыватель. Стойкость несерийных защит (даже спроектированных непрофессионалами) зачастую оказывается намного выше, потому что никто не хочет с ними связываться. Единичный взлом себя не окупит!
 +
 +Надеюсь,​ что эта статья поможет вам избежать ошибок и разработать защиту свой мечты самостоятельно.
 +
 +