Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Защита от пиратства [D5, WinXP]


Страницы:   1 2 3

Александр1 ©   (2005-01-21 21:17:00) 

Здравствуйте уважаемые мастера. У меня такая проблема. Есть программа, не важно какая. Надо сделать так, чтобы она работала только на конкретном компе (защита от пиратства). Я понимаю, что, наверное, надо сделать что-то типа: считать какую-нибуть уникальную информацию о каком либо оборудованию компьютера и записать в программу. А затем проверять если не тот комп, то не работает программа. Посоветуйте пожалуйста, какую именно информацию лучше всего считывать. И как может у кого примеры, какие есть. Может кто уже делал такое?
Заранее спасибо за помощь!


Беспечный_Ангел   (2005-01-22 12:33:00) [41]

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Получение серийного номера BIOS

Зависимости:
Автор:       Gua, fbsdd@ukr.net, ICQ:141585495, Simferopol
Copyright:
Дата:        03 мая 2002 г.
***************************************************** }

function GetBiosNumber: string;
begin
 result := string(pchar(ptr($FEC71)));
end;

(с) DelphiWorld.narod.ru

> MacroDenS ©   (21.01.05 21:41) [3]

А на аппаратных ключах надежней? ИМХО, еще более ненадежно.


Беспечный_Ангел   (2005-01-22 12:32:00) [42]


> Александр1   (22.01.05 06:57) [10]

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Поличение серийного номера IDE диска.

Функция получает серийный номер первого физического диска IDE (не серийный номер тома!).
Используется S.M.A.R.T. API, а под Windows NT/2K/XP запрос производится не напрямую к диску,
а через miniport драйвер контроллера, что позволяет читать серийный номер не имея прав администратора.
Функция может не работать, если первый контролер в системе не ATA или если первое устройство
не является винчестером, который поддерживает SMART (современные винчестеры поддерживают).
Если Вы хотите получить другие параметры диска/других дисков, то смотрите пример IdeInfo2 с моего сайта.
На Windows 9x требует наличия драйвера smartvsd.vxd (должен быть в стандартной поставке),
просто скопируйте его в \windows\system\iosubsys и перезагрузите компьютер.

Зависимости: Windows, SysUtils
Автор:       Alex Konshin, akonshin@earthlink.net, Boston, USA
Copyright:   http://home.earthlink.net/~akonshin/index.htm
Дата:        30 декабря 2002 г.
***************************************************** }

function GetIdeDiskSerialNumber: string;
type
 TSrbIoControl = packed record
   HeaderLength: ULONG;
   Signature: array[0..7] of Char;
   Timeout: ULONG;
   ControlCode: ULONG;
   ReturnCode: ULONG;
   Length: ULONG;
 end;
 SRB_IO_CONTROL = TSrbIoControl;
 PSrbIoControl = ^TSrbIoControl;

 TIDERegs = packed record
   bFeaturesReg: Byte; // Used for specifying SMART "commands".
   bSectorCountReg: Byte; // IDE sector count register
   bSectorNumberReg: Byte; // IDE sector number register
   bCylLowReg: Byte; // IDE low order cylinder value
   bCylHighReg: Byte; // IDE high order cylinder value
   bDriveHeadReg: Byte; // IDE drive/head register
   bCommandReg: Byte; // Actual IDE command.
   bReserved: Byte; // reserved for future use. Must be zero.
 end;
 IDEREGS = TIDERegs;
 PIDERegs = ^TIDERegs;

 TSendCmdInParams = packed record
   cBufferSize: DWORD; // Buffer size in bytes
   irDriveRegs: TIDERegs; // Structure with drive register values.
   bDriveNumber: Byte; // Physical drive number to send command to (0,1,2,3).
   bReserved: array[0..2] of Byte; // Reserved for future expansion.
   dwReserved: array[0..3] of DWORD; // For future use.
   bBuffer: array[0..0] of Byte; // Input buffer.
 end;
 SENDCMDINPARAMS = TSendCmdInParams;
 PSendCmdInParams = ^TSendCmdInParams;

 TIdSector = packed record
   wGenConfig: Word;
   wNumCyls: Word;
   wReserved: Word;
   wNumHeads: Word;
   wBytesPerTrack: Word;
   wBytesPerSector: Word;
   wSectorsPerTrack: Word;
   wVendorUnique: array[0..2] of Word;
   sSerialNumber: array[0..19] of Char;
   wBufferType: Word;
   wBufferSize: Word;
   wECCSize: Word;
   sFirmwareRev: array[0..7] of Char;
   sModelNumber: array[0..39] of Char;
   wMoreVendorUnique: Word;
   wDoubleWordIO: Word;
   wCapabilities: Word;
   wReserved1: Word;
   wPIOTiming: Word;
   wDMATiming: Word;
   wBS: Word;
   wNumCurrentCyls: Word;
   wNumCurrentHeads: Word;
   wNumCurrentSectorsPerTrack: Word;
   ulCurrentSectorCapacity: ULONG;
   wMultSectorStuff: Word;
   ulTotalAddressableSectors: ULONG;
   wSingleWordDMA: Word;
   wMultiWordDMA: Word;
   bReserved: array[0..127] of Byte;
 end;
 PIdSector = ^TIdSector;

