Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];




Вниз

Вопрос о привязке проги к компу 


NY152   (2002-01-08 14:19) [0]

Привет всем. Что-то не могу найти ответ на свою проблему.
Нужно "привязать" прогу к компьютеру, так чтобы на других она не запускалась. Как лучше сделать ? И компьютер и прога имеется в распоряжении. =)
Тут был такой вопрос но конкретного ответа так и не было, стихами отвечали =)... Всё таки к чему лучше (и проще) всего привязать - к номеру видеокарты, винта или ещё к чему-то ?
И как это номер получить тогда ?
Спасибо за ответ =)



XeN   (2002-01-08 14:30) [1]

//capture HDD serial.

var
SerialNum:Pdword;
a,b:Dword;
buffer:array [0..255] of char;

begin
new(SerialNum);
if getVolumeInformation("c:\",buffer,sizeof(buffer),SerialNum,a,b,nil,0) then
Label1.Caption:=IntToStr(SerialNum^); //вывод информации
Dispose(SerialNum);
end;

вроде так, попробуй.



NY152   (2002-01-08 14:36) [2]

Спасибо, попробую, но вроде я слышал что это номер не HDD а тома и что он меняется после форматирования ?
Хотелось бы чего-нибудь более постоянного =)))



PVOzerski   (2002-01-08 14:40) [3]

Есть одна идея, не проверял, но может оказаться не худшей. Суть: Пусть наш проект состоит
из exe и нескольких dll. Пусть эти dll имеют похожие длинные имена, совпадающие по первым
8 символам. Например:
myhelperdll1.dll, myhelperdll2.dll и т.д. При этом им будут сгенерены автоматически короткие имена
наподобие MYHELP~1.DLL, причем число после тильды будет зависеть от порядка создания/
копирования файла (а кстати, ведь если мы сначала перед установкой dll создадим
100 файлов-"заглушек" с аналогичными именами, а после установки всех dll эти заглушки сотрем,
то нумерация начнется не с ~1, а со ~101). По крайней мере в NT4 при копировании короткие
имена создаются каждый раз заново. Теперь предположим, что наш .exe вызывает .dll"и по
КОРОТКИМ именам. Тогда важными оказываются именно эти числа после тильды, и если копировать
dll"и не в должном порядке, то программа работать не будет.



NY152   (2002-01-08 14:45) [4]

А это хорошая идея (во всяком случае интересная) =)))
Но у меня всё проще - есть компьютер, есть программа, всё это вместе отдаётся заказчику (со всем уже установленным) и вот надо чтобы этот заказчик другому бы exe модуль не передал... На самом деле видимо это сложная проблема об определении какого-нибудь серийного номера железа, потому что нигде нет этого в инете... =((



Builder   (2002-01-08 15:09) [5]

А можно сходить на www.torry.ru, набрать себе компоненты, которые определят и номер винта и карточки и т.д. и использовать это все вместе + хитро прописаться в реестр - например какой-нить хеш от того же номера винта.

P.S. Если привязываться к чему-то одному, а его заменят, то как тогда - продумай - можно ли позволять проге и дальше работать или нет?



NY152   (2002-01-08 16:15) [6]

Не хотелось бы использовать компонент, может кто даст процедурку =)))



Zerul   (2002-01-08 16:28) [7]

я предлагаю привязать к номеру процесора!!
если номер проца закрыт для чтения или не тот - прога не запускаеться!!
НО номер сверки можно подменить с помощью любого HEX-редактора:-((
как идея?



Snake   (2002-01-08 16:52) [8]

Нескромный вопрос... А как узнать номер процессора? :)



TonnyS   (2002-01-09 11:39) [9]

Вообще 1й вопрос при организации подобных защит - насколько круто нужно защищать, т.е. сопоставить стоимость программы и стоимость защиты. Для некоторых прог достаточно защиты по дате биоса, другие продают с винтом с аппаратной привязкой к нему для других делают PCI-ключи и продают вместе с компьютерами.
По-моему для большинства программ (и клиентов соответственно - не каждый - хакер, и не у каждого есть знакомый хакер) достаточно идеи, предложенной Builder © (08.01.02 15:09): узнать кучу всевозможных характеристик, а в случае замены чего-то решать - насколько важно это (например, переформатили винт - не оч важно, заменили материнку/биос - стоит подумать)



13-ый   (2002-01-09 22:12) [10]

а у меня на сайте в разделе faq (железо вроде) есть примерчики, как определить номер винта (не тома, а самого винта!!!), правда есть одно но....... винт должен быть достаточно современным и поддреживать технологию - smart (современные вроде все поддерживают) ! есть пример для ide и для SCSI винта.

а ну да... адрес чуть не забыл :))))

http://www.chertenok.km.ru/



MARcoDEN   (2002-01-10 08:59) [11]

Вот еще один вариант - определять дату BIOS:

