Прив’язка до заліза 1

Прив'язка до заліза

Прохання до всіх, хто займається shareware. Підкажіть, як робиться прив'язка до заліза (саме отримання інформації про склад апаратної частини). Бажано, щоб працювало під будь-яку Win.

найкраще прівязиватся до серійного номеру жорсткого диска. Полдучается він або (той котрий від творця, оч. Складно, завсе від системи. Якщо інтерстно, є прога DiskID32, не пам'ятаю де лежить, нотах досить грамотно все алгоритми отримання опис). Можна так само прівязатся і до того серійник, що дається під час форматірвоанія. правда при соледущем форматі номер буде зовсім інший. Цей серійний номер виходить з пів стусана за допомогою функції GetVolumeInformation.
З.И. Це серійник підробити з пів стусана, а перший спосіб НЕ працює на гвинтах самсунга. У них поле відповідає за серійник пусте.

Просто CoCreateGuid (), запам'ятовуємо в реєстрі.

УІД генерітся випадково, причому кожен раз. А шароварів при переінстале повинен знати про те, що він вже використовувався, а як він дізнається що цей іуд юзался раніше? ніяк. А залишати якісь позначки. Це засікається. а Інформація про гвинті в якому-нить лівому або службовому реєстрі. Те що потрібно.

А чи не можна дізнатися більше інформації про машину? Прив'язка ТІЛЬКИ до гвинта мене не дуже обрадує, навіть якщо це буде прив'язка до номера гвинта, а не томи. Є ж всякі різні програми-тестілкі, які видають море інформації по залізу, причому вони більшу частину добувають самі, а не Новомосковскют з реєстру.

Шароварники до заліза не прив'язуватися, за це сильно б'ють, а прив'язуються любителі, у яких і красти то нічого.

Що на поточний момент є серед soft захистів.
1) Вилов дебагеров.
2) Збочений алгоритм розпакування щоб було складно знайти OEP (точку входу).
3) Антідамповие прийоми.
4) Псування імпорту та інших секцій.
5) "З'їдення" початкових байт (близько OEP до першого Call, Mov).
6) Динамічна розпакування.
7) Пошук протектора в самій програмі + API протектора.
8) Прив'язка до заліза, Перевірка CRC.

2Anatoly Podgoretsky:
Що значить, "шароварники до заліза не прив'язуватися, за це сильно б'ють"? До чого можна робити тоді ще прив'язку? Паре ім'я користувача / пароль? Так тоді програму навіть ламати не треба. Досить знайти 1 вірну пару (хоча б купити) і викласти на огляд - все, можна вважати, що програма пішла в "дику природу".

2NightAngel:
"5)" З'їдення "початкових байт (близько OEP до першого Call, Mov)." - ось про це перший раз чую. Можна детальніше?

Далі, що можна отримати - я знаю. Я не знаю, ЯК це можна отримати. До пунктів 1, 6, 7, 8 у мене немає алгоритмів. Може хто-небудь допомогти?

Б'ють грошима, втратою бізнесу.
А твоя прив'язка до заліза, як то обмежує, точно також можна інсталювати на будь-якій кількості комп'ютерів, тільки не треба пісню, про багато ступеневу отримання ключа, це ще надійніше для втрати бізнесу.
Треба захист, так купи професіональному захист і не мучся.

