Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Определить ID компа, на котором запустили прогу


Автор: Alexzz 11.3.2008, 22:37
Задача такова: Нужно защититься от копирования программы на другой комп. Для этого нужно как либо получить любой уникальный код, (либо число, либо строку), который бы был уникален для конкретного компа и не менялся со временем.
Вот собственно и весь вопрос.

Автор: Craft 12.3.2008, 02:11
Это невозможно. Можно конечно делать привьязку до железа но я не уверен что это выход. Можеш генерировать мас-адрес компа просто или брать идентификаторы самого железа(проца, материнки и т.п.)  или то и другое вместе.  И у тебя выйдет уникальный код  smile 

Автор: Alexzz 12.3.2008, 10:13
Так вот в том и вопрос, как добраться хоть до одного идентификатора?

Автор: Letov 12.3.2008, 19:04
DRKB. Там есть много материала по этой теме. Вот , например:


-------------------------------
Из DRKB:
Часть информации о диске можно получить при помощи функции GetVolumeInformation. Она позволяет узнать метку, тип файловой системы, серийный номер, максимальную длину имен файлов, а также несколько параметров, связанных с регистром букв в именах файлов, сжатием информации и др. 

Для определения типа диска используется функция GetDriveType. Для определения объема диска и свободного пространства - GetDiskFreeSpaceEx. Для определения размера кластера и сектора можно использовать GetDiskFreeSpace. Здесь это не используется. 
 
Код

procedure TForm1.Button1Click(Sender: TObject);
const
Flags: array [0..5] of cardinal = (
   FS_CASE_IS_PRESERVED,
   FS_CASE_SENSITIVE,
   FS_UNICODE_STORED_ON_DISK,
   FS_PERSISTENT_ACLS,
   FS_FILE_COMPRESSION,
   FS_VOL_IS_COMPRESSED);

var
c: char;
s: string;
li: TListItem;

DriveType: integer;
bufLabel, bufFileSystem: array [0..1027] of char;
SerialNumber, MaxFileNameLength, FileSystemFlags: cardinal;
i: integer;
freeavalilable, totalspace, totalfree: int64; 

procedure AddSpace(value: int64);
const onfiltered= 1024; onfiltered= 1024 * OneKB; onfiltered= 1024 * OneMB;
var
   b, kb, mb, gb: integer;
   v: int64;
   s: string;
begin
   gb := value div OneGb;
   v := value mod OneGb;
   mb := v div OneMb;
   v := v mod OneMb;
   kb := v div OneKb;
   b := v mod OneKb;
   if gb > 0
     then s := IntToStr(gb) + ' gb'
     else s := '';
   if mb > 0 then s := s + ' ' + IntToStr(mb) + ' mb';
   if kb > 0 then s := s + ' ' + IntToStr(kb) + ' kb';
   if b > 0 then s := s + ' ' + IntToStr(b) + ' b';
   if s = '' then s := '0';
   li.SubItems.Add(s);
end; 

begin
ListView1.Items.BeginUpdate;
ListView1.Items.Clear;
 

for c := 'A' to 'Z' do begin
   s := c + ':';
   DriveType := GetDriveType(PChar(s));
   if DriveType = 1 then continue; 

   li := ListView1.Items.Add;
   li.Caption := s;
   case DriveType of
     0: li.SubItems.Add('unknown');
     DRIVE_REMOVABLE: li.SubItems.Add('removable');
     DRIVE_FIXED: li.SubItems.Add('fixed');
     DRIVE_REMOTE: li.SubItems.Add('remote');
     DRIVE_CDROM: li.SubItems.Add('cdrom');
     DRIVE_RAMDISK: li.SubItems.Add('ramdisk');
   end;
   if not GetVolumeInformation(PChar(s), bufLabel, sizeof(bufLabel),
     addr(SerialNumber), MaxFileNameLength, FileSystemFlags,
     bufFileSystem, sizeof(bufFileSystem)) then continue;
   li.SubItems.Add(bufLabel);
   li.SubItems.Add(bufFileSystem);
   li.SubItems.Add(IntToStr(SerialNumber));
   li.SubItems.Add(IntToStr(MaxFileNameLength));

   for i := low(flags) to high(flags) do
     if (FileSystemFlags and flags[i]) <> 0
       then li.SubItems.Add('yes')
       else li.SubItems.Add('no');

 GetDiskFreeSpaceEx(PChar(s), freeavalilable, totalspace, @totalfree);
   AddSpace(freeavalilable);
   AddSpace(totalspace);
   AddSpace(totalfree);
