Самодельный ключ на флэшке или как защитить 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

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

Бери поболее.

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

>  Бери поболее.

И сейчас дискуссия уйдет в рекурсию... Фразу дарю Логику. 

 

+1

savely пишет:

>  Бери поболее.

И сейчас дискуссия уйдет в рекурсию... Фразу дарю Логику. 

 


Беру (С)

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

Нда. Я ещё не дописал, а Логик уже ухватил.

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

Ну, рад за вас, если вы и в своем софте спец, и в его защите. У меня так не получается.

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

Приходится. Ну или ключи по сто баксов покупать. 

Есть ешё нюанс. Покупной ключ -- налицо перепродажа и, как следствие, -- НДС.

 

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

Ну или в личку, кому интересно.

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

Т.е. если я в своем софте чью-то платную либу заюзаю, это тоже перепродажа? Можно с этого места подробнее?

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

А это как налоговая посмотрит. И зависит от системы налогообложения. Если ОСН с налогом на прибыль 16% и доход не превышал за последние 3 м-ца определённой суммы (статья 91 НК РБ), то ИМХО без НДС.

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

+1

Страницы