Все про Интернет
       (N 384) 2011 - 2012
        << Архив передач >>
 Логин:  Пароль:
[регистрация]     запомнить 
 Поиск по сайту:
[Сайты зрителей] [Рейтинг] [Статьи] [Форум] [Блог] [Киберспорт] [Конкурсы] [О передаче]
 

Мини HASP ключ из любого устройства USB

http://raxp.radioliga.com

В статье речь пойдет о реализации аппаратно-программной защиты на основе любой флешки. Но следует учитывать, что предложенная методика не является серъезным конкурентом существующих аппаратных ключей таких как HASP HL (с обновляемой прошивкой) от Alladin [1], Sentinel, Rockey и др…

Вы никогда не задумывались, для чего может сгодиться обычная флешка? Многие сразу ответят: "… что за вопрос? Конечно для хранения информации…". Но, это если рассматривать с точки зрения обывателя. А если взлянуть на нее "глазами компьютера"? Очевидно, что этот процесс достаточно непрост, это и протокол обмена по USB, переходные процессы, идентификаторы и GUID (Globally Unique IDentifier)…

Немного теории...
HASP (Hardware Against Software Piracy) - это система защиты программы (ПО) и аппаратуры от нелегального использования. Основой большинства ключей HASP - обычно является заказной чип c уникальным ПО, как например в получивших сейчас широкое распространение в дверной автоматике таблетках iBUTTON от Dallas Semiconductor.

Принцип защиты состоит в том, что в процессе запуска программа опрашивает ключ, подключённый к компьютеру по I2C, LPT, PCMCIA или USB. Если ключ отвечает "правильно", то программа выполняется нормально. Иначе, она блокирует доступ к определенным функциям или просто не запускается. Таким образом, любая защищаемая программа состоит непосредственно из самой программы и механизмов проверки ключа. Задача этих механизмов - проверить наличие ключа, получить его уникальный идентификатор, прочитать или изменить содержимое встроенной памяти.

Предпосылки защиты ПО. Существующие решения
Основными критериями для использования аппаратных ключей являются:

  • цена используемых ключей должна быть неизмеримо меньше цены софта
  • длительный срок жизни программного продукта
  • индивидуальный алгоритм взаимодействия
Первый критерий обеспечивается довольно легко: с интенсивной разработкой новых видов памяти, таких как PRAM*, цены на SSD (Solid State Disk) носители уже составляют от 5 долларов. Таким образом разработчик без ущерба для бюджета может распространять продукт на самом ключе.

* PRAM (Phasechange Random Access Memory) - память с произвольным доступом, основанная на фазовых переходах вещества - халькогенида, обладающую скоростью доступа порядка 10 нс, что сравнимо с современными ОЗУ.

Второй - актуален для оригинальных и популярных продуктов, содержащих уникальные алгоритмы требующие минимальной защиты. Третий - определяется самим разработчиком. Чем меньше знание пользователя о нем, тем выше криптостойкость. Ведь знание алгоритма даёт возможность создания программы - эмулятора, полностью выполняющего все функции аппаратного устройства.

Существует множество вариаций ключей: без собственной памяти, с защищенной памятью, со встроенными REAL TIME часами, со встроенными сетевыми протоколами.

В то же время, кроме предлагаемого в статье встраиваемого решения в виде компонента, существуют такие продукты как StarForce и HASP Envelope от компании Alladin, позволяющие уже на этапе продажи добавлять защитные модули обмена с ключом в готовые программы, интегрируя их в код продукта. Но у них есть издержки, связанные с затратами на покупку самих HASP ключей, стоимость которых составляет от 25 до 50 долларов за штуку (в зависимости от модели ключа) и ПО для встраивания (от 200 долларов), при стоимости защищаемой программы от 20 долларов.

Разработка ПО и средства отладки
Как известно, метод защиты HASP основан на привязке программы к некоему или совокупности уникальных параметров ключа и даже оборудования. Так как мы будем использовать устройство USB, то априори достаточно считать серийник и ID флешки**, поскольку они не меняются при их форматировании.

** не все флеш-накопители имеют данный номер, к примеру некоторые чипы от LG

Для работы необходимо следующее:

  • среда Borland Delphi 5-7
  • утилита Dependency Walker из комплекта Visual C++ 6.0 [2]
В средах NT/XP информацию о устройствах предоставляет стандартная системная библиотека SetupApi.dll. Чем и воспользуемся... Рассмотрим экспортируемые ею функции с помощью Dependency Walker, и для удобства разработчика встроим в компонент (в дальнейшем он будет использоваться как базис механизма защиты)

...
CM_Get_Device_IDA:function(dnDevInst: DWORD;
             Buffer: PChar;
             BufferLen: DWORD;
             ulFlags: DWORD): DWORD; stdcall;
SetupDiGetClassDevsA:function(ClassGuid: PGUID;
             Enumerator: PChar;
             hwndParent: HWND;
             Flags: DWORD): HDEVINFO; stdcall;
