Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Привязка к железу. WMI и другие способы.  [new]
CTAC-KO
Member

Откуда: Украина, г. Ивано-Франковск
Сообщений: 1012
Привет!
Собственно это не вопрос, а некоторые мои наработки по данному вопросу. Я не ставил задачи защиты программы с привязкой на железо, но с данным вопросом столкнулся.
Итак. На этом форуме, на фоксклубе и в интернете Вы найдете следующие решения:

1) Получить "серийный номер" логического диска винчестера, т.е. раздела на HDD. Этот способ существует в разных реализациях, однако у всех одно общее - использование GetVolumeInformation из Win32API:
Declare Integer GetVolumeInformation in Win32API 
Этот способ работает, но имеет следующие недостатки:
- собственно "серийный номер" логического диска винчестера - это не hardware serial. Это некий случайный набор чисел, получаемый разделом в результате форматирования
- не исключается повтор
- есть куча программ, которые могут выставлять заданный "серийный номер" любому логическму диску
- если производитель (сбощик) РС установит винду с помощью программ клонирования, очень большая вероятность того, что и "серийные номера" всех логических дисков так же будут клонированы
- пользователю достаточно отформатировать раздел, к "серийному номеру" которого привязана прога, и в результате этот самый "номер" изменится. Не говоря уже о переразбивке диска и переустановке винды.
Вывод: способ - ацтой!

2) Получить серийные номера различных устройств (компонентов) с помощью службы WMI. Выглядит примерно так:
LOCAL lcRemoteComputer,;
loSWbemLocator, loSWbemServices,lcolSWbemObjectSet,loSWbemObject
lcRemoteComputer = "."
lcComputer="."
loSWbemServices = GetObject("winmgmts:\\" + lcComputer + "\root\cimv2")
lcolSWbemObjectSet = loSWbemServices.InstancesOf("Win32_PhysicalMedia")
* вместо Win32_PhysicalMedia можно пробывать Win32_BaseBoard для материнки или Win32_Processor для процессора и т.д.
* какие значения (классы) можно использовать можно найти в нете немяряно инфы
for Each loSWbemObject In lcolSWbemObjectSet
? loSWbemObject.SerialNumber
next
данный способ имеет просто массу недостатков:
- сама служба WMI у пользователя мб отключена или вообще недоступна
- Win98 + WMI = недюженный гемор
- если производитель (сбощик) РС установит винду с помощью программ клонирования, очень большая вероятность того, что и "серийные номера" для всех таких РС будут совпадать, даже если само железо другое. Просто клонируется реестр, откуда WMI черпает инфу
- WMI может у одних нормально работать, а у других тупо не выдавать серийник, т.е. возвращать .NULL.
- далеко не всякое железо всякого производителя вообще будет отдавать серийник, т.к. есть куча ньюансов именно по производителям. Скажем винты Seagate отдают серийники по одному способу, а WD имеют уже какие-то хитрости и т.д.
Вывод: способ - ацтой! Неважно на что "привязываться", хоть и на BIOS.

3) Получить некий GUID, основанный на данных реестра. Типа следующего примера на VB (на фокс смысла переводить не имело):
Attribute VB_Name = "modFag"
Option Explicit
Dim reg As Object, Pid As Variant, GUID As Variant
Dim LENGUID As Long, LENPID As Long, TempS As String
Dim x As Long, SPID As String, SGUID As String, HWID As String
Const regPID = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId"
Const regGUID = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid"
Public Function CreateID() As String
On Error Resume Next
Set reg = CreateObject("wscript.shell")
Pid = Replace(reg.regread(regPID), "-", "")
GUID = Replace(reg.regread(regGUID), "-", "")
LENPID = Len(Pid)
LENGUID = Len(GUID)
For x = 1 To LENPID
TempS = Hex((Asc(Mid$(Pid, x, 1)) Xor 23) Xor 14)
SPID = SPID & TempS
Next x
SPID = StrReverse(SPID)
For x = 1 To LENGUID
TempS = Hex((Asc(Mid$(GUID, x, 1)) Xor 23) Xor 14)
SGUID = SGUID & TempS
Next x
SGUID = StrReverse(SGUID)
HWID = StrReverse(SGUID & SPID)
CreateID = HWID
Dim fagID As String
Dim i As Integer
For i = 1 To 5
fagID = fagID & CStr(Mid(CreateID, Int(Len(CreateID) / 12) * i, 4)) & "-"
Next
fagID = Mid(fagID, 1, Len(fagID) - 1)
CreateID = UCase(fagID)
End Function
данный способ имеет слудющие недостатки:
- необходим доступ к реестру, хз что с правами
- неизвестно от чего это все зависит вообще, меняется ли по жизни и почему
- если производитель (сбощик) РС установит винду с помощью программ клонирования, очень большая вероятность того, что этот способ выдаст одно и тоже на физически разных РС, т.к. клонируется и реестр, откуда черпается инфа.
Вывод: на мой взгляд, восновном из-за недостатка связанного с установкой винды клонированием, способ - ацтой!

