Как сграбить содержимое флешек и CD/DVD-носителей (включая удаленные файлы), не нарушив ни один пункт закона и оставшись не пойманным, не разоблаченным и не побитым? Я, покурив хорошей травы, разработал специальную технологию, описание которой и предлагаю всем желающим (а также не желающим, но просто интересующимся).

Ходят тут всякие! Спать, понимаешь, мешают. Зашел ко мне давеча в нору один такой тип. Флешку припер. Сует ее в разъем. Скопировать последний альбом Independent у меня хочет. А там у него, на флешке, сорцы интересные, конфиденциальная документация и фотки пикантные интимного характера с его пассией в главной роли. Знакомая ситуация, не так ли? И этот кадр думает, что если ни на секунду не выпускать свою малышку из рук, то никто у него ничего не сопрет. Наивный! Я озаботился этой проблемой еще во времена MS-DOS, когда программистам приходилось таскать за собой потрепанную папочку с дискетами пятидюймового форм-фактора, что придавало им сходства с инженерами (которыми они, по сути, и
являлись, поскольку пользователей тогда еще не существовало).

С тех пор многое изменилось. Народ перешел на ZIP’ы, CD/DVD, флешки и прочие носители, вмещающие гигабайты полезных данных, которыми некоторые скряги упорно не хотят делиться, забыв главный девиз хакера, гласящий, что код и данные
— общенародное достояние. Ну не хотят делиться — и хрен с ними! Мы и сами возьмем! По этому поводу я говорю: «Что на мой компьютер попало, то пропало». Хочешь сохранить свои данные в тайне
— так не суй флеш куда попало!

 

Обзор существующих утилит, или как палятся хакеры

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

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

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

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

Грабберы классом выше отслеживают момент первого обращения к съемному носителю и стягивают данные только во время «легальных» операций чтения/записи. Очевидным минусом этой технологии становится резко возросшая сложность реализации, требующая
перехвата системных функций, который в Висте и 64-битных версиях XP не то чтобы совсем невозможен, но существенно затруднен. Опять-таки антивирусы, глюки и прочие никому не нужные вещи. До сих пор мне не встречался ни один добротный перехватчик, корректно работающий на многопроцессорных машинах (включая NT и многоядерные процессоры, которых с каждым днем становится все больше и больше).

Недостаток второй и самый главный — емкость флешки (CD/DVD-дисков), как правило, намного больше размера легально копируемых файлов, и утянуть их содержимое просто так не получится. Времени уйдет целая куча. Даже если флешка не оснащена индикатором, будет мигать индикатор жесткого диска. А куда еще складывать такое количество награбленных данных? Не в память же! Хотя, вообще-то, можно и в память, только памяти должно быть много. Но сложности на этом не заканчиваются. При попытке отключения USB-устройства штатными средствами Windows, та просто откажется демонтировать флешку, пока с ней работает хотя бы одна программа. Следовательно,
граббер должен отслеживать отключение USB-устройств,
прекращая грабеж в аварийном режиме. Короче, весьма нехилый проект у нас получается. Реализовать его очень сложно. Отладить
— еще сложнее, а утащить информацию, не вызывая подозрений у ее владельца, — вообще невозможно.

По этому поводу говорят, что если нельзя, но очень сильно хочется, то все-таки можно! И сейчас я поделюсь рецептом программы, которую можно состряпать за пару вечеров и которая работает на любой, абсолютно любой, операционной системе: на 9x, NT, W2K, XP, Висте и даже на Linux/BSD, поддерживает все типы сменных носителей и не вызывает конфликтов. А самое главное — распознать факт грабежа не сможет даже продвинутый пользователь. А грабить, скажу я тебе, мы будем его подчистую: от первого до последнего байта, включая данные, принадлежащие удаленным файлам.

 

Основные идеи и концепции (не путать с контрацепцией)

Из канонов разведки известно, что лучше всех ныкается тот, кто, не прячась, играет в открытую. Применительно к нашей ситуации
— не пытайся скрыть факт грабежа данных, а сделай его явным. И это не шутка. Труднее всего обнаружить то, что находится у нас под глазами. Берем флеш (или CD/DVD), вставляем. Тут же всплывает «антивирус», имитирующий проверку файлов, а в действительности сливающий их на жесткий диск в какую-нибудь глубоко вложенную папку — такую, которая гарантированно не попадется жертве на глаза. Необходимость отслеживать обращения к съемным устройствам тут же отпадает. Мы и без всякой маскировки так замаскировались, что у жертвы и тени подозрений не возникает!

Поскольку обычные антивирусы так себя не ведут, то от копирования их интерфейса лучше воздержаться, иначе можно быстро погореть. Пусть это будет что-то совершенно никому не известное. Например,
суперкрутой антивирус под названием Selena Enterprise Edition. Чисто теоретически жертва может попросить нас прервать проверку флешки (CD/DVD), но тут ее легко обломать встречным вопросом: «С какого это такого перепугу мы должны чего-то прерывать? Уж не вируса, ты, милый человек, занести нам хочешь?»


Разработка граббера, замаскированного под антивирус, в Microsoft Visual Studio 6.0

Кстати говоря, с юридической точки зрения мы не совершаем никакого преступления, так как вправе копировать содержимое сменного носителя, добровольно вставленного в наш компьютер его правообладателем. Зачем копировать? Ну, например, в целях кэширования. Другой вопрос, что распространять полученную таким путем информацию без согласия правообладателя как бы нельзя. «Как бы» — потому что факт несанкционированного распространения еще необходимо доказать. Если речь идет не о документах, представляющих коммерческую или государственную тайну, и не об убытках в особо крупных размерах, никакой суд заниматься подобными мелочами просто не будет. Такие дела недоказуемы в принципе! Вот упрется хакер
рогом и будет гнуть линию, что согласие (устное) на дистрибуцию он получил. Кто не верит, пускай докажет, что его (согласия) не было, причем с учетом презумпции невиновности, которую еще никто не отменял.

Впрочем, мы ушли в перпендикуляр. Возвращаясь в смысловую плоскость обсуждаемой темы, обратим свое внимание на то замечательное обстоятельство, что сами по себе грабберы не могут быть законными или незаконными. Даже если они умышленно имитируют работу антивируса. Ну и что с того? Кого они этим вводят в заблуждение? Пользователя
граббера? Ни фига подобного, ведь в прилагаемой к нему документации все сказано. Владельца флешки или CD/DVD? Ну… так это он сам себя обманул. Мало ли что ему там почудилось на экране. Selena — это вполне нормальный антивирус, точнее, часть антивирусного комплекса, копирующая данные с внешних носителей в специальную папку, чтобы при обнаружении заразы можно было
установить ее источник.

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

 

Технические детали реализации

В состав win32 API входит любопытная функция FindFirstChangeNotification, генерирующая уведомления при изменении содержимого заданной директории. Достаточно передать ей букву оптического привода и можно отслеживать вставку новых CD/DVD-дисков. Если у нас имеется более одного привода, функция FindFirstChangeNotification должна вызываться персонально для каждого из них.

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

// передаем функции имя буквы привода оптических дисков
// (в данном случае это диск «G:\\»)
HANDLE cnh = FindFirstChangeNotification("G:\\", FALSE,
FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME);

// отслеживаем изменения в бесконечном цикле
// (тут необходимо добавить код для выхода из цикла по <Esc> или другому хоткею 
while(1)
{
// ждем изменений в файловой системе заданного диска
// или, более конкретно, вставки (нового) диска в привод
DWORD wr = WaitForSingleObject(cnh, INFINITE);

// если мы находимся здесь,
// в привод вставлен новый диск,
// и самое время его ограбить
}

// после выхода из цикла сообщаем системе,
// что мы больше не хотим получать никаких уведомлений
FindCloseChangeNotification(cnh);

Получать уведомления о вставке флешек, автоматически монтирующих себя на новые диски, несколько сложнее. Мне так и не удалось найти элегантный и документированный способ, поддерживаемый всеми системами семейства Windows. Но я к этому, по правде сказать, не особенно и стремился, ограничившись периодическим (раз в несколько секунд) вызовом API-функции QueryDosDevice, возвращающим список имеющихся дисков, или GetLogicalDrives, которая работает быстрее и реализована на всех платформах, а не только на линейке NT, но вместо букв возвращает битовую маску (с которой еще предстоит разобраться).

Сделать это можно, например, так:

// получаем битовую маску с перечнем дисков,
// смонтированных на соответствующую им букву
DWORD dwLogicalDrives = GetLogicalDrives();

// разбираем все биты один за другим
for ( nDrive = 0; nDrive<32; nDrive++ )
{
// такой диск существует?
if ( dwLogicalDrives & (1 << nDrive) )
{
// определяем характеристики диска
uType = GetDriveType(szBuffer);
if ( (uType == DRIVE_REMOVABLE) ||
(uType == DRIVE_CDROM))
{
// это наш клиент!!!
// грабим его по полной программе
}
}
}

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

Грабить файлы лучше всего не блочно (функциями ReadFile/WriteFile), а через CopyFileEx
— это проще и более производительно. В остальном грабеж реализуется вполне стандартно и не должен вызывать сложностей даже у начинающих программистов, терзающих Visual Basic или DELPHI.

 

Грабим удаленные файлы

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

Естественно, стратегию грабежа придется радикально изменить, развернув ее на 360 градусов. Передаем API-функции CreateFile имя диска в виде «\\\\.\\R:», где R – буква, ассоциированная с флешкой, и читаем содержимое устройства функцией ReadFile блоками, кратными размеру сектора, например, по 2048 байт (внимание:
процесс-граббер в обязательном порядке должен обладать правами администратора, которые ему можно делегировать, к примеру, через штатную утилиту runas, иначе ничего не получится).

Минимально работающий листинг, реализующий эту затею, выглядит так (полный исходный текст можно найти в книге «Техника защиты CD от копирования»):