const
 IDE_ID_FUNCTION = $EC;
 IDENTIFY_BUFFER_SIZE = 512;
 DFP_RECEIVE_DRIVE_DATA = $0007C088;
 IOCTL_SCSI_MINIPORT = $0004D008;
 IOCTL_SCSI_MINIPORT_IDENTIFY = $001B0501;
 DataSize = sizeof(TSendCmdInParams) - 1 + IDENTIFY_BUFFER_SIZE;
 BufferSize = SizeOf(SRB_IO_CONTROL) + DataSize;
 W9xBufferSize = IDENTIFY_BUFFER_SIZE + 16;
var
 hDevice: THandle;
 cbBytesReturned: DWORD;
 pInData: PSendCmdInParams;
 pOutData: Pointer; // PSendCmdInParams;
 Buffer: array[0..BufferSize - 1] of Byte;
 srbControl: TSrbIoControl absolute Buffer;

 procedure ChangeByteOrder(var Data; Size: Integer);
 var
   ptr: PChar;
   i: Integer;
   c: Char;
 begin
   ptr := @Data;
   for i := 0 to (Size shr 1) - 1 do
   begin
     c := ptr^;
     ptr^ := (ptr + 1)^;
     (ptr + 1)^ := c;
     Inc(ptr, 2);
   end;
 end;

begin
 Result := '';
 FillChar(Buffer, BufferSize, #0);
 if Win32Platform = VER_PLATFORM_WIN32_NT then
 begin // Windows NT, Windows 2000
   // Get SCSI port handle
   hDevice := CreateFile('\\.\Scsi0:', GENERIC_READ or GENERIC_WRITE,
     FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
   if hDevice = INVALID_HANDLE_VALUE then
     Exit;
   try
     srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL);
     System.Move('SCSIDISK', srbControl.Signature, 8);
     srbControl.Timeout := 2;
     srbControl.Length := DataSize;
     srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY;
     pInData := PSendCmdInParams(PChar(@Buffer) + SizeOf(SRB_IO_CONTROL));
     pOutData := pInData;
     with pInData^ do
     begin
       cBufferSize := IDENTIFY_BUFFER_SIZE;
       bDriveNumber := 0;
       with irDriveRegs do
       begin
         bFeaturesReg := 0;
         bSectorCountReg := 1;
         bSectorNumberReg := 1;
         bCylLowReg := 0;
         bCylHighReg := 0;
         bDriveHeadReg := $A0;
         bCommandReg := IDE_ID_FUNCTION;
       end;
     end;
     if not DeviceIoControl(hDevice, IOCTL_SCSI_MINIPORT, @Buffer,
       BufferSize, @Buffer, BufferSize, cbBytesReturned, nil) then
       Exit;
   finally
     CloseHandle(hDevice);
   end;
 end
 else
 begin // Windows 95 OSR2, Windows 98
   hDevice := CreateFile('\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0);
   if hDevice = INVALID_HANDLE_VALUE then
     Exit;
   try
     pInData := PSendCmdInParams(@Buffer);
     pOutData := PChar(@pInData^.bBuffer);
     with pInData^ do
     begin
       cBufferSize := IDENTIFY_BUFFER_SIZE;
       bDriveNumber := 0;
       with irDriveRegs do
       begin
         bFeaturesReg := 0;
         bSectorCountReg := 1;
         bSectorNumberReg := 1;
         bCylLowReg := 0;
         bCylHighReg := 0;
         bDriveHeadReg := $A0;
         bCommandReg := IDE_ID_FUNCTION;
       end;
     end;
     if not DeviceIoControl(hDevice, DFP_RECEIVE_DRIVE_DATA, pInData,
       SizeOf(TSendCmdInParams) - 1, pOutData, W9xBufferSize,
       cbBytesReturned, nil) then
       Exit;
   finally
     CloseHandle(hDevice);
   end;
 end;
 with PIdSector(PChar(pOutData) + 16)^ do
 begin
   ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));
   SetString(Result, sSerialNumber, SizeOf(sSerialNumber));
 end;
end;
Пример использования:

var
 s: string;
 rc: DWORD;
