itkvariat

    Самодельная флешка-"ключ" или как защитить 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, что ещё быстрее.

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


    Читайте продолжение статьи


    Михаил Гурчик

    Компьютерные Вести





    Подписывайтесь и читайте новости от ITквариат раньше остальных в нашем Telegram-канале !



    Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!  




    И еще об интересном...
  • LG G6: большой тест - обзор
  • AppleTV: консоль, медиапроигрыватель или…
  • Игровой ноутбук MSI GS43VR 6RE Phantom Pro
  • Вольный обзор языков программирования
  • Java — великий и могучий
  • Репортажная зеркальная цифровая фотокамера Nikon D500. Новый флагман для искушенных.
  • «Сапожник без сапог». SSD-накопитель Intel SSD 540s


  • А что вы думаете? Напишите в комментариях!
    Кликните на изображение чтобы обновить код, если он неразборчив



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

    Полная версия правил

Самое популярное
    
Проверьте скорость вашего интернета!


Что бывало...
  • 13 март 1996

    NBA JAM

    Вам предоставляется возможность поиграть за любую команду национальной баскетбольной ассоциации США, правда каждую из

Наши друзья
Сервисный центр Five Service

Магазин кабелей и аксессуаров UGREEN

Самоклейкин

Смарт



Самодельная флешка-"ключ" или как защитить 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, что ещё быстрее.

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


Читайте продолжение статьи


Михаил Гурчик

Компьютерные Вести





Подписывайтесь и читайте новости от ITквариат раньше остальных в нашем Telegram-канале !



Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!  




И еще об интересном...
  • LG G6: большой тест - обзор
  • AppleTV: консоль, медиапроигрыватель или…
  • Игровой ноутбук MSI GS43VR 6RE Phantom Pro
  • Вольный обзор языков программирования
  • Java — великий и могучий
  • Репортажная зеркальная цифровая фотокамера Nikon D500. Новый флагман для искушенных.
  • «Сапожник без сапог». SSD-накопитель Intel SSD 540s


  • А что вы думаете? Напишите в комментариях!
    Кликните на изображение чтобы обновить код, если он неразборчив



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

    Полная версия правил
    ITквариат (АйТиквариат) Powered by © 1996-2024