Что надо знать хакеру. ][-гайд: выбери оптимальный язык программирования для своих задач

В этом уроке будут рассмотрены следующие две темы: введение и инструменты хакера.

Введение
Привет, читатель. Год назад я пришёл на ХЗ, и очень хотел стать хакером. Никто не мог мне обьяснить многие простые вещи, я видел много опытных, но стать на путь хакера мне помогли буквально единицы. И я могу их назвать: PinkPanther, DrWeb, R_a_ID_e_R. Я обучался сам, не надеясь ни на чью помощь, стараясь описывать свои познания в статьях для новичков. Так шло время, менялись поколения... Я не хочу усложнять жизнь ньюбов, я всегда к ним хорошо относился, и я считаю, что новички меют право знать. Тот, кто скажет, что я неправ, что мол "пусть сами разбираются, только так они вырастут", и прав и неправ. Да, упорные достигнут своей цели, но человек, которому это не надо, просто не будет читать эту статью. Тем, кто до сих пор мучает поисковики вопросами типа "как стать хакером" я решил посвятить цикл уроков, а может, и книгу. Ты пройдёшь путь от ламмера до хакера, изучишь технологии программирования, взлома и многое-многое другое. Проходи этот путь по моим урокам, и всё будет ОК. Это первый урок, посвящённый азам хакерства, он скорее завлекающий. Помни, всё это только игрушки, а настоящее хакерство пойдёт потом. А на этом этапе ты должен решить, нужно оно тебе, или нет. Постепенно мы изучим сетевые технологии, ты узнаешь, как устроен Интернет, что можно в нём найти интересного, что можно, а что нельзя. Добро пожаловать в наш мир!
Инструменты хакера
В этом разделе я опишу джентльменский набор хакера. Этими инструментами мы будем иногда пользоваться в дальнейшем.

Брутфорс
- Сканнер портов
- Сканнер безопасности
- Джойнер
- Mail Bomber
- Bзлом паролей Windows
- Просмотр паролей
- Троян
- KeyLogger
- Скрыватель IP (прокси/сокс)
- Подмена HTTP-запросов

Начнём по порядку:

[Брутфорс]. Bruteforce (в переводе с английского "грубая сила") применяется для подбора паролей от e-mail и ftp-серверов. Существует много видов программ-брутфорсов, но их способности схожи. При использовании таких программ на dial-up соединениях, где скорость не превышает 56 Кбит/сек, подбор может длиться долго и нудно, при использовании же скоростного интернета (ADSL, оптоволокно, спутник, и т.д.) скорость подбора увеличивается, однако тогда сьедается немало траффика. Оптимальный вариант - подбор по словарю. Взломщик составляет текстовый документ из возможных паролей жертвы, программа подключается на заданный ей сервер и по очереди перебирает пароли из файла. Если производится подбор паролей к почтовому ящику, нужно указать брутфорсу сервер входящих сообщений жертвы, например, если мы ломаем мыло , то чаще всего сервером будет pop.pupkin.ru. Если же мы ломаем не e-mail, а сайт pupkin.ru, то надо указать ftp-сервер, это будет ftp.pupkin.ru . Брутфорсы имеют ещё массу полезных настроек, например, если ты подсмотрел, что твой друг вводит пароль из 5 символов, и первый его символ L, то тебе надо использовать подбор по маске. Маска будет выглядеть так: L#### . Я привёл общее описание, а для более близкого знакомства советую скачать wwwHack .

[Сканнер портов]
Поскольку этот урок - введение, сетевыми технологиями я тебя буду мучить в другой раз, но это всё равно надо знать.
Сканнеры портов проверяют заданный диапазон IP-адресов на заданный открытый порт. Если порт открыт, этот IP добавляется в список.
Где это применяется? Создатели так называемых "троянов" иногда предусматривают сканнер портов в своих творениях. Дело в том, что сервер
трояна, попадая на машину, открывает в системе порт, по которому он получает команды клиента. Для тех, кто еще не догадался, обьясню: Зная,
какой порт открывает наш троян, мы "спрашиваем каждый компьютер диапазона", открыт ли этот порт, и если это так, значит на этой машине
сидит наш трой - можно смело коннектиться и управлять этим компьютером. Я рекомендую использовать Essentional Net Tools, так как это
хороший сканнер с дополнительным набором функций. Это не просто сканнер - имей ввиду. За время своего существования он стал
легендарным, и ещё не теряет своей актуальности. Он платный. Брат мой купил и дал мне серийник от версии 1.1:
Name: Jan Klaassen
S/N: 2957888021

[Сканнер безопасности]
В Интернете существует два типа страниц: статические(HTML) и динамические(PHP,ASP,CGI). Если расширение страницы htm, html, это означает, что сожержимое страницы не зависит от пользователя и всегда неизменное - "статическое". Динамические страницы обрабатывают данные, полученные от пользователя, грубо говоря, они умеют думать. Естественно, ни о каких дырах в html-страницах и речи быть не может, дыры бывают только в скриптах динамических страниц. Самые распространенные уязвимости - XSS. Их хорошо описал DrWeb в статье "XSS новичкам", поэтому их суть я обьяснять не буду. Для автоматизации поиска уязвимостей XSS (и не только) хакеры используют сканнеры безопасности. Я рекомендую XSpider.

[Джойнер] - (англ. Join - соединить, обьединить).
Джойнер - это программа, позволяющая обьединять несколько файлов один, с возможностью приклеивать к полученному файлу произвольную иконку. Таким образом, используя джойнер, хакер может склеить троянского коня с какой-либо полезной утилитой, и спихнуть это жертве. Та, в свою очередь, открывая файл, считает, что запускает свою прогу, хотя фактически их запускается две(три, четыре, и т.д.), просто троян себя не выдаёт. Минус такого подхода в том, что большинство джойнеров определяются антивирусами.


Этот тип программ предназначен для "бомбления" электронной почты, т.е. закидывания огромным числом писем. Mail-бомберы широко используются спаммерами. Лично я спаммером не являюсь, но использую Ganja Spammer для подмены адреса отправителя. Очень удобно при занятиях "фишингом". Что это такое - расскажу позже.

[Пароли Windows]
Я уважаю продукты компании InsidePro, и советую закачивать их . Это: PasswordsPro, MD5Inside, PWLInside, SAMInside. Предназначение программ уже заложено в их названии, но я расскажу о каждой в отдельности.
SAMinside - программа для взлома файла SAM. В Windows 2k/XP пароли пользователей хранятся в директории windowssystem32config, и называются соотв. SAM и SYSTEM, без расширения. Чтобы их скопировать для расшифровки, придётся юзать dos или альтернативную ОСь, как Windows PE. Так вот, пароли хранятся в зашифрованном виде, и чтобы их расшифровать, у тебя должны быть копии этих файлов. Надо забить их в SAMinside, поставить способ перебора, и ждать.
PWLinside - аналогично, только это для ныне мёртвых Windows 95/98, где пароли (в т.ч. на инет) хранятся в директории винды в файлах, имеющих расширение *.PWL.
MD5inside - расшифровывает MD5-хэш, используемый во многих системах авторизации. Расшифровав хэш, можно получить пароль. Кстати, в форумах IPB примерно такой хэш хранится в кукисах.
PasswordsPro - мощный инструмент для работы с паролями, имеет все функции MD5inside, генерация хэшей, также он может показывать пароли, скрытые за звёздочками, для этого надо включить соотв. режим и навести мышей на поле с паролем.

[Просмотр паролей]
Если тебе интересно знать, что друг пишет твоей невесте по e-mail, достаточно прити к нему домой и отправить варить кофе, а в это время достаём дискетку и запускаем прогу, показывающую все его пассы, от мыла в том числе. Магия? Нет! Всё дело в том, что для удобства, чтобы избавить тебя от кайфа каждый раз при авторизации на сайте, в аське и т.д. вводить пароль, браузеры/аськи/почтовики его запоминают. Вот за это их и наказывают). Существует множество программ, показывающих всевозможные сохранённые пароли. Чтобы посмотреть, что там насохранял IE и Outgluk Express, можно воспользоваться программой PSPV. Для TheBat - TheBatPasswordViewer, для ICQ/Trillian/Miranda etc. - Advanced Instant Messenger Password Recovery, сокращенно AIMPR.

