الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشروع لصنع Keygen "طريقة تعتمد على رقم الهارد ديسك وتمنع النسخ الغير شرعي لبرنامجك"

رائج
بدأه tahasit في 2 مايو 2009 · 94 رد · 29,377 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#76

اخي taha لاتخجل و لاهم يحزنون الامتحانات اولى من كل شئ .

هل استطيع ان اوكل لك مهمة التشفير و انشاء Header خاص للملف المشفر و ليكن arabteam و لمساعدتك اكثر استعمل وحدة ال Zlib المتوفرة مع نسخ دلفي .

اخي kachwahed مرحبا بكل محاولتك و كل الاعضاء

محمد

عزيزي :

لاتنسى ان تصلي على حبيبنا و شفيعنا يوم لا ينفع مال ولا بنون .

فاللهمّ صّل وسّلم على سيدي و شفيعي وحبيبي محمد عليك الف صلاة وازكى تسليم

*****

2_header.png

#77

اظن انني سوف اكمل المشروع وحدي

غدا او بعد غد سوف اكمل النقطة السابقة و يمكن ان نتطرق الى نقاط اخرى من مثل :

Anti-Debug ......

محمد

عزيزي :

لاتنسى ان تصلي على حبيبنا و شفيعنا يوم لا ينفع مال ولا بنون .

فاللهمّ صّل وسّلم على سيدي و شفيعي وحبيبي محمد عليك الف صلاة وازكى تسليم

*****

2_header.png

#78

السلام عليكم

كيف حالك اخي محمد

عند تشغيل المرفق Generated_Lic_Fileتوقف البرنامج عند Hash الموجودة في uses . ماهي هذه . انا لاافهم كثيرا في الحماية ولاحتى قليلا أحاول تعلمها من خلال مشاركاتك . هل ممكن توضيح أكثر :angry:

#79

اخي طلال Hash هي وحدة موجودة مع البرنامج

عزيزي :

لاتنسى ان تصلي على حبيبنا و شفيعنا يوم لا ينفع مال ولا بنون .

فاللهمّ صّل وسّلم على سيدي و شفيعي وحبيبي محمد عليك الف صلاة وازكى تسليم

*****

2_header.png

#80

ولماذا لاتعمل عندي مع ديلفي 2009

#81

السلام عليكم ورحمة الله

أعتذر عن التأحر في الرد

أخي محمد لقد وجدت وحدة zlib التي أشرت إليها ولكن كيف عساي أستفيد منها في التشفير

986902102.jpg
#82

اخي taha وحدة ال Zlib هي للظغط وليس للتشفير .

بوحدة ال Zlib يمكنك ظغط الملفات و ظغط ال Streams تقريبا بكل انواعها On the Fly . وانصحك بالبحث عن النسخة الاخيرة لان النسخة التي تاتي مع دلفي قيل ان فيها Bug مايسمى بال Memory Leak .

اخي taha هل عملت من قبل مع ال ظغط و التشفير وخاصة مع Memory من مثل MemoryStream ....?

عزيزي :

لاتنسى ان تصلي على حبيبنا و شفيعنا يوم لا ينفع مال ولا بنون .

فاللهمّ صّل وسّلم على سيدي و شفيعي وحبيبي محمد عليك الف صلاة وازكى تسليم

*****

2_header.png

#83

الحقيقة لم يسبق لي التعامل في مثل هذه المواضيع

986902102.jpg
#84

إخواني بارك الله فيكم على هذا الموضوع الرائع ونحن ننتظر المزيد وتكملة الأفكار المطروحة لو تكرمتم

#85

هل من محاولة من طرفك اخي nansoft

عزيزي :

لاتنسى ان تصلي على حبيبنا و شفيعنا يوم لا ينفع مال ولا بنون .

فاللهمّ صّل وسّلم على سيدي و شفيعي وحبيبي محمد عليك الف صلاة وازكى تسليم

*****

2_header.png

#86

فعلا أخي كان لا بدا أن أشارك ولكن صدقني أنا مبتدأ في عالم البرمجة ونأكد بأنه لو كانت لديا فكرة لما ترددت بطرحها في هذا الصرح الكبير وأنا آسف على عدم المشاركة الفعالة

#87

السلام عليكم

موضوع جميل يستحق المتابعة ...

المسألة بسيطة والأفكار كثيرة ;)

لدي اقتراح :

1- استعمل ال Hashing أو ال Ciphering واعتمد على تشفير الملف الذي سيقوم بإنشائه برنامجك وخبئه في ال System32 بإسم غريب مثلا إجعله هكذا actsys.bin هذا مثال فقط .

ستقول كيف؟ ... مثلا سيقوم المستخدم بإرسال الأسم الدي يريد أن يسجل البرنامج به( هذا الخيار أجده جميلا بالنسبة للمستخدم- فقط عامل نفسي لا أكثر-) ثم بعد ذلك اعطه السريال الموافق لذاك الإسم .. ثم بعد إدخاله السريال سيقوم برنامجك بما أسلفت ذكره ;)

2- بالنسبة لمكتبات ال DLL فلا أنصحكم بها لأنها سهلة التتبع ... اقترح أن تبرمج بريمجا صغيرا لا يعمل إلا من خلال البرنامج الرئيسي وليس فيه واجهة(أي يعمل بشكل خفي) و فيه خوارزمية التحقق من السريال ودالك بفتح الملف السالف الذكر(actsys.bin) مثلا وقراءة ما فيه ... أنتم تعرفون الباقي ... ;)

واقتراحي الأخير هو أن تنشؤوا خلية من المبرمجين مهمتهم أن يبرمجوا خوارزمية قوية مثل md5 أو Base64 أو Haval أو Blowfish أو ....

ويجعلون هذه الخوارزمية خاصة فقط بالمسلمين ولا يجعلوها متاحة للجميع ..

اقترحت هذا لأنني أحبكم

والسلام عليكم

#88

السلام عليكم ورحمة الله تعالى وبركاته

اين انتم يا اهل الخبرة

وأقصد اين اين انت يا mohfa ويا tahasit

ويا كل من له علاقة بهذا الموضوع

نحن بحاجة لنهاية هذا الموضوع

ارجو ان تكملوا الموضوع

وتعطون النتيجة الأخيرة من فضلكم ولا تنسو انكم تتعاملون مع اخوانكم الذين ليس لديهم خبرة كافية مثلي

واقصد التبسيط في عملية إدراج الموضوع في البرنامج

ارجو التعجيل في الموضوع نحن بأمس الحاجة لهذ الأمر

ووفقكم الله جميعًا

#89

الحمد لله

من جد وجد ومن زرع حصد

#90

شكرا لجميع الاخوة على المجهود الرائع

الاخ medreg ممكن نفس البرنامج يلي عملتو حضرتك بس لو ممكن انو بعد اظهار الرقم الحقيقي للهارد ديسك ان يقوم البرنامج بحفظ هذا الرقم بملف نصي txt بجانب البرنامج تلقائيا

يعني لما يشتغل البرنامج تلقائيا يظهر رقم الهارد ويقوم بحفظة بملف نصي بجانب ملف البرنامج دون الحاجة للضغط على اي زر

وشكرا لكم

تم تعديل هذه المشاركة بواسطة alwady في 29 أبريل 2010 في 22:36

#91

السلام عليكم

بارك الله فيكم اخوتي على هذا الموضوع الجيد، هناك تنبيه هو ان التحصل على الرقم الحقيقي للقرص الصلب بالطريقة التي قدمها اخي mohfa في بداية المشروع لا يمكن في ويندوز فيستا أو ويندوز ٧ لكن تصلح في ويندوز XP فالأفضل البحث عن طريقة أخرى شكرا

تريد الفوز إضغط هنا

اشِهِدي يَا سَمَـا وَاكْتُبَنْ يا وُجـودْ

إنَّـنَـا للِحـمَـا سَنَكُونُ الجُـنُـودْ

فـنَـزيحْ البَـلاَ وَنَـفُـكُّ الْقُيُـودْ

