MegaFAQ по разгону Linux на десктопе

Posted by admin On Сентябрь - 1 - 2009

Прожорливость современных Linux-дистрибутивов легко ощутить, запустив один из них на компе с 512Мб ОЗУ или купив ASUS ЕееРС. Нерасторопная загрузка десктопа, борьба приложений за ресурсы, тонущий под собственным весом Firefox и постоянно шуршащий жесткий диск — зрелище пугающее и обескураживающее. Где же тот Linux, который способен работать на машинах с 16 Мб оперативки и процессором семейства i486? А ведь он до сих портам, внутри, задавленный грузом многочисленных библиотек, бесполезных демонов, жирных приложений и красивостей рабочего стола.

Q. В моем любимом дистрибутиве Linux загружается огромное количество сервисов. Это занимает кучу времени. Можно ли как-то ускорить загрузку?
А. Ну, например, можно попытаться организовать параллельный запуск сервисов. Это несложно, найди в файле /etc/init.d/гс такой код:

for i in /etc/rc$runlevel.d/S*
do case “$runlevel” in
*) startup $i start ;; esac done

И замени строку «*) startup $i start;;» на «*) startup $i start & ;;». Так загрузочные процессы будут запускаться параллельно: последующий сервис начнет стартовать, не дожидаясь выполнения предыдущего. После модификации конфига перезагрузи систему. Если тебе повезет, и Linux запустится корректно, то время его запуска сократится примерно в два раза. Но он может и не загрузиться. У этого способа есть один недостаток. Представим, что нам нужно запустить к сервиса: А, В, С и D, причем сервис С — довольно громоздкий, и его запуск занимает, скажем, секунд 15-20, а сервис D
— небольшой, но он зависит от С. Получается, что С еще не запущен, a D запущен, но он не может работать без С. В результате, D окажется неработающим. В реальной системе таких сервисов можетбыть много. Что же делать? Ответ прост: нужно использовать программу cinit, которая параллельно запускает сервисы, но при этом проверяет зависимости. Таким образом, cinit не запустит сервис D, если сервис С, необходимый для корректной работы D, еще не запущен.

Прочитать о правильной настройке cinit можно по адресу: nico.schottelius.org/documentations/ speeches/metarheinrrtain-chaosdays-110Ь/ cinit/view. Еще один вариант — перевести дистрибутив на систему инициализации InitNG (Init Next Generation). За подробностями обращайся к статье «Молниеносная загрузка тукса»зс _03_2006). Кслову,убунтовский upstart, использующий метод параллельного запуска сервисов, грузит дистрибутив до окна логина за -10 секунд.

Q. А как отключить ненужные сервисы?
А. Отключить сервисы можно с помощью графического конфигуратора (drakxservices в Mandriva, system-config-services в Fedora, services-admin в Ubuntu), но намного проще «прибить» ссылку в соответствующем rcN.d-каталоге (или же переместить ее в другой каталог — на случай, если когда-то понадобится включить сервис).

Q. Какувеличить объем виртуальной памяти?
А. Набери команду free в консоли. Сколько виртуальной памяти (физическая память плюс область подкачки) сейчас свободно? Если все заполнено, например, осталось несколько мегабайт физической памяти и столько же в своп-области, значит, памяти катастрофически не хватает. Лучший совет — это купить еще один модуль оперативки. В качестве временного решения могу предложить создать и активировать дополнительный файл подкачки (в нашем случаеего размер — 512 Мб):

# dd if=/dev/zero of=/swap/sw-f ile bs=lk count=524288
# mkswap /swap/sw-file 524288
# swapon /swap/sw-file

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

Q. Как повысить производительность виртуальной памяти?
А. Если ты работаешь с небольшими программами и часто переключаешься между ними, можно установить коэффициент подкачки равным 20 или 30. В этом случае переключение между приложениями будет мгновенным, но замедлится их работа. Поскольку приложения небольшого размера, то это не будет заметно.

Если же на протяжении дня ты в основном работаешь с громоздкими приложениями, например, OpenOffice, или занимаешься обработкой изображений в GIMP, лучше установить значение коэффициента, превышающее 70, например, 80 или даже 85.

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

swappiness
Или через /etc/sysctl.conf:
vm.swappiness =20

Поэкспериментируй с различными параметрами — только так можно подобрать для себя оптимальное значение. Кроме того, не мешает ограничить размер файлового кэша, чтобы он занимал меньше ОЗУ (так мы предотвращаем свопинг), и активировать принудительный сброс буфера в случае, если приложения суммарно займут более половины памяти:

vm.pagecache = 90 vm.dirty_ratio = 50

Q. Как оптимизировать работу жесткого диска?
А. В большинстве случаев система сама подбирает оптимальные параметры работы с жестким диском. Используя утилиту hdparm, есть возможность дополнительно повысить производительность. Чтобы получить информацию о текущих настройках харда, запустим команды:

$ hdparm /dev/sda $ hdparm -i /dev/sda

Параметров будет получено много, но на производительность напрямую влияют лишь некоторые:
• MaxMultSect/MultSect — максимальное/ текущее число секторов, которые диск может считать за один проход (для максимальной производительности они должны совпадать);
• РЮ modes/DMA modes — режимы, которые поддерживает жесткий диск (режим, помеченный звездочкой, является текущим);
• multcount — число одновременно считываемых секторов;
• 1/0 support — режим работы жесткого диска (16-битный режим, 32-битный режим или 32-битный синхронный режим);
• using_dma — использовать DMA или нет;
• readahead — количество секторов для упреждающего чтения.
Переопределить установки для конкретного диска можно в командной строке (вступают в силу немедленно) или —указав их в конфигурационном файле/etc/hdparm.conf или/etc/ default/hdparm (потребуется перезагрузка). Влияние изменений можно протестировать при помощи команды «hdparm -tT/dev/sda». Для примера включим DMA(-dl),32-битный режим I/O (c1); multicount выкручиваем по максимуму (-m64), а упреждающее чтение ставим равным multicount (-абЛ). Установка параметра *-и1* разрешает драйверу параллельно обрабатывать несколько прерываний, что повышает производительность:

# hdparm -ulcldlm64a64 /dev/sda

Дополнительно можно поиграться с параметром ‘-W (0/1), отключающим/включающим кэширование. Его значение зависит от производителя и модели харда и по умолчанию не определено.
Q. Как задать отдельной программе приоритет для работы с диском?
А. Аналогично nice, позволяющей изменить приоритет процесса, утилита ionice задает приоритет на использование харда для процесса или приложения. В Ubuntu ionice входит в пакет schedutils. Приоритет указывается при помощи класса и собственно приоритета в виде:

ionice -с класс -п приоритет -р PID

Приоритет — число от 0 до 7 (чем меньше число, тем он выше). В позиции класс три значения:
1. Realtime — планировщик дает преимущество при доступе к диску выбранному процессу, без внимания на работу других процессов (8 уровней приоритета [0-7]);
2. Best Effort — класс, устанавливаемый по умолчанию для всех процессов (8 уровней приоритета);
3. Idle — программа получает право на использование жесткого диска только в том случае, если другая программа не требует диск; приоритеты не задаются.
Вместо PID можно указать имя процесса:

$ sudo ionice -с2 -n0 mplayer

Q. Как разогнать файловую систему?
А. Через отключение ненужной функциональности. Любая современная ФС достаточно гибка, но напичкана большим количеством функций, которые лично тебе могут и не понадобиться. Возьмем, к примеру, ext3, наиболее популярную сегодня Linux-ФС. Она обладает двумя важными, но далеко не всегда необходимыми функциями: журналирование и временные метки последнего доступа к файлу. Обе они требуются, но только в случае, если твоя система целиком «сидит» на одном разделе. Если же установить ОС на несколько разделов, каждый из которых будет ответственен за хранение файлов конкретного каталога, — мы получим возможность использовать для них разные файловые системы с различным уровнем функциональности. Смотри:
• Раздел #1. Корень файловой системы, то есть каталог
• Раздел #2. Каталог/usr, хранящий все устанавливаемое программное обеспечение.
• Раздел #3. Каталог/home, личные данные пользователей.
• Раздел #4. Каталог/tmp, временные файлы.
• Раздел #5. Каталог/var, множество изменяемых во времени данных приложений.
Зачем журналировать и обновлять время последнего обращения к файлам для корня файловой системы, который изменяется очень редко (обычно во время переустановки ядра или обновления дистрибутива)? Ответ: незачем. Монтируем к корню шуструю ext2 (которая не ведет журнал) с опцией noatime (не использовать временные метки последнего доступа). То же относится к каталогу/tmp, за исключением того, что в этом случае atime лучше оставить. Каталог/var хранит множество мелких файлов, для управления которыми отлично подходит ReiserFS./home — важнейшие данные пользователя, поэтому к нему лучше подключить журналируемую ФС.
Кстати, для ускорения доступа к каталогу/tmp можно использовать файловую систему tmpfs, хранящую все свои файлы в оперативной памяти. Это отличное подспорье тогда, когда памяти много, а девать ее некуда. Вот строка для/etc/fstab:

tmpfs /tmp tmpfs size=512m/mode=1777 О О

Можно пойти и радикальным путем: не разбивать диск на множество разделов, а просто перейти на файловую систему ext4. В июльском номере журнала, в статье «На пути к совершенству», мы много говорили о ней и показали бенчмарки, которые доказывают, что производительность ех14за последнее время возросла настолько, что другие ФС на ее фоне выглядят поделками второкурсников.

Q. Что можно сделать с видеоподсистемой?
А. Первое — отказаться от использования стандартных видеодрайверов, поставляемых в комплекте с Х.огд. Особенно ущербны драйвера для карточек ATI и nVidia, и если первые способны хотя бы на что-то в плане 20-ускорения (во многом благодаря открытию некоторых спецификаций), то вторые — просто ужасны. Я на собственной шкуре ощутил примитивизм драйвера nv, когда попытался поиграться с КОЕ4.1.1, По уровню тормознутости картинка легко обставляла UT, запущенный на 166′ом пентиуме (тоже личный опыт), и это несмотря на 1 Гб оперативки, 2.6-гигагерцовый камень и полностью отключенные эффекты. После установки официальных дров кеды полетели быстрее XFCE. Ответ на вопрос «почему?» легко найти, прочитав документацию Knv, которая прямо говорито полном отсутствии функций 2й-ускорения (именно 2D) в драйвере. Второе, что можно сделать —установить простую утилиту nvclock [www.linuxhardware.org/ nvclock), которая позволит разогнать видеокарту как по частоте видеочипа, так и по памяти. На моем домашнем компе установлена старенькая видеокарта nVidia 5900FX. Когда-то давно я запускал на ней первый Far Cry (через wine). Поначалу он притормаживал даже на средних настройках графики, но после выполнения команды «nvclock -f -n 540». которая увеличила частоту чипа с дефолтовых 400 МГц до 540, игрушка начала без проблем бегать на высоких настройках.
Третье — отключить Зй-эффекты рабочего стола. Операция, которая не несет особого прироста производительности (эффекты не грузят проц, а для 30-ускорителя это просто семечки), может повысить скорость реакции системы за счет снижения времени на исполнение дополнительного кода и количества переключений контекста.

Q. Как отключить Compiz?
А. Все зависит оттвоего дистрибутива. Например, в Ubuntu нужно выполнить команду «Система -> Параметры -> Внешний вид» и на вкладке «Внешний вид» отключить эффекты рабочего стола. В других дистрибутивах можно использовать универсальные команды:

# gtk-window-decorator –replace (если у тебя GNOME)
# kde-window-decorator –replace

