Злобный комп и флэшка-граббер



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

Evil Computer

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

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

Подготовка инструментов

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

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

Ставим задачу

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

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

Без WinAPI никуда...

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

Функция, обрабатывающая сообщения

LResult CALLBACK WindowProc (
	HWND hwnd, //идентификатор окна
	UINT uMsg, //идентификатор сообщения
	WPARAM wParam, //событие, которое произошло
	LPARAM lParam //указатель на структуру содержащую данные
)

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

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

Ok как установить факт подключения нового оборудования мы знаем, но как быть уверенным, что подключили именно флэшку? Устройств с возможностью горячего подключения (я про 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;

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

Структура поможет нам определить букву диска:

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, то буква диска будет A, если 1, то B и т.д. Для удобства получения символьной буквы лучше всего написать функцию.

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

Ударим .NET'ом

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

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

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

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

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

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

После создания экземпляра объекта класса DriveDetector я определяю, обработчики событий DevieArrived() и DriveRemoved(). По их названию нетрудно догадаться за что они отвечают. Весь код инициализации лучше всего писать в метод Form1().

Весь основной код нашей программы будет находиться в обработчике события DeviceArrived. Его текст ты увидишь в листинге 1.

Листинг 1. Обработка подключенной флэшки

string dirName = 
	Environment.GetCommandLineArgs()[0] +
	"flash_" + 
	DateTime.Now.ToString("dd-MM-yy-hh-mm-ss");
 
 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.FileFilters.Add("*.xls"); 
 
 //Определение других фильтров
 //....
 
 flashcopier.StartCopy();
 

В самом начале листинга, я определяю путь к папке, в которую будем копировать содержимое флэшки. Для удобства, выполнять копирование будем в директорию "flash_текущая дата", расположенную вместе с папкой, из которой запущено наше приложение. Определившись с именем папки, я пытаюсь ее создать с помощью функции CreateDirectory(). Эту функцию я написал чисто для удобства. В ней происходит создание экземпляра объекта DirectoryInfo, предназначенного для работы с директориями, и вызов его метода Create(), который и создает новую папку.

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

Дело все в том, что xDirectory - сторонний класс. Когда-то давным-давно я его нашел на просторах инета и с тех пор частенько использую в своих проектах. Мне он нравится тем, что для копирования вложенных папок достаточно вызвать один метод. Кроме того, он позволяет устанавливать фильтры.

Да, без него обойтись реально. Берем стандартные классы, хорошо знакомый всем программистам прием – рекурсия и пишем пару десятков строчек кода. Увы, это я делать категорически не хочу. На дворе 21 век и нужно по максимуму оптимизировать свои действия и xDirectory нам в этом поможет.

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

USB граббер

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

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

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

Как будет грабить?

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

	RegistryKey readKey = Registry.CurrentUser.OpenSubKey("
					software\\Ghisler\\Total Commander");
 
	string key = (string) readKey.GetValue("InstallDir");

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

Mail.Agent

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

1. Хистори. Всю историю переписки пользователя MA хранит Documents and setting\%Пользователь%\Appication Data\Mra\base. В папке base есть файлик mra.dbs. Это, собственно говоря, и есть файл истории.

2. Контакт-Лист. Список контактов расположен в папке MRA\%аккаунт пользователя%\clist5.txt. Учти, пользователей работающих с mail.agent можно быть несколько (или у одного юзера может быть несколько акков), поэтому разумней всего будет скопировать все папки, содержащие в названии символ - "@".

3. Пароль. Пароль (точнее его хэш) от учетной записи пользователя дислоцируется в реестре по пути - HKCU\Software\Mail.RU\Agent\magent_logins2\%Account% в параметре ####password.

gTalk

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

Total Commander

Total Commander - сегодня, безусловно, самый популярный файловый менеджер (или его клон Unreal Commander). Функций в программе вагон и маленькая тележка и еще столько же можно на него навесить при помощи дополнительных плагинов. Нас интересует лишь встроенный в него FTP-клиент. Его используют многие и пароли, конечно же, сохраняют.

TC в отличии от многих других программ не хранит пароли в реестре, а использует старые добрые ini файлы. Пароли, а также все необходимые данные для подключения к серверам (ip, порт, имя пользователя и т.д.), Total Commander хранит в файле wcx_ftp.ini, который невинно располагается в папке с программой. Путь к директории, в которую установлен Total Commander ты можешь узнать из реестра. Загляни в ветку HKEY_CURRENT_USER\Software\Ghisler\Total Commander.

FireFox

Сегодня браузер - это не просто программа для 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\%Имя профиля%.

Opera

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

Skype

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

QIP

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

Copying completed

Слизать конфиденциальную инфу с чужого компа - дело не такое уж и трудное. Главное подойти к делу "творчески". Технология .NET сильно упростила нам задачу, и весь кодинг свелся к вызову нескольких методов. Ты, конечно, можешь сказать, что это не круто и такие штуки куда эффективней написать на WinAPI или ASM'e. В чем-то я с тобой соглашусь, но учти, на WinAPI и уж тем более на Асме написать такую программку также быстро не удастся. Пока другие пишут километровый код - мы будем с тобой собирать урожай.

Удачи в программировании, а если возникли вопросы, то милости прошу, пиши – на мыло.

НА ЗАМЕТКУ:

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

На этом можно заработать

На многих хакерских форумах много объявлений о продаже софта такого рода. Цены разные - от 10$ до 100$. Доработав рассмотренные в статье примеры, возможно, заработать на корочку черного хлеба с икрой. Повторюсь, главное подойти к делу творчески и все обязательно получится.

Written by Игорь Антонов aka Spider_NET
E-mail:

Комментарии

3 комментария(ев)
аватар: tsergey
tsergey
Дата: ЧТ, 26/08/2010 - 07:29
Звание: Энтузиаст
Сообщений: 198

Статья очень хорошая, а есть ли у Вас описание для Delphi

аватар: Spider_NET
Spider_NET
Дата: ЧТ, 26/08/2010 - 21:52
Звание: Мастер
Сообщений: 2049

2tsergey

Как работать с флешками из Delphi я описывал в статье ]]>http://vr-online.ru/?q=content/fljeshki-pod-kontrolem-delfina-chast-1-312]]>

аватар: tsergey
tsergey
Дата: СБ, 28/08/2010 - 08:01
Звание: Энтузиаст
Сообщений: 198

спасибо я эту статью не видел раньше:)