Программирование на C++ глазами хакера

         

Кто такой хакер? Как им стать?


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

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

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

Понятие "хакер" зародилось, когда только стала распространяться первая сеть ARPANET. Тогда это понятие обозначало человека, хорошо разбирающегося в компьютерах. Некоторые даже подразумевали под хакером человека, "помешанного" на компьютерах. Понятие ассоциировали со свободным компьютерщиком, человеком, стремящимся к свободе во всем, что касалось его любимой "игрушки". Именно благодаря этому стремлению и тяге к свободному обмену информацией и началось такое бурное развитие всемирной сети. Именно хакеры помогли развитию Интернета и создали FIDO. Благодаря им появились UNIX-подобные системы с открытым исходным кодом, на которых сейчас работает большое количество серверов.

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

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


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

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

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

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

Маленький пример на эту тему. Мой начальник всегда копирует и вставляет данные из буфера обмена с помощью кнопок на панели инструментов или команд контекстного меню, которое появляется при щелчке правой кнопкой мыши. Но если вы делаете так же, то наверно знаете, что не везде есть кнопки Копировать, Вставить или такие же пункты в контекстном меню. В таких случаях мой начальник набирает текст вручную. А ведь можно было бы воспользоваться копированием/вставкой с помощью комбинаций горячих клавишCtrl+C/Ctrl+V или Ctrl+Ins/Shift+Ins, которые достаточно универсальны и реализованы практически во всех современных приложениях.



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

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

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



Желательно уметь программировать. Любой хакер должен знать как минимум один язык программирования. А лучше знать даже несколько языков. Лично я для начала рекомендую всем изучить Borland Delphi или C++. Borland Delphi достаточно прост, быстр, эффективен, а главное, это очень мощный язык. C++ - признанный стандарт во всем мире, но немного сложнее в изучении. Но сие не значит, что не надо знать другие языки. Вы можете научиться программировать на чем угодно, даже на языке Basic (использовать его не советую, но знать не помешало бы).

Хотя я не очень люблю Visual Basic за его ограниченность, неудобность и сплошные недостатки, я видел несколько великолепных программ, которые были написаны именно на этом языке. Глядя на них, сразу хочется назвать их автора хакером, потому что это действительно виртуозная и безупречная работа. Создание из ничего чего-то великолепного как раз и есть искусство хакерства.

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



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

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

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

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

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

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



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

Знать меру. Честно сказать, я уважаю Билла Гейтса за то, что он создал Windows и благодаря ей сделал компьютер доступным для каждого в этом мире. Если раньше пользоваться компьютерами могли только люди с высшим образованием и математическими способностями, то теперь он доступен каждому ребенку.

Единственное, что я не приветствую - это методы, которыми продвигается Windows на компьютеры пользователей. Неужели Биллу Гейтсу недостаточно денег? Мне кажется, что уже давно пора ослабить давление, и Windows наоборот станет более популярной, и у многих пропадет ненависть к корпорации и ее руководству.

Нельзя просто так лишать денег другие фирмы только из-за того, что ты проиграл конкуренцию, как это произошло с Netscape Navigator. Тогда Microsoft не удалось победить фирму Netscape в честной борьбе, и Microsoft сделала свой браузер бесплатным, потому что у корпорации хватает денег и она может себе это позволить. Но почему нельзя было просто уйти от борьбы и достойно принять проигрыш? Ведь доходы фирмы от перевода Windows на бесплатную основу не так уж сильно увеличились, а интеграция Internet Explorer в ОС - чистый фарс.

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

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



Ну, а если к вам попал код другого человека, то не стесняйтесь его использовать (с его согласия!). Не выдумывайте то, что уже сделано другими и обкатано пользователями. Если каждый будет создавать колесо, то никто и никогда не создаст повозку.

Хакеры - не просто отдельные личности, а целая культура. Но это не значит, что все хакеры одеваются одинаково и все на одно лицо. Каждый из них - это отдельный индивидуум и не похож на других. Не надо копировать другого человека. Удачное копирование не сделает вас продвинутым хакером. Только ваша индивидуальность может сделать вам имя.

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

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

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

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

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

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



Некоторые считают, что правильно надо произносить "хэкер", а не "хакер". Это так, но только для английского языка. У нас в стране это слово обрусело и стало "хакером". Мы - русские люди, и давайте будем любить свой язык и признавать его правила.

Напоследок советую почитать статью "Как стать хакером" на сайте www.sekachev.ru. Эта статья написана знаменитым хакером по имени Eric S. Raymond. С некоторыми его взглядами я не согласен, но в большинстве своем она также отражает дух хакерства.

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

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

Вот и последнее. Я уже сказал, что любой хакер должен уметь писать программы на каком-нибудь языке программирования. Некоторые заведомо считают, что если человек хакер, то он должен знать и уметь программировать на языке ассемблера. Это не так. Знание этого языка желательно, но не обязательно. Я люблю Borland Delphi, который позволяет мне сделать все, что я захочу. А главное, что я могу сделать это быстро и качественно. Но я также использую C++ и ассемблер.



Языки программирования надо использовать с умом. Несмотря на мою любовь к Borland Delphi должен признать, что он удобен для написания практически любых программ, кроме игр. Тут всегда властвовал и будет властвовать C++. При сетевом программировании иногда может оказаться удобнее C++, а иногда Borland Delphi. Но писать большие приложения на языке ассемблера не просто не эффективно, это глупо.

Вы также должны понимать необходимость использования технологий. Я по образованию экономист-менеджер и 6 лет проучился в институте по этой специальности. Но даже до этого я знал, что заказчик всегда прав. Почему-то в компьютерной области стараются избавиться от этого понятия. Например, Microsoft пытается заставить программистов писать определенные программы, не объясняя, зачем это нужно пользователям. Многие тупо следуют этим рекомендациям и не задумываются о необходимости того, что они делают.

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

Я рекомендую не обращать особого внимания на корпорацию Microsoft (хотя некоторые разработки гениальны), потому что считаю определенные их действия тормозом прогресса. И это тоже можно доказать на примере. Сколько технологий доступа к данным придумала Microsoft? Просто диву даешься: DAO, RDO, ODBC, ADO, ADO.NET, и это еще не полный список. Корпорация Microsoft регулярно выкидывает на рынок что-то новое, но при этом сама этим не пользуется. При появлении новой технологии все программисты кидаются переделывать свои программы под новый стандарт и в результате тратят громадные ресурсы на постоянные переделки. Таким образом, конкуренты сильно отстают, a Microsoft движется вперед, потому что не следует своим собственным рекомендациям и ничего не переделывает. Если программа при создании использовала для доступа к данным DAO, то можно спокойно оставить ее работать через DAO и не переделывать на ADO, потому что пользователю все равно, каким образом программа получает данные из базы, главное, чтобы данные были.



Могу привести более яркий пример - интерфейс. В программе MS Office постоянно меняется интерфейс, и при этом всем говорят, что именно он самый удобный для пользователя. Все бегут переводить свои программы на новый внешний вид меню и панелей, а тот же Internet Explorer и все остальные программы выглядят как 10 лет назад. В них практически ничего не меняется и Microsoft не тратит на это время, а конкуренты тратят месяцы на переписывание множества строчек кода.

Да, следование моде придает вашим программам эффектность, но при этом вы должны сохранить индивидуальность.

Возможно, сложилось впечатление, что я противник Microsoft, но это не так. Мне очень нравятся продукты этой фирмы, например, Windows или MS SQL Server, но я не всегда согласен с ее методами борьбы с конкурентами. Это жестокий бизнес, но не до такой же степени.

Программисты и хакеры навязывают другим свое мнение о любимом языке программирования как о единственно приемлемом, обычно добиваясь успеха, потому что заказчик часто не понимает в программировании. На самом же деле заказчику все равно, на каком языке вы напишете программу, его интересуют только сроки и качество. Лично я могу обеспечить минимальные сроки написания приложения, сохраняя хорошее качество, только работая на Borland Delphi. Такое же качество на C++ я (да и любой другой программист) смогу обеспечить только в значительно большие сроки.

В данной книге будут описываться примеры именно на Visual C++, потому что этот язык является наиболее распространенным и многими признан стандартом для программирования. Но существует книга, в которой решаются те же проблемы, но с использованием примеров на языке Borland Delphi.

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

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


Содержание раздела