[Троянская лошадь]
Вот и подобрались к самому интересному). Этот подвид зверей так называется потому что действует подобно знаменитому троянскому коню. Проникая в систему пользователя, он там осваивается и работает на хозяина. Что я имею ввиду? В отличие от вируса, троян безобиден, если ты не в сети. Он активизируется, когда его создатель посылает ему команды через LAN или Интернет, например, он может по команде отправить хозяину твои пароли, и ещё много чего интересного, также позволяет взломщику лазить по твоим файлам и реестру, вобщем суть ты понял, а возможности у них у всех разные. Самые популярные троянцы: ALB, NetBus, LamerDeath. Но только вот все они уже давно палятся. А мой собственный называется LamerHack, можете поискать на моем сайте , и не палится, но сейчас доступна ещё слабенькая бета-версия, кроме того непалимость компенсируется размером сервера.


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


Если ты занимаешься чем-то не совсем законным, то тебя вряд ли устроит то, что на взломанном тобой сервере останется твой IP-адрес, по которому тебя вычислить нефиг делать. И что в таком случае? Существует такая вещь, называемая прокси-сервером, или сокс-сервером. Я не буду вдаваться в тонкости и обьяснять тебе, чем они отличаются - на данном этапе тебе это неважно. Суть одна - заменяется твой IP-адрес на адрес proxy-сервера. Это ипользуется, когда есть какие-то ограничения на твой IP, например, обьем музыки для скачивания, либо ограниченное число попыток регистрации аськи. А для самого первого случая нужно использовать анонимные или элитные прокси. Их недостаток - непостоянность. Они меняются каждые n часов. Всегда свежий список проксей находится . В качестве программы для использования proxy я советую .

[Подмена HTTP-пакетов]
Это я тоже буду описывать более подробно в будущих уроках. Вся информация в Сети передвётся т.н. "пакетами". Подобно пакетам секретной информации на войне, HTTP-пакеты имеют начинку и надпись: кому/куда и т.д. , с той лишь разницей, что ЭТА информация особо секретной не считается, но вызывает интерес. В заголовке пакета находится информация о браузере, откуда мы пришли, и каким скриптам какие данные передаются. Как ты понял, речь пойдёт о подмене этих данных. Возникает вопрос: "А зачем?" . А затем. Рассмотрим лучше на примере. У нас в Днепропетровске очень популярный интернет-провайдер "Алькар Телепорт". Он содержит несколько сайтов с интересными ресурсами, которые доступны только его пользователям. При заходе с других провов, они посылают нафиг. А как же эти сайты проверяют, откуда я пришел? По IP. Если, допустим, IP вида 212.15.x.x , то доступ разрешен. А если заменить referer(откуда я появился) на адрес самого сервера, то, скорее всего, он не будет нам ничего запрещать. Используется программа InetCrack, качаем её .

Конечно, в этом разделе были описаны далеко не все программы, но основные.

Владислав Новик aka VladUha::HackZona.Ru

Программирование — это основной инструмент хакера. Если вы ещё не знаете никакого компьютерного языка, то я рекомендую начать с Python"а. Он понятно разработан, основательно документирован и относительно добр к новичкам. Несмотря на своё доброе отношение к новичкам — это не просто игрушка, а очень мощный и гибкий язык, который превосходно подходит для больших проектов. Я уже писал более подробную оценку Python"у . Есть прекрасное руководство для начинающих и официальный учебник на сайте Python"а, также можно найти превосходные руководства в других местах, одно из них Computer Science Circles .

Раньше я рекомендовал Java, как язык для раннего изучения, но, учитывая эту критику, изменил своё мнения (поищите также: “The Pitfalls of Java as a First Programming Language” (“Заблуждения о Java, как о первом языке программирования”)). Хакер не может подходить к решению проблемы, как решает её сантехник в магазине, он должен знать, что конкретно делает каждый компонент. Поэтому, сейчас я сколоняюсь, что в начале лучше будет изучить языки C и Lisp, и уже после них Java.

Сущестует, пожалуй, более общий подход к этому. Когда для создания чего-либо есть хороший инструмент, а язык для этого слишком много и изучение его вызывает трудности. Не только языки программирования могут справится с задачей, но и различные веб фреймворки, такие как RubyOnRails, CakePHP, Django могут решить задачу легко, но оставят вас с поверхностными знаниями и вы не сможете решить более сложную задачу или разобраться в проблеме, если это быстрое и лёгкое решение будет работать неправильно.