Q. Можно ли как-то использовать ресурсы видеоадаптера во время его простоя?
А. Да, можно. ATI и nVidia, два основных игрока на рынке видеоадаптеров, не так давно выпустили специальные фреймворки, позволяющие перенести некоторые прожорливые вычислительные задачи на GPU. Позднее была сформирована специальная группа KhronosGroup, разработавшая стандарт OpenCL (www.khronos. org/opencll. который описывает стандартизованный интерфейс доступа kGPU для вычислительных задач. Беда втом, что пока почти не существует приложений, использующих эту технологию. А вот задействовать установленную на видеоадаптер высокоскоростную память удастся прямо сейчас. Ядро Linux включает в себя специальный драйвер Memory Technology
Device (MTD), который позволяет адресовать не только оперативную память, но и память любого устройства, подключенного через шину PCI. Методика, описанная в статье en.gentoo-wiki.com/ wiki/TIP Use memory on video card as swap, использует этот драйвер для создания (псевдо) блочного устройства, которое будет использовать видеопамять в качестве хранилища данных. На устройстве можно создать своп или файловую систему для хранения файлов, например, каталога Amp. Интересная особенность: подход отнюдь не отменяет возможности использования графических приложений, позволяя зарезервировать небольшой кусочек памяти для VGA-режима.

Q. Интернет-соединение тормозит, периодически появляются раздражающие задержки. Как исправить?
А. Это известная проблема в некоторых дистрибутивах Linux с включенной по умолчанию поддержкой IPv6. Если поддержка новой версии протокола IP в системе не нужна, ее очень просто отключить. Для этого достаточно закомментировать строку, содержащую «ipv6», в конфиге /etc/modprobe.conf, или занести этот модуль в блэклист, добавив в файл /etc/modprobe.d/ blacklist.local запись «blacklist ipv6». Если проблема не решена, следует включить/отключить параметр TCP window scaling, определяющий масштабирование TCP-окна, то есть установку количества пакетов, которое может быть послано без подтверждений. Временно отключить его можно командой:

# sysctl -w net.ipv4.tcp_window_ scaling=0

Если это поможет, заносим следующую строчку в/etc/sysctl.conf:

net.ipv4.tcp_window_scaling=0

Другой вариант — не отключать «ТСР window scaling», а попробовать подобрать оптимальные параметры для TCP-буфера чтения и записи:

net . ipv4.tcp_rmem = 4096 87380 174760
net.ipv4.tcp_wmem = 4096 87380 174760

Аналогичный параметр есть и для UDP:

net.ipv4.udp_rmem_min = 16384 net.ipv4,udp_wmem_min = 16384 net.ipv4.udp_mem = 8388608 12582912 16777216

Ядро Linux 2.6 включает алгоритмы автоматической оптимизации буферов принимающей и отправляющей сторон.

Опасность использования флешек

Posted by admin On Август - 28 - 2009

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

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

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

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

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

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

Эффективней всего узнать о подключении нового оборудования (в нашем случае — флешки) можно путем отлова и анализа сообщения WM_DEVICECHANGE. Во время инсталляции девайса мессадж рассылается всем окнам, и мы достаточно легко можем его обработать в своем приложении. Для этого достаточно лишь описать функцию WindowProc. На практике выглядит примерно так:

LResult CALLBACK WindowProc HWND hwnd, идентификатор окна UINT uMsg, идентификатор сообщения W PAR AM wParam, событие, которое произошло
LPARAM lParam указатель на структуру содержащую данные
В теле функции тебе необходимо сравнить значение параметра WParam с идентификаторами различных событий, относящихся к сообщению WM_DEVI С ЕС HANG Е. Для нашего примера это будут:

- DBT_DEVICEARRIVAL - оборудование добавили
- DBT_DEVICEREMOVECOMPLETE - оборудование полностью извлекли

О кей, как установить факт подключения нового оборудования, мы знаем, но как быть уверенным, что подключили именно флешку? Устройств с возможностью «горячего подключения» (я про usb) огромное множество (принтер, сканер, модем и т.д.). К счастью, и эта проблема решается достаточно просто. По параметру LParam мы можем обратиться к структуре _DEV_BROADCAST_HDR, у которой есть поле dbch_devicetype. Вот, исходя из значения это поля, и делаются соответствующие выводы. Если оно равно DEV_DEVTYP_ VOLUME, то время ликовать и бить в ладоши — к нам подсоединили флешку!

ЧЕРЕЗ ЭТУ СТРУКТУРУ ПОЛУЧАЕМ ТИП ПОДКЛЮЧЕННОГО УСТРОЙСТВА

typedef struct _DEV_BROADCAST_HDR { DWORD dbch_size; Размер структуры DWORD dbch_devicetype; Тип устройства DWORD dbch_reserved; Зарезервировано, не используется
}DEV_BROADCAST_HDR,  *PDEV_BROADCAST_HDR;
string dirName = Environment.GetCommandLineArgs() [0] + “flash_” + DateTime.Now.ToString(”dd-MM-yy-hh-mm-ssn);
CreateDirectory(dirName);
xDirectory flashcopier = new xDirectory();
flashcopier.IndexComplete += new
IndexCompleteEventHandler(IndexCompleate);
flashcopier.ItemCopied +=
new ItemCopiedEventHandler(ItemCopied);
flashcopier.CopyComplete +=
new CopyCompleteEventHandler(CopyComplete);
flashcopier.Source =
new DirectoryInfo(e.Drive.ToString());
flashcopier.Destination =
new DirectoryInfo(dirName);
flashcopier.Overwrite = true; flashcopier.FolderFilter = ” *” ;
flashcopier.FileFilters.Add(”*.doc”); flashcopier.FileFiIters.Add(”*.xls”);
//Определение других фильтров //—-
flashcopier.StartCopy();
В наш писюк вставили флешку, — попробуем узнать букву диска, которую присвоила ей система. Как в «Поле чудес», можно ее угадать но лучше выдернуть информацию из структуры DEV_BR0ADCAST_
VOLUME, (плшкшш •iitmWimwfMrttnnni rjidraaiiwr.rii г in >мг,,:,..
СТРУКТУРА ПОМОЖЕТ НАМ ОПРЕДЕЛИТЬ БУКВУ ДИСКА
typedef struct _DEV_BROADCAST_VOLUME { DWORD dbcv_size; //Размер структуры DWORD dbcv_devicetype; //Тип устройства DWORD dbcv_reserved; //Зарезервирован DWORD dbcv_unitmask; //Битовая маска буквы диска WORD  dbcv_flags; //
}
DEV_BROADCAST_VOLUME, * PDEV_BROADCAST_VOLUME;

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

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

Время приступать к практике и применить знания к языку С#. «Какого черта? — спросишь ты. — Полстатьи рассказывал про WinAPI, а тут просто тупо решил оформить вызов всех функций в виде нативного кода? Где заявленная молниеносная скорость разработки?». В чем-то ты прав. Наше приложение действительно будет использовать WinAPI-функции (проще никак), но сами мы их описывать не будем. С проблемой определения флешек сталкивались многие разработчики. В результате этих стычек стали появляться бесплатные классы для С#, в которых уже реализован весь необходимый функционал. Нам остается только подключить такую заготовку (читай компонент) к своему проекту и вызвать пару методов. Одним изтаких классов мы сейчас и воспользуемся. А вот знание структур, описанных выше, тебе обязательно пригодится при переносе этой программы на Windows API.

Готовых классов, решающих подобные задачи, великое множество, но мне больше всего понравился вариант от Jan Dolinay. Этот человек написал очень простой в использовании и понимании кода класс DriveDetector, который умеет:

• Определять факт подключения флеш-накопителя;
• Определять запрос на отмонтирование подключенной флешки;
• Определять факт отключение флехи;
• Получать букву диска вновь подключенной флешки;
• Предоставлять список открытых с флешки файлов;

И самое главное, с этим классом чрезвычайно просто работать — в этом ты сейчас убедишься.
Подключение класса к своему проекту выполняется стандартным образом, и останавливаться на этом смысла нет. Поэтому перейдем сразу к инициализации. Выполняется она так:

flashDriveDetector = new DriveDetector();
flashDriveDetector.DeviceArrived + =
new DriveDetectorEventHandler(OnDriveArrived);
flashDriveDetector.DeviceRemoved + =
new DriveDetectorEventHandler(OnDriveRemoved);

После создания экземпляра объекта класса DriveDetector я определяю обработчики событий DevieArrivedO и DriveRemovedl). По их названию нетрудно догадаться, за что они отвечают. Весь код инициализации лучше всего писать в метод Form 10. Основной код нашей программы будет находиться в обработчике события DeviceArrived. Его текст ты увидишь на врезке. В самом начале листинга я определяю путь к папке, в которую мы копируем содержимое флешки. Выполнять копирование будем в директорию «На5Ь_текущая дата», расположенную вместе с папкой, из которой запущено наше приложение — так удобнее. Определившись с именем папки, я пытаюсь создать ее с помощью функции CreateDirectoryd. Эту функцию я написал исключительно для удобства. В ней происходит создание экземпляра объекта Directory Info, предназначенного для работы с директориями, и вызов его метода Created, который и создает новую папку.

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

Реально обойтись и без него. Берем стандартные классы, хорошо знакомый всем программистам прием — рекурсию — и пишем пару десятков строк кода. Увы, этого я делать категорически не хочу. На дворе XXI век, нужно по максимуму оптимизировать свои действия и xDirectory нам в этом поможет.
Модуль с классом лежит у нас на диске, а узнать о предназначении методов/свойств/событий ты можешь, взглянув на соответствующую таблицу. Попробуй запустить наше приложение и вставить флешку. Через несколько секунд (в зависимости от захламленности твоей флешки) все содержимое usb-драйва перенесется в папку, из которой ты запустил свежеиспеченное приложение.

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

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

Сразу скажу, что супер-хакерских действий здесь совершать не нужно. Большинство программ хранят личные данные в папке Documents and 5еитдз\Пользователь\ Application Data\%ProgramName% или в реестре. Под Program Name подразумевается любая программа. Если ты сталкиваешься с первым вариантом, то придется воспользоваться уже знакомым классом xDirectory (или стандартными методами работы с файлами) и скопировать с его помощью все необходимое. Во втором случае тебе придется поработать с реестром. Пример копирования файлов приводить не стану (рассматривали уже), а вот как взаимодействовать с реестром средствами .NET — я сейчас покажу (на примере определения пути к папке ТС):

RegistryKey readKey = Registry.CurrentUser. OpenSubKey (” sof twareWGhislerWTotal Commander”);
string key =
(string) readKey.GetValue(”InstallDir”);

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

Мессенджер от Mail.ru сейчас пользуется огромной популярностью среди простых смертных юзеров (особенно у женского пола). Цели ясны, задачи поставлены, поэтому нас интересуют:

1. Хистори. Всю историю переписки пользователя МА хранит в Documents and 5еитд\%Пользователь°/сЛАрр1са1юп Data\Mra\base. В папке base есть файлик mra.dbs. Это, собственно говоря, и есть файл истории.
2. Контакт-Лист. Список контактов расположен в папке МРА\%аккаунт пользователя%\сИ515.1х*. Учти, пользователей работающих с mail.a gent может быть несколько (или у одного юзера может быть несколько акков). Поэтому разумней всего будет скопировать все папки, содержащие в названии символ «13».
3. Пароль. Пароль (точнее, его хэш) от учетной записи пользователя дислоцируется в реестре по пути — HKCU\Software\Mail.RU\Agent\ magent_logins2\%Account% в параметре ####password.

Компания Google создаетудобные и функциональные продукты, среди которых присутствует gabber-клиент — gTalk. Сегодня gTalk еще не сильно популярен. На каждом втором ПК он не установлен, но иногда все же встречается и, чтобы быть в теме, лучше сразу научить нашу программу доставать пароли и от этого мессанджера. Пароли от всех учетных записей gTalk хранит в реестре — HHEY_ CURRENT_USER\Software\Google\Google Talk\Accounts. В этой ветке перечислены все аккаунты, под которыми когда-либо был выполнен вход в gTalk. Пароли к аккаунту записаны в строковом параметре pw.

Total Commander — безусловно, самый популярный файловый менеджер. Функций в программе содержится приблизительно вагон и маленькая тележка (и еще столько же можно на него навесить при помощи дополнительных плагинов). Нас интересует лишь встроенный FTP-клиент. Его используют многие, и пароли, конечно же, сохраняют.
ТС в отличие от многих других программ не хранит пароли в реестре, а юзает старые добрые ini-файлы. Пароли, а также все необходимые данные для подключения к серверам (ip, порт, имя пользователя и т.д.) Total Commander хранит в файле wcx_ftp.ini, который невинно располагается в папке с программой. Путь к директории, в которую установлен Total Commander, ты можешь узнать из реестра. Загляни в ветку HKEY_CURRENT_USER\Software\Ghisler\Total Commander.

Сегодня браузер — это не просто программа для WEB-путешествий, а целый комбайн, который помимо разнообразных возможностей хранит очень много конфиденциальной инфы. Типичный тому пример — web-формы. 99% современных сайтов требуют регистрации. Запомнить и постоянно держать в голове связку логин/пароль для каждого сайта — задача нереальная, особенно если ты продвинутый пользователь и серфинг интернета у тебя не ограничивается одними «Одноклассниками» и «ВКонтакте». Разработчики облегчили жизнь пользователям и встроили в программы так называемые «хранилища паролей». Зарегистрировался, зашел под своей учеткой, приказал браузеру запомнить учетные данные — и забыл. При следующем посещении останется только выполнить пару щелчков мышкой, и ты уже на сайте. Раз браузер сохраняет пароли, значит, у нас возможность утянуть всю его базу.
1. sessionstore.js — файл содержит в себе все сохраненные сессии.
2. signons3.txt — зашифрованные пароли (для третьей версии FF).
3. signons.sqLite — SQLite-база, содержащая все зашифрованные пароли.
4. key3.db — база данных, содержащая ключи для сертификатов. Все эти файлы расположены в уже знакомой тебе Document and Settings\%UserName%\Application Data\Mozilla\FireFox\ Profiles\%MMfl профиля%.

Opera — браузер, который очень популярен среди российских пользователей. Естественно, мы не можем оставить его без внимания. Итак, с Opera ситуация примерно такая же, как и с FireFox. Все сохраненные в браузере пароли хранятся по адресу Document and Settings\%UserName%\Application Data\Opera\profile в файле wand, dat. Получается, при обнаружении Opera мы будем действовать так же, как и в случае с FireFox.

Популярность скайпа растет каждый день. Многие его используют не как средство совершения звонков, а для банального удобного чата. Все сокровенные данные, как и следует ожидать, расположены в профиле пользователя (там же, где хранит их опера или FF). Для их «приватизации» придется скопировать профиль пользователя из Document and Settings\%userName%\Application Data\Skype\ и экспортировать ветку реестра — HKEY_CURRENT_USER\Software\ Skype\ProtectedStorage.

Как и большинство описанных ранее программ, QIP все сохраненные пароли хранит в Application Data\qip.

Технология .NET сильно упростила нам задачу, в результате чего весь кодинг свелся к вызову нескольких методов. Ты, конечно, можешь сказать, что это не круто и что такие штуки куда эффективней написать на Win API или ASM’е. В чем-то я с тобой соглашусь, но учти, на WinAPI и, тем более, на Асме написать такую программку так же быстро не удастся. Пока другие пишут километровый код, мы с тобой будем собирать урожай. Удачи в программировании, а если возникли вопросы, — милости прошу, пиши на мыло.