end;
ListView1.Items.EndUpdate;
end;

procedure TForm1.FormCreate(Sender: TObject);
const
FlagStrs: array [0..5] of string = (
   'Case preserved',
   'Case sensitive',
   'Unicode',
   'Preserve ACLs',
   'File Compression',
   'Volume Compression');
 

procedure AddColumn(caption: string);
var
   lc: TListColumn;
begin
   lc := ListView1.Columns.Add;
   lc.Caption := caption;
   lc.Width := ColumnHeaderWidth;
end;


var
i: integer;
begin
ListView1.ViewStyle := vsReport;
AddColumn('root');
AddColumn('type');
AddColumn('label');
AddColumn('file system');
AddColumn('Serial Number');
AddColumn('MaxFileNameLen');
for i := low(FlagStrs) to high(FlagStrs) do
   AddColumn(FlagStrs[i]);
AddColumn('FreeAvalilable');
AddColumn('TotalSpace');
AddColumn('TotalFree');
Button1.Click;
end;


©Drkb::01383

--------------------

В DRKB много хороших примеров.

Автор: Alexzz 14.3.2008, 21:10
Пока искал информацию по GetVolumeInformation нашёл вот такую темку в инете: http://www.cracklab.ru/f/index.php?action=vthread&forum=2&topic=7095. Вот теперь в раздумьях, то ли это что мне нужно...

Фишка в том, что этот серийник не должен поменяться со временем, иначе мне поновой придётся выдавать человеку регистрационный код. А потом я не смогу контролировать, когда у него действительно поменялся серийник а когда он просто решил поделиться програмкой с кем-то ещё.

Автор: lukas 15.3.2008, 06:45
слышал что у сетевых карт есть свои уникальный серийный номер, а сетевая плата меняется редко (но ее может еще и не быть, а чем черт не шутит), а вот как его получить проблема другая...

Автор: mmvds 15.3.2008, 14:39
Цитата(lukas @  15.3.2008,  06:45 Найти цитируемый пост)
слышал что у сетевых карт есть свои уникальный серийный номер, а сетевая плата меняется редко (но ее может еще и не быть, а чем черт не шутит), а вот как его получить проблема другая... 

угу, Mac адрес, прошит заводской, но и его можно менять стандартной утилитой arp, правда на 30 секунд, потом возвращается изначальный, но для тех кто умеет писать простейшие скрипты это не проблема smile

Автор: lukas 15.3.2008, 17:06
думаю это не критическое обстоятельство... придется постоянно запускать скрипты, да и к томуже крекеру нужно будет понять логику программы... что еще усложняет процесс взлома, можно еще к программе добавить цифровую подпись, что то вроде хеша самого текста програмного файла *.exe... 

Автор: Alexzz 31.1.2010, 21:38
Может кто всё-же владеет информацией, как получить какой-нибудь идентификатор мамки или проца?

Автор: profesiachuvak 1.2.2010, 00:31
Цитата(Alexzz @  11.3.2008,  22:37 Найти цитируемый пост)
Для этого нужно как либо получить любой уникальный код, (либо число, либо строку), который бы был уникален для конкретного компа и не менялся со временем.


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

На счёт получения мак адресов в DRKB куча примеров. http://drkb.ru

Автор: Snowy 1.2.2010, 11:29
Мак адрес уникален только в теории.
Реально его легко поменять без ущерба.
Кроме того мак может быть не один.
А вот к ID проца, пожалуй можно привязаться.
http://www.delphilab.ru/content/view/303/1/

Автор: ~FoX~ 1.2.2010, 12:18
Цитата(lukas @  15.3.2008,  18:06 Найти цитируемый пост)
думаю это не критическое обстоятельство... придется постоянно запускать скрипты

Мак меняется стандартными средствами управления винды, без ущерба и на всегда  smile 
Цитата(Snowy @  1.2.2010,  12:29 Найти цитируемый пост)
А вот к ID проца, пожалуй можно привязаться.

ИМХО, проц легко и часто меняется...по крайней мере я меняю раз в пол года, а то и чаще... А если прога для оффисов, то там, проци летят вообще как расходники...
Опят таки ИМХО, привязывать программу надо к тому на чем она лежит - т.е. к винту, его ид не изменить... Даже если человек захочет поставить ось заново, то прогу переригистрить не придется...

Автор: Snowy 1.2.2010, 12:24
Вообще можно привязываться к материнке. 
Но я не уверен, что серийник биоса неизменен.
А так можно оговаривать, что лицензия на процессор.
Уж не знаю, как у вас буржуинов, но я не вижу смысла менять процессор каждые полгода - бред какой-то.
Я меняю раз в 4-5 лет вместе с материнкой.
А, если у вас на работе процы летят, как расходники, то нужно увольнять или пользователей, или тех, кто такое фуфло закупил.

Автор: profesiachuvak 1.2.2010, 17:19
Цитата(~FoX~ @  1.2.2010,  12:18 Найти цитируемый пост)
Мак меняется стандартными средствами управления винды, без ущерба и на всегда  


Цитата(Snowy @  1.2.2010,  11:29 Найти цитируемый пост)
Реально его легко поменять без ущерба.


А смысл? Неужели Вы так часто меняете мак адреса?  smile 

Автор: former 1.2.2010, 18:42
Есть утилиты, которые позволяют семенить mac-адрес. Поэтому mac - не выход.
По-поводу серийного номера HDD (заводского). На рынке железа полно винтов, у которых вместо серийного номера иероглифы. Так что тоже не выход.
Лучше уж действительно к процу с материнкой. В любом случае придется криптовать участки бинарника, где все это выполняется.

Автор: ~FoX~ 1.2.2010, 20:57
Цитата(profesiachuvak @  1.2.2010,  18:19 Найти цитируемый пост)
А смысл? Неужели Вы так часто меняете мак адреса?  

Часто, ибо у меня модем и две сетевухи, иногда необходимо выпускать комп в инет через сетевухи, а пров проверяет маки, мне проще сменить адрес, чем звонить прову, говорить что бы они сменили на своей стороне, потом обратно...

Автор: profesiachuvak 2.2.2010, 22:58
Цитата(~FoX~ @  1.2.2010,  20:57 Найти цитируемый пост)
Часто, ибо у меня модем и две сетевухи


~FoX~, Я имею ввиду мак адрес проца или материнки, с какой целью их меняют? Сомнительно,что это происходит часто. (С сетевой конечно, тут спору нет, но это так скажем "вторичное", необязательное оборудование).

Неужели если топикстартеру привязаться к адресу проца, то ему придётся обновлять его программу каждый месяц? smile 

Автор: Snowy 3.2.2010, 11:59
MAC адрес бывает только у сетевух.
У проца и материнки есть серийный номер или ID

Автор: Alexzz 11.2.2010, 19:18
Кстати на счёт ID проца. Пробовал через ассемблер командой CPUID вычитывать 3й ряд данных, который судя по всему и должен являться серийником, но увы, там всегда нули. Пробовал на нескольки машинах. В инете нагуглил описание, что код сей простому смертному не увидеть, но как-то хитро можно только из-под системы открыть. Вот и вопрос - как разблокировать чтение серийного номера?

Автор: Akella 11.2.2010, 23:23
Цитата(Alexzz @  11.2.2010,  19:18 Найти цитируемый пост)
В инете нагуглил описание, что код сей простому смертному не увидеть, 


ведь программы как-то читают и не только информацию о проце, взять Эверест, так она столько инфы выдаёт о железе %)

Автор: bems 11.2.2010, 23:59
Akella, у эвереста вроде драйвер, нет?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)