ونَنيلُ الـرِّضـا مِنْ وَفَّى بِالعْهُـودِ

الشيخ عبد الحميد ابن باديس

#92

السلام عليكم

أولا بارك الله في الإخوة الذين أثرو هذا الموضوع

بركان مسعود كتب:

السلام عليكم

بارك الله فيكم اخوتي على هذا الموضوع الجيد، هناك تنبيه هو ان التحصل على الرقم الحقيقي للقرص الصلب بالطريقة التي قدمها اخي mohfa في بداية المشروع لا يمكن في ويندوز فيستا أو ويندوز ٧ لكن تصلح في ويندوز XP فالأفضل البحث عن طريقة أخرى شكرا

أيضا لا يصلح في ويندوز XP في حالة إذا لم تكن لديك صلاحيات الـ Admin

وجهتني هذه المشكلة عند أحد زبائني ولم أجد الحل إلى الآن

وفقكم الله

#93

السلام عليكم

أعلم أن الموضوع قديم، فقط أردت أن أذكر بخصوص HDD Serial

الأصل مثال IdeSN2لـ Alex Konshin

http://home.earthlink.net/~akonshin/delphi_components.htm

هناك أمثلة أخرى جيدة في الموقع.

أعدت ضبطها لتوافق إصدارات Delphi الأخيرة (حاليا):

function GetIdeDiskSerialNumber: String;
type
  TSrbIoControl = packed record
    HeaderLength: ULONG;
    Signature: Array [0 .. 7] of AnsiChar;
    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 AnsiChar;
    wBufferType: Word;
    wBufferSize: Word;
    wECCSize: Word;
    sFirmwareRev: Array [0 .. 7] of AnsiChar;
    sModelNumber: Array [0 .. 39] of AnsiChar;
    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;
  SIGNDISK: AnsiString = 'SCSIDISK';
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: PAnsiChar;
    i: Integer;
    c: AnsiChar;
  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;