main(int argc, char **argv)
{
int a; FILE *f; HANDLE h; char *buf; DWORD x_read; char buf_n[1024];

buf = malloc(2048); // выделяем память

// открываем устройство
// (в данном случае диск G:)
h=CreateFile("\\\\.\\G:",GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);

// позиционируем указатель на первый читаемый блок
SetFilePointer (h, 0, NULL, FILE_BEGIN);

// читаем блоки с нулевого по 666-й
for (a = 0; a <= 666; a++)
{
// читаем очередной блок
if (ReadFile(h, buf, 2048, &x_read, NULL) && x_read)
{
// записываем только что считанный блок в файл C:\grab.dat
sprintf(buf_n,"%s[%04d].dat", "C:\\grab.dat" ,a);
if (f = fopen(buf_n,"wb"))
{ fwrite(buf, 1, x_read, f);fclose(f);}
}
}

Полученный образ флешки можно впоследствии залить на свою собственную флешку, поменяв функцию ReadFile на WriteFile, после чего натравить на нее любую из многочисленных утилит, предназначенных для восстановления удаленных файлов или (если флешки такого объема у нас нет) запустить Linux/BSD, смонтировать образ как настоящий диск и восстановить файлы вручную с помощью hex-редактора.

Техника восстановления подробно описана в моей книге «Data Recovery – tips and solutions», русская редакция которой лежит на http://nezumi.org.ru, а недавно по просьбе читателей выложен архив прилагаемого к ней лазерного диска со всеми исходными текстами простейших программ для восстановления.

Утянуть удаленное содержимое с носителей CD/DVD-R/RW на порядок сложнее, и, чтобы добраться до захороненных данных, необходимо спуститься на один уровень вглубь, получив прямой доступ к приводу через интерфейс ASPI или SPTI. Оба подробно описаны в «Технике защиты CD от копирования». Там же рассказывается, как самостоятельно восстановить данные после быстрой очистки. Полная очистка, увы, гробит содержимое CD/DVD-RW безвозвратно, однако она применяется лишь некоторыми пользователями.

 

Как не ограбить самого себя

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

Короче, лучше держать «антивирус» постоянно активным. Только это же ведь напряг сплошной! Не успел еще вставить новый диск (свой диск, а не чужой), как уже вовсю пошел грабеж, отнимающий время и убивающий нервные клетки. Значит, будем хитрить (тем более что нам это не впервой).

«Антивирус» должен позволять быстро отменять проверку текущего диска нажатием <Esc>, <Alt-X> или любой другой привычной комбинации клавиш, запоминая его серийный номер в скрытом конфигурационном файле, и никогда больше его не проверять. Другими словами, необходимо добавить в
граббер поддержку «белого» списка своих дисков, опознаваемых по серийному номеру или метке тома. Однако метка
— довольно ненадежное средство. Например, Nero по умолчанию метит все прожигаемые им диски ключевым словом NEW, а при форматировании флешек и ZIP’ов метка обычно вообще не назначается.

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

За чтение серийного номера отвечает API-функция GetFileInformationByHandle, возвращающая его в следующей структуре:

typedef struct _BY_HANDLE_FILE_INFORMATION {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD dwVolumeSerialNumber;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD nNumberOfLinks;
DWORD nFileIndexHigh;
DWORD nFileIndexLow;
} BY_HANDLE_FILE_INFORMATION;

Также следует предусмотреть комбинацию горячих клавиш, блокирующую запуск граббера при вставке носителя (типа <Shift>, отключающего автозапуск). Впрочем, это уже детали, допускающие бесчисленные вариации. Лично я поступил так: если в момент вставки нового диска на переднем плане находится FAR, то граббер не запускается. Если же FAR отсутствует или вращается в бэкграунде, а работа со сменными носителями осуществляется через проводник, это расценивается как сигнал к атаке. Внешне все выглядит вполне невинно и никаких подозрений не вызывает.

 

Замечания по реализации граббера под Linux/BSD

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

Механизм уведомлений об изменениях в файловой системе в UNIX-клонах реализован по-разному, и написать
переносимый граббер просто так не получится. Впрочем, ловить уведомления совершенно необязательно. Достаточно написать свою обертку штатной утилиты mount (по типу вируса-спутника), которая при попытке монтирования съемных носителей передаст управление настоящему mount’у и тут же запустит
граббер, замаскированный под антивирус. Как говориться, дешево и сердито. Зато системно независимо и надежно (кстати, описанный прием распространяется в том числе и на auto-mount).

Грабеж образов с носителей осуществляется путем открытия соответствующих устройств (перечисленных в каталоге /dev) системным вызовом open с последующим чтением их содержимого системным вызовом read.

В общем, написать приличный UNIX-граббер (даже не будучи гуру) совсем несложно.

 

Заключение

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


Полную версию статьи
читай в августовском номере
Хакера!

Оставить мнение

Check Also

Скрытая сила пробела. Эксплуатируем критическую уязвимость в Apache Tomcat

В этой статье мы поговорим о баге в Apache Tomcat, популярнейшем веб-сервере для сайтов на…