SetupDiEnumDeviceInfo:function(DeviceInfoSet: HDEVINFO;
             MemberIndex: DWORD;
             DeviceInfoData: PSP_DEVINFO_DATA): boolean; stdcall;
SetupDiDestroyDeviceInfoList:function(DeviceInfoSet: HDEVINFO): boolean; stdcall;
CM_Get_Device_ID_Size:function(pulLen: PDWORD;
             dnDevInst: DWORD;
             ulFlags: DWORD): DWORD; stdcall;
SetupDiCallClassInstaller:function(InstallFunction: DWORD;
             DeviceInfoSet: DWORD;
             DeviceInfoData: PSP_DEVINFO_DATA): BOOL; stdcall;
SetupDiGetDeviceRegistryPropertyA:function(DeviceInfoSet: DWORD;
             DeviceInfoData: PSP_DEVINFO_DATA;
             Propertys: DWORD;
             PropertyRegDataType: PWORD;
             PropertyBuffer: PByte;
             PropertyBufferSize: DWORD;
             RequiredSize: PWORD): BOOL; stdcall;
SetupDiSetClassInstallParamsA:function(DeviceInfoSet: DWORD;
             DeviceInfoData: PSP_DEVINFO_DATA;
             ClassInstallParams: PSP_CLASSINSTALL_HEADER;
             ClassInstallParamsSize: DWORD): BOOL; stdcall; FLib: THandle;
...

для их использования - осуществим динамическое их подключение в компоненте

...
function LinkProc(ProcName: string):Pointer;
 begin
  try
   result:= GetProcAddress(FLib,PChar(ProcName));
   Win32Check(Assigned(Result))
  except end
end;
...
CM_Get_Device_IDA            := LinkProc('CM_Get_Device_IDA');
SetupDiGetClassDevsA         := LinkProc('SetupDiGetClassDevsA');
SetupDiEnumDeviceInfo        := LinkProc('SetupDiEnumDeviceInfo');
SetupDiDestroyDeviceInfoList := LinkProc('SetupDiDestroyDeviceInfoList');
CM_Get_Device_ID_Size        := LinkProc('CM_Get_Device_ID_Size');
SetupDiCallClassInstaller    := LinkProc('SetupDiCallClassInstaller');
SetupDiGetDeviceRegistryPropertyA 
:= LinkProc('SetupDiGetDeviceRegistryPropertyA');
SetupDiSetClassInstallParamsA:= LinkProc('SetupDiSetClassInstallParamsA');
...

при создании компонента инициализируем опрос USB:

...
var Info: TDevBroadcastDeviceInterface; //интерфейс-
...
Info.dbcc_size      := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
Info.dbcc_devicetype:= DBT_DEVTYP_DEVICEINTERFACE;
Info.dbcc_classguid := FClassGUID;
FNotifyHandle       
:= RegisterDeviceNotification(FWnd,@Info,DEVICE_NOTIFY_WINDOW_HANDLE);
// таймер на CountDiskEnum
ftimer:= ttimer.Create(self);
ftimer.Enabled := false;
ftimer.interval:= FPoolingInterval;
ftimer.ontimer := tmr;
ftimer.Enabled := true
...

Покажем на практике как это работает. Встроим компонент в уже готовую программу [3] и в меню осуществим активацию режима "мини HASP" (см. рис.)


после того как флешка будет вставлена, наступает событие DBT_DEVICEARRIVAL

...
//--- читаем очередь сообщений и отлавливаем момент подключения-съема USB
procedure TDUSB.WndProc(var Msg:TMessage);
begin
 with Msg do
  if (Msg=WM_DEVICECHANGE)and
     ((wParam=DBT_DEVICEARRIVAL)or(wParam=DBT_DEVICEREMOVECOMPLETE)) then
   try DoDeviceChange(wParam,PDevBroadcastDeviceInterface(lParam));
   except end
  else Result:= DefWindowProc(FWnd,Msg,wParam,lParam)
end;
...

производим считывание серийного номера, ID и GUID

...
var VID,PID: Word;
    Serial,GUID: string;
const USBNameMask='\\?\USB#Vid_%x&Pid_%x#%s#%s';
begin
 if (Device.dbcc_devicetype=DBT_DEVTYP_DEVICEINTERFACE)and Assigned(FOnChange)
  and ParseDeviceName(USBNameMask,PChar(@Device.dbcc_name), 
  [@VID,@PID,@Serial,@GUID])
 then
 case Event of
  DBT_DEVICEARRIVAL       : FOnChange(Self,VID,PID,Serial,GUID,doInsert);
  DBT_DEVICEREMOVECOMPLETE: FOnChange(Self,VID,PID,Serial,GUID,doRemove)
 end
end;
...


для того, чтобы программа знала о наличии нужного нам "девайса" в любой момент времени, а не только в момент съема, воспользуемся функцией SetupDiGetClassDevsA все той же библиотеки - setapi.dll

