Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #105, СЕНТЯБРЬ 2007 г.

FAQ

Степан «Step» Ильин

Хакер, номер #105, стр. 142

(faq@real.xakep.ru)

Задавая вопрос, подумай! Не стоит мне посылать вопросы, так или иначе связанные с хаком/кряком/фриком, для этого есть Hack-Faq (hackfaq@real.xakep.ru); не стоит также задавать откровенно ламерские вопросы, ответ на которые ты при определенном желании можешь найти и сам. Я не телепат, поэтому конкретизируй вопрос, присылай как можно больше информации.

Q: В одном из ваших прошлых номеров вы рассказывали о «рыбалке» — приеме, позволяющем перехватить данные, которые качают пользователи спутникового инета (при наличии соответствующего оборудования, естественно). А возможно ли половить рыбку в рамках локальной сети и снифать файлы, которые пользователи передают между собой по локалке?

A: Тут все зависит от того, как передаются файлы между пользователями локальной сети. Скорее всего, пользователи просто кидают друг другу файлы через «Сетевое окружение», то есть через Microsoft Windows Network. В подобном случае используется специальный механизм, основанный на протоколе Server Message Block (SMB), описывающем формат сообщений, используемый для передачи файловых запросов (open — открыть, close — закрыть, read — прочитать, write — записать и т.п.) между клиентами и серверами. Эти сообщения легко перехватить, а вместе с ними легко перехватить и файлы. Для этого существует несколько утилит. Рекомендую попробовать SMB File Sniffer (www.microolap.com/products/network/smbfilesniffer).

Q: Никак не пойму: каким образом на однопроцессорной системе реализуется многозадачность?

A: Минимальной единицей исполнения программного кода в Windows-системах является поток. Процесс представляет собой всего лишь «контейнер» для потоков, позволяя им разделять общее адресное пространство, дескрипторы и прочие ресурсы. Однако каждый поток владеет своим собственным контекстом, включающим в себя набор регистров и стек. Каждый процесс имеет по меньшей мере один поток, создаваемый при его старте, но в дальнейшем программист может создавать столько потоков, сколько ему заблагорассудится, удаляя их в любой момент времени. Так, когда все потоки процесса уничтожаются, процесс исчезает, высвобождая ранее занятые ресурсы.

На однопроцессорных машинах все потоки выполняются последовательно в течение короткого промежутка времени, называемого квантом. Иллюзия многозадачности создается лишь за счет быстрого переключения между потоками. При наличии двух и более процессоров несколько потоков может выполняться параллельно, увеличивая производительность системы. Однако и тут все не так просто: сплошные грабли и подводные камни. Если поток А ждет результата вычислений потока Б, то на многопроцессорной машине они выполняются так же медленно, как и на однопроцессорной. То же самое происходит в случае, если самый ресурсоемкий процесс (например, программа для сжатия цифрового видео) имеет единственный вычислительный поток.

Q: Как же тогда добиться увеличения производительности?

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

Совсем другое дело — кластер. Компьютеры, объединенные в единую вычислительную машину через Ethernet, показывают чудеса производительности только в том случае, если каждый из них обрабатывает «свою» порцию данных независимо от остальных, возвращая только результат вычислений. Опять-таки протоколы обмена данными закладываются разработчиками приложений, и пользователь вынужден использовать то, что дают, потому что другого не будет. Тем не менее, начиная с Windows Server 2003 и Vista, Microsoft включила в систему поддержку удаленных потоков, способных исполняться на соседних компьютерах. Строго говоря, понятие удаленных потоков (RemoteThread) существовало еще во времена NT, однако эта «удаленность» относилась к соседним процессам, исполняющимся на той же самой машине, а в Висте это ограничение наконец-то снято. Более того, система позволяет самостоятельно раскидывать потоки по разным машинам, если видит в этом необходимость (то есть ожидает увеличения производительности), и пользователю заботиться об этом уже не нужно.

Q: Как переименовать пользователя в Винде так, чтобы переименовать и каталог профайла?

A: Сам несколько раз сталкивался с ситуацией, когда нужно было переименовать пользовательский аккаунт в Винде. Если просто поменять имя через панель управления, то все файлы, относящиеся к профилю, останутся на том же самом месте. Название каталога не меняется и выдает старое имя. Как это исправить? Сама Microsoft предлагает следующий алгоритм действий:

  1. Входим в систему под аккаунтом с правами администратора (но, естественно, не под тем, который нужно переименовать).
  2. Даем каталогу с профилем новое имя: с %SystemDrive%\Documents and Settings\OldUsername на %SystemDrive%\Documents and Settings\NewUsername.
  3. Теперь ковыряемся в реестре, в котором есть специальный ключ - ProfileList: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList.

Он в свою очередь содержит подключи с параметрами аккаунтов, представляющие собой списки так называемых User Account Security Identifiers (SID). Подобный идендитификатор имеется у каждого аккаунта и внешне выглядит примерно так: S-1-5-21-220523388-2147195339-725345543-501.

Нам нужно изменить путь до файлов профиля, но обратиться к его настройкам можно только через его SID. Для того чтобы выяснить идентификатор любого аккаунта из системы, достаточно запустить простенький скрипт (http://windowsxp.mvps.org/reg/SIDList.vbs).

Далее находим в ProfileList нужный SID, который принадлежит переименованному аккаунту, там - опцию ProfileImagePath и указываем в ее значении новый путь (%SystemDrive%\Documents and Settings\NewUsername).

  1. Перегружаемся.

Q: Что такое номер-невидимка в ICQ?

A: Номер считается полностью невидимым, если его нельзя найти общим поиском через WhitePages, но тем не менее он полностью работоспособен и имеет свой идентификатор и пароль. Таким статусом обладают номера, которые гарантированно не использовались ни кем более шести лет. При этом из базы удаляется вся информация о email-адресах и очищается список контактов, поэтому получение такого номера сравнимо с регистрацией нового. Первый же введенный email-адрес в User Details станет Primary, и с его помощью можно задать вопросы и ответы для восстановления пароля в случае беды. И еще. Чтобы такой номер появился в поиске и в каталогах ICQ, достаточно просто заполнить одно любое поле User Details.

Q: Многие сейчас трубят о Hardened Gentoo. Чем он отличается от обычного Gentoo?

A: Hardened Gentoo (www.gentoo.org/proj/en/hardened) — это надстройка над системой, которая заключается в нескольких изменениях в компиляторе и ядре, нацеленных на увеличение общей безопасности системы. Обновленный компилятор — hardened-gcc — позволяет защитить компилируемые им программы от взлома. Одна из применяемых методик - SSP (Stack-smashing protection) - добавляет в бинарник защиту от переполнения буфера. Откомпилированная подобным образом программа сама выгружает из себя из памяти, если обнаруживает переполнение. Ядро Hardened Gentoo предотвращает всевозможные переполнения, и, помимо этого, запрещает массу потенциально опасных операций. Например, PaX позволяет запретить выполнение кода в страницах памяти с данными. Получается программная реализация защитного NX-бита, который появился только в 64-битных процах Intel. Вообще говоря, Hardened Gentoo — это лишь набор уже готовых инструментов для защиты системы, их можно было бы установить и на многие другие Linux’ы. Но здесь все собрано в одном месте, все готово к работе.

А знаешь ли ты…

  • ...что стандартное сообщение об ошибке, выведенное с помощью message box’а, таит в себе один большой секрет. Я в свое время очень удивлялся, почему сообщение об ошибке нельзя выделить и скопировать в буфер обмена. Оказалось, можно. Надо просто без всяких выделений нажать стандартные <CTRL-C> – и все, сообщение будет в clipboard’е.
  • ...что для корректной установки DLL-библиотеки в Винде недостаточно просто кинуть ее в системный каталог (к примеру, в C:\WINDOWS\system32). Ее также обязательно нужно прописать с помощью команды regsvr32 filename.dll.
Содержание