Защита CD от копирования

В настоящее время существует большое количество специальных форматов данных, используемых для записи информации на компакт-диск. К ним относятся не только формат для аудиоданных (CD Digital Audio - CD-DA) и формат, применяемый для хранения произвольной информации в общепринятом для современных компьютерных систем виде (DATA CD), но также специфические форматы, позволяющие создавать фотоколлекции (Kodak CD, CD-G), хранить видеоинформацию в доступном к воспроизведению виде (CD-I), сохранять специфическую текстовую информацию наряду с аудиоданными (CD-TEXT) и другие. Предтечей всех этих форматов является обычный аудиодиск. Развитие других форматов было связано исключительно с грандиозным скачком технологий, произошедших вскоре после внедрения аудиодисков в серийное производство. Фирма Philips, как разработчик базового стандарта записи аудиодисков, была вынужден признать необходимость разработок принципиально нового подхода к проблеме записи структурированных данных на компакт диск. Более того, в связи с существованием на мировом рынке целого ряда аппаратных платформ, работающих на существенно отличающихся операционных системах, была произведена попытка унификации формата записи данных на компакт-диск. Так возникли весьма экзотические форматы записи, в некоторых случаях необходимые для написания игр и мультимедиа на базе игровых консолей (Amiga CD32, Atari Jaguar, Sony Playstation), в других – для расширения возможностей мультимедийного подхода в компьютерных и бытовых технологиях в принципе (Video-CD, CD-I, CD-XA, CD-TEXT, CD-G). Следует отметить одну немаловажную деталь – все эти форматы являются адаптацией базового формата для записи аудиодисков.

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

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

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

Рассмотрим методы защиты информации на CD:

Метод 1. Защита информации путем нарушения некоторых управляющих служебных сигналов, записанных на диск синхронно с данными.

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

Метод 3. Защита информации, базирующаяся на изменении файловой системы, используемой при записи. Следует сказать, что, несмотря на то, что этот метод защиты несколько менее универсален, он тоже позволяет эффективно защитить данные от возможности нелегального копирования диска целиком, т.к. возможна гибридная реализация методов 1-3.

Рассмотрим подробнее каждый из перечисленных методов.

Метод 1.

При записи абсолютно всех типов данных на компакт-диск синхронно с блоками данных формируется и записывается ряд управляющих цифровых сигналов. Подобная запись в подавляющем большинстве случаев делается аппаратно и означает, что при этом устройство при помощи внутреннего генератора формирует управляющие последовательности без непосредственного участия программы-копировщика и помещает их в конце каждого блока данных. Такие последовательности принято называть субканалами. Субканалов всего восемь и их принято нумеровать строчными английскими буквами P,Q,R,S,T,U,V,W.

Компакт-диски, записанные в стандарте CD-DA, используют лишь два субканала – P-субканал, который является по сути дела стробирующим при передаче данных от инициатора к устройству, и Q-субканал, в котором записывалась информация о тайм-коде, статусе устройства, кодах аппаратного корректора ошибок, работающего по схеме Соломона-Рида, а также некоторая другая. Для дальнейшего использования было зарезервировано еще 6 субканалов – R-W, которые на компакт-диск записываются, но фактически не используются. За период развития формата CD-DA в прочие форматы было сделано лишь несколько удачных попыток использования R-W субканалов. Например, в R-субканале при записи диска в форматах CD-G и CD-TEXT записывается некоторая пользовательская информация о копирайтах и авторстве для каждого трека. В редких случаях информацию из R-W субканалов используют тестовые программы для оценки производительности того или иного устройства чтения/записи дисков. Практически, на сегодняшний день ординарный компакт-диск, содержащий информацию произвольного типа, несет в себе 75% незадействованных субканалов.

Подобная ситуация позволяет особым образом защитить компакт-диск. В процессе записи субканалов отдельно от данных формируются полностью заполненные блоки, причем такая запись отнюдь не нарушает никаких договоренностей и стандартов записи данных на компакт диск, но дополняет. В области неиспользованных субканалов записывается дополнительная управляющая информация, которая неявно связана с данными субканалов P и Q. Программа для записи защищенных подобным образом дисков использует данные Q-субканала для формирования W-субканала. Данные, которые будут записаны в W-субканал, есть по сути закодированные симметричным алгоритмом соответствующие управляющие данные. Первичный ключ для кодирования формируется на основе данных, записанных в служебных областях на компакт-диске. Параллельно вводиться дополнительный псевдостробирующий R-субканал. Суть введения последнего заключается в том, что часть записанных на диск данных помещаются в область с верным Q-субканалом, но с ошибочным основным стробом. При чтении записанного таким образом компакт-диска эти данные будут просто проигнорированы, не вызвав сообщения об ошибке. Однако, при использовании программы, способной корректно читать подобные диски, перед принятием решения о том, насколько эффективна читаемая информация, будет произведена дизъюнкция реального и псевдостробирующих каналов, что обеспечит корректное и полное чтение данных во всем объеме.

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