...
procedure TDUSB.CountDiskEnum; // вызов по таймеру ftimer-
const GUID_DEVCLASS_DISKDRIVE: TGUID = (D1: $4D36E967; D2: $E325; D3: $11CE; 
D4: ($BF, $C1, $08, $00, $2B, $E1, $03, $18));
var hDevInfoSet: HDEVINFO;
    DevInfo: SP_DEVINFO_DATA;
    i: Integer;
    s: string;
    pp: boolean;
begin
 DevInfo.cbSize:= sizeof(SP_DEVINFO_DATA);
 hDevInfoSet   := SetupDiGetClassDevsA(@GUID_DEVCLASS_DISKDRIVE, nil, 0, 2);
 i:= 0;
 list.Clear; // обнуляем stringlist
 //
 if hDevInfoSet <> INVALID_HANDLE_VALUE then begin
  while (SetupDiEnumDeviceInfo(hDevInfoSet, i, @DevInfo)) do begin
   s:= GetDevName(DevInfo.DevInst);
   //фильтрация строки вида-
   //USBSTOR\DISK&VEN_KINGSTON&PROD_DATATRAVELER_2.0&REV_PMAP\5B661B004102&0
   //USBSTOR\DISK&VEN_SAMSUNG&PROD_MIGHTY_DRIVE&REV_PMAP\07521094081F&0
   if pos('USB',s)=1 then // наполняем список подключенных-
    list.Add(sel_ser(s));
   Inc(i)
  end;
  SetupDiDestroyDeviceInfoList(hDevInfoSet)
 end;
...

введем алгоритм простейшей защиты на основе функции BlockInput из библиотеки - user32.dll

...
procedure BlockInput; external 'user32.dll';
...
 //проверка на блокировку ПК-
 pp:= false;
 if (FActive)and(fblock<>'') then begin
  for i:= 0 to list.Count-1 do
   if list[i]= fblock then begin pp:= true; break end;
  if pp then UnBlock else block
 end;
 //
 FSerChange(Self,list) // возврат события компонента-
...

Полные исходные тексты компонента и тестовый монитор доступны по [4].


Рис. - Тестовый монитор USB
Рис. - Компонент мини HASP

Все. Теперь при съеме флешки ПК будет заблокирован до тех пор, пока она не будет возращена на место. Род действий на данные события ограничен лишь фантазией разработчика. Как вариант, возможно встраивание рассмотренных выше функций в сервис и запуск его в безопасном режиме...

Итоги
Обратите внимание, что рассмотренный метод защиты USB флешкой, так и самими ключами HASP имеет уязвимое место - это аппаратный перехват вызова устройства. Имея отладчик с пошаговой трассировкой, можно выделить процедуру во время которой идет обращение к устройству и "работать" дальше с ней. Тем не менее, учитывая дешевизну, скорость разработки, а главное простоту - данный метод с успехом можно использовать для минимальной защиты как ПК, так и привязки программ.

Ссылки:


Контактная информация:

raxp@mail.zp.ua

10.07.2008


[Переход к списку статей]

 
 

[Видеоархив]

Передача создана дизайн-студией Conus Video
По вопросам размещения рекламы или информации в передаче Internet@Mania пишите imania@mail.zp.ua, или звоните
8(0612)63-80-84


Share |
 
 


Провайдеры Запорожья
zp-provider.narod.ru
providers.portall.zp.ua
Домовые сети
linet.zp.ua
setka.zp.ua
biscom.zp.ua
homenet.zp.ua
www.16x.zp.ua
www.ss.zp.ua
www.skynet.zp.ua
www.watson.zp.ua
www.link.zp.ua
www.kichkas.net
www.neuro.zp.ua
innkom.zp.ua
Каталоги Запорожья
www.otvet.zp.ua
www.portall.zp.ua
www.zaporozhye.org
www.spravka.zp.ua
Форумы
www.forumzone.zp.ua
forum.mail.zp.ua
forum.tinet.zp.ua
forum.nulled-warez.org
forum2.biscom.zp.ua
myforum.net.ua
forum.ru-board.com
forstud.org.ua
Чаты
chatzone.zp.ua
4at.zp.ua
chatinet.zp.ua
chatik.zp.ua
Компьютерные сайты
www.ixbt.com
www.techlabs.ru
www.thg.ru
www.overclockers.ru
Игровые сайты
www.games.zp.ua
www.ag.ru
www.gamemag.ru
www.uaplay.com
www.gameg.info
Журналы
www.seti.com.ua
www.cpp.com.ua
www.shpil.com
www.chip.ua
Блоги
revolver.ru
dirty.ru
photoblog.ru
www.autoblog.ru

 
    Передача создана дизайн-студией Conus Video
    По вопросам размещения рекламы или информации в передаче Internet@Mania пишите нам imania@mail.zp.ua, или звоните 8(0612)63-80-84