Если вы решили погрузиться в серьёзное программирование, то вы должны выучить сердцевину ОС Unix — язык C (произносится Си ). C++ (произносится Си Плас Плас )очень тесно связан с C, если вы знаете один, то изучить другой будет не трудно. Хотя они не являются языками для начинающих. И, на самом деле, чем больше вы избегаете программирования на C, тем более продуктивны будете вы.

C очень эффективный и очень бережливый относительно затрат машинных ресурсов. Тем не менее, использование языка C будет эффективным там, где требудется управление вручную низкоуровневыми ресурсами, например, памятью. Весь этот низкоуровневый код сложен и в нём легко ошибиться, а также требует огромного количества вашего времени на отладку (поиск и устранение ошибок). Принимая во внимание мощности современных компьютеров, можно принять компромисное решение — умнее поступить это выбрать язык, который менее эффективно использует ресурсы компьютера, но более эффективен к затраченному времени на реализацию. Этот компромис — Python.

Другие языки первостепенной важности для хакеров - это Perl и LISP . Язык Perl имеет смысл выучить из практических соображений: он очень широко используется для активных web-страниц и системного администрирования, так что даже если вам никогда не придётся писать на Perl, вы должны научиться его читать. Многи люди используют Perl в этом качестве, а я советую вам использовать Python и избегать программирования на Си, если задача не требует экономного использования ресурсов машины. Вам необходимо понимать такой код.

LISP ценен для изучения по другой причине - вы приобретёте глубокие знания узнав этот язык до конца. Эти познания сделают вас прекрасным программистом на всю оставшуюся жизнь, даже если вы никогда особо и не будете использовать сам LISP. (Первоначальные навыки программирования на LISP можно достаточно легко получить, создавая и модифицируя расширения текстового редактора Emacs или создавая плагины на Script-Fu для GIMP).

На самом деле, лучше выучить все пять: Python, C/C++, Java, Perl, и LISP. Помимо того, что это самые важные хакерские языки, они демонстрируют очень разные подходы к программированию и каждый из них научит ценным подходам.

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

Я не могу дать здесь полные инструкции как научиться программированию - это сложное искусство. Но я могу сказать вам, что книги и курсы этого тоже не сделают - многие, возможно большинство лучших хакеров самоучки. Вы можете научиться функциональным возможностям языков (малая часть знаний) из книг, но тип мышления, который делает эти знания применимы к жизни, может быть получен только на практике и через определённый период обучения. Что на самом деле может научить программированию, так это (а) чтение исходного кода и (б) написание исходного кода .

Питер Норвиг (Peter Norvig) один из ведущих хакеров Google и соавтор популярного учебника по ИИ (Искусственному Интеллекту), написал замечательную статью под названием Teach Yourself Programming in Ten Years (Научи себя программировать за десять лет). На его "рецепт успешного программирования" стоит обратить особенное внимание.

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

Больше об этом процессе я рассказал в How To Learn Hacking (Как научиться хакингу). Это простой набор инструкций, который выполнить очень не легко.

Отыскать хорошие исходные тексты для изучения раньше было сложно, потому что было очень мало больших программ, доступных в исходных текстах и пригодных для изучения и экспериментов юным хакерам. Теперь ситуация кардинально изменилась: программы в исходных текстах, средства разработки и целые операционные системы (всё это создано хакерами) теперь широко доступны. Что подводит меня прямо к следующему разделу...

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


3.1. Языки программирования


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

Год рождения ARPANET был также годом, когда хакер из «Bell Labs» по имени Кен Томпсон (Ken Thompson) создал Unix. Томпсон был вовлечен в работу по разработке операционной системы, называемой Multics. Multics должна была облегчить использование и программирование ЭВМ, чтобы увеличить производительность работы. Этот проект был выставлен на продажу, но никогда не пользовался таким успехом, как операционная система. Томпсон отказался от среды Multics и начал обыгрывать смесь идей Multics’a со своими собственными.

Другой хакер по имени Деннис Ричи (Dennis Ritchie) придумал новый язык, названный «С», для использования под «изначальным» Unix’oM Томпсона. Подобно Unix, «С» был разработан, чтобы быть естественным и гибким. Интерес к этим инструментам распространился в Bell Labs, и они получили популярность в 1971 г., когда Thompson и Ritchie выиграли тендер на то, что мы теперь называем системой автоматизации делопроизводства для внутреннего использования в фирме.

Традиционно операционные системы писались на ассемблере, чтобы извлечь максимально возможную эффективность (КПД) из хост-машин. Томпсон и Ричи были среди первых, кто понял, что аппаратные средства и технология компилирования стали достаточно хороши, чтобы операционная система полностью могла быть написана на «С», и к 1974 г. среда целиком была успешно перенесена на несколько машин различных типов.

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

Помимо переносимости, Unix и «С» имели еще одну важную силу. Они были сконструированы как философия «для самых тупых». Программист мог легко удерживать полную логическую структуру «С» в своей голове (в отличие от большинства других языков), вместо того чтобы постоянно обращаться к справочникам; и Unix был структурирован как гибкий инструментарий простых программ, разработанных для комбинирования друг с другом в необходимых направлениях.

В начале 1996 г. появился новый язык программирования – «Java». На домашней странице Consortium Java была внесена в список так называемых Мобильных кодов – одного из перспективных направлений развития технологии World Wide Web. И вот в конце 1996 г. на Западе начался бум Java, который к моменту проведения выставки Unix-Expo-96 докатился и до нашей страны. Согласно истории технология Java (кофе) роди-лась из проекта Oak (дуб), основной целью которого была разработка объектно-ориентированных средств описания и коммуникации различного рода электронных устройств. Из-за неудачи Oak в 1994 г. опыт, накопленный в рамках его реализации, было решено применить к продуктам, ориентированным на применение в Интернете. С апреля 1995 г. по сети свободно распространяется Hotjava – интерфейс просмотра страниц World Wide Web для платформ Sun.

Буквально через месяц Netscape Communication – тогдашний законодатель моды в разработке программ-интерфейсов Интернета – покупает лицензию на Java. С этого момента начинается золотое время для этой технологии. В настоящее время Hotjava реализована не только для Sun-. OS и Solaris, но и для многих других платформ и Windows.

Система программирования на Java позволяет компилировать программы для компьютерной платформы, на которой она стоит в том же ключе, как и любая другая, например С или C++. В этом случае основным отличием Java-программ, которые называются Java-applications, является использование библиотеки Java-классов, которые обеспечивают разработку безопасных, распределенных систем. При этом утверждается, что язык позволяет делать гораздо меньше ошибок при разработке программ. Главным при этом является тот факт, что в Java напрочь отсутствует адресная арифметика. Гораздо более интересным является разработка мобильных Java-байт-кодов, которые в терминах Java-технологии называются applets.

Известный в свое время язык программирования Модула-2 был создан Н. Виртом в 1979 г. и впервые реализован на мини-ЭВМ PDP-11. В 1970-х гг. Паскаль получил широкое признание у пользователей ЭВМ и преподавателей, однако первоначально он был разработан для обучения программированию и как язык разработки програмного обеспечения имел много недостатков. В Модуле-2 эти недостатки были устранены, но при этом сохранены логическая структура и характерные черты его предшественника. Кроме того, в Модуле-2 были введены новые мощные языковые средства.

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

Первые версии языка программирования Си++ (тогда он назывался «Си с классами») были разработаны в начале 1980-х гг. Бьярном Страуструпом, сотрудником знаменитой AT&T Bell Labs, где ранее были разработаны операционная система Unix и язык программирования Си. По признанию самого автора языка, Си++ никогда не разрабатывался на бумаге. Проектирование, реализация и документирование новых возможностей происходили фактически одновременно. Единственной целью разработки было создание языка, на котором было бы удобно программировать автору и его друзьям. За основу был взят популярный в среде профессиональных разработчиков язык программирования Си. Первыми средствами, которыми был расширен Си, стали средства поддержки абстракций данных и объектно-ориентированного программирования. Как это принято в AT&T, описание нового языка не было опубликовано сразу. Первыми его пользователями стали сами сотрудники Bell Labs.

Perl. Когда встает вопрос о создании приложений системного уровня, в частности сценариев Web-cepвepoв, на первый план выходит язык программирования Perl -прежде всего благодаря своей проверенности и богатству возможностей. Perl (Practical Extraction and Reporting Language, или, как иногда расшифровывают это название создатель Perl и другие его фанатичные приверженцы, – Pathologically Eclectic Rubbish Lister) является одним из наиболее мощных и популярных языков программирования.

История «Perl» началась в 1987 г., когда человек по имени Ларри Уолл занялся разработкой языка, необходимого ему для решения проблем системного программирования, с которыми он сталкивался как администратор Unix-систем. Несмотря на такое скромное начало, Perl вырос в полнофункциональный сложный язык. Он привлекателен тем, что заполняет разрыв между методами программирования коммандного процессора Unix и С-приложениями, обладая простотой первых и функциональностью последних. Уолл характеризует его так: «Perl – это интерпретируемый язык, оптимизированный для сканирования произвольных текстовых файлов, извлечения информации из этих файлов и печати отчетов на основе этой информации. С его помощью также можно решать многие задачи системного управления. При разработке этого языка целью была не столько красота (небольшой объем, элегантность и оптимальность), сколько практичность (простота в использовании, эффективность и полнота)». Уолл указывает также, что синтаксис выражений Perl находится в полном соответствии с синтаксисом выражений языка С; Perl не ограничивает произвольно объем ваших данных – «если вы располагаете памятью, Perl может загрузить в нее весь ваш файл как одну строку»; рекурсия может быть неограниченной глубины, а кроме того, язык применяет изощренные методы сопоставления с образцом для быстрого сканирования больших объемов данных.


3.2. Почему ломают сети?


Сильными сторонами российских взломщиков по-прежнему остаются коллективизм и взаимопомощь, а также мощный полет воображения, чего в большинстве случаев их западные коллеги лишены. Действуют они дружной толпой (стадом), которой и батьке навалять можно. Рассчитанные по большей части на достаточно инфантильные западные стандарты, системы защиты от взлома лихих и невероятно изобретательных россиян обычно бессильны. Охраннику с резиновой дубинкой нипочем не остановить банду, вооруженную монтировками и гвоздодерами. Как таковой кражей денег со счетов пока занимаются единицы, и то от случая к случаю. Но вот через пару лет с расширением в России компьютерных коммуникаций такие вещи могут быть поставлены на поток. Предвидя такой оборот событий, руководители ФБР и иже с ними уже сейчас поднимают шум и соответственно требуют дополнительных ассигнований. И, как ни странно, наши хакеры выступают здесь в роли добровольных и весьма эффективных помощников.

Несколько лет назад по сети «Фидонет» прошла информация, что некий ее участник забрался в компьютер управления сетью международных спутников «Иммарсат» (обслуживает навигацию, космос, связь, сигналы «SOS» и т. д.). Он не только сам там «погулял», но и выдал в сеть все инструкции и пароли по вхождению в базу данных. Чем это может обернуться для спутниковой сети, пока неясно.

Нахальство наших компьютерных хулиганов не в последнюю очередь обусловлено фактическим отсутствием борьбы с ними на родине. Причем нельзя сказать, что совсем ничего не делается. В 2001 г. вышел специальный указ Президента о защите информации. Россия обязалась сотрудничать с Интерполом в этой области. В начале 1995 г. при МВД было создано специальное подразделение по борьбе с хакерами в количестве восьми человек. По этому вопросу было даже специальное заседание Совета безопасности. Хорошей иллюстрацией эффективности подобных мер является то, что на вопрос корреспондента о результатах поимки злодеев ответственный работник МВД ответил прямо: «Молодой человек, арестовывают и судят у нас по законам, а не по указам».