4) Получить CPUID, т.е. идентификаионную иформацию процессора. Для реализации на фокспро не обойтись без сторонних программ, типа консольных ехе (например: getcpu.exe и различные одноименные cpuid.exe) или с помощью специальных библиотек fll/dll (можно найти на фоксклубе). Есть как бесплатные так и платные решения типа Hardware_IDExtractor и т.п. Все решения основаны на ассемблерной комманде CPUID.
данный способ имеет следующие недостатки:
- не каждое решение работает с правами юзера, т.е. некоторые только с правами администратора
- нельзя использовать индентификатор, строящися на принципе получения контрольной суммы типа CRC32/MD5 и тп от полученной информации (ответа), т.к. это влючает в себя номер задействованного в данный момент ядра и текущую частоту. Текущая частота процессора зачастую "плавает" в пределах нескольких МГц в реальном времени (не говоря уже о разгоне или наоборот, котода биос сбрасывает настройки на безопасные в случае сбоя), а номер ядра, когда в ходу многоядерные системы, в разный момент времени на одном и том же РС мб разным (проверено). Итого: будет разная инфа и соотв. кс в разные моменты времени на одном и том же РС!
- процессоры Intel, начиная с Pentium-III, действительно отдают сериник через CPUID, но на всех старших, современных моделях необходимо обязательно предварительно включать такую фичу в BIOS-е материнки, чего естественно никто не делает
- не все процессоры вообще имеют возможность получать серийные номера программно, в т.ч. через CPUID. Например, процессоры AMD - не имеют вообще. Об этом можно прочитать в нете, втч на вики.
- в итоге на типовой конфигурации в оффисе и т.п., когда несколько РС построены на одном и том же железе, CPUID отдаст одну и ту же инфу, т.е. неуникальную.
- наличие дополнительных файлов (библиотек, программ) сторонних производителей, повсеместная работоспособность которых не гарантируется
Вывод: способ - ацтой!

5) Получить реальный hardware HDD serial. Это опять же не решается средствами фокспро, а подобно предидущему варианту с помощью библиотек или программ сторонних производителей. Здесь восновном существуют практически исключительно только платные варианты, как то дллки Hardware_IDExtractor, RLByte HDDPhysic, AKRAM SOFT HardDiskSerial и т.п. и кряков к ним как правило просто не существует, т.к. спроса нет. Я находил лишь 2 бесплатных варианта - один в виде dll (AmoK GetIDE, который, однако, требует прав администратора, а у юзеров не работает вообще) и в виде консольной ехе - diskid32, которая таки работает с правами юзера.
данный способ имеет слудющие недостатки:
- наличие дополнительных файлов (библиотек, программ) сторонних производителей, повсеместная работоспособность которых не гарантируется
- возможные проблемы с правами доступа в виндах
- проблемы связанные с версией винды, т.е. может работать на XP, но не работать на Vista или 7
- подавляющее большинство удобных решений - платные
- наличие доп. проги/дллки легко заметно, для взлома потребуется "эмуль", который будет выдавать одно и тоже везде
Вывод: в принципе возможное решение, но непопулярное, а что до diskid32 - то и довольно легко взламываемое. Можно, конечно контрольную сумму запускаемого ехе спросить, но и это легко "подставить". Разве что переписать diskid32 (на оф. сайте выложены исходники) на фокспро, если такое вообще возможно.

