Генерация и проверка серийного номера в своей программе(как реализовать?) С/С++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by blackbox, 13 Jul 2015.

  1. blackbox

    blackbox Elder - Старейшина

    Joined:
    31 Dec 2011
    Messages:
    362
    Likes Received:
    62
    Reputations:
    11
    Мне нужна простенькая защита, генерировать и проверять серийный номер пользователя программы (уникальный для каждого ПК). Я так понимаю, что нужно брать ID оборудования и плясать оттуда, только что дальше делать, как обычно генерируют серийники? Спасибо.
     
  2. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
  3. blackbox

    blackbox Elder - Старейшина

    Joined:
    31 Dec 2011
    Messages:
    362
    Likes Received:
    62
    Reputations:
    11
    Его вроде как подменить можно. Меня в общем-то интересует алгоритм. Получаю я ID процессора или винчестера, какие махинации обычно проводятся над ними чтобы потом получить исходную строку по которой генерировать серийный номе(как?) и потом проверять его обратным способом в программе.
     
  4. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    да хоть какие, на что способна твоя фантазия, для примера, заполнил ты массив байтов инфой о железках, их номерах или какой иной инфой, (версией системы, номером сборки, используемой локали и т.д.), вычислил хэш, например, sha256 для данного набора, ну и взял 3, 5, 6,7,12-15,17... , байты получившегося хэша, для серийника, а для ключа 2,4,6,8,10,11-15 байт тройного sha256 хэша серийника. Это самое простое, что можно придумать, если нет желания загоняться особо о защите и привязке
     
  5. blackbox

    blackbox Elder - Старейшина

    Joined:
    31 Dec 2011
    Messages:
    362
    Likes Received:
    62
    Reputations:
    11
    Окей, понял, только не догнал этот момент. Что тут имеется в виду под ключом, если мы серийник генерируем и так?
     
  6. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Имелось ввиду схема: уникальный серийный номер, вычисленный программой, тот, что пользователь сообщит тебе и ключ (код активации) тот, что сгенерируешь ты и скажешь пользователю, чтобы он смог её активировать. Иначе, если ты собираешься обходиться одним серийном, тебе нужно придумать способ передачи тех данных о ПК, на основе которых ты будешь генерировать номер
     
    blackbox likes this.
  7. Developer™

    Developer™ Member

    Joined:
    7 Nov 2013
    Messages:
    30
    Likes Received:
    6
    Reputations:
    0
    Используй WMI для получения серийного номера оборудования.
     
    blackbox likes this.
  8. blackbox

    blackbox Elder - Старейшина

    Joined:
    31 Dec 2011
    Messages:
    362
    Likes Received:
    62
    Reputations:
    11
    Спасибо.
     
  9. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    1) Генеришь открытый и закрытый ключ RSA. На WinAPI без проблем
    2) В прогу прошиваешь открытый ключ
    3) В проге генеришь какое-либо число, зависимое от компа. Желательно как можно больше методов объединить. На выбор
    - метка тома системного диска
    - имя проца
    - серийник винды
    - дата установки винды. по факту время создания папки windows
    - на крайняк дата установки программы.
    - версии системный библиотек

    В общем большой простор для выбора
    4) Далее полученное число и есть идентификатор компа. Желательно его сохранить еще в реестре в шифрованном виде.
    5) И вот юзер сообщает полученное число + свой идентификатор, вы
    юзер + хеш(идентификатор) подписываете ключем и отсылаете в виде этих данных + подпись
    6) прога проверяет валидность цифровой подписи зная открытый ключ и идентификатор.

    Если вдруг утечет ключ (через подделку идентификаторов) то вы всегда знаете кто это сделал, потому что всегда в ключе содержится имя юзера

    // пля, многие напиваясь звонят бывшим, а тут пробило на форум
     
    blackbox and crystalbit like this.
  10. i~DOS

    i~DOS Member

    Joined:
    26 Mar 2009
    Messages:
    42
    Likes Received:
    40
    Reputations:
    4
    slesh, чем это принципиально отличается от проверки зашитого в бинарник серийника? Вся суть взлома сводится к простому патчу в месте проверки. Ну да, придётся ещё открытый ключ затереть, чтобы обезличить сборку.
    Как по мне, лучше обойтись обычным xor'ом и сосредоточиться на функциональности программы. А тот, кто не хотел платить за софт, и так не станет его покупать.
     
  11. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Ну вам не угодишь. Другой пример
    1) Весь очень важный функционал оформлен в виде DLL. Можно даже не чисто dll а выдранный из неё код.
    2) Этой DLL нет в комплекте
    3) При указании серийника высылается пользователю файл dll шифрованный с использованием ID компа
    4) Далее эта dll грузится напрямую из памяти. В идеале не dll а шелкод большой

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

    Можно конечно пропатчить программу чтобы грузили сразу распакованную DLL и отключить проверку в DLL. Но это уже слишком много работы и требует спец лоадера.

    А вообще как сказал ктото из известных: Если программа запускается, то её можно взломать.
     
  12. i~DOS

    i~DOS Member

    Joined:
    26 Mar 2009
    Messages:
    42
    Likes Received:
    40
    Reputations:
    4
    А если мне нужно в линупс сконпилить? Никаких персональных претензий, просто смешно становится, когда в софте функционала на 100 строк, а там нужно дополнительную dll качать, бред какой-то. Если уж очень хочется защиты, то лучше вынести исполнение части кода на сервер, либо воспользоваться рефлексией, и функцилнальные куски кода также дёргать с сервера.
     
    blackbox likes this.
  13. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Если функционала на 100 строк, то этот функционал не требует защиты в виду того что он очень примитивный и любой дебагер справится с этим.

    В линуксе есть so файлы. И там всё также по факту. Конечно можно некоторые сугубо вычислительные функции реализовать на сервере. Вот только нагрузка и поддержка - не стоят того.
     
    blackbox likes this.