Не, ну як це "точно також можна інсталювати на будь-якій кількості комп'ютерів"? Зрозуміло, що один і той же ключ на інший комп не підійде. Значить, треба міняти код програми. Ну ось вся надія якраз на це. Що зламають не відразу. Щодо "купи професійного захист". Це яку ж? Якщо щодо ключа - для маленької тулзи самий невідповідний рішення. Якщо чисто софт - ХАЧУ САМ! ( «Не мучся" - відмінний варіант, на всі випадки життя, а чому щось самому вигадувати, коли можна купити / попросити / поцупити готове)

І, до речі, за використання асинхронного шифрування в своїх програмах по шапці надавати можуть?

Тобі вище вказали - AsProtect - $ 99

procedure TMyForm.FormActivate (Sender: TObject);
Var
S, SOut. String;
I. Integer;
VolumeName, FileSystemName. String;
VolumeSerialNo, MaxComponentLength, FileSystemFlags: LongWord;
begin
S: = GetDisks (DiskHDD);
SOut: = "";
For I: = 1 to Length (S) do
Begin

if GetHDDInfo (S [I], VolumeName, FileSystemName, VolumeSerialNo,
MaxComponentLength, FileSystemFlags) then
SOut: = SOut +
"Диск:" + S [I] + # 13 # 10 +
"Метка:" + VolumeName + # 13 # 10 +
"Файлова система:" + FileSystemName + # 13 + # 10 +
"Серійний номер:" + IntToHex (VolumeSerialNo, 8) + # 13 + # 10 +
"Макс. Довжина імені файлу:" + IntToStr (MaxComponentLength) + # 13 + # 10 +
"Flags:" + IntToHex (FileSystemFlags, 4) + # 13 # 10 + # 13 # 10;
End;
Disks.Caption: = SOut;
end;

interface
Uses Windows;

Отримувані значення:
VolumeName - Метка / Ім'я томи
FileSystemName - Файлова система
VolumeSerialNo - Серійний номер диска (можна прив'язувати до диска програми)
MaxComponentLength - Максимальна довжина імені файлу
FileSystemFlags - Прапори дивіться в довідці Delphi по GetVolumeInformation

Функція повертає true, якщо все пройшло успішно (диск знайшовся),
і false, якщо виникли проблеми, наприклад диска немає в дисководі,
або дисковода такого взагалі немає
>
Function GetHDDInfo (Disk. Char; Var VolumeName, FileSystemName. String;
Var VolumeSerialNo, MaxComponentLength, FileSystemFlags: LongWord). Boolean;

function GetDisks (TypeOfDisk. Word). String;
var
DriveArray. array [1..26] of Char;
I. integer;
begin
DriveArray: = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for I: = 1 to 26 do
if GetDriveType (PChar (DriveArray [I] + ":")) = TypeOfDisk then Result: = Result + DriveArray [I];
end;

Function GetHDDInfo (Disk. Char; Var VolumeName, FileSystemName. String;
Var VolumeSerialNo, MaxComponentLength, FileSystemFlags: LongWord). Boolean;
Var
_VolumeName, _FileSystemName: array [0..MAX_PATH-1] of Char;
_VolumeSerialNo, _MaxComponentLength, _FileSystemFlags: LongWord;
Begin
if GetVolumeInformation (PChar (Disk + ":"), _ VolumeName, MAX_PATH, @ _ ​​VolumeSerialNo,
_MaxComponentLength, _FileSystemFlags, _FileSystemName, MAX_PATH) then
Begin
VolumeName: = _ VolumeName;
VolumeSerialNo: = _ VolumeSerialNo;
MaxComponentLength: = _ MaxComponentLength;
FileSystemFlags: = _ FileSystemFlags;
FileSystemName: = _ FileSystemName;
Result: = True;
End else Result: = False;
End;
end.

приклад
procedure TForm1.Button1Click (Sender: TObject);
begin
MessageDlg (GetCPUVendor, mtInformation, [mbOk], 0);
end;

type
TVendor = array [0..11] of char;

приклад
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.

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;

серінйік гвинта - теж унікальний. як і мак мережевої. і то і то можна перепрошити. Я вважаю цей спосіб прив'язки кращим, і завжди ним користуюся, якщо виникає така необхідність.

Во! Те що треба було! Дякуємо.

Rem: звичайно, якщо у кого ще що є - прохання поділитися.

Тільки зараз помітив: трохи раніше опечатали, мав на увазі:
"І, до речі, за використання асиметричного шифрування (тобто з відкритим ключем) в своїх програмах по шапці надавати можуть?" (Напевно про інше думав, коли писав).