begin
 s := GetIdeDiskSerialNumber;
 if s = '' then
 begin
   rc := GetLastError;
   if rc = 0 then
     WriteLn('IDE drive is not support SMART feature')
   else
     WriteLn(SysErrorMessage(rc));
 end
 else
   WriteLn('Disk serial number: ''', s, '''');
end.


Knight   (2005-01-22 12:23:00) [43]

имхо, никто со взломом твоей проги сильно заморачиваться не будет... поэтому можешь привязаться хоть к имени пользователя, компа или маку сетевой карты... %)


Knight   (2005-01-22 11:49:00) [44]


> Гарри Поттер ©   (22.01.05 11:31) [16]
> системы переустановят и твою программу.

За отдельную плату... конечно же %)


Гарри Поттер   (2005-01-22 11:31:00) [45]

Александр1   (22.01.05 6:57) [10]
Только он код какой-то выдаёт не постоянный. Он иногда меняется. Я точно знаю, что он меняется при форматировании диска. Но иногда и так. Не надёжно это всё.


А твоя программа после форматирования на диске сохранится??
Ничего страшного не случится если юзеры при переустановке системы переустановят и твою программу.


Knight   (2005-01-22 11:22:00) [46]


> uny ©   (22.01.05 10:44) [14]
> патча не видел, но работает у нас без ключей

Если спрошу... как? Точно убьют... %)
Хотя похоже человек, который искал и не нашёл, плохо искал... я щас из интереса озадачился... инфы море =)


uny   (2005-01-22 10:44:00) [47]

[13]
патча не видел, но работает у нас без ключей


Knight   (2005-01-22 10:13:00) [48]


> MacroDenS ©   (21.01.05 21:41) [3]
> к "железу" - это очень не хорошо, да и защита такая не совсем
> надежная, можно же проследить что откуда читается, куда
> пишется и что с чем сравнивается. А дальше пишется патч.

Почему тогда нигде нет патчей к Консультанту Плюс?


KilkennyCat   (2005-01-22 09:29:00) [49]


> Я занаю про эти ключи. Это конечно всё хорошо, но они денег
> стоят. А мои программы дешёвые. Я считал не выгодно получается.


ого... то есть, отдать за ключ 600 рублей, получив 3000 - это не выгодно? Выгодно получить фиг?

Жадность погубит.


Александр1   (2005-01-22 06:57:00) [50]

Кто-нибудь знает, как определить, например дату создания оперативной памяти, процессора или Bios?


Александр1   (2005-01-22 06:57:00) [51]

Я вот ту испытывал один метод. Проверять серийный номер жёсткого диска или флешки. Использую следующий код.

function GetHardDiskSerial(const DriveLetter: Char): string;
var
 NotUsed:     DWORD;
 VolumeFlags: DWORD;
 VolumeInfo:  array[0..MAX_PATH] of Char;
 VolumeSerialNumber: DWORD;
begin
 GetVolumeInformation(PChar(DriveLetter + ':\'),
   nil, SizeOf(VolumeInfo), @VolumeSerialNumber, NotUsed,
   VolumeFlags, nil, 0);
 {Result := Format('Label = %s   VolSer = %8.8X',
   [VolumeInfo, VolumeSerialNumber])}
  Result := Format('%s%8.8X',
   [VolumeInfo, VolumeSerialNumber])
end;
………..
h:=GetHardDiskSerial('D');

Только он код какой-то выдаёт не постоянный. Он иногда меняется. Я точно знаю, что он меняется при форматировании диска. Но иногда и так. Не надёжно это всё.


Александр1   (2005-01-22 06:04:00) [52]


> KilkennyCat ©   (21.01.05 21:45) [4]
> www.aladdin.ru

Я занаю про эти ключи. Это конечно всё хорошо, но они денег стоят. А мои программы дешёвые. Я считал не выгодно получается.


Александр1   (2005-01-22 06:02:00) [53]


> что привязываться к "железу" - это очень не хорошо,

А что тогда посоветуешь?


Александр1   (2005-01-22 06:01:00) [54]


> Vasya.ru ©   (21.01.05 23:53) [5]
> Есть программа, не важно какая
> если программа не важно какая, то кто её воровать то будет?

Программа маленькая, но удаленькая. Сделана она для университета, для родной кафедры. Но если её не защитить, то её растащут студенты бог знает куда. Просто так уже было. Я тоже написал программу, принёс на кафедру. А уже через месяц она оказалась в 3-х организациях города. Которые могли бы и купить данную программу, а им она досталась на халяву. Из за того, что студенты ходят на практику и таскают всё куда попало. С 3- огранизаций я бы мог получить как минимум 9000 руб, а получил фиг. Если кому интересно, то программа по расчёту ТЕПЛОПОТЕРЬ здания.


Johnmen   (2005-01-22 02:17:00) [55]

"Hello, world" защищенный от пиратства ? Прикольно !


Vasya.ru   (2005-01-21 23:53:00) [56]

Есть программа, не важно какая
если программа не важно какая, то кто её воровать то будет?


KilkennyCat   (2005-01-21 21:45:00) [57]

www.aladdin.ru


MacroDenS   (2005-01-21 21:41:00) [58]

Подобная тема здесь недавно обсуждалась...
Так вот на ее основе хочу тебе сразу заметить, что привязываться к "железу" - это очень не хорошо, да и защита такая не совсем надежная, можно же проследить что откуда читается, куда пишется и что с чем сравнивается. А дальше пишется патч.

Если тебе нужна именно защита "на дурака", то можно и к железу цепляться, можно так же спрятать куда-нибудь поглубже файло с инфой (не факт что не удалят).


Anatoly Podgoretsky   (2005-01-21 21:26:00) [59]

Раба своего хочешь поиметь?


Gero   (2005-01-21 21:19:00) [60]


> Надо сделать так, чтобы она работала только на конкретном
> компе

Что ты подразумеваешь под понятием «комп»?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо