![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать серийный номер материнской платы [D5, Win95/98, WinME]
dXb group © (2002-06-16 00:02:00)Проблема в следующем: необходимо прочитать серийный номер материнки либо любой другой УНИКАЛЬНЫЙ ДЛЯ ДАННОЙ МАШИНЫ (системного блока) номер средствами Delphi...
111 (2002-06-17 14:29:00) [1]Вот исходник на Paskale серийний номер HDD (РОДНОЙ!!!!)
{$IFDEF Windows}
uses WinCrt;
{$ENDIF}
var
InfoArray : array[0..255] of word;
IdeInfo : record
Config : word;
CylsTotal : word;
Unused : word;
HeadTotal : word;
BPT : word;
BPS : word;
SPT : word;
Vendor : array[0..2] of word;
Serial : array[1..20] of char;
BufType : Word;
BufSize : Word;
ECC : Word;
Revision : array[1..8] of char;
Model : array[1..40] of char;
end absolute InfoArray;
Count : byte;
i : byte;
begin
writeln("€д®а¬ жЁп ® ¤ЁбЄ®ў®¤ е IDE:"^M^J);
{$IFDEF WINDOWS}
for count := 1 to mem[ $0040:$0075] do begin
{$ELSE}
for count := 1 to mem[Seg0040:$0075] do begin
{$ENDIF}
FillChar(InfoArray, SizeOf(InfoArray), 0);
{Џа®ўҐаЁвм Ј®в®ў®бвм}
while (port[$1F7] and $80<>0) do ;
{‡ ЇаҐвЁвм ЇаҐалў Ёп}
port[$3f6] := 2;
port[$1f6] := $A0 + ((count-1) shl 4);
port[$1f7] := $EC;
{Џа®ўҐаЁвм Ј®в®ў®бвм}
while (port[$1F7] and $80<>0) do ;
{Џ®«гзЁвм Ёд®а¬ жЁо}
for i := 0 to 255 do InfoArray[i] := swap(portw[$1F0]);
{H ЇҐз вaвм Ёд®а¬ жЁо}
writeln("€д®а¬ жЁп ® дЁ§ЁзҐбЄ®¬ ¤ЁбЄҐ ",count-1,^M^J);
with IdeInfo do begin
writeln("…¬Є®бвм Ґд®а¬ вЁа®ў п :", 9.5367431641E-7* {1/2^20}
swap(BPT)*swap(CylsTotal)*swap(HeadTotal):5:0, "Mb");
writeln("…¬Є®бвм д®а¬ вЁа®ў п :",
longint(swap(SPT))*swap(CylsTotal)*swap(HeadTotal) div 2048:5, "Mb");
writeln("—Ёб«® жЁ«Ё¤а®ў :", swap(CylsTotal):7);
writeln("—Ёб«® Ј®«®ў®Є :", swap(HeadTotal):7);
writeln("—Ёб«® ᥪв®а®ў ¤®а®¦Єг :", swap(SPT):7);
writeln("—Ёб«® Ў ©в ¤®а®¦Єг* :", swap(BPT):7);
writeln("—Ёб«® Ў ©в ᥪв®а* :", swap(BPS):7);
writeln("ђ §¬Ґа ЎгдҐа :", swap(BufSize):7);
writeln("Љ®¤ ECC :", swap(ECC):7);
writeln(" * -- Ґд®а¬ вЁа®ў п Ґ¬Є®бвм", ^M^J);
writeln("‘ҐаЁ©л© ®¬Ґа :", serial);
writeln("‚ҐабЁп :",revision);
writeln("Њ®¤Ґ«м :",model);
end;
write("H ¦¬ЁвҐ «оЎго Є« ўЁиг...");
{$IFDEF WINDOWS}
readkey;
{$ELSE}
asm xor ah,ah ; int 16h end;
{$ENDIF}
writeln(^M^J);
end;
end.
KSergey (2002-06-17 13:02:00) [2]Пошарьтесь в "Новостях мира компонент" - точно есть компонент, с исходниками, который позволяет считывать всякие вот параметры железа. Его же (если не ошибаюсь) перенесли уже и в кладовку. Так что ищите.
bander_log (2002-06-17 12:22:00) [3]Все эти методы хороши, но программно ты все равно будешь делать логические сопоставления которые прекрасно обходятся при вскрытии. Абсолютной защиты не существует. В таком случае лучше сделай генератор ключей или лицензий и сныкай подальше, а при использовании БД производи шифрование с помощью своего шифратора с ключами зарытыми в отдельном приложении или вообще на внешнем носителе. Это не так много времени занимает по времени и можно использовать в комбинации с другими средствами защиты.
SuperUmnik (2002-06-17 09:17:00) [4]BOOL GetVolumeInformation(LPCTSTR lpRootPathName,
LPTSTR lpVolumeNameBuffer,
DWORD nVolumeNameSize,
LPDWORD lpVolumeSerialNumber,
LPDWORD lpMaximumComponentLength,
LPDWORD lpFileSystemFlags,
LPTSTR lpFileSystemNameBuffer,
DWORD nFileSystemNameSize);
+ CoCreateGuid - уникальнее номера не придумаешь
+ номер сетевухи если есть и еще какая нить фигня записанная в реест при установке программы и скопировать Чайнику или Ламеру будет сложно, очень сложно.
Но абсолютной защиты ни когда не сделать. Защита должна быть экономически эффективна. т.е. 1) Взламывать дороже чем купить.
2) Разработка Защиты должна стоить дешевле самой программы т.е. если программа стоит 100баксов то защита на 10 баксов уже хорошая!
Новенький в Делфи (2002-06-17 00:21:00) [5]а конкретней можно, как взять эти значения (проц, биос) ?*
MJH (2002-06-16 17:59:00) [6]2dXb group
а че не гарантийный?
>тогда как можно написать программу, то бы она запускалась >только с одного компьютера?
привязка к серийному номеру винта, к типу и частоте проца, к биосу
Rem (2002-06-16 13:02:00) [7]Можно прочитать серийный номер раздела на винчестере:
BOOL GetVolumeInformation(LPCTSTR lpRootPathName,
LPTSTR lpVolumeNameBuffer,
DWORD nVolumeNameSize,
LPDWORD lpVolumeSerialNumber,
LPDWORD lpMaximumComponentLength,
LPDWORD lpFileSystemFlags,
LPTSTR lpFileSystemNameBuffer,
DWORD nFileSystemNameSize);
Гарантировать его уникальность нельзя, но оченьтрудно найти другой винчестер с таким же номером.
GOOFFY (2002-06-16 12:17:00) [8]Удалено модератором
Anatoly Podgoretsky (2002-06-16 11:23:00) [9]В такой постановке, вообще то никак, скопирую и запущу
Новенький в Делфи (2002-06-16 11:11:00) [10]тогда как можно написать программу, то бы она запускалась только с одного компьютера?
Rooman (2002-06-16 11:04:00) [11]CoCreateGuid - уникальнее номера не придумаешь
~Rand~ (2002-06-16 09:11:00) [12]Удалено модератором
SPeller (2002-06-16 03:21:00) [13]А если юзер сделает апгрейд, то что тогда твоя программа будет делать?
Anatoly Podgoretsky (2002-06-16 00:16:00) [14]У материнских плат, за небольшим исключение серийный номер существует только в виде наклейки на плате, естественно его не узнать программными путями, то небольшое количество плат, которые имеют егов БИОС никак это не документируют.