type Ts=array[0..7] of char;
var s:TS;
p:^TS;
begin
s:="";
p:=@s;
asm
push esi
push edi
push ecx

Или тактовую частоту проца:

function GetCPUSpeed: Double;
const
DelayTime = 500; // measure time in ms
var
TimerHi, TimerLo: DWORD;
PriorityClass, Priority: Integer;
begin
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
Sleep(10);
asm
dw 310Fh // rdtsc
mov TimerLo, eax
mov TimerHi, edx
end;
Sleep(DelayTime);
asm
dw 310Fh // rdtsc
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
Result := TimerLo / (1000.0 * DelayTime);
end;

begin
LabelCPUSpeed.Caption := Format("CPU speed: %f MHz", [GetCPUSpeed]);
end;
mov esi,$0ffff5
mov edi,p
mov cx,8
@@1:mov al,[esi]
mov [edi],al
inc edi
inc esi
loop @@1
pop ecx
pop edi
pop esi
end;
Form1.Label1.Caption:=s;



Павел2   (2002-01-10 11:03) [12]

Ходи на "Королевство Делфи", там есть серия статей "Антикрекинговые мучения", которая снимает большинство вопросов



F o x   (2002-01-10 11:58) [13]

Нестоит пробовать через номер Винта или Чмоса. Он может не определиться. Советую сделать защиту по номеру виндов, имени компа и еще чего-нибудь. Потом зашифровать и в реестр или *.key. А там уже свои нюансы.
S:=0;
For t:=1 to Length(V1) do
H := H+IntToHex(Ord(V1[t]),2);
for t:=1 to Length(H) do
S := S+Round(Ord(H[t]));
Result := FloatToStr(S);
For t:=1 to Length(V2) do
H := H+IntToHex(Ord(V2[t]),2);
for t:=1 to Length(H) do
S := S+Round(Ord(H[t]));
S := S*Length(H)+Length(H);
Result := Result+"-"+FloatToStr(S);
Я думаю что разберёшься.
Это кусок из моей проги.
Тут должно браться номер виндов и имя компа и преобразует ввиде
цифр, например: 341-161044.
Можно добавить привязку к чему угодно.
На счёт других примеров, то их можно подкорректировать SoftIce"ом или Hex-редактором. Может это способ тоже не достаточно эффективный, но у меня его ещё никто не обманывал:)
Пиши если что



Red Alert   (2002-01-10 15:21) [14]

Сам задавался такой проблемой - как защитить программу от несанкционированного копирования. И однажды пришел к тому:
я снял (а дело было под Досом) серийный номер винта. Здесь кто-то
сказал что не все винты имеют серийные номера, но за мою 12 летнюю практику что-то таких не припомню. Недавно пришлось
опять решится на подобные эксперименты, но под виндой.
Оказалось что не все так просто т.к. для работы с портами ( а получить номер можно только так) требуется несколько другая организация работы с ними. Я нашел на www.torry.ru компонент
Smallport, позволяющий работать с портами на низком уровне.
Проинсталил его и написал небольшой пример, надеюсь он вам поможет. Но суть защиты я выстраиваю сл. образом (он не описан в примере):
RetCode[1]:= SerialNum[1] xor 1;
RetCode[1]:= SerialNum[2] xor 2;
RetCode[1]:= SerialNum[3] xor 3;
RetCode[1]:= SerialNum[4] xor 4;
RetCode[1]:= SerialNum[5] xor 5;
(1..5 - просто значения)
(SerialNum[X] - компоненты серийного номера)
(RetCode[x] - компоненты регистационного запроса)
Программа выдает на запрос не серийный номер, а несколько
модифицированный запрос.
AnswCode[1] := RetCode[1] xor 6;
...
AnswCode[5] := RetCode[5] xor 10;

Это код ответный. То есть если он прописан у юзера в ini-файле,
программа сделав расчеты и сравнив
AnswCode[1] = SerialNum[1] xor 1 xor 6.
...
AnswCode[5] = SerialNum[1] xor 5 xor 10.
проверяет регистрационный номер AnswCode на его ликвидность.
Если все ок, работает далее, иначе выдает
RetCode, который доставляется юзером вам и вы расчитываете ему
(с помощью программы, ес-но) AnswCode. Юзер прет домой, прописывает его в iniфайл и работает.
Вот и все..
А на счет того что есть винты которые не дают серийный номер, на такой случай сделайте какой-нить уникальный номер, для него.

Далее собственно пример как получить серийный номер с винта,
не забывайте про требуемый компонент (внимательно читайте, про используемые VXD и Sys драйвера, их надо при инсталяции программы кинуть в windows\system)








Red Alert   (2002-01-10 15:22) [15]

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, SmallPort;

type
TForm1 = class(TForm)
Button1: TButton;
SmallPort1: TSmallPort;
Label1: TLabel;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

PIDEInfo = ^TIDEInfo;
TIDEInfo = Record
Config, {General configuration bit-significant information}
Cyls, {Number of logical cylinders}
Unused, {Reserved}
Heads, {Number of logical heads}
BPT, {Number of unformatted bytes per track}
BPS, {Number of unformatted bytes per sector}
SPT : Word; {Number of logical sectors per logical track}
Vendor : Array [0..2] of Word; {Vendor specific}
Serial : Array [1..20] of Char; {Serial number. 20 ASCii characters, 0000H=not specified}
BufType, {Buffer type}
BufSize, {Buffer size in 512 byte increments. 0000H=not specified}
ECC : Word; {# of ECC bytes avail on read/write long cmds. 0000H=not spec.}
Revision : Array [1..8] of Char; {Firmware revision. 8 ASCii characters. 0000H=not specified}
Model : Array [1..40] of Char; {Model number. 40 ASCii characters. 0000H=not specified}
Features : Word; {Features information}
DwordIO : Word; {0001H=Can perform doubleword I/O}
Capabil : Word; {Capabilities}
Reserved : Word; {Reserved}
PIO : Word; {PIO data transfer information}
DMA : Word; {DMA data transfer information}
ExtValid : Word; {Extended data validation information}
CurrCyls, {Number of current logical cylinders}
CurrHeads, {Number of current logical heads}
CurrSect : Word; {Number of current logical sectors per track}
Capacity : LongInt; {Current capacity in sectors}
BlockMode : Word; {Multiple sectors transfer information}
LBACapacity : LongInt; {Total number of user addressable sectors. LBA mode only}
SingleDMA : Word; {Single word DMA transfer information}
MultiDMA : Word; {Multiword DMA transfer information}
AdvancedPIO : Word; {Advanced PIO Transfer information}
MinDMACycle : Word; {Minimum Multiword DMA Transfer Cycle Time Per Word in nsecs}
RecDMACycle : Word; {Manufacturer Recommended Multiword DMA Transfer Cycle Time}
MinPIOCycle : Word; {Minimum PIO Transfer Cycle Time Without Flow Control in nsecs}
MinIORDYPIOCycle : Word; {Minimum PIO Transfer Cycle Time With IORDY Flow Control in nsecs}
Filler : Array [1..374] of Byte;
end;

var
Form1: TForm1;
IDEInfo : TIDEInfo;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
info : array[0..255] of word; i : integer;

begin
SmallPort1.Opened:=True;
SmallPort1.port[$3f6]:= 2;
SmallPort1.port[$1f6]:= $A0+ (0 shl 4);
SmallPort1.port[$1f7]:= $Ec;
While(SmallPort1.Port[$1f7] and $80 <>0) do;
for i:= 0 to 255 do
Info[i]:=swap(SmallPort1.PortW[$01f0]);

Move(Info, IdeInfo^, SizeOf(IdeInfo));
label1.Caption:=label1.Caption+IDEInfo^.Serial[i];
Memo1.Text:=StrPas(@Info);
SmallPort1.Opened:=False;
label1.Caption:=label1.Caption;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SmallPort1.Opened:=False;
end;

end.



NY152   (2002-01-10 15:58) [16]

Спасибо всем большое ! Кое-что есть, кое-что не работает (у меня Win XP и процедуры по определению номера биоса отказываются работать наотрез)... Состряпал маленькую защиту пока на частоту процессора =))))



Boris   (2002-01-10 17:13) [17]

Я занимался этим вопросом.
Все продвинутые Софтяры строят защиту на MAC адресах
сетевой карточки. Как считать его я правда не знаю,
но поискать в сети можно. Частота проца конечно же не
хилая вещь. Но процы меняются аж по паре раз за год.
А сеть как была 10/100 mbit так и останется на ближайшее
время. Карты стоят копейки, а MAC адресса у каждой уникален.
и замене не подлежит (хотя есть возможности) но в этом случае
если клиент купил ее себе на фирму, то в своей сетке адреса не поменяешь.



abp   (2002-01-10 17:51) [18]

Ответ есть в FAQ на сайте www.chertenok.km.ru



sergling   (2002-01-10 19:55) [19]

Сталкивался с такими прогами, в основном это криптовалки, по всей видимости они привязываются к контрольной суммк CMOSа. При этом понятное дело, если пользователь добавляет памяти, то прога сразу же отказывает в работе. Были случаи, когда при подключении принтера такая бяка происходила. Удачи!




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.78 MB
Время: 0.021 c
4-90434           a-leksey              2001-11-26 11:39  2002.01.28  
Нужно на время и конкретно отключить клавиатуру и мышь


6-90335           Layet                 2001-11-07 08:13  2002.01.28  
TClientSocket


1-90287           NY152                 2002-01-08 14:19  2002.01.28  
Вопрос о привязке проги к компу


6-90337           erik                  2001-11-07 12:54  2002.01.28  
Bug Indy IdFTP, Event OnStatus?


1-90271           RomaRomaRoma          2002-01-09 19:29  2002.01.28  
Язык текста в RichEdit