6) Получать любые серийники любого железа позволяют различные программы типа старой AIDA32ю. К примеру Everest Corporate Edition имеет специальные функции, с помощью которых любую инфу о железе и не только можно получать даже удаленно, мониторить изменения в железе и все такое, может "сливать" отчеты в разном виде (CSV и тд) и даже заливать на SQL-сервер. Решение имеет лишь один очевидный недостаток - оно платное. И довольно дорогое. Т.к. даже не пробовал, больше ничего сказать не могу. Дома запускал, прога реально модная и весьма популярная в середе итешнегоф - инфу отдает любую, однако требует периодического обновления, связанного с появлением нового железа (чипсеты, процы, видяхи и тп).
Вывод: возможное решение, но зависит от материальных возможностей.

Глобальный вывод: защита программы, основывающаяся на серийниках железа сама по себе ущербна изначально. Весь софт, защищенный подобным образом - взламывается, защиты "обходятся". Единственной пока устойчивой защитой является онлайн-активация типа UbiSoft-овской DRM, т.е. когда для работы программы постоянно нужен выход в интернет, понятно для чего :)
11 сен 10, 15:46    [9424040]     Ответить | Цитировать Сообщить модератору
 Re: Привязка к железу. WMI и другие способы.  [new]
piva
Member

Откуда: Курган
Сообщений: 1096
Самый главный вопрос - вот нафига это надо ?
Если всем известно, что лучшая защита - качественное сопровождение. А если надо сломать, то Defox ломается. Было бы что ломать
11 сен 10, 22:24    [9424797]     Ответить | Цитировать Сообщить модератору
 Re: Привязка к железу. WMI и другие способы.  [new]
reware
Member

Откуда: Хабаровск
Сообщений: 585
Да незачем так мудрить, привязывайтесь к дате BIOS, извлекая её внешним 16-битным приложенеим (а иначе не сможете) . Все эти DECLARE тут вам не помощники.
12 сен 10, 15:55    [9426103]     Ответить | Цитировать Сообщить модератору
 Re: Привязка к железу. WMI и другие способы.  [new]
CTAC-KO
Member

Откуда: Украина, г. Ивано-Франковск
Сообщений: 1012
Мне какбэ фсиравно кому и зачем это надо. Сие является лишь кратким обзором вариантов собранные в одной "статье" для тех, кто этим интересуется.
Если есть что добавить - добавляйте, только подробнее. Потому как "дата из биоса" например мне мало о чем говорит, т.к. часы/календарь и так на "материнских" часах, т.е. какбэ из биоса, что там "вытаскивать"? Дату создания биоса? Дату прошивки биоса? Дату версии биоса? Опять же - какую б дату там не брать, необходима, как тут было сказано, внешняя прога, которая быстро "палится" простым просмотром содержимого каталога проги и пишется простецкий эмуль, выдающий всегда то, что "дохтур" (т.е. программёр) прописал .
15 сен 10, 00:11    [9439795]     Ответить | Цитировать Сообщить модератору
 Re: Привязка к железу. WMI и другие способы.  [new]
psj
Member

Откуда:
Сообщений: 3
CTAC-KO,-
Достаточно и первого метода.Нужно просто давать время на размышление потенциальному покупателю и не блокировать запуск программы ,а переводить ее в демо-режим.Поэтому в файл лицензии лучше спрятать ,кроме серийника винта, еще и название организации и дату окончания поддержки.Не сработает первое - будет часто напоминать второе.
15 сен 10, 17:04    [9445024]     Ответить | Цитировать Сообщить модератору
 Re: Привязка к железу. WMI и другие способы.  [new]
reware
Member

Откуда: Хабаровск
Сообщений: 585
psj
CTAC-KO,-
Достаточно и первого метода.Нужно просто давать время на размышление потенциальному покупателю и не блокировать запуск программы ,а переводить ее в демо-режим.Поэтому в файл лицензии лучше спрятать ,кроме серийника винта, еще и название организации и дату окончания поддержки.Не сработает первое - будет часто напоминать второе.

Имеется в виду API ? Это несерьезно. Я не имел в виду ответ участников про изготовление "простейшего эмуля", это дело уже хакеров с закатанными рукавами, вы попробуйте взломать старинное 16-битное внешнее приложение, тем более зашифрованное и включенное в проект. Друзья, не надо тут пальцы веером. На данный момент лучшее средство защиты - DefoxIII.
15 сен 10, 17:19    [9445159]     Ответить | Цитировать Сообщить модератору
 Re: Привязка к железу. WMI и другие способы.  [new]