В 1997 г. ФБР обратилось к правоохранительным органам России. Дело в том, что американские глобальные коммерческие информационные сети, такие как America Online и Microsoft Network, за 4 месяца 1996 г. понесли ощутимые убытки от хакеров, использующих для входа в сеть фальшивые кредитные карточки. Проследив линки, службы безопасности указанных сетей передали всю информацию ФБР, так как было выявлено, что большинство незаконных подключений производится со стороны России. Если честно, то в Интернете определить источник подключения достаточно просто, но дорого (приходится держать дополнительный штат сотрудников). В АОЛ и МСН такие подразделения существуют. Ну и что? Первым делом начинается проверка всех официальных точек входа в сеть, т. е., если в городе имеется официальное представительство сети со своим номером телефона для подключения к конкретной сети, все подключения начинают контролировать автоматически. При этом работает АОН или CID (если набор тональный). Если абонент официально подключен к сети – все нормально. Если номер не определяется – абонента «выкидывает с линии». Если номер телефона не совпадает с базой данных официальных пользователей – соединение автоматически берется на контроль. Не спасает и подключение через Интернет (через промежуточные сети), так как текущий линк всегда фиксируется при соединении (этот момент используется сетью для автоматического роуминга пакетов данных). Только в Москве в 1996 г. было выявлено более 360 человек, незаконно использующих коммуникационные услуги. Тут есть юридическая тонкость – сидя дома, человек совершает преступление на территории США. Требование привлечь их к ответственности в соответствии с законодательством США даже в наши маразматические времена – дикость. Тут можно годами разбираться. Теоретически здесь применимы статьи УК РФ, касающиеся финансовых преступлений, т. е., если хакера нельзя привлечь за взлом сети, его можно привлечь к уголовной ответственности по другим статьям (например, за хулиганство, подделку денежных знаков и т. п.).

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


3.3. Протокол TCP/IP


Семейство протоколов TCP/IP широко применяется во всем мире для объединения компьютеров в сеть Интернет. Более подробную информацию о протоколах TCP/IP можно найти в RFC (Requests For Comments) – специальных документах, выпускаемых Сетевым Информационным Центром (Network Information Center – NIC).

Каждая машина в сети, работающей по протоколу TCP/IP (IP-сети), имеет уникальный адрес, который присваивается администратором, и все данные передаются и получаются машиной с использованием этого уникального адреса. Вторым, не менее важным параметром, характеризующим машину, является маска подсети – величина, определяющая максимальное число машин, которые могут находиться в одном локальном сегменте сети.

Администратор присваивает IP-адреса машинам в соответствии с тем, к каким IP-сетям они подключены. Старшие биты 4-байтного IP-адреса определяют номер IP-сети. Оставшаяся часть IP-адреса – номер узла (хост-номер). Существуют 5 классов IP-адресов, отличающиеся количеством бит в сетевом номере и хост-номере. Класс адреса определяется значением его первого байта. Из этих 5 классов широко используются только первые три.

Адреса класса «А» предназначены для использования в больших сетях общего пользования. Они допускают большое количество номеров узлов. Адреса класса «В» используются в сетях среднего размера, например в сетях университетов и крупных компаний. Адреса класса С используются в сетях с небольшим числом компьютеров.

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


Класс Начало диапазона Конец диапазона Маска
А 10.0.0.0 10.255.255 255.255.0.0.0
В 172.16.0.0 172.31.255 255.255.255.0.0
С 192.168.1120 192.168.112.255 255.255.255.0

Прежде чем вы начнете использовать сеть с TCP/IP, вы должны получить один или несколько официальных сетевых номеров. Выделением номеров (как и многими другими вопросами) в Интернете занимается DDN Network Information Center (NIC). Выделение номеров производится бесплатно и занимает около недели. Вы можете получить сетевой номер вне зависимости от того, для чего предназначена ваша сеть. Даже если ваша сеть не имеет связи с объединенной сетью Интернет, получение уникального номера желательно, так как в этом случае есть гарантия, что в будущем при включении в Интернет или при подключении к сети другой организации не возникнет конфликта адресов. Адрес для вашей сети может предоставить ваш провайдер. Чаще всего так и делается.

Адресное пространство сети может быть разделено на непересекающиеся части – «подсети», с каждой из которых можно работать, как с обычной сетью TCP/IP. Таким образом, единая IP-сеть организации может строиться как объединение подсетей.

Как правило, подсеть соответствует одной физической сети, например одной сети Ethernet. Использование подсетей необязательно. Можно просто назначить для каждой физической сети свой сетевой номер, например номер класса «С». Однако такое решение имеет два недостатка. Первый заключается в пустой трате сетевых номеров. Более серьезный недостаток состоит в том, что если ваша организация имеет несколько сетевых номеров, то машины вне ее должны поддерживать записи о маршрутах доступа к каждой из этих IP-сетей. Таким образом, структура IP-сети организации становится видимой для всего мира. При каких-либо изменениях в IP-сети информация о них должна быть учтена в каждой из машин, поддерживающих маршруты доступа к данной IP-сети.


3.4. Порты


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

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



| |

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

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

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

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

Веб-разработчик

https://geekbrains.ru/professions/web_developer

Легко ли быть веб-разработчиком? Может показаться, что не очень сложно - ведь веб-сайт может сделать кто угодно. Однако чтобы стать настоящим фулстек-девелопером, сегодня нужно знать гораздо больше, чем HTML и какой-нибудь серверный язык. За десять месяцев этот набор курсов Geekbrains проведет тебя от освоения HTML и CSS к изучению PHP - с самого начального уровня и до профессиональной веб-разработки с применением фреймворка YII2. Поимо этого, сюда входят курсы по изучению Javascript - как клиентского, так и серверного (Node.js), а также фреймворков Angular и D3.js.

Мобильный разработчик

https://geekbrains.ru/professions/mobile_developer

Хочешь делать мобильные приложения для iOS и Android? Этот набор курсов спроектирован специально для таких, как ты и длится 11 месяцев. В него входит два курса по Java (от основ до продвинутого ООП, работы с сетью и многопоточностью) и два курса по Android (разработка интерфейса, работа с графикой и сенсорами и так далее). Вторая половина курсов посвящена Objective-C - этот язык необходим тем, кто планирует делать приложения для iOS. К нему добавлен и курс по Swift - новому языку Apple, который уже начинает использоваться в разработке софта.

Программист на Java

https://geekbrains.ru/professions/java_developer

Создатели языка Java думали, что он так хорош, что будет применяться повсеместно. Этого не случилось: в итоге Java используется на Android и в серьезной серверной разработке - на этом языке пишут бекенды высоконагруженных приложений и многопользовательских игр. Отсюда вывод: программистам на Java всё же очень неплохо живется! Стать одним из них поможет этот шестимесячный набор курсов Geekbrains. Два курса по Java в нем совпадают с планом занятий разработчиков софта для Android, но именно третий курс поможет стать настоящим гуру Java. Он посвящен базам данных, построению графических интерфейсов, а также сложным вещам вроде многопоточности, механизма отражений и внутренним классам.

Программист на Python

https://geekbrains.ru/professions/python_developer

Говорят, что на Python можно начать программировать без всякого обучения, но при этом умалчивается пара важных деталей: толком это получится только у того, кто уже знает пару языков, да и профессионалом так не станешь. Пятимесячный курс Geekbrains включает не только изучение Python от основ до тонкостей вроде декораторов, но затрагивает ещё и HTML/CSS, Javascript и фреймворк Django. Так что ты научишься не просто писать программы на Python, но сможешь делать на нем полноценные динамические сайты.

Программист на Ruby

https://geekbrains.ru/professions/ruby_developer

Язык Ruby долго считался интересной диковинкой, пока не появился фреймворк Ruby on Rails. Теперь Ruby - один из лучших языков для веб-разработки, а благодаря Rails он помогает многократно ускорить и упростить разработку сложных веб-приложений. Этот полугодовой курс Geekbrains научит тебя обращаться с HTML/CSS и клиентским Javascript, а также обучит Ruby именно с целью использования Rails. Контроллеры и шаблонизаторы ждут тебя, будущий веб-разработчик!

Спецпроект с компанией GeekBrains

Пятнадцать лет назад эпический труд Криса Касперски «Фундаментальные основы хакерства» был настольной книгой каждого начинающего исследователя в области компьютерной безопасности. Однако время идет, и знания, опубликованные Крисом, теряют актуальность. Редакторы «Хакера» попытались обновить этот объемный труд и перенести его из времен Windows 2000 и Visual Studio 6.0 во времена Windows 10 и Visual Studio 2017.

Проверка аутентичности

Проверка аутентичности (от греч. authentikos - подлинный) - «сердце» подавляющего большинства защитных механизмов. Должны же мы удостовериться, то ли лицо, за которое оно себя выдает, работает с программой и разрешено ли этому лицу работать с программой вообще!

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

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

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

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


Шаг первый. Разминочный

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

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

If (strcmp(введенный пароль, эталонный пароль)) {/* Пароль неверен */} else {/* Пароль ОK*/}

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

Листинг 1. Пример простейшей системы аутентификации

#include "stdafx.h" // Простейшая система аутентификации - // посимвольное сравнение пароля #include #include #define PASSWORD_SIZE 100 #define PASSWORD "myGOODpassword\n" // Этот перенос нужен затем, чтобы // не выкусывать перенос из строки, // введенной пользователем int main() { // Счетчик неудачных попыток аутентификации int count=0; // Буфер для пароля, введенного пользователем char buff; // Главный цикл аутентификации for(;;) { // Запрашиваем и считываем пользовательский // пароль printf("Enter password:"); fgets(&buff,PASSWORD_SIZE,stdin); // Сравниваем оригинальный и введенный пароль if (strcmp(&buff,PASSWORD)) // Если пароли не совпадают - «ругаемся» printf("Wrong password\n"); // Иначе (если пароли идентичны) // выходим из цикла аутентификации else break; // Увеличиваем счетчик неудачных попыток // аутентификации и, если все попытки // исчерпаны, завершаем программу if (++count>3) return -1; } // Раз мы здесь, то пользователь ввел правильный // пароль printf("Password OK\n"); }

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

Не так уж редко пароли представляют собой осмысленные слова наподобие Ferrari, QWERTY, имена любимых хомячков или названия географических пунктов. Угадывание пароля сродни гаданию на кофейной гуще - никаких гарантий на успех нет, остается рассчитывать на одно лишь везение. А удача, как известно, птица гордая - палец в рот ей не клади. Нет ли более надежного способа взлома?

Давайте подумаем. Раз эталонный пароль хранится в теле программы, то, если он не зашифрован каким-нибудь хитрым образом, его можно обнаружить тривиальным просмотром двоичного кода программы. Перебирая все встретившиеся в ней текстовые строки, начиная с тех, что более всего смахивают на пароль, мы очень быстро подберем нужный ключ и откроем им программу! Причем область просмотра можно существенно сузить - в подавляющем большинстве случаев компиляторы размещают все инициализированные переменные в сегменте данных (в PE-файлах он размещается в секции.data или.rdata). Исключение составляют, пожалуй, ранние багдадские (Borland’овые) компиляторы с их маниакальной любовью всовывать текстовые строки в сегмент кода - непосредственно по месту их вызова. Это упрощает сам компилятор, но порождает множество проблем. Современные операционные системы, в отличие от старушки MS-DOS, запрещают модификацию кодового сегмента, и все размещенные в нем переменные доступны лишь для чтения. К тому же на процессорах с раздельной системой кеширования они «засоряют» кодовый кеш, попадая туда при упреждающем чтении, но при первом же обращении к ним вновь загружаются из медленной оперативной памяти (кеша второго уровня) в кеш данных. В результате - тормоза и падение производительности.

Что ж, пусть это будет секция данных! Остается только найти удобный инструмент для просмотра двоичного файла. Можно, конечно, нажать клавишу F3 в своей любимой оболочке (FAR, например) и, придавив кирпичом клавишу Page Down, любоваться бегущими цифирьками до тех пор, пока не надоест.

Можно воспользоваться любым hex-редактором (QView, Hiew...) - кому какой по вкусу, - но в статье, по соображениям наглядности, приведен результат работы утилиты DUMPBIN из штатной поставки Microsoft Visual Studio. DUMPBIN запускается из Developer Command Prompt.

Натравим утилиту на исполняемый файл нашей программы, в котором лежит пароль, и попросим ее распечатать содержащую инициализированные только для чтения данные секцию rdata (ключ /SECTION:.rdata) в «сыром» виде (ключ /RAWDATA:BYTES), указав значок > для перенаправления вывода в файл (ответ программы занимает много места, и на экране помещается один лишь «хвост»).

Листинг 2

