Большая книжка хакера
Техника и философия хакерских атак
О чем эта книга
"... В моем уме не оставалось места для беспокойства об успехе или провале книги. Было лишь желание работать над ее созданием." Ф. Херберт. "Еретики Дюны".
Эта книга не предназначена специально для кракеров. Несмотря на то что в ней рассматриваются и даются в виде законченных технологий механизмы атак на широко распространенные системы, эту информацию не следует принимать как руководство к действию. В любом случае правовую ответственность за компьютерный вандализм еще никто не отменял и прежде чем использовать полученные знания на деле, неплохо бы ознакомиться с уголовным кодексом и запастись адвокатом.
Не предназначена эта книга и для разработчиков защит. Я не хотел делать упор ни на одну из социальных категорий, потому что проблемы защиты информации скорее организационные, чем технические. Разработчики ПО не нуждаются в таких книгах и вообще редко прислушиваются к советам по реализации защитных алгоритмов, а хакеры от всего этого просто балдеют и морально разлагаются, теряя стимул к развитию.
Термин "хакер" имеет множественные трактовки, которые было бы бессмысленно перечислять здесь и тем более останавливаться на какой-то из них, игнорируя остальные. Но в лучшем значении хакер — это индивидуал, смотрящий в корень и стремящийся разобраться во всем до конца. Для таких людей и предназначена эта книга.
Большая часть этой книги посвящена истории и социологии. Такова уж специфика проблемы защиты информации. Кроме того, знание истории — долг каждого культурного человека. Невозможно глубокое понимание предмета без четкого представления его основ. Везде, где это только возможно, я буду стремиться к обобщению и постараюсь не акцентировать внимание на конкретных реализациях. Это не означает, что в книге не встретится законченных схем. Напротив, в них не будет недостатка. Но я не ставлю перед собой цель снабдить хакера готовым инструментарием.
Я даже не буду пытаться научить читателей "ловить рыбу", а рискну пойти немного дальше и дать навыки самообучения. Из любой самой нестандартной ситуации и при самом скудном инструментарии всегда можно найти выход. Типовые схемы часто оказываются бессильными и бесполезными. Любые навыки слишком привязаны к конкретному окружению. В наше время больших перемен уже поздно хвататься за традиционные схемы обучения. На обучение просто нет времени. Большинству программистов приходится осваивать новые технологии "на ходу", и задолго до конца обучения они уже полностью устаревают.
Возьмем популярную платформу Windows, находящуюся в состоянии бурного развития. Разве можно сопоставить наше время с вялым развитием компьютерных систем только десятилетней давности? Объем электронной документации для сегодняшней платформы Win32 (MSDN) перевалил за отметку одного гигабайта и стремительно продолжает расти!
Системы зашиты, заметны, развиваются заметно более медленно и ничего принципиально ноцого за последние год-два не было придумано нли широко внедрено. Это обнадеживает, особенно на фоне деградации качества реализации широко распространенных систем безопасности.
С другой стороны, толковых учебников и изданий по данной тематике тоже не выходило. Это привело к тому, что действительно грамотно спроектированных и качественно реализованных защит сегодня на массовом рынке практически не наблюдается. Большинство авторов, с трудом припоминая школьный курс алгебры, разрабатывают собственные алгоритмы, которые при близком рассмотрении криптостойкими не являются. Все математическое богатство валяется бесхозным и нетронутым, хотя на рынке достаточно много качественных и вполне современных изданий. Я не стремлюсь повторить уже проделанную работу, а просто буду отсылать по ходу дела к конкретным источникам.
Цель этой книги — научить читателя самостоятельно добывать необходимые ему знания и навыки, порой не имея соответствующей литературы и информации. Современное информационное изобилие приводит к атрофированию навыка самостоятельного получения необходимых знаний. Парадоксально на первый нзгляд, но недостаток литературы развивает и тренирует мозги куда лучше, чем ее избыток. Сам я осваивал ассемблер 8086 с помощью утилиты : кроме нее (и свободного времени) у меня в ту пору не было ничего. Логика работы команд изучалась анализом воздействия последних на регистры и память. Эта было утомительное занятие, и свободное владение ассемблером (без учета ряда некритичных команд) ко мне пришло приблизительно через три месяца. Наличие инструкции сократило бы этот срок до двух-трех дней (с учетом знания ассемблера других платформ), но зато не дало бы никаких полезных навыков.
Инструкция исключительно редко бывает исчерпывающей и доступной. Полученные давным-давно навыки актуальны для меня до сих пор, ибо тенденция обратной зависимости качества инструкции от ее объема в последнее время стала угрожающе превращаться из метафоры в реальность.
Главный психологический барьер для многих — это ощущение беспомощности перед компьютером. Человек ощущает себя не хозяином ситуации, а незадачливым экзаменуемым, наобум пытающимся угадать, чего же от него хочет машина. Знакомая ситуация: вызываемая функция упрямо ведет себя не так, как описано в документации, и не работает. В данном случае не помещает прибегнуть к дизассемблированию и анализу ситуации, но, возможно, оптимальным окажется другое решение. В любом случае возможны свои нетривиальные варианты. Наивно полагать, что схема "нажал на кнопку — получил банан" работает но всех ситуациях. Или что банан непременно удастся достать с помощью палки либо ящика. А если нет? Если задача не имеет известного и опробованного решения? Вот тогда и приходится действовать, как говорят, "по обстоятельствам". Научить этому читателя — моя задача.
История хакерства
"Попытка понять Муаддиба, не поняв его смертельных врагов, — это попытка увидеть правду без знания лжи. Это попытка понять, что такси свет, не зная, что такое тьма. Это просто невозможно."
Ф. Херберт "Мессия Дюны"
"/ remember the gond old days, when computers wen mainframes, analysts were rna^icians.and program mars punced cards..." Philip Fites, Peter Jolinston, Martin Krat?. "Computer viruses crysis"
Рассвет. Первые лучи
Первые хакеры появились задолго до возникновения компьютеров, более того задолго до зарождения цивилизации и даже появления человечества. Первых открытием хакеров было удивительное свойство палки, позволявшее использовать ее одновременно как орудие охоты, обороны и многих других целях Нетривиальное, за гранью обычного, восприятие мира — вот главная черта хакеров. Им мало просто видеть предмет в трех измерениях. Для хакеров каждых предмет связан с определенными свойствами и включен в определенные причинно-следственные отношения.
На протяжении всей истории человечества всегда находились люди, которые выходили за рамки господствующих установок и традиций, создавая свою философию и субкультуру. По иронии судьбы хакерство оказалось тесно сплетенным с криминалом. Так было во все века, так и будет до самого последнего вздоха человечества. Почему? Хакер стремится разобраться во всем до конца, понять все до мельчайших подробностей, выйти за область определения объекта, проанализировать и испытать его поведение во всех нештатных ситуациях. От "простого смертного" хакера прежде всего отличает исчерпывающее знание предмета. Абсолютное знание по умолчанию подразумевает абсолютную власть над системой. Очень трудно устоять перед искушением и открывающимися перспективами.
Между взломом компьютерной системы и механического сейфа нет принципиальной разницы, что бы об этом ни говорили. Так что хакеры были всегда и некорректно связывать их существование только с ЭВМ и компьютерными технологиями.
Очередной каприз истории: именно длительная компьютерная анархия позволила легально развиваться широкому кругу личностей, которые в других отраслях прочно ассоциировались с криминалом. Впрочем, и раньше существовали радиолюбители, которые обходили электронные системы сигнализации, перехватывали секретные передачи и конструировали удивительные по своей природе устройства.
Между такими радиолюбителями и хакерами нет качественной разницы. Более того, обычно работа с компьютером связана с интересом к электронике, и обычное хакерскос любопытство затрагивает не только компьютерные, но и любые другие системы защиты.
Я понимаю, что данная трактовка является моим субъективным мнением и может встретить возражения. И тут мы приходим к обычной лингвистической проблеме. В самом деле, любой термин может менять свое узкое "словарное" значение в ходе развития языка.
Обратимся к лучшему на сегодняшний день исследованию хакерской культуры, Словарю Жаргона Э.С. Раймонда (заметим, что моя трактовка никак не противоречит традиционной, но лишь расширяет ее):
":hacker; [originally, someone who makes furniture with an axe] n. 1. A person who enjoys exploring the details ot programmable systems and how to stretch their capabilities, as opposed to most users, who prefer to learn only the minimum necessary. 2. One who programs enthusiastically (even obsessively) or who enjoys programming rather than just theorizing about programming. 3. A person capable of appreciating {hack value}. 4. A person who Is good at programming quickly. 5. An expert at a particular program, or one who frequently does work using it or on it; as in 'a UNIX hacker'. (Definitions I through 5 are correlated, and people who fit them congregate.) 6. An expert or enthusiast of any kind. One might be an astronomy hacker, for example. 7. One who enjoys the intellectual challenge of creatively overcoming or circumventing limitations. 8. [deprecated] A malicious meddler who tries to discover sensitive information by poking around. Hence 'password hacker', 'network hacker'. The correct term is {cracker}."
Но в рамках данной книги мы будем говорить исключительно о компьютерных хакерах. По непроверенным историческим данным, компьютеры, изначально созданные для узкоспециализированных военных задач, именно хакерами были воспринять] как платформы с поистине безграничными возможностями. В то далекое время математики занимались исключительно гипотетическими машинами, которые имели очень отдаленное отношение к действительности. Воплощенные в металле, инженерные идеи обогнали на десятилетия вперед даже знаменитых математиков. Предложенная дискретная архитектура была совершенна и существует до сих пор, приведя к развитию соответствующей дискретной математики, большей частью описывающей то, что инженеры давно воплотили в жизнь. Так изначально практические компьютерные технологии оставили позади математические модели.
Сегодня нам трудно представить, что было время, когда компьютеры обслуживались технической элитой, решавшей рутинные, ''спущенные сверху" задачи. Впрочем, для начальства не было секретом, что свободное (и не только свободное) машинное время использовалось для личных нужд и неследований персонала. Так и зарождалась субкультура людей, которые открыли в грохочущем монстре вторую Вселенную, свое второе Я.
Чудовищное отставание нашей страны в области вычислительной техники, жесткая дисциплина, постоянные репрессии привели к тому, что субкультура хакеров, да и программистов, возникла в стенах лабораторий США и уже оттуда распространилась на весь мир. Как следствие, эта сфера большей частью американизирована, особенно у нас, на фоне массового использования американской, а не "родной" программно-аппаратной базы.
Документированная история американского хакерства берет начало от все того же Словаря Жаргона Рэймонда.
Лаборатория искусственного интеллекта в США и PDP-1
"Нет четкой грани между богами и людьми: одни переходят в других."
Ф. Херберт. "Мессия Дюны".
Персонал, обслуживавший правительственные компьютеры, относился к работе серьезно и машинное время жестко протоколировалось, поэтому хакерство в то время было настолько экзотической редкостью, что не оставило заметного следа в истории. Нам остается только гадать, а существовали ли в самом деле хакеры во времена машин масштаба ЭНИАКа? Будем надеяться. Достоверно известно лишь то, что уже тогда сотрудников частенько увольняли за отклонение от технологических режимов работы аппаратуры. Было ли это следствием халатности или попытки получить от машины больше, чем предусмотрел ее создатель, уже нельзя установить.
В 1954 году был разработан первый массовый компьютер UNIVAC. Стоимость этого компьютера вполне позволяла ряду корпораций приобрести его для своих нужд. Обычно это были крупные технологические и исследовательские центры.
Впервые доступ к ЭВМ смогли получить гражданские лица. Помимо основной деятельности компьютер загружали бесполезными, но очень любопытными задачами. Появились первые головоломки и компьютерные парадоксы — такие, как программа, которая распечатывает свое содержимое или стирающая сама себя. Не принося никакой материальный выгоды, они имели только познавательную ценность и способствовали развитию информатики как отдельной дисциплины.
В то время всем уже было ясно, что будущее принадлежит этим электронным вычислителям и обеспечить его должны были профессионалы. Но специалисты не возникают сами по себе. Для этого требуется обучение и солидная материальная база. Осознав это, американцы начали поставлять ЭВМ в лучшие институты страны. Первые компьютеры на основе процессора PDP-1 были размещены в подвалах учебных заведений в начале шестидесятых годов. Отсюда и берет свое начало история хакерства.
Но даже в Америке никто не мог предвидеть, к чему это приведет. Новая электроника завоевала сердца тысяч студентов и они были готовы сидеть за машиной круглыми сутками, отказывая себе в еде, сне, отдыхе.
Эти люди и были первыми хакерами, оставившими едва заметный, но все же сохранившийся исторический след. Сложилось так, что хакер прежде всего социально ассоциируется со студентом. По определению, хакер — это человек, располагающий неограниченным свободным временем, которое он проводит наедине с машиной. Иначе и быть не может: копание в недрах железа и операционных систем требует не только определенного склада ума и характера, но и времени.
Коммерческий программист, какими бы не были его наклонности, имеет очень мало шансов стать хакером. Работая по заказу, ограниченному жесткими временными рамками, он просто не в состоянии углубляться в дебри чужеродного кода или ценой трех бессонных ночей сокращать уже до предела оптимизированную программу на один байт.
Это не значит, однако, что все хакеры были исключительно студентами. В те времена темпы развития вычислительной техники существенно отличались от сегодняшних и на разработку ПО отводилось достаточно много времени, так что познавательные эксперименты не были недостижимой роскошью. Особо отметим, что оптимизация тогда была не только показателем "крутости" программиста, но и необходимостью. При существовавших ограничениях памяти, скорости и возможностей периферии на той технике могли программировать лишь гении.
Хакерство на данном этапе ассоциировалось с изящностью программирования и профессионализмом. Компьютеры вызывали чувство глубокого уважения, и никто не мог представить, что когда-то возникнет такое малопринтнпе явление, как компьютерный вандализм. За машинами работал цвет интеллигенции. Это были культурные парни, и они могли что-нибудь испортить только по ошибке.
Но и на этом фоне заметно выделялась лаборатория искусственного интеллекта МIТ (Массачусстский технологический институт Massachusets Institute of Technology), в которой работали сливки компьютерной общественности. Со временем эти люди, разъедутся по другим городам и займутся другой работой. распространяя повсюду свой жаргон и стиль жизни. Но об этом расскажем несколько позже.
Вторым центром хакерства в Америке был Корнеллский университет, расположенный в пригороде Бостона. Лояльное отношение к студентам и предоставление "ночного машинного времени" способствовало развитию интереса к вычислительной технике и формированию хакерских традиций. Это поколение навсегда оставило след в истории "звездными войнами", открыв тем самым возможности компьютера как игровой платформы. Первые образцы ANSI-искусства были созданы именно Корнелловскими студентами. И хотя сегодня уже трудно установить, кто первым применил символьный терминал для передачи графического образа, этот человек несомненно был хакером. Способность заставить систему делать то, чего никак не ожидал ее разработчик, поистине заслуживает восхищення. В СССР же картины, созданные на принтерах типа "Ромашка", появились гораздо позже и явно были копиями западных.
Поскольку СССР был тоталитарным государством, хакерство сформировалось здесь с большим опозданием и открыто подражало западной культуре. Доступ студентов к компьютерам был жестко ограничен, и хотя на фоне слабых преподавателей знания отдельных студентов могли показаться достаточно глубокими, эти "выскочки" так и остались в одиночестве.
Последнее явление вообще стало национальной чертой русского андерграунда. Отсутствие клубов и разобщенность людей не способствовали развитию собственной субкультуры.
Центрами возникновения отечественных хакеров стали не нищие ВУЗы, а производственные предприятия и НИИ. Не секрет, что в то время в журналы загрузки машинного времени часто писали "липу", а рабочее время использовали для удовлетворения собственного любопытства.
Но вернемся в подвалы лаборатории М1Т. Трудно сказать почему именно здесь сложились благоприятные условия и хакеры росли как на дрожжах. Еще труднее сказать, что заставляло многих людей проводить ночи напролет, отказывая себе во всем, возле грохочущих телетайпов, клацающих реле и перемигивающихся огоньков. Психологи пока не ответили на вопрос, почему одни открывают в компьютере свою Вселенную, а другие не в состоянии увидеть в нем ничего, кроме груды металла, кремния и пластика?
Почему сегодня трудно представить хакера, поклоняющегося системе Windows, но мы совершенно отчетливо видим хакера, прокалывающего дырки на перфокарте? Дело в том, что Windows не является миром, который позволяет выражать собственное Я. В ее создании принимали участие сотни и тысячи людей, каждый из которых вносил часть своего видения мира, — в результате система потеряла общую концепцию и напоминает старый чулан где немало действительно блестящих и красивых инженерных решений скрылись под густым слоем пыли.
Заслуга разработчиков PDP в том, что они смогли создать не только идеологически целостную, но и настолько гибкую архитектуру, что выражение программистской мысли на ней превратилось в сущее удовольствие.
По непроверенным данным, первый PDP-1 был создан именно М1Т. Если это верно, то не приходится удивляться, что именно тут сформировалась особая субкультура людей, которые были настоящими волшебниками больших машин. Язык определяет стиль мышления, поэтому мышление программиста постепенно преображается под воздействием используемой архитектуры в образ мышления ее создателя. Это настолько очевидно, что никто из психологов в этом не сомневается.
Немного утрируя, можно сказать, что возникновением хакерства — такого, каким мы его знали в 60-х годах, — мы целиком и полностью обязаны человеку-легенде Кену Оулсену (Ken Olsen), основателю компании DEC и ведущему разработчику аппаратного обеспечения. Без сомненья, он был хакером и его образ мышления невольно копировали все пользователи его детища в течение двух десятков лет. Действительно, нужны чертовски нетривиальные мозги, чтобы создать компьютер, который стоил всего 120.000$, тогда как майнфреймы IBM обходились в миллионы. Конечно, майнфреймы IBM заведомо превосходили PDP, но последняя имела неповторимую архитектуру, сохранившую привлекательность и до сих пор. Даже в наше время суперпроцессоров Pentium PRO немало людей с упоением программируют на ассемблере PDP, используя эмулятор или даже сохранившееся аппаратное обеспечение.
Я не хочу бросать камни в огород других фирм, но шедевр PDP никто из них не повторил, да, похоже, не особо к этому и стремился. Популярность PDP обеспечивает и тот факт, что это машина профессионала и для профессионала. Низкая скорость компенсируется изящностью и гибкостью выражения программистской мысли. Более того, именно критически низкие ресурсы послужили мощным толчком к глубокому изучению команд процессора и заставили программистов проводить бессонные ночи в поиске нужных комбинаций расположения сотен байт в скудной оперативной памяти. На больших машинах это было попросту ненужно: ресурсов хватало даже для выполнения достаточно "кривого" и необдуманного кода.
Именно в PDP нашли свой рай компьютерные гуру. Ее успех способствовал росту поставок DEC, расширению фирмы, а вместе с ним — возникновению полноводного хакерского течения в лабораториях крупнейших университетов.
Этот процесс оказал решающее влияние на последующее развитие хакерстца. Сегодня нам уже не понять психологию людей, работавших на машинах того времени. Средства ввода-вывода, а тем самым и язык общения с машиной, изменились коренным образом.
Клавиатуру и терминал никак нельзя сравнить с тем воистину магическим процессом, когда оператор вручную вводил с пульта программу загрузки, а затем мигающий огоньками исполин заглатывал стопку перфокарт и после длительного размышления выдавал узкой лентой результат, часто даже в двоичном виде.
Люди в белых халатах, стерильный воздух... все это безвозвратно ушло в прошлое и унесло с собой культуру компьютерных жрецов. Сохранившиеся ее элементы утратили прежнее значение. PDP-1 сегодня может быть редким музейным экспонатом, познавательной игрушкой в форме эмулятора или памятником инженерного гения, но живой машиной она не станет уже никогда. Ее дух ушел вместе с хакерами того времени...
Но ростки, пущенные PDP-1, живы и по сей день.
Сеть
"Ива сгибается под ветром, пока не разрастется и не встанет стеной на его пути. В этом ее предназначение."
Ф. Херберт. "Дюна",
До конца шестидесятых годов хакеров можно было сопоставить с античными Мастерами. Хак ассоциировался с высшим профессионализмом и вытекающей из него культурой поведения. Тесная связь культурного и интеллектуального уровней давно отмечалась психологами. Из этого правила, конечно, бывают исключения, но они редки и не меняют общей картины. А картина до конца шестидесятых годов была следующая — в условиях полной замкнутости и отсутствия какой-либо связи между компьютерными центрами страны каждый программист должен был получить необходимые ему знания САМ. Это был долгий и тернистый путь. Информатика тогда лишь зарождалась, и даже эффективные алгоритмы и приемы еще не были канонизированы и широко известны. Как бы ни был очевиден древовидный поиск или линейная сортировка, но до них нужно было додуматься самому и — увы — далеко не один раз. Как следствие, все алгоритмы десятки раз открывались заново, прежде чем информация о них успевала дойти до адресатов "естественным" путем — через книги и университеты.
Обмен знаниями происходил только в узких рамках университетских или лабораторных общин. В этих условиях компьютерный вандализм просто не мог возникнуть. "Паршивые овцы" быстро выявлялись и с позором выдворялись прочь. Да и было-то их очень немного. Машинное время и программистский труд очень ценили, и любая мысль о "завешивании" системы казалась кощунственной.
В лексиконе тогдашних хакеров еще не появилось оскорбительное слово "ламер". Не то чтобы среди них не было таковых, но программисты в то время намного лояльнее относились к непрофессионалам. Да и как бы можно было расценить такие оскорбления в тесных коллективах?
Сегодня, на фоне развитых сетевых коммуникаций, когда собеседники едва ли имеют шанс встретиться лицом к лицу в реальной жизни, ситуация кардинально изменилась. Электронное общение принесло вместе с неоспоримыми благами немало проблем, с которыми вынуждены сталкиваться сегодняшние хакеры. Первый камень этого здания был заложен в 1969 году. Тогда по инициативе Управления перспективных исследований Министерства Обороны США — Defense Advanced Research Projects Agency — создается первая вычислительная сеть, получившая название Advanced Research Projects Agency NETwork — ARPAnet.
ARPAnet сразу объединила несколько университетов, находящихся в разных концах США и продолжала стремительно расширяться. По очередной иронии судьбы, эта сеть планировалась не для передачи секретных сведений, а просто для обмена открытой информацией и электронной перепиской, поэтому разграничивающих доступ элементов в ее архитектуре не присутствовало. Это только лишний раз подчеркивает, что еще в конце шестидесятых годов не только не имели представления о вандалах, но даже не могли догадываться о их появлении
Именно этот недосмотр, унаследованный общеизвестной сетью Интернет, привел последнюю к состоянию сегодняшней анархии. Но не будем пока забегать так далеко вперед.
Сеть не только физически соединила компьютеры, но и духовно сплотила работающих за ними людей. Хакеры, привыкшие к малоподвижному образу жизни, порой и не знали, где географически находится их респондент — в соседней лаборатории или r другом штате. Интенсивное взаимодействие сотен и даже тысяч очень неглупых людей послужило невероятно быстрому прогрессу. Для тех времен было характерно открытое обсуждение и распространение технологий н инженерных решений. Любые недочеты быстро исправлялись, и программа (технология) уже в исправленном варианте отправлялась в сеть на следующий цикл доработки.
Времена, когда каждый изобретал свой велосипед, уже уходили в историю. Вместо бессонных ночей, проведенных в попытках решения задачи, теперь время тратили на поиск уже готовой информации в быстро набирающей силы сети. Не будем навешивать ярлыки, но именно эта легкость получения уже готовой информации без понимания ее сути и послужила толчком к появлению в Сети людей, которые ничего не делали сами н только копировали ресурсы других.
Число пользователей ARPAnet продолжало расти, и не всех из них можно было назвать хорошими парнями. Кроме того, ресурсы сети помимо собственно программистов начали использовать для служебной и деловой переписки и люди, далекие от компьютеров.
Прежняя монолитность компьютерного сообщества рухнула. Теперь далеко не каждый человек, сидевший за терминалом, был программистом. Все чаще и чаще он оказывался, выражаясь сегодняшней терминологией, юзером. Успех ARPAnet и совершенствование компьютерных технологий вели к тому, что ЭВМ превращалась в предмет массового спроса и потребления.
Хакерский жаргон становился знаком принадлежности к особой группе — касте компьютерных фанатов. В то время хакерство еще не было модным, и никому и н голову не приходило копировать его профессиональный сленг, да и особой нужды в этом у пользователей еще не было.
В конце шестидесятых годов компьютерные технологии шагнули далеко вперед, заменив телетайпы терминалами, а перфокарты — клавиатурой. Не в меньшей мере это отразилось и на возросших вычислительных мощностях. Машинное время выделялось уже в достаточной мере н позволяло решать задачи, о которых раньше никто и не пытался помышлять.
Ярким примером могут служить первые прототипы будущих вирусов программы-кролики. Не причиняя разрушений, они тем не менее были сконструированы так, что многократно копируя себя захватывали большую часть ресурсов системы, отнимая процессорное время у других задач. История их создания доподлинно не известна. Возможно, они явились следствием программной ошибки, которая приводила к зацикливанию и наделяла программу репродуктивными свойствами. Первоначально кролики (rabbits) встречались только на локальных машинах, но с появлением Сети быстро "научились" размножаться по последней. В конце шестидесятых годов была обнаружена саморазмножающаяся по сети APRAnet программа, известная сегодня как CREEPER (вьюнок), которая будто бы была написана Бобом Томасом (Bob Thomas). Вьюнок проявлял себя текстовым сообщением
"I'M THE CREEPER ... CATCH ME. IF YOU CAN"
("Я ВЬЮНОК ... ПОЙМАЙ МЕНЯ, ЕСЛИ СМОЖЕШЬ")
и экономно относился к ресурсам пораженной машины, не причиняя ей никакого вреда и разве что слегка беспокоя владельцец. Каким бы безвредным Вьюнок ни казался, но он впервые показал, что проникновение на чужой компьютер возможно без ведома и против желания его владельцев.
С появлением Creeper родились и первые системы защиты. Да, теперь компьютеры стали ценностью, которую следовало охранять не только от воров с отмычками и трейлерами (а на чем еще можно было увезти компьютеры того времени?), но и от разрушительных или злоумышленных команд, проникающих по сети или через магнитные носители.
Первым шагом в борьбе против Вьюнка стал Жнец (REAPER), репродуцирующийся наподобие Creeper-a, но уничтожающий все встретившиеся ему копии последнего. Мы не знаем, чем закончилась борьба двух программ. Так или иначе от подобного подхода к защите в последствии отказались. Однако копии обеих программ еще долго бродили по сети...
Предназначенная изначально для обучения и обмена информацией Сеть стала открытыми воротами на пути зарождавшегося компьютерного вандализма. Именно та легкость и доступность информации приведет через несколько лет к тому, что безграмотные и озлобленные маньяки получат н руки практически готовые технологии и инструментарий, чтобы потом употребить их для своих черных дел.
Именно Сеть впоследствии вынесет компьютеры из лабораторий и поставит их "персоналками" на рабочие столы; разрушит атмосферу отношений, царившую в компьютерном мире шестидесятых-ссмидесятых годов. Позже деградация образования и общества уничтожит хакерский дух. Уже в восьмидесятых останутся лишь отдельные одиночки, хакерство как общественное движение прекратит свое существование. Но мы слишком забежали вперед. Вернемся вновь к концу шестидесятых — началу семидесятых годов.
Си и UNIX
"Легкие мои вдыхают ветер времени. Дующий над мертвыми песками..."
Ф. Херберт. "Дюна".
В 1969 г. усилиями двух талантливых программистов была создана система, сформировавшая не одно поколение хакеров н заложившая основы современных операционных систем. Я говорю о UNIX, разработанной К.Томпсоном и Д.Ричи, недущими инженерами Bell Laboratories — подразделения American Telephone & Telegraph (AT&T). UNIX была первой системой, написанной на компилируемом языке. Так и хочется закончить — языке высокого уровня. Но уникальность Си и заключалась как раз в том, что он не походил на существующие в то время гипотические и алгоритмические языки. Си, сочетая в себе возможности низкоуровневого доступа, "отвязанные" от конкретной реализации, больше походил на кросплатформенный ассемблер. Такая идеология языка позволила создавать эффективные компиляторы и получить быстродействующий и компактный код.
Си завоевал сердца многих хакеров своей лаконичностью, краткостью, красотой и гибкостью выражения инженерной мысли.
Понравился он (и активно используется по сей день) и прикладным программистам. Именно поэтому во многих программах столько ошибок. Си все же не является прикладным языком. Для работы с ним нужно тренированное системное мышление. Ничто не убережет программиста от неверных указателей и выхода за рамки массивов. Никто не позаботится завершить строку разделяющим нулем, если программист это явно не укажет в программе.
Но все же Си находится в совсем другой плоскости, чем ассемблер, и никак не освобождает истинных хакеров от знаний последнего. "Родной" язык не может быть вытеснен никакой другой высокоуровневой прослойкой. Пусть он потерял актуальность с появлением Си и быстродействующих процессоров, но в программировании непосредственно железа есть то магическое очарование, которое побуждает многих изучать его даже сегодня — в конце девяностых.
Однако мы опять забегаем вперед. Создатели UNIX, разработавшие ее для своих нужд, вряд ли представляли себе, какого джина они выпускают из бутылки. Язык формирует мышление, и эти два хакера определили мышление миллионов людей по крайней мере на два десятилетия вперед. Не секрет, что продукты "внутрифирменного использования" очень часто представляют собой жалкое зрелище, поскольку работодатели редко позволяют вкладывать деньги и ресурсы в изначально некоммерческий продукт. В свете этого шедевр UNIX-a кажется еще больше поразительным и необъяснимым.
Система не только вобрала в себя лучшие по тем временам многопользовательские решения, но была невероятно устойчива в работе и неплохо защищена. Разграничение затрагивало не только пользовательские, но н системные ресурсы. Именно UNIX послужила тем барьером, который приостановил попытки вбрасы-вания Кроликов в сеть. На несколько лет компьютерный мир вновь обрел устойчивость.
Успех системы позволил AT&T значительно усилить свои позиции на рынке. UNIX. в противоположность системе Windows 90-х годов, не только был удачной платформой, но и дружелюбной к профессионалу средой, развивающей абстрактное мышление, способствующей умственному и в конечном счете культурному развитию.
Конец хакеров шестидесятых
"Я не должна бояться. Страх убивает разум. Страх — малая смерть, которая приносит полное уничтожение. Я смотрю в лицо моему страху..."
Ф. Херберт. "Дюна".
Шагнем на пару лет вперед. Это были годы непрерывного совершенствования технологий программирования и аппаратного обеспечения. Росла вычислительная мощь ЭВМ, емкость периферийных накопителей и быстродействие центрального процессора. Собственно говоря, в то время все упиралось скорее в деньги, чем в технологии. Если клиент хотел решать с помощью компьютера серьезные задачи, то получение необходимой машинной мощности зависело только от его кошелька. Производители компьютеров заметно обгоняли в те годы потребности клиентов.
И необходимость в высокопрофессиональных программистах и тщательно оптимизированном коде мало-помалу начала отпадать. Ярким подтверждением тому была UNIX, полностью написанная на компилируемом языке. Могли ли программисты представить такое расточительство хотя бы пару лет назад? Си стал первым кирпичом в фундаменте быстрых средств проектирования, на котором сегодня построены такие чисто визуальные системы как Visual Basic и Delphi.
Время обучения программистов резко сократилось, и былые профессионалы становились во многих местах просто не нужны. Было бессмысленно оплачивать их квалификацию, когда множество людей соглашалось работать на куда более худших условиях.
Это вызвало приток специалистов в фирмы, специализирующиеся сугубо на программном обеспечении. А таковые появились во множестве, поскольку UNIX стала кросс-платформенной системой и программы, написанные для одной модели компьютера могли с минимальными переделками работать на любой другой.
И тут началось самое интересное. Если прежде, в отсутствие конкуренции, время, отведенное на разработки, было, как правило, практически не ограничено, а конечная стоимость не критична, то теперь каждый стремился обогнать другого. Это соревнование не проходило безболезненно. И в первую очередь страдал код, вернее его качество. Стремясь снизить издержки, руководство фирм вынуждало инженеров использовать все пути удешевления и ускорения разработки.
Если бы этим все и ограничилось, то было бы полбеды, и конце концов настоящий художник проявил бы себя и в таких условиях. И код. написанный даже в условиях этой сумбурной спешки настоящим хакером, все равно бы нес в себе долю оригинальности и собственного "я" программиста. Однако, стремясь максимально эффективно использовать труд людей, руководство разделяло коллектив на небольшие группы из трех-пяти человек, каждый из который решал свою локальную задачу, тесно зажатый ее рамками.
Творить и показывать свою индивидуальность в этих условиях стало попросту невозможно. И профессионалы начали потихоньку разбегаться. Кто-то пытался организовать свою фирму, кто-то вообще уходил из поогпаммиоовйпия. Будучи не в силах переломить ситуацию. Одним словом, хакерскому сообществу шестидесятых пришел конец. Уходили хакеры, а вместе с ними как туман рассеивалась их культура. Нет, никогда не вернуть то время, те машины, тот исследовательский дух, когда компьютеры были еще чисто научной, но никак не коммерческой игрушкой.
Коммерция и жажда наживы поглощала все. Главным критерием становилась скорость написания продукта, какого бы он ни был качества. Любые недостатки и ошибки программного обеспечения не обнаруживаются сразу и всегда есть время их устранить... потом, когда клиент, поверивший рекламе, вложит деньги в ваш товар и приобретет его. Кто первым выбрасывает на рынок продукт, тот и захватывает его. Таков закон. Собственно под "сопровождением ПО" почти любая фирма понимала его доработку и доведение из сырого состояния в некоторое подобие законченного продукта.
Быть может, я сгущаю краски? Каждый имеет право на свою точку зрения и видение ситуации. Нужно быть большим оптимистом, чтобы увидеть хоть что-то хорошее в этой конкурентной борьбе и спекуляции старыми идеями и технологиями, которая просто вышвырнула многих специалистов на обочину дороги. "Крутой поворот", как любит выражаться Билл Гейтс, на этот раз и вправду оказался настолько крутым и непредвиденным, что никто не успел к нему как следует подготовиться.
Весь научно-технический потенциал в то время не хранился за "семью печатями" и мог свободно использоваться кем угодно и как угодно. Этим-то и воспользовались коммерсанты, умело превратив его в "живую деньгу", вырученную от продаж компьютеров и программного обеспечения. Зачем было вести свои разработки, когда имелись уже готовые?
Позже, конечно, ситуация изменится, но в самом начале семидесятых она складывалась именно так. Впрочем, профессионалы, инженеры и ученые предвидели, что существующие технологии исчерпают себя в ближайшие несколько лет. Разумеется, компьютерные "магнаты" также это предвидели и были вовсе не в восторге. С некоторым запозданием они все же начали спонсировать частные исследования и нанимать на работу талантливых инженеров, требуя от них только одного — технологий, которых не существовало у конкурентов.
К сожалению, инженерный персонал находился в довольно жестких рамках. Однако некоторая свобода творчества оставалась — впрочем, ею могла пользоваться лишь "верхушка" разработчиков — идеологи проекта. С другой стороны, в этом был определенный здравый смысл. Рядовые инженеры являлись лишь инструментом в руках "архитектора" и чем послушней был этот инструмент, тем удобнее им было управлять.
Невозможно однозначно сказать — плохо это или хорошо. Новое время устанавливало свои законы, подрывая старые устои и ломая судьбы десятков тысяч людей.
С другой стороны, такая организация труда позволяла получать качественно новые результаты, и новые технологии стали плодиться как грибы после дождя. Научный прогресс ускорился, опровергая общепринятый тезис, что наука и творчество едины. Оказалось, что они даже не взаимосвязаны. Американцы переняли лучшие черты советской плановой экономики и производства и добились при этом подходе впечатляющих результатов.
• Хакеры шестидесятых вырождались. Не было больше "больших" машин и открытого духа свободного общения. С каждым днем все больше и больше находок и неординарных решений окутывались мраком коммерческой тайны и тщательно охранялись фирмой от окружающих.
Красивые решении уже никому не были нужны и никого не интересовали. Возможности компьютеров того времени были уже достаточны, чтобы "небрежно" написанный код удовлетворял заказчика по всем параметрам (скорости, объему). "Железо" дешевело куда быстрее программного обеспечения. Легче было купить вчетверо более мощный компьютер для небрежно написанной дешевой программы, чем приобретать для дешевой машины оптимизированный до последнего байта код, стоимость которого в этом случае была бы просто астрономической. Так, к примеру, средняя стоимость UNIX в семидесятых годах составляла шесть-семь тысяч долларов и была доступна далеко не всем желающим.
RSX-11M
"Подсмотреть будущее — значит украсть мистический огонь от священного костра."
Ф. Херберт. "Дюна".
В начале семидесятых еще никто не представлял себе, какого размаха достигнет компьютеризация через десяток-другой лет. Никто не догадывался, что новая ориентация на микрокомпьютеры сметет монстрообразные машины того времени с лица земли. Все шло своим чередом, и вроде бы ничто не предвещало бури.
Некоторые компании, пытаясь захватить ничейный рынок микрокомпьютеров, развернули свою деятельность в этом направлении. Вряд ли они догадывались о том, какой выгодной их позиция станет через несколько лет, поэтому и не прилагали особых усилий, чтобы удержаться на этом месте подольше. В то время эта ниша рынка никого не интересовала. Уж больно неприбыльным и бесперспективным казался в то время компьютер, рассчитанный на массового покупателя.
Однако "свято место пусто не бывает" и "природа не терпит пустоты". А вот в отношении операционных систем для PDP-11 появился заметный вакуум. UNIX требовала на несколько порядков больше мощности и попросту нс могла работать на компьютерах такого класса. 32 килобайт памяти было недостаточно, чтобы разместить такого монстра.
И в 1971 году компания DEC решилась создать собственную операционную систему RSX-1 1М. Необходимо было поддержать многозадачность, планировщик, иерархическую файловую систему, виртуальную память. На все это отводилось только 16 килобайт оперативной памяти, так как другие 16 килобайт было решено отдать приложениям.
Разумеется, выбор пал на ассемблер. В то время, кстати, он претерпел первое серьезное изменение. Появились директивы условного ассемблирования. Это позволило легко модифицировать исходный текст — вносить одни фрагменты, удалять другие; и при этом всегда была возможность вернуться назад, если последнее изменение внезапно приводило систему к краху.
Благодаря этой новой технологии лучшие специалисты DEC смогли в бешеном темпе завершить свою работу за 18 месяцев. При этом операционная система получилась в конечном счете очень простой и сильно уступающей набирающей популярность UNIX. Но своего потребителя она все же нашла. Им стали многие средние предприятия, которые могли себе позволить купить несколько ЭВМ — по одному для каждого отдела. И их вполне устраивала мощность простого 16-разрядного процессора PDP.
Вскоре RSX-IIM получила завидную популярность, и объемы продаж стали весьма внушительными. Другие фирмы, пытаясь перенять этот успех, переносили существующие приложения на миникомпьютеры, чем вызвали первую волну переориентации разработчиков.
Возникал устойчивый рынок миникомпьютеров для "бедных" клиентов. В то время он еще не был таким перспективным, как сейчас, и не приносил миллионных доходов, но требовал от разработчиков изрядного таланта, позволявшего втиснуть изрядно "пожирневшее" за последние годы программное обеспечение в скудный объем памяти миникомпьютера, сохранив при этом приемлемое быстродействие.
Не было достаточно эффективных компиляторов, поэтому единственным выбором оставался ассемблер. Старым талантам вновь нашлась работа. Но теперь им пришлось бороться за рабочие места с молодым поколением. Неудивительно, что в новых коллективах царила совсем другая атмосфера... Новое поколение жило по своим законам. Информатика становилась все более массовым явлением, и в нее вливалось все больше и больше случайных людей.
Среди них были и те, кто не сомневался в успехе микрокомпьютеров и делал первые шаги по созданию Персонального Компьютера, доступного по цене для широких масс. Того, кому бы это удалось, ожидали чудовищные объемы продаж. Но для этого прежде всего было необходимо удешевить центральный процессор.
INTEL
"Солнце не просит о милосердии".
Ф. Херберт. "Дюна".
Фирма INTEL одной из первых рискнула сделать ставку на микропроцессоры для персональных компьютеров (впрочем, ни самого термина "персональный компьютер", ни микропроцессоров для них тогда еще не существовало: и те и другие еще предстояло изобрести). Персональные компьютеры еще назывались "интеллектуальными терминалами", и предполагалось, что они будут способны служить в системах управления и для арифметических вычислений.
Intel не обладала значительным начальным капиталом и вряд ли могла конкурировать с существующими фирмами. Все, что ей оставалось, — это вложить все средства в разработку микрочипа и занять ту нишу рынка, на которую пока никто серьезно не претендовал.
Такой чип впервые появился в 1972 году и вышел под кодовым обозначением 8008. Это была первая и очень простая модель микропроцессора, которая могла служить калькулятором, и не более того. Тем не менее тогда еще юный Билл Гейтс все же ухитрился создать на ее основе устройство для анализа городского траффика (движения). Разумеется, назвать это устройство компьютером было нельзя даже с большой натяжкой.
Но время не стояло на месте, а инженеры Intel нс сидели сложа руки. Через три года, весной 1974, журнал Electronics опубликовал сообщение о новом чипе Intel 8080. Это действительно был шедевр, который каждый мог приобрести всего за 200 долларов. Конечно, этому микропроцессору было далеко до "больших машин" .как по скорости, так и по архитектуре, системе команд, но для "персонального" использования он вполне годился.
Потребовалось меньше года, прежде чем в мире появился первый персональный компьютер на его основе — Altair. Но что это был за компьютер! С сегодняшних позиций нам очень трудно понять, что машина без клавиатуры, дисплея, и конечно, без каких бы то ни было накопителей могла называться "компьютером".
Однако это и был первый минимально функциональный ПК. Микропроцессор, немного оперативной памяти и сопрягающих микросхем — вот и все, что было нужно для работы этой груды железа. Единственным устройством вывода служили 16 индикаторов на передней панели, а устройством ввода — 16 переключателей. Собственно говоря, это была машина для радиолюбителей и электронщиков. Последние вообще могли просиживать ночи напролет, заставляя индикаторы перемигиваться самым причудливым образом. 4 килобайта памяти тогда казались более чем достаточными для таких целей. А вот отсутствие удобных средств ввода-вывода сильно обескураживало.
Поэтому практически каждый, купивший Altair, пытался в той или иной степени его модернизировать. Не будем забывать, что в то время он стоил 1000$ и позволить себе купить его могли только фанатично преданные электронике (или компьютерам) люди. Теперь они получали ЭВМ в свое личное распоряжение и могли экспериментировать с ней как им вздумается.
Почти все из них были "молодым" поколением, до этого нигде не работавшим, а, может быть, и не видевшим "серьезных" машин. Поэтому их не смущало, что система команд и архитектура микропроцессора фирмы Intel значительно уступала даже первым моделям PDP и требовала совсем иного мышления и подхода.
Разрыв в мышлении между старыми и новыми программистами был просто огромен. К тому же, если первые были большей частью образованными людьми, то последние — в основном кустарями, безусловно талантливыми, ко за исключением редких случаев так и не закончившими образования.
Но всех их объединяло большое чувство любви к технике и компьютерам. Не был исключением и Билл Гейтс, который вовсе не из-за денег в течение пяти месяцев создавал первую версию бейсика для Альтаира. Это было необычайное расточительство и без того скудных машинных ресурсов, но упрощало общение с машиной. Все же бейсик выучить было куда легче, чем бессмысленные (для большинства) команды ассемблера.
Впрочем, тогда эта версия бейсика так и не снискала популярности. Она оказалась слишком прожорливой, и программы еле-еле ползали. Но джин был выпущен из бутылки. С этого времени персональные компьютеры начали производиться многими фирмами и находили покупателей.
Хаос
"Хаос существовал в виде сырья, из которого творится порядок."
Ф. Херберт. "Дом Глав Дюны".
Перенесемся на десяток лет назад. Многие до сих пор помнят это время. Десятки моделей машин от разных производителей, совершенно не совместимые друг с другом даже на уровне переноса текстовых файлов данных. Это стало настоящим бедствием для программистов восьмидесятых годов. Обмен программным обеспечением был невозможен. Портабельных компиляторов не существовало. Более того, диалекты одного и того же языка реализовывались на каждой машине по-своему.
Словом, компьютерный мир находился в состоянии анархии и неудержимо катился в пропасть машинной несовместимости и полной разобщенности. Это порождало множество экономических и социальных проблем. Начнем с того, что преподавание в высших учебных заведениях информатики было очень затруднено невозможностью выбора одной конкретной платформы. Действительно, в дальнейшем обучаемый студент мог столкнуться с совсем другими моделями ЭВМ иной архитектуры.
Конечно, каждый грамотный инженер должен уметь осваивать технику по предоставленной документации (так оно к было). Но это требовало значительных затрат времени, в течение которого предприятие оплачивало обучение (а точнее, переобучение) инженера. В нашей стране, быть может, это и не было удивительно, но в капиталистических странах оплачивать из своего бюджета обучение персонала могли только крупные и солидные фирмы, да и те стремились брать на работу людей опытных и знающих. А "молодое поколение" оказывалось невостребованным. Фактически все держалось на старых кадрах.
Все это негативно сказывалось на развитии рынка программного обеспечений. Фактически все программы создавались инженерами тех предприятий, которым эти программы собственно и требовались. При этом чаще всего написанные пакеты оказывались бесполезными для окружающих, потому что последние обычно имели совершенно другие компьютеры. Иногда ближайший совместимый компьютер находился за сотни километров в совершенно другом городе.
Конечно, каналы распространения программ все же существовали. Но чаще всего приложения, написанные "для себя", не годились для остальных пользователей.
Это был "серебряный век" хакерства, особенно в нашей стране, когда требовалось перекроить чужую программку под свои нужды. Специалисты, умевшие это делать, высоко ценились руководством. Им позволялись вольности, недопустимые для простых смертных. Действительно, специалистов такого класса было немного. Хэкерству не учили в учебных заведениях, и в то время не существовало развитых средств обмена информацией. Нужен был изрядный талант, чтобы глубоко освоить системное программирование, как тогда было принято говорить, "без отрыва от производства".
Печально, однако, что незаурядные личности губили свой талант, работая простыми системными операторами, когда на Западе программисты подобного уровня устраивались в узкоспециализированные фирмы, где могли исчерпывающе реализовать себя. В России же в то время все ПО создавалось в основном на заводах, производящих ЭВМ.
При этом качество его оставляло желать лучшего. Может быть, среди читателей найдутся такие, которые до сих пор помнят некоторый шедевр отечественного компьютеростроения "Агат-9" и его на редкость корявую программную оснастку. Агат-DOS 3.3 не выдерживала никакой конкуренции даже с существующей в то время СР\М.
Разумеется, это не могло никого устроить и все пользователи этой машины первым делом садились за написание собственной операционной системы, удовлетворяющей хотя бы минимальным требованиям. Сегодня это выглядит средневековой дикостью, но в таком положении вещей были и свои плюсы. Написание ОС — дело непростое и требует обширных знаний, далеко выходящих за кругозор сегодняшнего поколения программистов. Причем маловероятно, чтобы устойчиво работающая ОС получилась с первого раза. По крайней мере, я написал десяток операционных систем для "Агата", из которых пользовался только тремя, а остальные забраковал еще на стадии написания.
Это же можно сказать и о прикладных программах. Практически все они были созданы самостоятельно. Конечно, это был глупый и пустой труд, но зато приобретенные навыки оказались бесценными. Полученные знания позволяли писать качественные, компактные, удобные в работе программы. Однако...
Однако мы забываем, что в то время существовали десятки разнотипных машин и это обесценивало большую часть проделанной работы при переходе на новую платформу. Это было настоящим проклятием для программистов. Менялся не только набор инструкций процессора и логика взаимодействия с периферией, но и сама концепция и архитектура.
Фактически было невыгодно покупать новые модели компьютеров. Увеличение вычислительной мощности не компенсировало необходимость переобучения персонала и переписывание всего необходимого ПО. Большинство предпочитало работать на старом оборудовании, попутно решая головоломную проблему ремонта вышедшей из строя техники. С каждым годом достать устаревшие (и уже снятые с производства) комплектующие становилось все сложнее.
Для предприятия было гораздо проще иметь собственного высококвалифицированного специалиста-электронщика, чем пытаться поддержать работоспособность парка машин любым другим способом. Но что же могло привлечь хороших специалистов на предприятия, мягко выражаясь, совсем другого профиля? Разумеется, только одно — возможность заниматься в рабочее время собственными исследованиями на предоставленной аппаратуре.
Все запуталось еще больше. Теперь центры кибернетики медленно мигрировали из вроде бы специально для этого предназначенных институтов на крупные предприятия и заводы, разбросанные по всей нашей стране. Доходило до того, что некий сибирский трубопрокатный завод имел вычислительную технику и штат сотрудников, которому мог бы позавидовать иной НИИ.
Бытовой компьютер восьмидесятых
"Наверняка человеческий мозг, в котором особым способом развиты сверхспособности, делающие его живым компьютером, до сих пор находит применение."
Ф. Херберт. "Бог — император Дюны".
В это время и наша отечественная промышленность достигла высот, позволявших выпускать относительно недорогие компьютеры для домашнего использования. Практически все они были основаны на 8-разрядных микропроцессорах, были оснащены несколькими десятками килобайт оперативной памяти, имели встроенный интерпретатор языка "Бейсик" и работали только с кассетным магнитофоном (в качестве внешнего накопителя) и телевизионным приемником (вместо привычного нам монитора).
По нынешним меркам это устройство равносильно программируемому калькулятору, только на порядок более неуклюжему и громоздкому. Возможности этих машин были более чем скромными, но в то время они казались грандиознымн. Народ проявлял изрядную изобретательность, пытаясь изобразить в знако-цифро-вом режиме нечто отдаленно напоминающее видеоигру.
При этом наша промышленность, как и следовало ожидать, не справлялась с удовлетворением возникшего спроса, и передовые модели бытовых компьютеров в магазине приобрести было очень тяжело. Однако это не стало помехой для желающих приобрести компьютер любой ценой, и многие радиолюбители занялись разработкой собственных моделей на доступной элементной базе.
Это имело положительный социальный эффект. Большая часть молодежи коротала вечера за паяльником, упорно пытаясь заставить работать десяток микросхем и не отвлекаясь на наркотики, спиртное, дискотеки и мотоциклы. Впрочем, это уже не имеет отношения к хакерам. Компьютеры наконец вырвались из стен лабораторий в народные массы. К ним смогли получить доступ практически все желающие. Только самые ленивые или бедные по каким-то причинам не смогли приобрести их, завистливо глядя на тех своих сверстников, у которых оные имелись.
Новая игрушка нашла свое место в сердцах многих сотен тысяч людей, которые забывали обо всем на свете, когда садились за свою ЭВМ. Практически все они были школьниками или студентами. Лишь немногие программисты старшего поколения увлекались микрокомпьютерами. Причина очевидна — им была доступна на несколько порядков более мощная техника.
Все ПО для новых машин создавалось исключительно энтузиастами-любителями. При этом нельзя было реализовать на микрокомпьютере хоть что-то, достойное внимания, без глубокого знания ассемблера и машинной архитектуры.
Можно ли назвать всех этих людей хакерами? По-видимому, да. Действительно, нужны исключительно изобретательные мозги чтобы в условиях нехватки документации и хоть какой-нибудь литературы по данной тематике освоить низкоуровневое программирование.
Наибольшую популярность в это время приобрел компьютер Лорда Клавдия Синклера, названный его же именем. Существовало большое количество программного обеспечения для этого компьютера (в основном игр), созданного преимущественно зарубежными фирмами. В то время еще не существовало законов, охраняющих авторские права разработчика, и последний мог уповать только сам на себя, т.е. препятствовать распространению программ чисто техническими приемами.
Так родились первые программные защиты. Но они не принесли ожидаемого эффекта. Разработчики не учли, что имеют дело с людьми, у которых есть масса ничем не занятого времени, а у многих к тому же весьма неординарное мышление. Так или иначе, а защиты стали потихоньку ломать.
Это, однако, особая тема.
Рождение современных хакеров, или снова INTEL
"...он был пропозойским творением, рождение и смерть которого по сути одновременны."
Ф. Херберт. "Дети Дюны".
Однажды руководство IBM предприняло попытку создать собственный вариант персонального компьютера. Вряд ли оно было уверено в успехе. В то время персональные компьютеры делали все кому не лень, и что из этого получалось, уже рассказано выше.
Но IBM имела богатый опыт в конструировании майн-фреймов и, кроме того, набрала в свой штат опытных инженеров, с которыми другим компаниям было нелегко тягаться. Действительно, все остальные допустили одну роковую ошибку, а именно — каждый компьютер с момента своего создания был обречен на немедленное и неминуемое старение. Можно было лишь купить новый компьютер...
IBM неоднократно сталкивалась с похожим явлением в своих майн-фрейма; и уже имела блестящее инженерное решение — так называемую "открытую архитектуру", в которой отдельные компоненты легко могли быть заменены на новые. Контроллеры перестали быть частью архитектуры машины, став факультативным расширением.
Разумеется, эта концепция требовала определенной стандартизации и поддержки последней сторонними производителями. Чтобы добиться этого, IBM пошла на смелый шаг. Впервые за всю историю своего существования она использовала в собственной разработке чужие комплектующие. При этом техническая документация вплоть до листингов BIOS распространялась совершенно свободно.
Однако эффект был совершенно непредсказуемым — вместо того чтобь поддерживать новую перспективную модель, десятки фирм начали клонирован ее и продавать гораздо дешевле, чем оригинальный производитель. Парадоксально, но это только играло на руку компании. Убыток от "пиратства", конечно, бл велик, но он способствовал популярности этой модели.
За короткое время было продано несколько тысяч полностью совместимых между собой машин. Разработчики ПО не могли мечтать о лучшем и активно переходили на новую платформу. Это вызывало популярность и среди пользователей
Сейчас фирма IBM утратила лидирующее положение в производстве компьютеров, да и архитектура современных машин уже мало напоминает древние ХТ\АТ, но единственное, что осталось неизменным, — это сердце компьютера микропроцессор фирмы Intel. Если бы выбор IBM пал на другой микропроцессор облик современных компьютеров мог быть другим.
Сегодня идут ожесточенные дискуссии о том, что лучше: PowerPC или Intel причем основная часть спорящих крайне агрессивно настроена против последнего. Сразу видно, что практически все спорящие являются простыми пользователями, или, по крайне мере, прикладными программистами. Дело в том, что ш один хакер на трезвую голову никогда не будет выражать свою симпатию к RISС процессорам. Их ограниченный набор команд и адресаций загоняет ассемблерщиков в тиски и не позволяет проявить никакой индивидуальности. Да, для компиляторов подобный подход весьма практичен и упрощает их написание. Но человек не компилятор: он всегда хочет иметь свободу выбора и выражения собственных идей и решений.
Даже сегодня микропроцессоры Intel наиболее интересны своими архитектурными решениями в этом классе. К сожалению, большинство начинает забрасывать упреками фирму Intel, не обладая даже "джентльменским" уровнем знаний и смутно представляя себе защищенный режим.
Парадокс, но большая часть "хакеров" до сих пор ограничивается реальным режимом и не в состоянии хотя бы в общих чертах освоить защищенный. При этом за Intel'OM уже закреплен ярлык "нехакерского" микропроцессора. Но это всего лишь распространенное заблуждение! То же можно сказать и о Билле Гейтсе, которого сегодня склоняют на все лады, забыв, что именно он настоял на том, чтобы фирма IBM использовала не 8-разрядный процессор (как она первоначально планировала), а именно передовой 16-разрядный. Не окажись Билла — кто знает, может быть, IBM выпустила бы очередной "спектрум", который бы бесследно исчез и не было бы ничего, что окружает нас сейчас.
Возможно, мой взгляд не совпадает с общепринятым, но Билл Гейтс все же в первую очередь хакер, а потом уже бизнесмен. Не верите? А ведь это так. Он с детства был по уши влюблен в компьютеры и делал на них довольно неплохие вещи, например интерпретаторы языка бейсик, которые хоть и были несколько прожорливыми, но все же ухитрялись работать на древних микропроцессорах.
Именно фирма Microsoft впервые реализовала мощный механизм недокументированных возможностей. В переводе на русский язык это звучит так: глупому и даром не нужно, а умный и сам все поймет. Заметьте, что большинство недокументированных функций и структур поддерживались и следующими версиями его продуктов, даже когда это было технически нецелесообразно.
Современных хакеров, какие они есть, сформировал главным образом именно Билл Гейтс. Когда вы работаете с его продуктами, они вольно или невольно накладывают на вас отпечаток своего создателя. Впрочем, Билл лично не участвовал в разработке ни dos, ни Windows, поэтому его присутствие ощущалось только косвенно. Между прочим, лишь редкие системные программисты под Windows ругают последнюю или ее создателя. И если ваш собеседник настроен против MicroSoft, то он скорее всего не имеет никакого отношения к хакерам.
Настоящий хакер работает не на чем хочет, а на чем дают. Хакер должен любить свою операционную систему или сменить ее. Иначе это не хакер. Однако сегодня смена Windows на UNIX для рабочих станций все же малооправданный поступок, что бы об этом ни говорили. Впрочем, это только мое личное мнение.
Психологический анализ. Что движет хакером
"Инструменты управления государством всегда должны быть остро отточены и готовы к употреблению. Власть держится на страхе."
Ф. Херберт. "Мессия Дюны".
За последние годы трактовка слова "хакер" сильно изменилась. Это в первую очередь связано с появлением "хакеров-вандалов" — совсем не хакеров в изначальном понимании этого слова, но называющих себя именно так. Персонализация компьютера привела к тому, что доступ к ним получили практически все желающие, независимо от их возраста, наклонностей, уровня знаний и психологической уравновешенности.
Иными словами, если в высших учебных заведениях работали (к сожалению, в прошлом времени) преимущественно люди культурные и образованные, а на производствах по крайней мере, и любого вандала легко было уволить, лишив его этим доступа к ЭВМ, то персональный компьютер попадал в руки к самым разным людям.
Среди них были не только увлеченные фанаты, но и всевозможные маньяки. К чему это привело, мы как раз и наблюдаем сегодня. Компьютерный мир из доброго сообщества быстро превратился в подобие нашего социума, где нельзя оставлять ворота незапертыми, а за каждым углом может стоять человек с ножом.
Появились не только компьютерные воры, но и просто хулиганы, которым приносило удовольствие пакостить ближнему. Они уничтожали информацию, блокировали компьютерные системы и писали так называемые "троянские программы". Незащищенная персоналка оказалась питательной средой для всех этих деяний. Но тогда еще никому и в голову не могла прийти мысль о разграничении доступа на однопользовательских маломощных персональных компьютерах. Да и если бы она и пришла, реализовать ее без поддержки со стороны микропроцессора не представлялось возможным.
Операционная система просто не могла бы препятствовать обращению прикладной задачи к портам ввода-вывода и своему коду. Из это следовало, что злоумышленник мог как угодно модифицировать код операционной системы, отключая все защитные механизмы, или напрямую работать с оборудованием, уничтожая или модифицируя любые сектора на диске.
В то время компьютерный мир еще не знал ни вирусов, ни вандалов. Сама Intel не верила, что ее процессоры будут использоваться в "серьезных" машинах (уж слишком смехотворными казались их вычислительные способности). Конечно, большой ошибкой со стороны IBM было продвигать ничем не защищенный компьютер на рынок машин для среднего и малого бизнеса. Впрочем, в то время никто не мог представить, к чему это в конечном счете приведет.
Парк IBM-совместимых машин стремительно рос, и когда компьютерный мир осознал, какого джина он выпустил из бутылки, было уже поздно что-то менять. Ситуацию могла спасти только принципиально новая архитектура операционной системы и микропроцессора. Но в этом случае обесценивалось все существующее программное обеспечение, а на такие жертвы пойти никто не мог.
Со временем появились защищенные операционные системы типа Windows NT, но они не получили ожидаемой популярности именно по причинам плохой совместимости с уже существующим программным обеспечением. Большинство до сих пор работает на ничем не защищенной Windows 95\Windows 98. Впрочем, надо признать, что последняя все же обрела, хоть и с большим опозданием, защитные механизмы, предотвращающие некоторые деструктивные действия. К сожалению, это достигается ценой ухудшенной совместимости. Многие программы могут не работать или работать неправильно. В этом мире за все нужно платить.
Но оставим дискуссию о проблеме незащищенности "народной" операционной системы Windows 9х. Словами горю не поможешь: если вам требуется безопасность, переходите хотя бы на Windows NT. Это не решит всех проблем, но по крайней мере позволит спать спокойно.
Что за люди умышленно пишут деструктивные программы и похищают не принадлежащую им информацию. Какие же мотивы толкают на это? Современная психология утверждает, что во всем виновата жажда власти или превосходства над другими, что, впрочем, одно и то же. Компьютерный вандал ничем не отличается от уличного хулигана, и причины их поведения сходны — неудовлетворенность, агрессивность, озлобленность... Таких людей можно только пожалеть. В какой-то мере их формирует именно общество. Оно же и пожинает плоды своих деяний. К сожалению, при этом страдают ни в чем неповинные люди.
Компьютер позаоляет ощутить превосходство над окружающими. Власть над простыми пользователями, не способными распознать и адекватно прореагировать на зловредную программу, кому-то доставляет изрядное наслаждение.
К счастью, подавляющее большинство таких людей обладает весьма смутными знаниями. Они не представляли бы никакой угрозы, если бы пользователи не были так беспечны в отношении собственной безопасности. По разным оценкам, ущерб от вандалов составляет 5-10 процентов от общего числа случаев потери информации (при этом более 50% инцидентов происходит из-за ошибок или неверных действий пользователя).
Последнее, кстати, служит отличным самооправданием для злоумышленников, называющих себя "санитарами компьютерного леса". Они создают программы наподобие "кракера интернета" (а на самом деле форматирующие жесткий диск) и этим пытаются "лечить" так называемых "ламеров" (т.е. низкоквалифицированных пользователей) от компьютерной глупости, а заодно и от жадности. Другими словами "компьютерный крестовый поход" во благо святого дела.
Неграмотных пользователей, конечно, нужно учить, но не такими же приемами! Бесполезность террора уже многократно доказана историей, но он с завидным упорством вспыхивает не только в компьютерном, но, к сожалению, и в реальном мире. Очень маловероятно, чтобы в течение ближайших ста лет хоть что-нибудь изменилось. Проблема вандалов (и не только компьютерных) не в них самих, а в обществе, т.е. во всех нас.
Взломанные системы и отформатированные винчестеры — это месть за свою поломанную судьбу, не имеющая конкретного адреса. Никакие законы, тюрьмы ничего не смогут изменить. На место одно пойманного и наказанного вандала завтра придет десяток таких же. Точнее, не придет, а выпадет из оттолкнувшего их общества. Трудно судить озлобленного и ожесточенного человека, садящегося за клавиатуру и создающего злобный вирус, призванный наказать обидевшее его человечество.
Силой невозможно противостоять силе. И нетерпимость окружающих к вирусописателям и стремление "начистить последним фуиксль" или "разобраться" только подливает масла в огонь. Человек, отвечающий агрессией на действия вирусописателя, уже не заслуживает жалости. Чем лучше он сам, обиженный и готовый избить первого подозреваемого вирусописатсля, не особо утруждая себя выяснением, насколько тот виноват?
Фактически вандалов гораздо больше, и то, что часть из них не пишкт ни вирусов, ни троянских программ — чистая случайность. Просто они еще не дошли до этой грани, но кто может утверждать, что этого никогда не будет? Очень сомнительно...
Нет, я не собираюсь здесь никого оправдывать, но всем своим авторитетом призываю остановиться и не вершить самосуд, а просто внимательнее относиться ко всем проходящим через ваши руки программам. Альтруизм, конечно, не наставит вирусописателя на путь истинный, но по крайней мере не породит новой агрессии и новых злоумышленников. Вообще, вандализм всегда имеет глубокие социально-психологические корни, и причина озлобленности на общество у каждого своя.
Каждый случай требует отдельного рассмотрения. Человеком могут двигать разные мотивы, а не только месть. Быть может, он одинок и хочет внимания, которого ему так не хватает? Конечно, садиться и писать вредоносные программы — это не выход, но не забывайте, что речь идет о людях с теми или иными психическими отклонениями, в которых они сами не виноваты.
Исправить вандалов невозможно. Можно перевоспитать (или проще, сломать, — чем и занимается Евгений Касперский с особо "доставшими" его вирусописателями) одного человека, но ведь на его место завтра придет другой. Вандалы — следствие болезни нашего общества: и только исправляя последнее, можно добиться хоть каких-то результатов. Пока же мы боремся не с причиной, а со следствием. На ум приходит известный анекдот "бороться с коммунистической партией под ее руководством".
В самом деле, компьютерные преступники как это ни парадоксально, принесли больше пользы, чем вреда и в экономическом и социальном плане. Они обеспечили рабочие места специалистам по антивирусам и вообще компьютерной безопасности. При этом оборот компьютерных фирм неизмеримо превысил убытки от вирусных атак. Вандалы стали приносить ощутимый доход и оказались в самом деле весьма полезными. Забавно, но при этом на борьбу с ними ни у кого до сих пор не находится денег.
К счастью, человеку довольно скоро надоедает делать мелкие пакости окружающим. При этом одни просто "уходят со сцены", но есть и другие, которые отваживаются на глубокое изучение тонкостей операционных систем, компьютерного "железа", криптографии, математики, с тем чтобы проникать в действительно хорошо защищенные системы, писать сложно-шифруемые вирусы, т.е. наносить уже значительный и крупномасштабный вред. Мы сталкиваемся с таким интересным явлением, как "воспитание образованием".
Образование неразрывно связано с культурой и внутренним воспитанием. При этом человек заметно добреет и мстить никому уже не хочет. К сожалению, он все еще остается духовно искалеченным, и от объявления войны обществу его отделяет очень тонкая грань, которую он может в любую секунду перешагнуть.
Могу с полной ответственностью заявить: просто чудо, что до сих пор такого инцидента еще нс произошло. Впрочем, это и понятно, знания дают чувство уверенности в себе и стремление что-то кому-то доказывать пропадает само собой.
Все сказанное выше навряд ли относится к хакерам — по определению профессионалам. Среди последних за редкими исключениями практически не встречается вандалов или злых шутников. Однако, профессионалами не рождаются, ими становятся. При этом немногим удастся избежать "вирусной болезни", т.е. увлечения написанием вирусов. Впрочем, написание еще не подразумевает распространение.
Ну, а мелким кракерством занимаются почти все. Действительно, на некотором этапе изучения ассемблера и системного программирования трудно найти более достойное применение своим знаниям. Для серьезных вещей еще не хватает мастерства, а текстовой редактор большинству писать все же скучно. Впрочем, вреда от таких экспериментов было немного, если он вообще и был. В вирусах оказалось действительно что-то притягательное. Конечно, некорректно считать их каким-то подобием живого организма, но зато писать очень и очень интересно.
То же можно сказать и о взломе программ. И в том, и в другом случае многих сознательно или подсознательно привлекает власть. Вряд ли последнее утверждение нуждается в пояснении.
Введение в криптосистемы
Введение
"Стать хакером очень просто. Достаточно выучить и понять: математические дисциплины (математический анализ, теорию функций комплексного переменного, алгебру, геометрию, теорию вероятностей, математическую статистику, математическую логику и дискретную математику...)".
Борис Леонтьев. "Хакеры & internet".
Существуют два основных подхода, применяемых в системах защиты информации. Первый построен на затруднении прямого или косвенного анализа алгоритма с помощью оригинальных приемов программирования (использование недокументированных функций, специальных антиотладочных приемов). Такой подход широко применяется в условно-бесплатных программах, однако он крайне неэффективен. Для него характерно плохое соотношение накладных расходов на создание \ вскрытие защиты; кроме того, он не обеспечивает даже минимальной безопасности. Большинство подобных программ ломаются в течение нескольких минут, самое большее — нескольких дней.
Сегодня большинство коммерческих защит основано на криптографических протоколах. Эти защиты выглядят неломаемыми. "Выглядят" потому, что разработчики не учитывают разницу между теоретическими моделями и практической реализацией. Подробнее перечень основных ошибок в популярных ; системах изложен Павлом Семьяновым в статье "Почему криптосистемы . ненадежны". Здесь отмечу лишь следующее: да, действительно, очень многие . используемые криптосистемы ненадежны, и практически все в той или иной степени уязвимы.
Кроме того, обычно такие оценки исходят из предположения, что злоумышленник будет просто перебирать последовательно все пароли один за другим. Наивно, не так ли? Лобовая атака на современных вычислительных мощностях персональных компьютеров сегодня попросту невозможна. Сколь нибудь удовлетворительные результаты могут быть получены только при объединении десятков тысяч компьютеров.
Совсем другая картина получается при анализе криптосистемы и поиске уязвимого места для атаки. Маловероятно, что конечная реализация не имеет слабых мест. Это, конечно, никак не означает, что, как следует проанализировав ситуацию, можно найти дырку и быстренько в нее пролезть. Возможно, криптостойкость даже самого слабого места в системе окажется вполне достаточной для ее защиты. Но математический подход дает нам зрение и возможность качественной и самое главное количественной оценки сложности атаки.
К сожалению, сейчас многие (с позволения сказать) недохакеры не обладают даже минимальными математическими знаниями. Более того, академическую математику закидывают камнями, обвиняя в полной бесполезности для прикладных и системных программистов. Увы, это кризис нашего (да и не только нашего) образования.
Несмотря на то что первая часть является неизбежным теоретическим введением, все ее положения будут рассмотрены на примерах конкретных реализаций. Для этого необходимо выбрать платформу. Приучая читателя к детальному ("низкоуровневому") мышлению, я выбираю ассемблер. Реже буду использовать IDA Си и MS VC Поклонники Pascal и Delphi должны делать свой выбор самостоятельно. Во всяком случае, без знания ассемблера изучение и защита программ в большинстве случаев невозможна. Эта книга не научит вас основам ассемблера и рассчитана на уже подготовленного читателя.
С другой стороны никакой математической подготовки книга не требует. Однако я надеюсь, что в процессе чтения читатель будет обращаться к соответствующим источникам для получения более детальной картины подаваемого материала.
Настоящий хакер никогда не откажет себе в удовольствии копаться не только в недрах кода, но и в литературе (бумажной или электронной). Соблазн использовать готовые схемы и решения "AS IS" достоин только коммерческих кракеров (поставивших взлом на поток и зарабатывающих деньги на эксплуатации чужих идей и инструментов).
Не будем вдаваться в этическую полемику и задаваться извечным вопросом "что такое хорошо и что такое плохо?" Так или иначе это есть. Для использования любой законченной технологии не требуется понимать ее функционирование. Воплощенная в конкретный программный код, она становится в руках вандалов разрушающим программным оружием. Выход из ситуации "методом страуса" невозможен.
Сегодня вычислительная техника уже не контролируется, и такая программа будет создана и распространена — если не одним, так другим человеком. Распространение технологий и инструментов для взломов и атак является не актом вандализма, а напротив, указанием на уязвимость существующих систем, и побуждает к исправлению последних.
Препятствование распространению информации об атаках приводит к опасной иллюзии безопасности, которая в любой момент может рухнуть, погребая под своими обломками труды, возможно, тысяч людей.
Все прилагаемые к книге программы предназначены в первую очередь для системных администраторов и разработчиков систем безопасности для оценки их уязвимости.
Предполагается, что существующие "дырки" будут залатаны, и весь инструментарий, содержащийся на компакт-диске, окажется бесполезным в руках вандалов.
Это не относится к теоретическим выкладкам, "отвязанным" от конкретных платформ и реализаций. К счастью, маловероятно, чтобы вандалы дали себе труд глубоко в них разобраться. Известно, что даже техническое образование культурно воспитывает человека. Знания дают человеку великолепный полигон для самовыражения, уничтожая желание пакостить ближнему.
Хеши. Односторонние функции
"Ночь — это туннель, — подумала она. — Это дыра в завтра, если только оно наступит, это завтра."
Ф. Херберт. "Дюна".
Вся современная криптография основана на использовании методов хеширования. Метод хеширования позволяет хранить элементы множества А в линейном массиве X. Математически это можно записать:
h: А -> {0,х-1}
Это читается; функция h отображает каждый элемент А в индекс множества X. Поскольку число элементов А, как правило, намного больше X, то функция h наверняка неинъективна.
Однако возможно существование такого интервала на области определения функции, в границах которого она становится инъективной. Это означает, что только для одного элемента А существует индекс х1. Функция будет инъективной и в том случае, если ни один элемент А не отображается на интервал {х1,х2} при условии, что последний не равен нулю. В любом другом случае на каждый индекс множества Х отображается более одного элемента А. Это так называемая коллизия хеш-функции.
Реверс хеш-функции заключается в поиске всех отображаемых на данный индекс элементов. Для любого конечного множества А это разрешимая задача, которая имеет наиболее простое решение на инъективных интервалах хеш-множества.
Давайте остановимся на инъективных интервалах. Невозможно практическое использование хеш-преобразований без понимания их значения. В качестве примера рассмотрим следующую задачу: пусть нам требуется эффективный алгоритм сравнения строк, допустим, для синтаксического анализатора. Простое посимвольное сравнение потребует значительной памяти для хранения образов строк. Представим все возможное множество строк в данной разрядной сетке массивом S, тогда мы можем хеш-преобразованием привести его к множеству b {0,OxFF}. Разумеется, b много меньше S и требует для хранения значительно меньше памяти.
Рассмотрим практическую реализацию для некоторого множества команд IF', THEN', 'BEGIN', 'END'. Выберем простейшую хеш-функцию, посимвольно складывающую элементы строки. Это плохая хеш-функция (ниже мы поясним почему), но для нашего примера ее будет достаточно.
Для начала нужно построить хеш-таблицу значений для всех элементов множества S.
Воспользуемся для этого программой :\SOURCE\VC\hashOO — "хеш-калькулятор". Рассмотрим ее ключевой фрагмент:
BYTE GetHash (CString s0)
(
BYTE hash=0;
for (int a=0; aUP— DIR< |Attr |—Date—- |—Time— |
|PROHACK |>SUB-DIB< |… |15-03-1999 |14:06:06 |
|CRACKME.EXE |182455 |.a. |15-03-1999 |14:07:18 |
|DЕХЕM.ЕХЕ |11408 |.a. |22-10-1998 |11:32:26 |
маска отображения файлов —*
Вообще навигатор очень напоминает Norton Commander, и общение с ним проблем вызвать не должно. На всякий случай я все же опишу назначение клавиш управления:
Alt-FI (Drive) — смена текущего дисковода. Замечу, что HIEW не совсем корректно обрабатывает список существующих устройств. Так, например, у меня он обнаружил 'В', хотя 'В' отродясь не было. Попытка чтения с него привела к переадресации на 'А', что прошло не без "возмущений" со стороны Windows.
F2 (Hidden) — отображение скрытых и системных файлов. Кнопка действует как триггер.
F3 (Name) — сортировка по именам файлов.
F4 (Exten) — сортировка по расширениям.
F5 (Time) — сортировка по времени создания.
F6 (Size) — сортировка по размерам.
F7 (Unsort) — располагать файлы в том порядке, в каком их находит FindNextFile.
F8 (Revers) — обратить условные сортировки. Т.е. по умолчанию (за исключением даты) принята сортировка по возрастанию параметра. Реверс приводит к сортировке по убыванию. Действует как триггер.
FIO (Filter) — задать маску отображаемых файлов. К сожалению, не позволяет задавать более одной маски, что может вызвать неудобства. Маленький баг — если удалить маску, то HIEW ее не восстановит по умолчанию. Для этого необходимо будет задать явно '*.*', что просто неудобно.
При этом существует возможность быстрого поиска необходимого файла. HIEW вобрал в себя все лучшие решения от DN и NC и реализовал очень неплохие для простого встроенного менеджера возможности.
Нажатие любой символьной клавиши приводит к появлению консольной строки, в которой можно ввести имя файла (при этом курсор будет перемещаться по списку синхронно с вводом).
Есть и чисто юниксовская возможность дополнения введенного имени до полного, при условии что последнее однозначно определяет файл. Возможно, что это определение покажется витиеватым, поэтому приведу пример. Допустим, нам нужно найти файл crackme.exe. Если в текущей директории на 'с' есть тоЛко один файл, то логично, что он может однозначно быть определен заданием всего одной буквы. Вводим 'с' и нажимаем . Hiew, догадываясь, что мы хотим открыть crackruc.exe, выводит его имя (между прочим, без расширения). А что будет, если у пас есть два файла crackmel и crackme2? Тогда HIEW, сердито пискнув, напишет только 'crackme' и остановится, ожидая уточнения — какой именно из двух файлов нам требуется открыть.
Кому-то это может показаться неудобным. В этом случае можно воспользоваться '*' — непосредственным аналогом Ctrl-Enter в DN и NC — последовательному перебору подходящих файлов.
Имеется и очень ценная недокументированная возможность заданий списка в квадратных скобках. Например, [cr,h]ack.exe найдет все crack и hack. Если запятую опустить, то HIEW будет интерпретировать строку как lc,r,h]. Т.е. *.[chl он найдет все файлы с, срр, h и др. Это очень полезная и вообще уникальная для платформы MS-DOS возможность, которая не существует ни в одной другой аналогичной программе.
Жаль, конечно, что эти возможности большей частью остаются невостребованными — HIEW все же не файловая оболочка и чаще всего редактируемый файл непосредственно задается в строке, хотя бы по чистой привычке, оставшей. ся от старых версий. (Думается, что если бы автор предусмотрел еще и запуск из Файлового Навигатора, то многие использовали бы его как оболочку, которая была бы особенно удобной на "спасательных" дискетах.)
Если HIEW запущен с именем несуществующего файла, то он предложит создать его. Альтернативным вариантом является клавиша в Навигаторе. Последняя возможность просто незаменима, когда новые файлы приходится создавать и открывать непосредственно во время работы. К примеру, может потребоваться сделать некоторые заметки по ходу работы, скопировать фрагмент в новый файл и при этом тут же открыть его и, скажем, расшифровать (отметим, что Навигатор можно вызвать в любой момент работы клавишей F9).
Ctrl-'\' обеспечивает быстрый переход в корневую директорию текущего диска, а FIO — в материнскую директорию (ту, из которой был запущен HIEW).
При этом существует полезная возможность быстрого переключения между четырьмя произвольно выбранными директориями. Для этого существуют клавиши Ctrl-FI, Ctrl-F3, Ctrl-F5, Ctrl-F7, которые запоминают текущую директорию и Ctr3-F2, Ctrl-F4, Ctrl-F6, Ctrl-F8, которые, соответственно переходят в записанную. При этом есть возможность сохранения текущего состояния в файл и его последующего использования во всех сеансах. Впрочем, эта возможность реализована не самым лучшим образом. Нет никакой возможности сохранить состояние непосредственно из Навигатора, поэтому приходится открывать файл только для того, чтобы получить доступ к клавише 'Ctrl-FlO' — 'SaveSatus'. К ней мы еще вернемся, а пока отметим такую приятную особенность, как ведение истории просматриваемых файлов (F9).
mode Offset Name
Hex 0000163С |D:\KPNC\HIEW\HIEWR.602
Text 00000452 |D:\KPNC\HIEW\DEXEM.EXE
При этом кроме собственно имен сохранятся текущий режим и позиция курсора (что особенно приятно). Последнее позволяет использовать HIEW для чтения больших текстовых файлов (электронных книг, документации); никогда не придется запоминать, на каком месте вы находились перед выходом. (Впрочем, чтобы быть до конца честными, отметим, что эта возможность присуща сегодня практически всем современным вьюерам — QVIEW by AGC, UniversalViewer и MessageViewer by KPNC, да и многим другим.) Позволю себе так же отметить, что в этом UniversalViewer обогнал других. Тогда как HIEW и QVIEW привязываются к имени файла, UV — к хеш-сумме заголовка и окрестностей текущей позиции курсора. Имя файла при этом игнорируется. Последнее вызывает меньше конфликтов, хотя работает немного медленнее. Будем надеяться, что SEN в ближайших версиях реализует нечто похожее.
Перейдем теперь к рассмотрению командной строки. Большинство ею пользуется все же гораздо чаще, чем непривычным Навигатором.
В командной строке можно задавать более одного файла, но при этом будет открыт только первый из них, а остальные доступны по Ctrl-F9, что, впрочем, удобно, так как уменьшает время загрузки. Если спецификация файла не будет полной, то HIEW найдет все подходящие файлы и добавит их имена в список. Это иеудобно и нелогично. Неполная спецификация должна приводить к вызову Навигатора (во всяком случае, по моему личному мнению).
Параметр /SAV задает имя SAV-файла, который автоматически будет загружен. По умолчанию принимается hiew.sav, но последнее может быть изменено в hiew.ini:
; startup
Savefile = "hiew-sav"
Sav-файл полностью сохраняет текущее состояние HIEW-a, включая текущую позицию, все закладки и т.д. Обычно, чтобы воспользоваться sav-файлом, нужно запустить HIEW без параметров. Заметим, что 'hiew.exe MyFile.exe' не приведет к должному результату. Неудобно, конечно, но приходится мириться: хозяин (SEN) — барин.
Интересная особенность: файл конфигурации можно также указывать в командной строке после ключа /INI. Это очень удобно для "корпоративного" использования HIEW сразу несколькими людьми. Каждому — настройки на свой вкус.
Если же требуется показать содержимое вложенных директорий, то можно использовать ключ /S с указанием пути и маски. При этом hiew /s С'.\*.* с большой вероятностью после продолжительного шуршания диском завершит свою работу сообщением:
"No free memory".
Это будет зависеть от количества имеющихся у вас на диске файлов. Если их относительно немного, то есть шанс, что HIEW запустится и можно будет выбрать любой понравившийся файл, нажав Ctrl-F9.
После долгих размышлений так и не удалось придумать ситуацию, в которой данная возможность была бы незаменимой. Ведь всегда есть под рукой встроенный Файловый Навигатор!
После выбора файла HIEW автоматически показывает его в текстовом режиме. Не слишком удачный выбор для хакеров, поэтому они обычно первым делом редактируют следующую строку hiew.ini
StartMode = Text ; Text I Hex I Code
Впрочем, если HIEW планируется использовать и для просмотра текстовых сообщений, то ничего трогать не надо. Жаль, однако, что нет функции "автоде-тект", тем более что реализовать последнюю совсем не трудно.
[pic]
Вообще же строка статуса может меняться в зависимости от режима, но это не должно вызвать каких-то проблем понимания. Рассмотрим подробнее некоторые элементы.
Левосторонний лифт может показаться непривычным и действительно не очень удобен. Поэтому автор предусмотрел возможность настроить последний по вкусу пользователя, а то и вовсе отключить его. Для этого необходимо отредактировать hiew.ini. Если комментариев в файле окажется недостаточно, то обратитесь к главе "Конфигурирование HIEW" настоящего руководства.
Направление поиска (прямое или обратное) задается клавшей Alt-7 в любой момент или непосредственно во время вызова окна поиска клавишей F2. При этом
индикатор направления будет обновлен только после завершения поиска. Не нравится это. Неплохо бы перенести управление с F2 на AU-F7 и при этом обновлять индикатор. Но не будем строги к автору — эта возможность появилась только в версии 6.03 и, конечно, до конца еще не отлажена.
Состояние файла может быть следующим:
(R)ead — открыт по чтению.
(W)rite — открыт по записи.
(U)pdate — изменен.
При этом последний режим обрабатывается некорректно. Вне зависимости от того, был ли изменен хотя бы один байт, при каждом сбросе буферов редактора (F9) на диск (включая пустые!) всегда выставляется флаг изменения. Впрочем, это не баг, а фича, и маловероятно, что она будет исправлена в ближайших версиях.
Первый же вызов редактора (F3) приводит к автоматическому переоткрытию файла в режиме полного доступа (чтения и записи). Этот режим сохраняется и после выхода из редактора. Т.е. автоматического переоткрытия "Только на чтение" не происходит. А жаль. Индикация просто теряет смысл.
Hiew автоматически распознает следующие типы файлов DOS: EXE, NE, РЕ, LE, LX, NLM, но при этом отображает в строке статуса только пять последних из них. DOS-EXE HIEW, строго говоря, не поддерживает (за исключением заголовка). Да, собственно, там и поддерживать особо нечего. Можно, конечно, правильно настроить регистр DS, но это было бы слишком для шестнадцатиричного редактора — все же HIEW изначально отнюдь не планировался как дизассемблер. Впрочем, если был бы встроенный язык — пользователи смогли бы решать эти вопросы на месте, не дожидаясь новой версии. То же относится и к нестандартным бинарным файлам, например, разным BIOS-ам или дампам памяти. Для всего этого SEN написал замечательную утилиту StructLook, версия 4.20 которой выложена на ftp автора (ftp. kennsc.ru/pub/sen). Она содержит интерпретируемый препроцессор и очень удобна при "низкоуровневой" работе с различными форматами файлов. Но это совсем другая история.
Режим 16/32 определяется автоматически для поддерживаемых типов файлов. Это отличает его от QVIEW, где режимы приходится переключать вручную, в противном же случае коддизассемблируется неправильно, что может приводить к печальным результатам. В режиме 'text', где понятие 16\32 разрядного кода как таковое отсутствует, это поле выражает номер самой левой отображаемой колонки, считая от нуля.
Очень неплохо продумана работа с закладками. Впрочем, удобно еще не значит привычно. Редактор Gold Star установил стандарт де-факто: Ctrk-K-n запомнить состояние, Atl-Q-n восстановить его. Эта точка зрения не была поддержана SEN, и он задействовал совсем другие "горячие" клавиши. Grey-'+' запомнить текущее состояние. Этот факт мгновенно отражается в индикаторе. Изображение '-' изменяется на порядковый номер закладки (считая с единицы?!). При этом HIEW может запомнить до восьми закладок. Большего обычно и не требуется. Восстановить текущую закладку (которую индикатор отмечает ") можно нажатием Grey-'-'. Выбрать любую другую закладку поможет Alt-' 1-8'. При этом последняя автоматически помечается как текущая. Если ее потребуется удалить, то можно нажать Alt-'-'. A 'Alt-0' — удаляет сразу все закладки без предупреждения. Так что будьте осторожны с этой комбинацией!
В режиме редактора '' закладки, к сожалению, становятся недоступны по причине того, что последний ограничен всего одним окном. Удивительно, но этот недостаток присущ лишь HIEW-y, а конкуренты давно реализовали соответствующую возможность достойным образом. Самое интересное: непонятно, какие затруднения может испытывать автор с последним... Тем более что это действительно жесткое ограничение, которое особенно дает о себе знать при расшифровке даже небольших файлов. Поэтому все больше и больше людей склоняются к мысли, что эту операцию лучше делать в QVIEW, где нет таких ограничений. Остается только надеяться, что автор под мощным натиском общественного движения (ау! хакеры!) хотя бы через несколько версий реализует то, что конкуренты имели от рождения.
Длина файла отображается исключительно в неродном для хакеров десятичном исчислении. Вкупе с шестнадцатиричным смещением это особенно неприятно. Неплохой идеей, думается мне, был бы переход полностью на шестнадцатиричный режим в decode режиме и соответственно — на десятичный в текстовом. При этом было бы полезно отделять точкой каждые три знака, что улучшает читабельность больших чисел. Так что поле для работы у автора в следующих версиях еще есть, а это значит, что они будут выходить, выходить и еще раз выходить (правда, при том условии, если SEN-y все это не надоест и он не забросит свое творение в самый пыльный угол винчестера, как это произошло с DeGlucker-ом, Cup-ом, lnSight-ом... перечислять можно долго). Некто как-то писал в одной своей утилите, что, пожалев сейчас 1$, через некоторое время можно потерять в сотни раз больше из-за отсутствия утилиты, которая не была написана именно по причине экономии этого самого доллара. Увы, российские пользователи привыкли, что лучшие программисты страны должны работать "просто так" для их собственного удовольствия.
Ассемблер
"Убийство острием лишено артистизма. Но пусть тебя это не останавливает, если плоть, раскрываясь, сама себя предлагает."
Ф. Херберт. "Дюна".
Перейдем к непосредственному описанию возможностей HIEW-a. Автор этой книги долго колебался, что писать: "руководство по ключам" или "описание возможностей". В конце концов выбор остановился на последнем. По моему глубокому убеждению, описание на уровне клавиатуры не нужно тем пользователям, которые читают это руководство. HIEW все же хакерский продукт. "А зачем хакеру хелп?" — улыбается Сусликов. Но о возможностях, приемах работы и маленьких секретах читатель узнает с большим удовольствием. И может быть,
тогда начинающие прекратят задавать глупые вопросы: "я знаю, какие байтики подправить, а в HIEW-e их найти никак не могу",
Встроенный ассемблер может быть полезен для многих вещей. Так, например, небольшие файлы удобно набивать сразу в HIEW-e, а не пользоваться masm/tasm-om, которые работают на порядок медленнее. И не понимают многих "извратов". Так, например, когда потребовалось для хитрой защиты ассемблировать смесь шестнадцати- и тридцатидвухразрядного кода со множеством команд Pentuinn Pro, никто кроме HIEW-a и собственных ручек не смог этого сделать.
Кроме того, все команды сразу показываются и в hex-кодах, а не после редактирования/ассемблирования/линковки/дизассемблирования (при работе со стандарными средствами), что открывает свободу для экспериментирования и страхует от ошибок. Так, например, тот же TASM частенько даже при задании директивы USE32 почему-то вставляет в непредсказуемых местах ненужные префиксы или (что не лучше) опускает с целью оптимизации расставленные мной. Хотите пример? Попробуйте указать префикс DS для данных. TASM его проигнорирует (разве что пальцем у виска не покрутит). А теперь представим, что будет, если в самомодифицирующемся коде попытаться изменить префикс, который был опущен.
Так же незаменим встроенный ассемблер, если в ломаемой программе нужно не просто поменять 7х на ЕВ, а дописать десяток-другой строк кода (а такое случается достаточно часто).
К сожалению, встроенный ассемблер содержит много ограничений, о которых будет рассказано ниже. Самое обидное, что в этом режиме HIEW еще не поддерживает локальных смещений и все вычисления адресов приходится проводить вручную. К моему удивлению, не все знают, как это делается. На самом деле все очень просто, достаточно знать формат редактируемого файла. Покажем это на примере самого, по-видимому, распространенного РЕ-формата файлов, поддерживаемых платформой Win32 (все же это руководство по HIEW, а не по взлому).
Сначала рассмотрим, как происходит загрузка РЕ-файлов. MicroSoft неплохо оптимизировала этот процесс, и РЕ целиком проецируются в память, включая и DOS-секцию. При этом один селектор выделяется для кода и данных. А это означает, что перевод глобальных смещений в локальные осуществляется тривиальным добавлением адреса загрузки, который можно узнать из заголовка РЕ-фай-ла. Поскольку HIEW отображает последний в удобочитаемом виде, то наша задача упрощается еще больше, — достаточно заглянуть в поле Image base. В большинстве случаев там содержатся круглые значения, например 0х400000, 0х010000. Не сложно выполнить все вычисления и в уме, однако к чему напрягаться?Перейдем в начало файла и нажмем Ctrl-F5, после чего введем значение Image base (в нашем случае 400000). Посмотрим, что получилось:
| |Дизассемблер |Ассемблер |
|Без базирования: |.0040119А: call .000401298 |0000119А: call 000001298 |
|С базированием: |.0040119A: call .000401298 |0040119А: call 000401298 |
Как мы можем с удовлетворением отметить, базирование решило проблему и можно даже не пинать автора, требуя, чтобы он исправил этот недостаток (хотя это с его стороны все же непростительный баг).
Очень удобно, что HIEW при ассемблировании не пытается оптимизировать то, что его не просят. Например, если вы укажете адресацию через DS, то перед командой появится соответствующий префикс ОхЗЕ. Сравните:
00000000: ЗЕД16606 mov ax,ds: [00666]
00000004; A16606 mov ax, [00666]
Любой другой привычный нам ассемблер (tasm, masm) выдал бы идентичные результаты, что не вызывает у меня восторга. За это и любим HIEW: он послушно делает то, что ему говорят.
Ассемблирование вообще процесс довольно творческий. Одна и та же мнемоническая инструкция может быть ассемблирована по-разному. Такова уж специфика архитектуры линейки 80х86 микропроцессоров от Intel. Микрокод первых процессоров разрабатывался в то далекое время, когда экономить приходилось каждый байт, и поэтому инженеры Intel обратили внимание на ситуацию, когда регистр размером в слово манипулирует непосредственным значением меньшим 0х100. При этом старший байт равен нулю, т.е. теоретически может быть ужат до одного бита, а этот самый бит можно разместить в пустующем поле приемника (ясно, что приемником непосредственный операнд быть никак не может). В результате этих ухищрений экономится один байт. Итак, такую команду можно записать двумя способами:
00000007; 83С266 add dx,066 "f"
0000000A: 81C26600 add dx, 00066 ;" f"
При этом HIEW всегда выбирает первый из них (т.е. пытается оптимизировать код). Это восторга у пользователей не вызывает, ибо часто не соответствует ожидаемому результату.
Диаметрально противоположна ситуация при генерации переходов. По умолчанию HIEW всегда генерирует близкий (near) переход ОхЕ9. Если необходимо задать близкий переход, то заставить HIEW это сделать поможет команда jmps (jmp short действует аналогично). Позволяя себе слегка покритиковать автора, замечу, что кракеры чаще всего заменяют условный переход на безусловный. При этом jmp near откровенно портит код. Обидно.
Продолжая критику, заметим, что ассемблер также не понимает ни ординалов, ни символьных имен, что совсем не радует. Очень хотелось бы в следующих версиях получить полноценную поддержку перечисленных выше форматов.
Б остальном же ассемблер ведет себя корректно и безглючно. При этом имеет встроенный калькулятор. Т.е. он прекрасно переваривает конструкции типа mov ах,[66+11] и даже mov ах,[—77]. Последнее, правда, без учета режима (еще один баг — в копилку'). Отрицательные числа адреса всегда дополняются до слова. При этом в 32-разрядном режиме забавно выглядит попытка ассемблировать •jmp -Г
00000003: E9F7FFFFFF jmp
Заметим, что только извращенцу придет в голову пользоваться последним, однако в защитах это встречается и работает следующим образом. Пусть, например, есть код:
00000000: E9FAFFFFFF jmp -I
00000005: 90 пор
00000006: 90 пор
При этом jmp смещает указатель команд на единицу, и получается:
00000000: FF9090909090 call d,[eax] [090909090]
Что, заметим, никак не очевидно и является довольно любопытным приемом. Вероятно, не всем приходит в голову, что jmp может прыгать в границах своего операнда. Хотя вообще ассемблирование отрицательных переходов в HIEW это один большой баг, или фича. Во всяком случае он не работает так, как ожидается.
Впрочем, это все мелочи, которые в ближайших версиях обоих продуктов будут исправлены.
Еще одним недостатком, приходящим на ум, является упорное нежелание HIEW-a 'переваривать' директиву , поэтому выражение
mov Word ptr CS: [077] ,66
не может быть обработано синтаксическим анализатором. Приходится его сокращать до
mov Word CS: [077] , 66
Ужасно неудобно менять свои привычки, но что поделаешь — приходится. Последнее частично скрашивается приятной возможностью сокращать byte/word/dword/pword/qword/tbyte до b/w/d/p/q/t, как показано ниже:
[pic]
Все числа считаются шестнадцатиричными по умолчанию, но никто не будет против постфикса 'h'. А вот с 'х' анализатор не знает что делать и незамедлительно начинает ругаться. Это выглядит особенно странно на фоне калькулятора, который такую нотацию как раз понимает, но в свою очередь не переваривает 'h'.
Чем больше углубляешься в HIEW, тем сильнее впечатление, что его писали два разных человека. Это, конечно, больше шутка, чем правда. Однако не мешало бы попинать автора, чтобы привести анализатор в порядок, а то работать порой бывает весьма дискомфортно.
Анализатор ошибок на редкость упрощен, однако это не должно вызывать каких-то проблем. (Предполагается, что HIEW все же рассчитан на тех людей, чей второй язык (после родного) — ассемблер, и достаточно лишь намека, чтобы понять, почему "оно" не ассемблируется.)
Дизассемблер
Дизассемблер в HIEW великая вещь. фактически это основной режим работы хакера. Не то чтобы некоторые ленились дизассемблировать в уме hex-коды, (что, скажем, частенько приходится делать при работе со встроенным вьюером в DN), но ассемблерный листинг все же привычнее для глаза и, кроме того, имеет множество дополнительных возможностей (таких, как поиск ассемблерных команд по маске), которые заметно ускоряют анализ программ.
К сожалению (и, признаться, еще большему удивлению), автор не считает HIEW дизассемблером и не хочет улучшать некоторые моменты чисто из идеологических соображений. Ну что же, будем ждать поддержки языка, где все это можно будет делать на лету, не обращаясь за помощью к автору. И сообразно со вкусами каждого. Беда в том, что раскачать автора на встроенный язык или хотя бы задокументированный API (язык-то написать нетрудно) пока никак не получается.
Ничего не поделаешь: как говорится хозяин — барин, тем более что автор пишет HIEW пока лишь для собственного удовольствия и исходя из своих этических соображений. Вот когда автор будет получать за свою работу "живые" деньги, тогда и можно будет ждать исполнения желаний, а пока остается только надеяться или садиться и писать собственный Xview. Последнее, кстати, многие активно делают, и автор этой книги не исключение. Впрочем, его UniversalViewer находится в весьма заброшенном состоянии, но если когда-то будет закончен, то... появится еще один конкурент на рынке hex-редакторов. К слову сказать, UV изначально рассчитан на мультипроцессорную поддержку и будет очень удобен при анализе эмуляторов виртуальных процессоров.
Но это когда еще будет (и будет ли вообще), а HIEW уже есть и поддерживает инструкции вплоть до Pentium Pro. А точнее, до Рб-kernel, которое используется и в Celeron-ax.
Типичный вид дизассемблированного текста таков:
.00401207: 50 push eax
.00401208: 52 push edx
.00401209: ESD2FEFFFF call. .0004010EO -------- (1)
.0040120E: 83C404 add еsр,004 ;
.00401211: 50 push eax
.00401212: E8A9FEFFFF call .0004010CO -------- (2)
.00401217: 83C408 add esp,008
.0040121A: 663DF801 cmp ax,OOIF8 ;
.0040121E: 7404 je .000401224 -------- (3)
.00401220: 6A03 push 003
.00401222: EB02 jmps .000401226 -—-—-- (4)
.00401224: 6A04 push 004
Hiew позволяет "путешествовать" по файлу, входя в процедуры и выполняя условные/безусловные переходы. Для этого нужно нажать цифру, которая показана в круглых скобках справа. Переходы в IDA реализованы несколько лучше. Переход осуществляется по адресу, на котором находится курсор. Это действительно удобнее, так как позволяет "гулять" и по смещениям, передаваемым через стек или регистры. Например:
.004012B9: 6840314000 push 000403140 ;"@1@"
.004012BE: 6844314000 push 000403144 ;"@lD"
.004012C3: FF74240C push d, [esp] [OOOOC]
.004012C7: E834010000 call .000401400 -------- (2)
Hiew не распознал смещения 0х00403140 и 0х00403144. Конечно, можно перейти по ним вручную (F5), по это не очень приятно. Впрочем, общественное мнение может не совпадать с мнением автора.
При этом поддерживается многоуровневый откат, который по умолчанию находится на '0' (как это изменить, рассказано в описании файла hiew.ini). К сожалению, буфер отката кольцевой, что не вызывает восторга. Так как чтобы вернуться в начальную позицию, надо держать в голове глубину вложенности (а это весьма проблематично). Было бы гораздо лучше если бы при исчерпании стека HIEW пищал хотя бы...
Вообще же навигация по исполняемым файлам дело привычное. В любой момент можно прыгнуть в произвольную точку, нажав F5. При этом адрес будет интерпретирован как локальный, если перед ним находится символ '.'; в противном случае всегда осуществляется переход по глобальному смещению внутри файла.
При этом HIEW корректно обрабатывает относительные переходы. Например, можно задать +77 или -66 и курсор переместится на 77h байт вперед или 0х66 назад относительно текущей позиции. Печально, но при этом откат невозможен. Хотя поддержка его была бы не лишней и великолепно вписывающейся в общий антураж программы. Еще один довод в пользу того, что встроенный язык избавил бы его от подобных приставаний.
Аналогично обстоит дело и с поиском перекрестных ссылок. Автоматический откат назад не предусмотрен. С другой стороны, это настолько уникальная и полезная вещь, что рука не поднимается каким-либо образом ее критиковать. Традиционно для поиска перекрестных ссылок использовались IDA или SOUR-CER (который в этом отношении до сих пор обгонит всех конкурентов). Однако монстроватые дизассемблеры очень медлительны и неповоротливы. Для анализа больших файлов не хватит не только терпения хакера, но иной раз и дискового пространства.
Поэтому выбор многих останавливается на HIEW-e. Даже когда он не мог делать это автоматически, ручной поиск занимал все же меньше времени, чем загрузка файлов в IDA. К тому же в большинстве случаев ссылки на сегмент данных в РЕ-файлах (например, поиск кода, выводящего строку 'key not found') с легкостью обнаруживались "прямым" поиском локальных смещений (с учетом обратного порядка байтов в двойном слове).
Однако поиск относительных смещений таким образом был уже невозможен. С другой стороны, требуемое нам смещение лежит "прямым текстом" в дизасссм-блированном листинге. Остается лишь просканировать последний. Не могу удержаться и не заметить, насколько логичен в этом случае IDA, который поддерживает "медленный" поиск подстроки именно в тексте дизассемблера. Это действительно медленно, но на все 100% надежно. HIEW же просто дизассембли-рует код на лету с шагом в одну команду (или даже байт) и сравнивает непосредственный операнд с текущим смещением, при этом косвенная адресация игнорируется и значения сегментных регистров не отслеживаются. Поэтому такой поиск хорошо работает только на односегментных моделях памяти. Во всех других случаях появятся проблемы (ссылки не будут найдены или найдены неверно).
Последнее, впрочем, не подлежит исправлению без переработки всей архитектуры HIEW-a, и мы получим продукт, мало отличающийся скоростью от среднестатистического дизассемблера. К счастью, наиболее популярный сегодня формат Win32 хранит РЕ-данные и код в одном сегменте, поэтому в отслеживании сегментных регистров никакой нужды нет.
По умолчанию при дизассемблировании HIEW анализирует текст с шагом в одну команду, что многократно ускоряет работу, но недостаточно надежно. Разберем следующий пример:
retn
DB 0х66
call 0х0666
Для сот-файлов это достаточно типичный случай. Как вы думаете дизассем-блирует его HIEW? Разумеется HIEW не догадается, что '0х66' переменная, и выдаст следующий результат:
00000000:C3 retn
00000001: 66ЕВ6106 call 00000066В
Обратите внимание, что теперь переход вычислен неправильно и весь анализ программы летит к черту. А если переменная будет равна нулю (что чаще всего и бывает), на экране появится следующий мусор:
00000000:03 retn
00000001: ООЕ8 add al,ch
00000003: 61 popa
00000004:06 push es
Это происходит потому, что HIEW неправильно определил границы команд, в результате чего не смог их правильно дизассемблировать. Ни в коем случае не стоит считать последнее "глюком" или недостатком. Это следствие самой концепции элементарного дизассемблера. IDA справляется с этой ситуацией ценой больших затрат времени на анализ программы. Для файлов в сотни килобайт это не вызывает проблем на современных быстродействующих процессорах, но даже мощности Pentuirn-a II и Celeron-a начинает не хватать, когда счет идет на мегабайты или даже десятки мегабайт (между прочим, размер типичного исполняемого файла под Windows).
Ситуацию может спасти разве что перекладывание части работы на человека. В приведенном примере ясно, что код после ret, собственно говоря, не является обязательно кодом. С таким же успехом это могут быть данные. Чтобы разобраться, необходимо найти ссылки на эту область памяти. Устанавливаем курсор на первый байт, переключаем (на всякий случай) шаг сканирования на единицу (alt-F6) и нажимаем F6. Допустим, HIEW нашел следующий код:
Mov al, [01]
(Впрочем, не факт, что версия 6.03 его найдет, но для простоты будем считать, что HIEW к моменту чтения этого опуса уже научился поддерживать и такую адресацию). Ясно, что 0х01 — это переменная размером в байт. Отмечаем это (карандашом в блокноте, так как HIEW все еще не поддерживает комментариев) и переходим к ячейке 0х2. Вновь нажимаем F6 и изучаем код, манипулирующий с этим адресом. Пусть он выглядит следующим образом:
ОООООООО: СЗ retn
00000001: ООЕ8 add al,ch
00000003: 61 popa
00000004: 06 push еs
00000005: A00100 mov al, [00001]
00000008: E8F7FF call 000000002 -------- (l)
Чтобы привести код в удобочитаемое состояние, достаточно перейти по адресу 0х2, для чего можно нажать 1' (переход по ссылке) или даже "02".
00000002: Е86106 call 000000666
00000005: А00100 mov al, (00001]
00000008: E8F7ff call 000000002 -------- (l)
Конечно, пример является надуманным, но тем не менее технику работы с примитивными дизассемблерами он иллюстрирует неплохо. Замечу, что "примитивный дизассемблер" вовсе не оскорбление, а соответствующий класс программ, которые выполняют только декодирование инструкций, перекладывая все остальное на плечи пользователя.
Если приведенный пример действительно является corn-файлом, то скорее всего HIEW не сможет правильно найти ссылки, потому что неправильно вычислит адреса, Это неудивительно, если вспомнить, что corn-файлы загружаются в память со смещения 0х100 в текущем сегменте. Пусть оригинальный файл выглядел так:
0х100: A10401 mov ax,[00104h]—SUB Byte ptr ES: [bx], 20h _//_ end
end;
Subj: SGWW password protection 'WhiteEagle'
Попался мне на CD электронный журнал SGWW. Но, попытавшись раскрыть arj-архив, я с удивлением наткнулся на пароль. Ну пароль и пароль. Но когда на другом диске (скорее всего, перепечатка) я наткнулся на тот же самый "закрученный" файл, то призадумался. К тому времени я собрал подборку журналов SGWW, которую с интересом пролистывал. Но "закрученного" номера в моей коллекции еще не было. Жаль. Но слабость алгоритма шифрования arj уже стала "притчей во языцех", и даже "лобовой" атаки на ключ методом перебора не требовалось. Впрочем, я ради эксперимента оставил на ночь "атакующую" программу, которая к утру так и ничего не нашла.
Известно, что используемая в arj схема шифрования при наличии открытого фрагмента шифротекста может быть легко раскрыта. Однако, в этом-то обычно и заключается проблема: далеко не всегда "злоумышленнику" доступен хотя бы фрагмент архива в нешифрованном виде. Но у меня такой фрагмент был! (Впрочем, это не было очевидно.) Им был файл pgpkey в каталоге INFO — он совпадал с имеющимся у меня из восьмого номера (что видно по длине и дате файла).
Таким образом, мне не составило труда расшифровать все остальные файлы и найти пароль "WhiteEagle". Десятисимвольный пароль можно было найти и лобовой атакой на ключ. Так что защита все же несерьезна, что бы об этом ни говорили. Атака по словарю также могла бы раскрыть это за доступное для анализа время.
Поэтому еще раз хотелось бы обратить внимание на то, что человек, заявляющий: "только не просите меня взломать пароль ARJ" вряд ли может называться хакером. Право, не стоит переоценивать возможности существующих широко распространенных защит, и тем более полагаться на них в серьезных случаях.
Subj: SOURCER 5.10___________________________
Скачал я с CD пятый SOURCER и с удивлением увидел, что он требует серийного номера. Откуда же мне его знать? Но хакер я или нет?!
Вообще-то мне непонятен смысл защиты на SOURCER. Не знаю, как там "у них", а у нас это чисто хакерская подручная утилита. Не думаю, чтобы прикладные программисты держали ее на своих компьютерах... Но ставить защиту такого уровня — это совсем глупо. Авторы SOURCER-a, видимо, всерьез думают, что ломают программы только с серьезными защитами. Или они нас совсем не уважают... Мне не потребовалось много времени, чтобы "вскрыть" эту "защиту". Интересно, на кого же они рассчитывали?! Ни одной хитрой ловушки, ни одного антиотладочного приема, ни одной недокументированной возможности, ни даже проверки собственного кода! Неужели кто-то всерьез думает, что даже начинающего хакера можно спугнуть "nag screen''-ом и заставить побежать регистрироваться?
Впрочем, к чести защиты можно сказать, что "убить" ее, изменив пару-тройку байт, никак не удастся. Слишком много проверок в самых разных местах. Довольно забавно смотрится эта наивная технология. Понятно, что вылавливание всех проверок занимает больше времени, но жаль, если это единственное, чем авторы надеялись затруднить взлом.
Subj: Как взломать Emulated Solar CPU_________
Это очень нетривиальный CrackMe и очень приятный. Ломается, правда, просто, но не всеми. Этот опус меня побудил написать один мой знакомый, который уже неделю его копает.
Все-таки математику и хакерам знать не помешает, хотя бы на уровне популярных книжек. В эмуляторе используются только основы булевой алгебры, которые (если я не ошибаюсь) входят и в программу школьного курса информатики.
Solar Designer пишет:
➢ Ну, кто сломает мое творение? ;) Кода 80х86 — меньше 100 байт.
➢ Шифрованного кода нет. Защиты от отладки тоже нет.
➢ Пароль сознательно зашифрован так, чтобы можно было разобравшись в коде его
➢ проверки, вычислить подходящий. И тем не
➢ менее сломать будет непросто. ;)
Тем не менее сломать просто, и даже очень просто! Ну-с, начнем... Как уже понятно, нам придется иметь дело с эмулятором. Или интерпретатором, кому как больше нравится. Никаких конвейеров, циклов выборки, распараллеленных дешифраторов команд нет, т.е. приятного особо не много. Минимально рабочий интерпретатор а-ля риск с фиксированной длиной и адресацией всех команд.
Но что примечательно, так это необычная архитектура. Не Фон-Неймановская. Исполняемый код и данные перемешаны. Правда, реализация не очень аккуратная и навешано очень много заплаток 186, что портит все удовольствие и сводит сложность взлома к нулю.
Далее, автор думает, что...
➢ В защитах я такого не встречал, а ведь именно в них это
➢ полезно, т.к. не дает возможности полной декомпиляции из-за невозможности
➢ распознать границы команд более высокого уровня (в данном случае они были
➢ на макросах).
Математику знать надо. А+В+С == (А+В)+С во всяком случае. Чем мы ниже с успехом и воспользуемся. Я думаю, что стрелка Пирса — это не самое лучшее для затруднения декомпиляции. А вот скорость замедляет изрядно. И серьезная защита будет сильно "тормозить". А что булевы термы ассоциативны, надо все же иногда иметь в виду.
Для написания декомпилятора или отладчика мы должны сначала разобраться с механизмом самого эмулятора. Поскольку защиты нет, подойдет даже .
> 16FO:0101 8В365201 MOV SI, [0152] ; Указатель команд
> 16FO:0105 AD LODSW ; Читаем 1st операнд
> 16FO:0106 97 XCHG DI.AX ; Dl :" [1st]
> 16FO.-0107 8B3D MOV Dl, [Dl] ; "
> 16FO:0109 AD LODSW ; Читаем 2st операнд
> 16FO:OIOA 93 XCHG BX.AX ; BX := &2st
> 16FO;OIOB OB3F OR Dl, [BX] ; tO := [1st) I [2st]
> 16FO:OIOD AD LODSW ; Читаем 3st операнд
> 16FO:OIOE 97 XCHG Dl,AX ; AX := tO ; Dl = 3st
> 16FO:OIOF F7DO NOT AX ; AX := NOT tO
> 16FO:0111 89365201 MOV [0152],SI .• Opdate ernIP
> 16FO:0115 AB STOSW ; mov [3st],NOT(OR [1st], [2st])
> 16FO:0116 EBE9 JMP 0101 ; -- цикл выборки команд --"
> 16FO:0152 5А01 ; ernREG :: ernIP
Обратите внимание на строку 0115—в ней заключена вся логика эмулятора. Именно тут собака зарыта. MOV [3st], NOT(OR [1st),[2st]). Всего одной этой команды достаточно для реализации всех остальных.
Как учит булевская алгебра, есть только две логические операции NOT и OR, и все остальные (AND, XOR) можно выразить через эти две. Причем, учитывая, что OR А,А = А, можно сказать, что данная функция может действовать как NOT (PIRS А,А), а следовательно, и как OR (PIRS(PIRS(A.B), PIRS(A,B)). Поскольку приемник представляет собой непосредственное значение, то можно также создать MOV и JMP (последний — изменяя "регистр" указателя команд).
И все. Защите конец. Мы уже знаем как декодировать числовые последовательности и можем без напряжения вычислить "границы команд более высокого уровня". Те, кто знаком с булем, могут пропустить следующий абзац, а для остальных маленький ликбез. Итак:
AND == NOT[( OR(NOT(A), NOT (В))];
XOR == AND[ OR (A,B), NOT(AND (A,B))];
mov == NOT(NOT(A)) или OR (A,A)
JMP =- MOV ([emlP],[A])
jmp == JMP [t0l\t0 DW offset Label
Таким образом, мы теперь имеем базовый набор команд для создания логики "второго уровня". В отличие от первого уровня, одни и те же определения второго могут быть построены различными комбинациями. Это не позволит применить шаблоны. Но что-нибудь еще придумаем.
Автор сдуру включил фрагменты исходников "чтобы легче было ломать". Я так и не понял глубокий смысл этой акции, но, раз нам дали кусок исходника, давайте проверим на совпадение команд первого уровня.
➢ ernNOT macro Src, Dst
➢ ernNOR Src, Src, Dst
➢ endm
➢ emOR macro Srcl, Src2, Dst
➢ ernNOR Srcl, Src2, emRI
➢ ernNOT emRI, Dst
➢ endm
Эти два фрагмента явно включены ради трафика, поскольку никаких других (кроме очевидно избыточных) реализаций данных команд не существует.
>emAND macro Srcl, Src2, Dst
➢ ernNOT Srcl, emRI
➢ ernNOT Src2, emR2
➢ ernNOR emRI, emR2, Dst
➢ endm
Таким образом, математика торжествует и, как мы видим, для написания декомпилятора исходники абсолютно не нужны.
Переходим к логике. Все пестрое множество реализаций может крутиться только вокруг двух формул:
а ===> В == OR(NOT(A),B)
а В == OR [AND (A,B),AND (NOT(A),NOT(B))]
Например, нам встретится следующая последовательность:
OR [AND (А,В), NOT(OR(A.NOT(C)))]
Тех, кто еще не понял, что это делает, попрошу составить логическую матрицу, в которой перечислить все возможные состояния (благо их всего восемь).
Если то же самое записать на привычном сишном наречии, то получится что-то типа а ? Ь: с.
Здравый смысл торжествует еще раз! Воодушевленные успехом, мы садимся за написание декомпилятора или отладчика. По мне лучше отладчик. Впрочем, нетрудно будет декомпилировать это с карандашом и листком бумаги. Тут я вашу свободу не ограничиваю.
Анализ программы не должен представить особых трудностей, и я его опускаю. Не хочу вам портить последнее удовольствие, да и в любом случае вопрос дизассемблирования программ далеко выходит за рамки данной заметки.
Но на механизме проверки подлинности пароля я все же остановлюсь. Алгоритм до ужаса простой, и для нахождения пароля нужно решить одно • простенькое линейное уравнение. Сам алгоритм на 186 диалекте выглядит так:
MOV сх,о
LEA SI .Buffer
Repeat:
MOV DX,CX
XOR CX, [SI]
JMF Repeat
Check:
CMP CX,lstConst
JNZ Nag
CMP DX,2stConst
JNZ Nag
Собственно "двойная" проверка обеспечивает дыру достаточных размеров, чтобы в нее можно было без труда пролезть. В самом деле, последние два символа пароля будут равны :
XOR lstConst,2stConst = XOR 7528h, 784Dh = OD65h = 'e
Пароль едва ли не сам приходит на ум, но мы пойдем другим путем :) Найти подходящий пароль несложно; более того, последовательности в стиле описываются едва ли не в каждом букваре! Нетрудно даже скалькулировать необходимое число шагов в наихудшем случае в данной разрядной сетке. Оно слишком мало. Самый криптостойкий пароль вскрывается даже не за 2^ итераций, а гораздо быстрее. Т.е. криптостойкость меньше выбранной разрядной сетки!
Замечу еще раз, что предложенная мной реализация атаки базируется на элементарной алгебре и в принципе должна быть доступна каждому хакеру.
Subj: Как был взломан POCSAG 32_____________
О качестве программы судить воздержусь (потому что не знаю), но как ее взломать (т.е. зарегистрировать), расскажу. Как обычно, нас просят ввести User Name и соответствующий ему код. Не особо напрягаясь, под Windows можно считать содержимое окна редактирования двумя функциями Win32 API GetWin-dowTextA и GetDIgItemTextA. Но, может быть автор использовал уникод? Или кодировал под Win 16? Так на какую же функцию нам поставить брейк-поинт? Первая здравая мысль, пришедшая на ум, — посмотреть таблицу импорта функций user.dll. Воспользуемся тем, что всегда под рукой, — Quick View.
Среди множества импортируемых функций user32.dll GetDIgItemText отсутствует, зато есть GetWindowTextA. Вот на нее мы и поставим Ьрх. Без сюрпризов и неожиданностей мы оказываемся во всплывшем Win-Ice. Теперь самое время узнать адрес буфера строки. Для этого необходимо вспомнить, какие параметры принимает функция. Воспользуемся Visual Studio C++, а точнее, электронной документацией MSDN. Через пару секунд выясняем следующее:
int GetWindowText (
HWND hWnd, // handle of window or control
with text LPTSTR IpString, // address of buffer for text
int nMaxCount ); // maximum number of characters to copy
Таким образом, необходимый нам ipString находится по адресу SS:[ESP+8+8]. Попутно замечаем, что этот адрес совпадает со значением еах. Это очень похоже на Visual C++ (впрочем, и на другие компиляторы Си). Нашу догадку подтверждает копирайт, который легко найти в исполняемом файле. Судя по размеру исполняемого файла, а также по отсутствию импортируемых функций mfc.(Ill, нетрудно предположить, что mfc скомпонована как статичная библиотека. А вот это уже нехорошо. Символьной информации о классах mfc мы не получим. Да и места на винте мне, ей-богу, жалко. Но с другой стороны, функции каркасной библиотеки — это большей частью простые переходники к соответствующим функциям API. Поэтому, подняв хвост, кидаемся в гущу событий. Выполняем следующую последовательность команд:
{ dd
d ssiesp+IO
d еах
bpm еах
bd * p ret
be *
x )
Убеждаемся, что программа считала введенный нами от балды регистрационный номер. Вскоре мы вываливаемся в очень тривиальный кусок кода, сравнивающий две строки каким-то странным способом. Дамп esi-I покажет нам сгенерированную строку. Аккуратно запишем ее и... Все! Мы зарегистрированные пользователи. А как быть с нашими друзьями? Думаете, им будет по вкусу ваше имя? Ну что же, напишем генератор регистрационных номеров. Сразу предупреждаю, что это на порядок сложнее, чем подсмотреть регнум, не вникая в механизм его генерации.
Возвращаемся к исходной точке. Опять вводим имя и произвольный номер. Нас будет интересовать сам процесс генерации ключа, поэтому теперь мы трапим не регнум, а имя. И дожидаемся кода, который его читает. Им оказывается movsx ebp, byte ptr [esi+eax]. Сразу видно, что сделано со вкусом и размахом. Судя по тому, что идущие подряд команды модифицируют один регистр, оптимизацией тут и не пахнет.
Теперь нам необходимо вникнуть в суть данного фрагмента кода и написать аналогичный для своего генератора. Обратите внимание на цикл в строке Ох40Е2ЕВ. Даже беглого взгляда на код достаточно, чтобы понять, что это простая и нестандартная хеш-функция, возвращающая сразу две свертки! (Видно, стандартное CRC32 автору реализовать было лень, впрочем, в данном случае это не страшно.) Пишем собственный код генератора:
void KeyGen::GenPolyO(CString Name)
(
unsigned long int poliO = OxADACAFFE;
unsigned long int polil = OxAFFEADAC;
unsigned long int Len = Hame.GetLength();
unsigned long int tempO;
unsigned long int tempi;
unsigned char transmit;
for (unsigned int а=0;а ................
................
In order to avoid copyright disputes, this page is only a partial summary.
To fulfill the demand for quickly locating and searching documents.
It is intelligent file search solution for home and business.