Telum
Member

Откуда: Краснодар
Сообщений: 127
CTAC-KO, я использовал WMI. Тупо запускал ShellExecute с такой программой (из командной строки не работает) msinfo32 /nfo info.nfo ВСЕЕЕЕ сведения, что необходимы.... даже не парься насчет всего остального. Правда парсер простенький нало написать. Решение внедрено мной на 3 предприятиях... не жалуются. Если какой-нить зверь спер память с компа... у меня тут же отчет выскакивает )))
17 сен 10, 15:04    [9457520]     Ответить | Цитировать Сообщить модератору
 Re: Привязка к железу. WMI и другие способы.  [new]
reware
Member

Откуда: Хабаровск
Сообщений: 585
Telum
CTAC-KO, я использовал WMI. Тупо запускал ShellExecute с такой программой (из командной строки не работает) msinfo32 /nfo info.nfo ВСЕЕЕЕ сведения, что необходимы.... даже не парься насчет всего остального. Правда парсер простенький нало написать. Решение внедрено мной на 3 предприятиях... не жалуются. Если какой-нить зверь спер память с компа... у меня тут же отчет выскакивает )))

Вам повезло. Дело в том, что WMI на компе может не быть или оно есть, но отключено.
17 сен 10, 18:09    [9459135]     Ответить | Цитировать Сообщить модератору
 Re: Привязка к железу. WMI и другие способы.  [new]
Telum
Member

Откуда: Краснодар
Сообщений: 127
reware
Telum
CTAC-KO, я использовал WMI. Тупо запускал ShellExecute с такой программой (из командной строки не работает) msinfo32 /nfo info.nfo ВСЕЕЕЕ сведения, что необходимы.... даже не парься насчет всего остального. Правда парсер простенький нало написать. Решение внедрено мной на 3 предприятиях... не жалуются. Если какой-нить зверь спер память с компа... у меня тут же отчет выскакивает )))

Вам повезло. Дело в том, что WMI на компе может не быть или оно есть, но отключено.

Почему повезло... я админ там )
29 сен 10, 14:03    [9522747]     Ответить | Цитировать Сообщить модератору
 Re: Привязка к железу. WMI и другие способы.  [new]
StQFox
Member

Откуда: Хабаровск
Сообщений: 75
reware,

ню-ню
http://www.foxclub.ru/sol/solution595.php
21 фев 11, 10:10    [10265299]     Ответить | Цитировать Сообщить модератору
 Re: Привязка к железу. WMI и другие способы.  [new]
reware
Member

Откуда: Хабаровск
Сообщений: 585
StQFox
reware,

ню-ню
http://www.foxclub.ru/sol/solution595.php

И что значит сие "ню-ню" ? Что полезного нам даёт приведенная ссылка ? Привязку проги к железу надо делать на низком нефоксовом уровне. Без внешнего 16-битного приложения здесь не обойтись. Только не надо сейчас про дампы памяти и эмуляторы, это уже для экстремалов.
21 фев 11, 13:57    [10267109]     Ответить | Цитировать Сообщить модератору
 Re: Привязка к железу. WMI и другие способы.  [new]
StQFox
Member

Откуда: Хабаровск
Сообщений: 75
reware,
например, то что предложенный Вами вариант не панацея. Как видите, с софтиной проблемы тоже имеются.
В остальном согласен с psj.
22 фев 11, 09:26    [10271169]     Ответить | Цитировать Сообщить модератору
 Re: Привязка к железу. WMI и другие способы.  [new]
StQFox
Member

Откуда: Хабаровск
Сообщений: 75
reware,

С другой стороны, каждый сам для себя определяет уровень защиты продукта. Выбор защиты ПО прямо пропорционален масштабности написанной софтины :)
22 фев 11, 09:28    [10271185]     Ответить | Цитировать Сообщить модератору
 Re: Привязка к железу. WMI и другие способы.  [new]
reware
Member

Откуда: Хабаровск
Сообщений: 585
StQFox
reware,

С другой стороны, каждый сам для себя определяет уровень защиты продукта. Выбор защиты ПО прямо пропорционален масштабности написанной софтины :)

Ну, верно это. Можно ограничится программными средствами, можно электронный ключ где-то заказать.
22 фев 11, 22:38    [10276360]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить