Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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а. При этом понятное дело, если пользователь добавляет памяти, то прога сразу же отказывает в работе. Были случаи, когда при подключении принтера такая бяка происходила. Удачи!



Страницы: 1 вся ветка

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

Наверх





Память: 0.51 MB
Время: 0.004 c
7-90398
Kirill_SKTS
2001-10-17 21:50
2002.01.28
Добыть звук из звуковухи


1-90321
Sasha2
2002-01-11 11:02
2002.01.28
Как в TMemoryTable задать Filter?


6-90332
Star
2001-11-06 09:14
2002.01.28
Как определить комп, наиболее активно загружающий сеть?


3-90234
Быданцев Александр
2001-12-09 16:40
2002.01.28
DB2


6-90342
glycol
2001-11-05 14:41
2002.01.28
Как проверить eMail ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский