Самодельный ключ на флэшке или как защитить win-приложение, наработанное непосильным трудом.

К чему привязывать? Конечно же к HDD. Но привязать своё поделие к «железу» программно напрямую не так-то просто: ОС при попытках чтения атрибутов «железа» упорно выбрасывает исключения. Дело в том, что современные ОС поддерживаются аппаратным отслеживанием команд, которые напрямую обращаются к адресам портов ввода-вывода процессора. При некотором  гуглении выясняется, что многие программисты путают понятие «идентификатор раздела» с понятием  «идентификатор железа». Что такое ID раздела? Это набор символов, присваиваемый разделу после форматирования. И никакого отношения к «железу» он не имеет. Например, вот такая функция вернёт именно его:

DWORD GetSerialNum(String FullAppName)

        {

char drive[_MAX_DRIVE];

char dir[_MAX_DIR];

char name[_MAX_FNAME];

char ext[_MAX_EXT];

        _splitpath(FullAppName.c_str(), drive, dir, name, ext);

String sVolume = AnsiString(drive)+"\\";

char cVolume[256];

        strcpy(cVolume, sVolume.c_str() );

 

DWORD SerialNum;

DWORD a, b;

char VolumeName[MAX_PATH];

char SysNameBuffer[MAX_PATH];

DWORD Result = 0;

        if (GetVolumeInformation(cVolume, VolumeName, sizeof(VolumeName), &SerialNum, &a, &b, SysNameBuffer, sizeof(SysNameBuffer)) )

                Result = SerialNum;

        return Result;

        }

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

Что ж, раз к «железу» привязать не получается, то остаётся покупать дорогой аппаратный ключ? Нет, друзья, Microsoft – это  Microsoft, эта корпорация давно уже продумала, как дать возможность программистам рыться в железе. Ведь работают же такие программы, как AIDA, вскрывая всю подноготную вашего «железа».

Секретное оружие MS – это система команд wmic. Кто хочет ознакомиться подробно, читайте  здесь. Мы же воспользуемся только командой

wmic idecontroller get name,deviceid

Понятное дело, спрячем результат в какой-нибудь хэшкод:

WORD GetIdeControllerStamp(void)

        {

extern unsigned char CRCL;   

extern unsigned char CRCH;

HWND hWnd = GetConsoleWindow();

        ShowWindow(hWnd,SW_HIDE); // прячем консоль

            system("wmic idecontroller get name,deviceid > foo.txt");

std::ifstream fin("foo.txt", std::ios::binary);

        fin.seekg (0, fin.end);

int length = fin.tellg();

        fin.seekg (0, fin.beg);

char* Buffer = new char[length];

        fin.read(Buffer,length);

        fin.close();

        remove ("foo.txt");

        CRC16((unsigned char*)Buffer, length);

        delete[] Buffer;

WORD Stamp = 0x100*CRCH+CRCL;

        return Stamp;

        }

Пояснение: результат предварительно записывался в файл, читался из него, затем файл удалялся. Далее я воспользовался стандартной программой деления результата на генераторный полином 16-ой степени. Можно посчитать MD5; вообще можно делать всё, что позволяет фантазия. Чтобы ещё больше запутать взломщика, можно поступить, например, так:

void SetIDToFile(void)

        {

WORD id = GetIdeControllerStamp();

String  Sid = IntToHex(id,4);

        Sid = IntToHex(random(0xffff),4) + Sid;

        Sid = Sid + IntToHex(random(0xffff),4);

std::ofstream qfile;

        qfile.open( "di.dll" );

        qfile << Sid.c_str();

        qfile.close();

        }

Здесь спереди и сзади к Stamp'у добавляются по два случайных байта. При некоторой фантазии со Stsmp'ом можно делать всё, что угодно. Важно только, чтобы ваши действия были обратимыми или по крайней мере такими, чтобы можно было восстановить Stsmp. Вы, конечно, догадались, что результат запутывания надо записывать не на HDD, а на флэшку?

Что должна сделать защищемая программа? Она должна вычислить Stamp железа, на котором работает, найти на вставленной флэшке файл di.dll,  вычленить из него оригинальный Stamp и сравнить Stamp’ы. И дальше …работать, как ни в чём не бывало. :)