> dumpbin /RAWDATA:BYTES /SECTION:.rdata passCompare1.exe > rdata.txt 004020E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 004020F0: 18 30 40 00 68 30 40 00 45 6E 74 65 72 20 70 61 [email protected]@.Enter pa 00402100: 73 73 77 6F 72 64 3A 00 6D 79 47 4F 4F 44 70 61 ssword:.myGOODpa 00402110: 73 73 77 6F 72 64 0A 00 57 72 6F 6E 67 20 70 61 ssword..Wrong pa 00402120: 73 73 77 6F 72 64 0A 00 50 61 73 73 77 6F 72 64 ssword..Password 00402130: 20 4F 4B 0A 00 00 00 00 00 00 00 00 00 00 00 00 OK............. 00402140: 00 00 00 00 90 0A C1 5B 00 00 00 00 02 00 00 00 ......A[........ 00402150: 48 00 00 00 24 22 00 00 24 14 00 00 00 00 00 00 H...$"..$.......

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

Один из способов сделать это - насильно поместить эталонный пароль в собственноручно выбранную нами секцию. Такая возможность не предусмотрена стандартом, и потому каждый разработчик компилятора (строго говоря, не компилятора, а линкера, но это не суть важно) волен реализовывать ее по-своему или не реализовывать вообще. В Microsoft Visual C++ для этой цели предусмотрена специальная прагма data_seg, указывающая, в какую секцию помещать следующие за ней инициализированные переменные. Неинициализированные переменные по умолчанию располагаются в секции.bss и управляются прагмой bss_seg соответственно.

В листинг 1 перед функцией main добавим новую секцию, в которой будем хранить наш пароль:

// С этого момента все инициализированные переменные будут // размещаться в секции.kpnc #pragma data_seg(".kpnc") #define PASSWORD_SIZE 100 #define PASSWORD "myGOODpassword\n" char passwd = PASSWORD; #pragma data_seg()

Внутри функции main проинициализируем массив:

// Теперь все инициализированные переменные вновь будут // размещаться в секции по умолчанию, то есть.rdata char buff="";

Немного изменилось условие сравнения строк в цикле:

If (strcmp(&buff,&passwd))

Натравим утилиту DUMPBIN на новый исполняемый файл:

> dumpbin /RAWDATA:BYTES /SECTION:.rdata passCompare2.exe > rdata.txt 004020C0: D3 17 40 00 00 00 00 00 D8 11 40 00 00 00 00 00 [email protected].@..... 004020D0: 00 00 00 00 2C 11 40 00 D0 11 40 00 00 00 00 00 ....,.@.?.@..... 004020E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 004020F0: 18 30 40 00 68 30 40 00 45 6E 74 65 72 20 70 61 [email protected]@.Enter pa 00402100: 73 73 77 6F 72 64 3A 00 57 72 6F 6E 67 20 70 61 ssword:.Wrong pa 00402110: 73 73 77 6F 72 64 0A 00 50 61 73 73 77 6F 72 64 ssword..Password 00402120: 20 4F 4B 0A 00 00 00 00 00 00 00 00 00 00 00 00 OK............. 00402130: 00 00 00 00 6F CB C4 5B 00 00 00 00 02 00 00 00 ....oEA[........ 00402140: 48 00 00 00 14 22 00 00 14 14 00 00 00 00 00 00 H....".......... 00402150: 6F CB C4 5B 00 00 00 00 0C 00 00 00 14 00 00 00 oEA[............

Ага, теперь в секции данных пароля нет и хакеры «отдыхают»! Но не спешите с выводами. Давайте сначала выведем на экран список всех секций, имеющихся в файле:

> dumpbin passCompare2.exe Summary 1000 .data 1000 .kpnc 1000 .rdata 1000 .reloc 1000 .rsrc 1000 .text

Нестандартная секция.kpnc сразу же приковывает к себе внимание. А ну-ка посмотрим, что там в ней?

> dumpbin /SECTION:.kpnc /RAWDATA passCompare2.exe RAW DATA #4 00404000: 6D 79 47 4F 4F 44 70 61 73 73 77 6F 72 64 0A 00 myGOODpassword..

Вот он, пароль! Спрятали, называется… Можно, конечно, извратиться и засунуть секретные данные в секцию неинициализированных данных (.bss) или даже секцию кода (.text) - не все там догадаются поискать, а работоспособность программы такое размещение не нарушит. Но не стоит забывать о возможности автоматизированного поиска текстовых строк в двоичном файле. В какой бы секции ни содержался эталонный пароль, фильтр без труда его найдет (единственная проблема - определить, какая из множества текстовых строк представляет собой искомый ключ; возможно, потребуется перебрать с десяток-другой потенциальных «кандидатов»).

Шаг второй. Знакомство с дизассемблером

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

Хакнуть, говорите? Что ж, это несложно! Куда проблематичнее определиться, чем именно ее хакать. Инструментарий хакеров чрезвычайно разнообразен, чего тут только нет: и дизассемблеры, и отладчики, и API-, и message-шпионы, и мониторы обращений к файлам (портам, реестру), и распаковщики исполняемых файлов, и… Сложновато начинающему кодокопателю со всем этим хозяйством разобраться!

Впрочем, шпионы, мониторы, распаковщики - второстепенные утилиты заднего плана, а основное оружие взломщика - отладчик и дизассемблер.

Итак, дизассемблер применим для исследования откомпилированных программ и частично пригоден для анализа псевдокомпилированного кода. Раз так, он должен подойти для вскрытия парольной защиты passCompare1.exe. Весь вопрос в том, какой дизассемблер выбрать.

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

Логичнее всего воспользоваться услугами дизассемблера-интеллектуала (если он есть), но… давайте не будем спешить, а попробуем выполнить весь анализ вручную. Техника, понятное дело, штука хорошая, да вот не всегда она оказывается под рукой, и неплохо бы заранее научиться работе в полевых условиях. К тому же общение с плохим дизассемблером как нельзя лучше подчеркивает «вкусности» хорошего.

Воспользуемся уже знакомой нам утилитой DUMPBIN, настоящим «швейцарским ножиком» со множеством полезных функций, среди которых притаился и дизассемблер. Дизассемблируем секцию кода (как мы помним, носящую имя.text), перенаправив вывод в файл, так как на экран он, очевидно, не поместится:

> dumpbin /SECTION:.text /DISASM passCompare1.exe > code-text.txt

Заглянем еще раз в секцию данных (или в другую - в зависимости от того, где хранится пароль): см. листинг 2.

Запомним найденный пароль: myGOODpassword . В отличие от Visual C++ 6.0, которой пользовался Крис, Visual C++ 2017 не обращается к инициализированным переменным по шестнадцатеричному смещению, а подставляет значение прямо в секцию кода. Таким образом, попробуем найти выявленный ранее пароль в дизассемблированном листинге тривиальным контекстным поиском с помощью любого текстового редактора.

0040107D: B9 08 21 40 00 mov ecx,offset ??_C@_0BA@PCMCJPMK@myGOODpassword?6?$AA@ 00401082: 8A 10 mov dl,byte ptr 00401084: 3A 11 cmp dl,byte ptr 00401086: 75 1A jne 004010A2 00401088: 84 D2 test dl,dl 0040108A: 74 12 je 0040109E

Смотрите, центральная часть этого листинга отвечает за сравнение значений регистров EAX и ECX. В последний, как мы видим, в первой строке листинга записывается эталонный пароль, следовательно, в первом - введенный пользователем. Затем происходит сравнение и выполняются переходы почти в одну и ту же точку: 0x4010A2 и 0x40109E. Заглянем, что там:

0040109E: 33 C0 xor eax,eax 004010A0: EB 05 jmp 004010A7 004010A2: 1B C0 sbb eax,eax 004010A4: 83 C8 01 or eax,1 004010A7: 85 C0 test eax,eax 004010A9: 74 63 je 0040110E 004010AB: 0F 1F 44 00 00 nop dword ptr 004010B0: 68 18 21 40 00 push offset ??_C@_0BA@EHHIHKNJ@Wrong?5password?6?$AA@ 004010B5: E8 56 FF FF FF call _printf

Здесь центральную роль играет инструкция test eax,eax , расположенная по смещению 0x4010A7. В случае если eax равен 0, следующая за ней команда JE совершает прыжок на 0x40110E. В противном же случае на вершину стека выталкивается строка Wrong password:

Push offset ??_C@_0BA@EHHIHKNJ@Wrong?5password?6?$AA@

а следом - вызов функции с говорящим названием:

Call _printf

Значит, ненулевое значение EAX свидетельствует о ложном пароле, а ноль - об истинном.

О’кей, тогда переходим к анализу валидной ветви программы, что делается после прыжка на 0x40110E. А тут притаилась инструкция, которая помещает строку Password OK на вершину стека, после чего вызывается процедура _printf, которая, очевидно, выводит строку на экран:

0040110E: 68 28 21 40 00 push offset ??_C@_0N@MBEFNJID@Password?5OK?6?$AA@ 00401113: E8 F8 FE FF FF call _printf

Оперативные соображения следующие: если заменить команду JE на JNE, то программа отвергнет истинный пароль как неправильный, а любой неправильный пароль воспримет как истинный. А если заменить TEST EAX,EAX на XOR EAX,EAX, то после исполнения этой команды регистр EAX будет всегда равен нулю, какой бы пароль ни вводился.

Дело за малым - найти эти самые байтики в исполняемом файле и слегка подправить их.

Шаг третий. Хирургический

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

Ну, с «выкидыванием запчастей» справиться как раз таки просто - достаточно забить код командами NOP (опкод которой 0x90, а вовсе не 0x0, как почему-то думают многие начинающие кодокопатели), то есть пустой операцией (вообще-то NOP - это просто другая форма записи инструкции XCHG EAX,EAX - если интересно). С «раздвижкой» куда сложнее! К счастью, в PE-файлах всегда присутствует множество «дыр», оставшихся от выравнивания, в них-то и можно разместить свой код или свои данные.

Но не проще ли просто откомпилировать ассемблированный файл, предварительно внеся в него требуемые изменения? Нет, не проще, и вот почему: если ассемблер не распознает указатели, передаваемые функции (а как мы видели, наш дизассемблер не смог отличить их от констант), он, соответственно, не позаботится должным образом их скорректировать, и, естественно, программа работать не будет.

Приходится резать программу вживую. Легче всего это делать с помощью утилиты Hiew, «переваривающей» PE-формат файлов и упрощающей тем самым поиск нужного фрагмента. Подойдет любая версия этого hex-редактора. Например, я использовал далеко не самую новую версию 6.86, прекрасно уживающуюся с Windows 10. Запустим ее, указав имя файла в командной строке hiew32 passCompare1.exe, двойным нажатием клавиши Enter, переключимся в режим ассемблера и при помощи клавиши F5 перейдем к требуемому адресу. Как мы помним, команда TEST, проверяющая результат на равенство нулю, располагалась по адресу 0x4010A7.

Чтобы Hiew мог отличить адрес от смещения в самом файле, предварим его символом точки: .4010A7.

004010A7: 85 C0 test eax,eax 004010A9: 74 63 je 0040110E

Ага, как раз то, что нам надо! Нажмем клавишу F3 для перевода Hiew в режим правки, подведем курсор к команде TEST EAX,EAX и, нажав клавишу Enter, заменим ее на XOR EAX,EAX.

004010A7: 33 C0 xor eax,eax 004010A9: 74 63 je 0040110E

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

>passCompare1 Enter password:Привет, шляпа! Password OK

Получилось! Защита пала! Хорошо, а как бы мы действовали, не умей Hiew «переваривать» PE-файлы? Тогда пришлось бы прибегнуть к контекстному поиску. Обратим свой взор на шестнадцатеричный дамп, расположенный дизассемблером слева от ассемблерных команд. Конечно, если пытаться найти последовательность 85 C0 - код команды TEST EAX,EAX, ничего хорошего из этого не выйдет - этих самых TEST’ов в программе может быть несколько сотен, а то и больше. А вот адрес перехода, скорее всего, во всех ветках программы различен, и подстрока TEST EAX,EAX/JE 0040110E имеет хорошие шансы на уникальность. Попробуем найти в файле соответствующий ей код: 85 C0 74 63 (в Hiew для этого достаточно нажать клавишу F7).

Опп-с! Найдено только одно вхождение, что нам, собственно, и нужно. Давайте теперь попробуем модифицировать файл непосредственно в hex-режиме, не переходя в ассемблер. Попутно возьмем себе на заметку - инверсия младшего бита кода команды приводит к изменению условия перехода на противоположное, то есть 74 JE -> 75 JNE.



Работает? В смысле защита свихнулась окончательно - не признает истинные пароли, зато радостно приветствует остальные. Замечательно!


Продолжение следует?

Итак, ты прочел (прочел ведь?) начальный отрывок классической книги Криса Касперски «Фундаментальные основы хакерства» в современном переосмыслении. Получилось ли у нас обновить эти знания до актуального уровня? Стоит ли продолжать? Поделись своим мнением в

Компьютер