Итак, наш увлекательный разговор о защите программного обеспечения от несанкционированного использования со стороны всевозможных любителей "халявы" продолжается. В прошлый раз речь шла о генерации и проверке регистрационных ключей - мы рассмотрели простые примеры кода, показывающие, как её реализовать в первой версии приложения буквально за пять минут.
Сегодня мы все еще будем обсуждать систему регистрации программного продукта и ключи, но перейдем уже к более сложным вариантам. Дело в том, что достаточно удобные схемы генерации ключа по персональным данным, предоставляемым пользователем, делают разработчика беззащитным перед разными хитростями со стороны потенциальных покупателей. Ведь никто не мешает даже честно купившему регистрационный ключ пользователю выложить его на каком-нибудь "варезнике", чтобы потом любой желающий мог воспользоваться этим самым ключом, не покупая новый у разработчика продукта. Думаете, такая схема маловероятна, и тому, кто купил ключ за собственные деньги, нет никакого резона выкладывать его в Сеть? Это, к сожалению, верно только в очень грубом приближении...
Действительно, тот, кто платит за продукт своими честно заработанными евро, долларами, фунтами стерлингов и так далее, обычно не имеет вредной привычки сразу после покупки бежать на какой-нибудь форум и там выкладывать только что полученный от разработчика программы регистрационный ключ. В то же время совершенно не обязательно платить за софт из своего кармана - особенно если потом планируешь не использовать этот софт для решения каких-то своих проблем (или для развлечений, если речь идет об играх), а прославляться с его помощью в узком кругу завсегдатаев "варезных" форумов. Поэтому достаточно часто покупки, которые должны в будущем стать источником падения продаж данного конкретного программного продукта, совершаются по поддельным или украденным кредитным или дебетовым картам. Вариант поддельной карточки, конечно, гораздо менее распространен и популярен, потому что приличные регистраторы (компании, занимающиеся процессингом платежей, полученных от пользователя, и выступающие, таким образом, посредниками между разработчиками софта и его покупателями) отслеживают такие карты и не дадут пройти транзакции, которая заведомо будет потом отменена банком. Что касается украденных карт, то с ними все гораздо хуже. Поскольку регистратор не может распознать, что карта украдена, то и транзакция с ней проходит вполне успешно. Только, к сожалению, даже денег за одну копию создатель ПО при этом не получит, поскольку, в конце концов, владелец обнаруживает, что его карточкой пользовались без спроса, и отменяет совершенные не им транзакции. За такую отмену банк может оштрафовать регистратора, а тот, в свою очередь, разработчика программы. Плюс не стоит забывать и о том, что комиссия регистратору за этот платеж разработчиком также уже уплачена. Так что убытки начинаются уже на самом этапе покупки по украденной карточке, и дальше только продолжаются.
Впрочем, украденная банковская карточка - далеко не единственное зло, с которым приходится бороться тем, кто на свой страх и риск продает собственное программное обеспечение через Интернет. Многие разработчики применяют способы регистрации, гарантирующие привязку конкретного ключа к конкретному пользователю. Биометрические технологии, к сожалению, нам в этом пока не помощники, хотя этот вариант был бы удобнее и надежнее всего. Но даже не каждый ноутбук сегодня оснащается сканером отпечатков пальцев, не говоря уже о настольных ПК. Продавать же такой сканер в комплекте с какой-нибудь утилитой для чистки реестра (да, в принципе, даже с тем же Photoshop'ом тоже) будет, скажем так, не совсем удобно ни для пользователя, ни для разработчика продукта. Поэтому приходится использовать менее совершенные, но более удобные для всех способы привязки продукта к пользователю - вернее, даже не к самому пользователю, а к его компьютеру. В качестве способа идентификации выступают различные параметры как "железа", так и программной "начинки" компьютера: размер жесткого диска, версия BIOS, версия Windows и т.д. и т.п. Наиболее удобным средством идентификации при этом является MAC-адрес сетевой карты компьютера - благо, теперь практически нет компьютеров, не имеющих в своем арсенале подобного устройства, потому что последние годы оно интегрируется в материнскую плату. Конечно, если есть желание использовать что-то, кроме MAC-адреса, это вполне можно сделать, потому что тогда можно продать (ну или, во всяком случае, попытаться это сделать) пользователю новый регистрационный ключ для программы в том случае, если он, скажем, переустановил операционную систему или заменил "винчестер" на другой, имеющий большую емкость. Но мы с вами сейчас рассмотрим только работу с MAC-адресом, а уже остальное, проявив творческий подход и немного смекалки, вы сможете добавить самостоятельно.
Поскольку напрямую запрашивать MAC-адрес у пользователя при регистрации не совсем удобно (ведь далеко не каждый из тех, кто соберется купить ваш программный продукт, будет в курсе того, что это не его почтовый адрес), то программа должна сама генерировать какой-то идентификационный номер, который будет зависеть от всех нужных разработчику параметров компьютера и на основе которого потом уже будет "сочиняться" итоговый регистрационный код. Этот код может даже самостоятельно отсылаться приложением разработчику, а затем, если его не будет в базе зарегистрированных пользователей, можно генерировать специальный временный код для пробной версии. В общем, механизм, предусматривающий связь программы с разработчиком при каждом её запуске, позволяет достаточно эффективно бороться с описанной выше ситуацией несанкционированного разработчиком программного продукта распространения лицензионного ключа, купленного по украденной банковской карточке.
Итак, приступим к практике. Давайте для начала взглянем на программный код, позволяющий получить MAC-адрес компьютера. Он приведен в листингах 1 и 2. Для получения MAC-адреса воспользуемся стандартными средствами NetBIOS, которые нужны для работы функции GetAdapterInfo, которая затем уже и используется для получения MAC-адреса. Она приведена в листинге 1, а непосредственно сам код получения адреса сетевой карты приведен в листинге 2. Для успешного выполнения предложенного в листингах кода нужно добавить в секцию uses модуль NB30.
Листинг 1
function GetAdapterInfo (Lana: Char): string; var Adapter: TAdapterStatus; NCB: TNCB; begin FillChar(NCB, SizeOf(NCB), 0); NCB.ncb_command := Char(NCBRESET); NCB.ncb_lana_num := Lana; if Netbios(@NCB) <> Char(NRC_GOODRET) then begin Result := 'adapter not found'; Exit; end; FillChar(NCB, SizeOf(NCB), 0); NCB.ncb_command := Char(NCBASTAT); NCB.ncb_lana_num := Lana; NCB.ncb_callname := '*'; FillChar(Adapter, SizeOf(Adapter), 0); NCB.ncb_buffer := @Adapter; NCB.ncb_length := SizeOf(Adapter); if Netbios(@NCB) <> Char(NRC_GOODRET) then begin Result := 'adapter not found'; Exit; end; Result := IntToHex(Byte(Adapter.adapter_address[0]), 2)+'-'+ IntToHex(Byte(Adapter.adapter_address[1]), 2)+'-'+ IntToHex(Byte(Adapter.adapter_address[2]), 2)+'-'+ IntToHex(Byte(Adapter.adapter_address[3]), 2)+'-'+ IntToHex(Byte(Adapter.adapter_address[4]), 2)+'-'+ IntToHex(Byte(Adapter.adapter_address[5]), 2); end;
Листинг 2
function GetMACAddress: string; var AdapterList: TLanaEnum; NCB: TNCB; begin FillChar(NCB, SizeOf(NCB), 0); NCB.ncb_command := Char(NCBENUM); NCB.ncb_buffer := @AdapterList; NCB.ncb_length := SizeOf(AdapterList); Netbios(@NCB); if Byte(AdapterList.length) > 0 then Result := GetAdapterInfo(AdapterList.lana[0]) else Result := 'mac not found'; end;
Собственно говоря, поскольку тема нашего с вами сегодняшнего разговора - все-таки не столько работа с NetBIOS'ом, сколько генерация регистрационных ключей, отдельно останавливаться на приведенном в листингах коде не будем, хотя, конечно, пару слов о нем сказать все-таки стоит. Функция, приведенная в листинге 1, позволяет получить MAC-адрес любого из имеющихся на компьютере пользователя сетевых адаптеров, функция же из листинга 2, по сути, является для неё просто оберткой, выдавая MAC-адрес первого по списку адаптера. В принципе, если присмотреться ко второму листингу, то несложно увидеть, что его совсем не сложно модифицировать таким образом, чтобы получить MAC-адреса всех присутствующих на компьютере адаптеров, но насколько целесообразно использовать для генерации регистрационного кода программы все их MAC-адреса, сказать сложно. Обратите внимание на то, что MAC-адрес выдается в стандартном представлении (шесть групп по две шестнадцатеричных цифры), а в качестве разделителя используется минус (или дефис, если вам так привычнее). Но если есть необходимость представить его в каком-то другом виде, то особых препятствий для этого, в общем-то, нет - достаточно немного модифицировать первый из представленных вашему вниманию листингов. Хотя, в общем-то, как мы с вами увидим далее, особых причин для такой модификации при стандартном раскладе быть не должно.
Что ж, пока что на сегодня, на мой взгляд, достаточно, в следующий раз продолжим разговор о привязке регистрационного ключа к MAC-адресу компьютера.
Вадим СТАНКЕВИЧ
Горячие темы