Данный вариант защиты еще более эффективен при совместном использовании с методом 2.

Метод 2.

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

Существует целый ряд устройств для записи компакт-дисков, поддерживающих команды управления мощностью лазера и скоростью вращения вала привода. К ним относятся Plextor, Matsashita, Plasmon и некоторые модели Teac. Создание сбойной области на диске сводиться к процедуре хаотичного варьирования этих параметров в процессе записи при помощи SCSI-команд Optical Power Calibration и Set Shaft Spd [1,2]. Необходимым и достаточным условием последующего успешного чтения данных, записанных подобным образом, есть точный мониторинг сбойных зон в момент записи. Это означает, что записывающая программа варьирует параметры лазера до записи, после чего, при достижении нормальных условий записи на поверхность диска в данном месте, записывает эффективные данные. Причем данные Q-субканала, отвечающие за позиционирование следующего не сбойного сектора, формируются внутри пишущей программы, а не самим устройством и записываются отдельно.

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

Недостаток этого метода состоит в ощутимом уменьшении общего объема данных, которые возможно записать при повышении степени защиты диска. Однако преимущество метода в том, что ни одно устройство копирования не сможет сделать копию такого диска в режимах TAO (Track-at-Once), SAO (Session-at-Once) и RAW. Конечно пользователь может нелегально скопировать данные без дублирования структуры диска, но легко реализуемая программная проверка носителя, откуда запущена программа, не даст возможности для запуска программы не с оригинального компакт-диска.

Метод 3.

Запись данных на любой носитель всегда делается структурировано. Метод построения базовых структур для упорядочения информации на носителях принято называть файловой системой. Этот метод определяет такие параметры, как размер апертуры чтения/записи (что иногда ошибочно называют длинной сектора), способ формирования директориальных записей и таблицы размещения, синхронизационные данные и коды контрольных сумм.

Запись данных на компакт-диск производиться с использованием файловой системы CDFS (Compact Disc File System). При этом в служебной области формируется таблица размещения данных, содержащая векторы начала данных (дорожек или файлов) и длины.

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

При попытке копирования такого диска стандартная программа чтения определит, что диск заполнен, но суммарная длина всех файлов близка к нулю. И не сможет выполнить копирование ни в одном режиме, кроме режима RAW. С другой стороны, при запуске c такого диска программа-загрузчик, которая начнет работать автоматически, корректно прочитает данные из областей с нестандартной файловой системой, после чего приложение, записанное на диске, запуститься. Использование этого метода возможно вместе с методами 1 и 2, что еще в большей степени повышает надежность защиты.

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


Сравнение различных защит.

Данная таблица позволят в наглядном виде не только получить основные параметры всех защитных систем, но и провести анализ их свойств. Сильной защитой можно назвать ту, которая совсем не вскрыта (пока не вскрыта). Перспективной можно считать ту, которая вскрыта, но вскрыта каким-то одним способом. Такая защита имеет перспективу стать трудно вскрываемой, если ее разработчики смогут усилить тот или иной слабый блок. И слабой будем считать ту защиту, которая взломана всеми тремя известными способами, что говорит о чрезвычайно низкой защитной функции.

Наименование защитыФирма-производитель\странаСпособ защитыНеобходимость в специальной аппаратуре для защитыЗащита небольших партий на CD-R\RWСпособы взлома
Cd-CopsLink Data SecurityАнализ физических характеристик CD. Без установки метокНЕТНЕТСуществует несколько "кряков"*
LaserLockMLS LaserLock InternationalНанесение не копируемых метокДАНЕТЭмуляция**, побитовое копирование***, "кряк"
StarForceProtectionTechnology (Россия)Анализ физических характеристик CD. Без установки метокНЕТДАЗащита пока не вскрыта****
SafeDiskMacrovision CorporationНанесение не копируемых метокДАНЕТЭмуляция, побитовое копирование, "кряк"
SecuRomSonyНанесение не копируемых метокДАНЕТЭмуляция, побитовое копирование, "кряк"
TAGESThomson & MPOАнализ физических характеристик CD. Без установки метокНЕТНЕТЭмуляция, "кряк"

*Под термином "кряк" здесь понимается внешняя программа, способная дезавуировать защиту. При данном способе в код защищенной программы вносятся изменения.

**Данный вид программ эмулирует лазерные метки. При данном подходе в код вскрываемой программы не вносится изменений

***Наиболее распространенный способ копирования, смысл которого состоит в использовании специальных побитовых копировщиков, наподобие CloneCD. Данный тип защиты может работать как сам по себе, так и вместе с "кряком".

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

Краткий справочник по методам взлома и способам защиты от них

(1) Взлом копированием и эмулированием

Побитовое копирование

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

Для осуществления подобной атаки могут использоваться различные программы, зачастую входящие в поставку устройств CD-R/RW. Это и официальный Easy CD Creator, и полуофициальные (полухакерские) CloneCD и BlindRead:

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

Способы обороны: существуют два способа противодействия взлому. Первый заключается в том, что на диск записывается определенная метка, которая не копируется обычными средствами (например, создается нестабильный сегмент, который не читается носителем, а раз не читается, то и скопированным быть также не может). К сожалению, данный способ не всегда устойчив, поскольку уже есть программы "продвинутого" копирования (те же CloneCD и BlindRead), которые способны пропускать подобные места (замещать нестабильные области произвольными данными) и проводить копирование до конца. Второй способ основывается на том, что ничего никуда записывать не надо, а надо лишь определенным образом запоминать физические характеристики диска, которые просто невозможно воспроизвести любым копированием, точнее диск сам по себе копируется, но уже с другой физической структурой. Соответственно, пользователь может спокойно клонировать диски, но ключевым будет тот, который был официально куплен.

Эмулирование

Данный подход позволяет формировать виртуальные драйверы устройств и имитировать обращение к диску. Это уже чистой воды взлом, поскольку для нормальной работы вскрытого приложения в систему инсталлируется специальный драйвер, который имитирует обращение к не копируемой метке на диске и возвращает вскрытой программе именно те данные, которые она ожидает "увидеть". Подобный способ довольно часто применяется на первых порах, когда хакеру известен способ получения некопируемой метки на диске, но ему не очень хочется разбираться с программой методом дизассемблирования.

Противодействием может служить работа с устройствами записи\чтения на низком уровне, когда невозможно перехватить вызовы к оборудованию. Здесь нужно еще внести одно пояснение: для того, чтобы защищенному приложению обратиться к CD, и проверить его на наличие не копируемой метки, необходимо воспользоваться одной из функций чтения\записи, которые предоставляет сама Windows. Хакерами уже наработан ряд механизмов, позволяющих перехватывать стандартные обращения к функциям Windows, а раз можно перехватить сообщение, значит целиком можно имитировать чтение, целиком заменяя стандартные вызовы на собственные. Как говорилось выше, противодействием данному способу взлома может быть только обращение к накопителю не через стандартные вызовы.

(2) Взлом программного модуля

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

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

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

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

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

Давайте теперь рассмотрим основные методы взлома и противодействия ему

Отладчики

Отладчиков существует великое множество: от отладчиков, являющихся частью среды разработки, до сторонних эмулирующих отладчиков, которые полностью "погружают" отлаживаемое приложение в аналитическую среду, давая разработчику (или хакеру) полную статистику о том что и как делает приложение. С другой же стороны, подобный отладчик настолько четко имитирует среду, что приложение, исполняясь под ним, считает, что работает с системой напрямую (типичный пример подобного отладчика - SoftIce).

Противодействие

Способов противодействия существует великое множество. Это именно способы противодействия поскольку основная их задача сделать работу отладчика либо совсем невозможной, либо максимально трудоемкой. Опишем основные способы противодействия:

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

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

Подавление изменения операционной среды - программа сама несколько раз перенастраивает среду окружения, либо вообще отказывается работать в измененной среде. Не все отладчики способны на 100% имитировать среду системы, и если "подопытное" приложение будет менять настройки среды, то рано или поздно "неправильный" отладчик может дать сбой

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

Изменений определенных регистров процессора, на которые отладчики неадекватно реагируют. Также как и со средой. Отладчик тоже программа и тоже пользуется и операционной системой и процессором, который один на всех. Так если менять определенные регистры микропроцессора, которые отладчик не может эмулировать, то можно существенно "подорвать" его здоровье.

Дизассемблеры и дамперы

Про дизассемблер сказано было выше, а вот про дампер можно добавить то, что это практически тот же дизассемблер, только транслирует он не файл, находящийся на диске в Ассемблерный код, а содержимое оперативной памяти на тот момент, когда приложение начало нормально исполняться (то есть, пройдены все защиты). Это один из коварных средств взлома, при котором хакеру не надо бороться с механизмами противодействующими отладке, он лишь ждет, когда приложение закончит все проверки на легальность запуска, проверяя метки на диске, и начинает нормальную работу. В этот момент дампер и снимает "чистенький" код без примесей. К всеобщей радости не все защиты могут просто так себя раскрыть! И об этом ниже:

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

Шифрование и дешифрование (динамическое изменение кода). Более продвинутый способ шифрования, который не просто дешифрует часть кода при исполнении, но и шифрует его обратно, как только он был исполнен. При такой защите хакеру придется проводить все время с отладчиком, и взлом защиты затянется на очень и очень долгое время.

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

Дополнительные способы противодействия

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

Использовать для хранения данных защиты системные ресурсы Windows: дополнительную память, выделяемую для параметров окон и локальные хранилища потоков. Суть способа состоит в нестандартном использовании стандартных областей, скажем, хранить ключи, пароли: и т.п., совсем не там, где их будут искать при взломе в первую очередь.

Использовать операции сравнения нестандартными способами, во избежание их явного присутствия. Для сравнения есть определенные инструкции микропроцессора, о которых знают и разработчики и хакеры. А если попытаться использовать нестандартные виды сравнения, то можно слегка запутать хакера, ожидающего стандартного ответа.

Избегать обращений к переменным, относящимся к защите напрямую. То есть использовать любые косвенные способы доступа к специальным областям.

Использовать метод "зеркалирования" событий, то есть применять нестандартные действия на стандартные вызовы. Об этом говорилось выше.

Использовать для шифрования надежные, проверенные временем алгоритмы и т. д.

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


Защиту от копирования аудио-компакт-дисков Key2Audio, которую недавно внедрил ряд звукозаписывающих компаний, можно взломать при помощи обыкновенной ручки-маркера.

Это выяснили некие анонимные исследователи, распространившие информацию о своём открытии в Интернете, сообщает Reuters.

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

Это ограничение распространяется как на компьютеры PC, так и на Macintosh (некоторые машины этой платформы при использовании таких дисков зависают), а также на некоторые модели портативных и автомобильных проигрывателей. Обычные же домашние аудиоустройства проигрывают такие диски без проблем.

Обойти эту защиту оказалось достаточно просто: если "ложный трек" закрасить обычным маркером, то остальное содержимое защищённого диска легко может быть прочитано компьютером и, следовательно, скопировано на жёсткий диск или другой носитель информации


По материалам статей:
Павел Ткачев, Александр Синицкий, Павел Хлызов, Владимир Горчаков, Сергей Карловский
УДК 638.235.231 "ИСПОЛЬЗОВАНИЕ ПРОГРАММНО-АППАРАТНЫХ СРЕДСТВ ДЛЯ ЗАЩИТЫ ИНФОРМАЦИИ НА КОМПАКТ-ДИСКЕ ОТ НЕЛЕГАЛЬНОГО КОПИРОВАНИЯ И ТИРАЖИРОВАНИЯ"

Новичков Александр
Анализ рынка средств защиты программного обеспечения от несанкционированного копирования.


Литература:

1. International standard. Audio recording – compact disk digital audio system. CEI/ IEC 60908. February 1999.

2. National Standard of Accredited Standards Committee X3. Working draft. Project X3T9.2-375D. Revision 10L. September 1993.

3. American National Standards Institute, National Committee on Interface Technology Standards T10. Working draft. Project T10/1363-D. Revision 01. March 2000.

4. American National Standards Institute, National Committee on Interface Technology Standards T10. Project 333-2000. May 2000.


Clone CD взять можно тут

Оглавление


© Колесников Дмитрий Геннадьевич Rambler's Top100 Учебник по СайтоСтроению