begin

  Result := '';
  FillChar(Buffer, BufferSize, #0);
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin // Windows NT, Windows 2000
    // Get SCSI port handle
    hDevice := CreateFile('\\.\Scsi0:', // Note: '\\.\C:' required administrative permissions.
      GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
      OPEN_EXISTING, 0, 0);
    if hDevice = INVALID_HANDLE_VALUE then
      Exit;
    try
      srbControl.HeaderLength := sizeof(SRB_IO_CONTROL);
      System.Move(SIGNDISK[1], srbControl.Signature, 8);
      srbControl.Timeout := 2;
      srbControl.Length := DataSize;
      srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY;
      pInData := PSendCmdInParams(PAnsiChar(@Buffer) + sizeof(SRB_IO_CONTROL));
      pOutData := pInData;
      with pInData^ do
      begin
        cBufferSize := IDENTIFY_BUFFER_SIZE;
        bDriveNumber := 0;
        with irDriveRegs do
        begin
          bFeaturesReg := 0;
          bSectorCountReg := 1;
          bSectorNumberReg := 1;
          bCylLowReg := 0;
          bCylHighReg := 0;
          bDriveHeadReg := $A0;
          bCommandReg := IDE_ID_FUNCTION;
        end;
      end;
      if not DeviceIoControl(hDevice, IOCTL_SCSI_MINIPORT, @Buffer, BufferSize,
        @Buffer, BufferSize, cbBytesReturned, nil) then
        Exit;
    finally
      CloseHandle(hDevice);
    end;
  end
  else
  begin // Windows 95 OSR2, Windows 98
    hDevice := CreateFile('\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0);
    if hDevice = INVALID_HANDLE_VALUE then
      Exit;
    try
      pInData := PSendCmdInParams(@Buffer);
      pOutData := PAnsiChar(@pInData^.bBuffer);
      with pInData^ do
      begin
        cBufferSize := IDENTIFY_BUFFER_SIZE;
        bDriveNumber := 0;
        with irDriveRegs do
        begin
          bFeaturesReg := 0;
          bSectorCountReg := 1;
          bSectorNumberReg := 1;
          bCylLowReg := 0;
          bCylHighReg := 0;
          bDriveHeadReg := $A0;
          bCommandReg := IDE_ID_FUNCTION;
        end;
      end;
      if not DeviceIoControl(hDevice, DFP_RECEIVE_DRIVE_DATA, pInData,
        sizeof(TSendCmdInParams) - 1, pOutData, W9xBufferSize,
        cbBytesReturned, nil) then
        Exit;
    finally
      CloseHandle(hDevice);
    end;
  end;
  with PIdSector(PAnsiChar(pOutData) + 16)^ do
  begin
    ChangeByteOrder(sSerialNumber, sizeof(sSerialNumber));
    SetString(Result, sSerialNumber, sizeof(sSerialNumber));
  end;
end;

//Other function doesn't work for me!

function ScsiHddSerialNumber: string;
{$ALIGN ON}
type
  TScsiPassThrough = record
    Length: Word;
    ScsiStatus: Byte;
    PathId: Byte;
    TargetId: Byte;
    Lun: Byte;
    CdbLength: Byte;
    SenseInfoLength: Byte;
    DataIn: Byte;
    DataTransferLength: ULONG;
    TimeOutValue: ULONG;
    DataBufferOffset: DWORD;
    SenseInfoOffset: ULONG;
    Cdb: array [0 .. 15] of Byte;
  end;

  TScsiPassThroughWithBuffers = record
    spt: TScsiPassThrough;
    bSenseBuf: array [0 .. 31] of Byte;
    bDataBuf: array [0 .. 191] of Byte;
  end;
{$ALIGN OFF}
var
  DeviceHandle: THandle;
  dwReturned: DWORD;
  len: DWORD;
  Buffer: array [0 .. sizeof(TScsiPassThroughWithBuffers) + sizeof
    (TScsiPassThrough) - 1] of Byte;
  sptwb: TScsiPassThroughWithBuffers absolute Buffer;
begin
  Result := '';
  FillChar(Buffer, sizeof(Buffer), #0);
  with sptwb.spt do
  begin
    Length := sizeof(TScsiPassThrough);
    CdbLength := 6; // CDB6GENERIC_LENGTH
    SenseInfoLength := 24;
    DataIn := 1; // SCSI_IOCTL_DATA_IN
    DataTransferLength := 192;
    TimeOutValue := 2;
    DataBufferOffset := PChar(@sptwb.bDataBuf) - PChar(@sptwb);
    SenseInfoOffset := PChar(@sptwb.bSenseBuf) - PChar(@sptwb);
    Cdb[0] := $12; // OperationCode := SCSIOP_INQUIRY;
    Cdb[1] := $01; // Flags := CDB_INQUIRY_EVPD;  Vital product data
    Cdb[2] := $80; // PageCode            Unit serial number
    Cdb[4] := 192; // AllocationLength
  end;
  len := sptwb.spt.DataBufferOffset + sptwb.spt.DataTransferLength;
  DeviceHandle := CreateFile('\\.\Scsi0',
    GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
    OPEN_EXISTING, 0, 0);
  if DeviceHandle = INVALID_HANDLE_VALUE then Exit;
  if DeviceIoControl(DeviceHandle, $0004D004, @sptwb, sizeof(TScsiPassThrough),
    @sptwb, len, dwReturned, nil) and ((PChar(@sptwb.bDataBuf) + 1)^ = #$80)
    then
    SetString(Result, PChar(@sptwb.bDataBuf) + 4,
      Ord((PChar(@sptwb.bDataBuf) + 3)^));
end;

بالتوفيق.

#95

السلام عليكم

اذا ينقص هذا الكود حتى يعمل مع الويندوز 7

لانه لاي يظهر بالويندوز 7 رقم هارذ 

بمعنى واضح

عندما تضع برنامجك في جهاز به الويندوز7

يخرج لك النافذة التي تظهر لك رقم الهارد لن فارغة ليس بها اي شيء وبمجرد الضغط على زر اوكي واعادة الدخول الى البرنامج يسمح لك بالدخول الى البرنامج وبدوم طلب الكود

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…