В чём здесь перец? А вот в чём. Результат сравнения Stamp’ов должен быть записан в контрольную переменную, как некоторое число, можно даже использовать булев тип. Я полагаю, что защищаемая софтина ведёт обмен с другим компьютером или устройством. В обмен при вычислении контрольных идентификаторов подмешивается контрольная переменная. Если подмешивание выполнено правильно, то обмен состоится, если нет, то нет. И никакие анализы на true/false отладчиком вам не помогут.

Резонно спросить: а откуда же возьмётся на флэшке файл, привязанный к железу покупателя? На самом деле тут всё просто. Вы продаёте программу с флэшкой. Будет или нет на ней файл с закодированным стэмпом "железа" покупателя -- не суть важно. Этот файл должен появиться при регистрации программы. Короче, при вводе регистрационного кода. А регистрационный код откуда? От верблюда. Придумайте сами, откуда вы его возьмёте. Если не хватает фантазии, читайте тут. ВАЖНО! Регистрационный код не должен иметь никакого отношению к стэмпу на флэшке. Важен факт: при регистрации создаётся стэмп на вставленной флэшке. Но не на простой флэшке, а на той, которой вы присвоили номер в имени и продали вместе с программой. Можно связать номер с датой продажи и её порядковым номером -- тут уместна ваша фантазия. Если покупатель при регистрации вставил не вашу флэшку -- файл стэмпа не должен быть создан!

Мало кто знает, что присвоить/изменить имя флэшки можно при помощи ...проводника. Вставьте флэшку, найдите её проводником, ПКМ и "переименовать". Введите свои символы, нажмите Enter. :) По этому имени ваша программа будет искать вашу флэшку.

Как писать на флэшку, как находить вставленную именно вашу, а не какую-нибудь другую флэшку или USB-устройство – обязательно ещё напишу.

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

Не напишу, но, впрочем, подскажу, так как считаю,  что было достаточно много просмотров этой ветки блога. Итак -- как?

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

Если кому-то интересно, но он не знает, как легко и быстро программно отыскать все примонтированные флэшки -- пишите в личку.

 

Версия для печатиВерсия для печати
  • 1
  • 2
  • 3
  • 4
  • 5
Всего голосов: 1
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Страницы

Аватар пользователя mike

Собираюсь выложить ещё немного кода. Но без спойлеров или скроллеров как-то неёмко.

+2

mike пишет:

Собираюсь выложить ещё немного кода. Но без спойлеров или скроллеров как-то неёмко.


Да, ужасно с форматированием кода.sad

Аватар пользователя mental

Ну так KV для домохозяек сайт, судя по статьям о ГМО...

По сабжу, чтобы коммент не удалили: а не проще прикрутить какой-нибудь готовый SDK для защиты? Их же раньше миллион было, должны же быть еще живые.

Аватар пользователя mike

Не понял. При чём тут SDK (система разработки)? Речь о принципе. Я показал, как легко можно закодить параметры железа и привязать к софтине. Всего-то.

Аватар пользователя mental

При том, что все давно написано до нас, и нечего изобретать велосипед.

Аватар пользователя mike

Нечего изобретать велосипед.

?

Не понял.

Аватар пользователя savely

> нечего изобретать велосипед.

А может, нечего из пушки по воробьям стрелять? 

Пушка - платный SDK + токены (чисто софтовой коммерческой защиты ПО я уж давненько не видел). 

Аватар пользователя mike

Вы, парни, выражайтесь менее иносказательно. Чтобы все понимали. В том числе и я.

Аватар пользователя mental

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

Аватар пользователя savely

> Любая самоделка на коленке ломается на раз-два любым более-менее подкованным школьником с дизассемблером - это факт.

Неа. Не те нынче школьники... 

>  Если, конечно, вы не за 500 баксов свой софт клиенту пишете.

Бинго! Наконец-то! Да - это как раз для этого случая. Дешевый софт - дешевая и простая зашита.  Стандартное отношение "овчинка/выделка". 

+1

Страницы