اخي taha لاتخجل و لاهم يحزنون الامتحانات اولى من كل شئ .
هل استطيع ان اوكل لك مهمة التشفير و انشاء Header خاص للملف المشفر و ليكن arabteam و لمساعدتك اكثر استعمل وحدة ال Zlib المتوفرة مع نسخ دلفي .
اخي kachwahed مرحبا بكل محاولتك و كل الاعضاء
محمد
اخي taha لاتخجل و لاهم يحزنون الامتحانات اولى من كل شئ .
هل استطيع ان اوكل لك مهمة التشفير و انشاء Header خاص للملف المشفر و ليكن arabteam و لمساعدتك اكثر استعمل وحدة ال Zlib المتوفرة مع نسخ دلفي .
اخي kachwahed مرحبا بكل محاولتك و كل الاعضاء
محمد
اظن انني سوف اكمل المشروع وحدي
غدا او بعد غد سوف اكمل النقطة السابقة و يمكن ان نتطرق الى نقاط اخرى من مثل :
Anti-Debug ......
محمد
السلام عليكم
كيف حالك اخي محمد
عند تشغيل المرفق Generated_Lic_Fileتوقف البرنامج عند Hash الموجودة في uses . ماهي هذه . انا لاافهم كثيرا في الحماية ولاحتى قليلا أحاول تعلمها من خلال مشاركاتك . هل ممكن توضيح أكثر :angry:
اخي طلال Hash هي وحدة موجودة مع البرنامج
السلام عليكم ورحمة الله
أعتذر عن التأحر في الرد
أخي محمد لقد وجدت وحدة zlib التي أشرت إليها ولكن كيف عساي أستفيد منها في التشفير

اخي taha وحدة ال Zlib هي للظغط وليس للتشفير .
بوحدة ال Zlib يمكنك ظغط الملفات و ظغط ال Streams تقريبا بكل انواعها On the Fly . وانصحك بالبحث عن النسخة الاخيرة لان النسخة التي تاتي مع دلفي قيل ان فيها Bug مايسمى بال Memory Leak .
اخي taha هل عملت من قبل مع ال ظغط و التشفير وخاصة مع Memory من مثل MemoryStream ....?
إخواني بارك الله فيكم على هذا الموضوع الرائع ونحن ننتظر المزيد وتكملة الأفكار المطروحة لو تكرمتم
هل من محاولة من طرفك اخي nansoft
فعلا أخي كان لا بدا أن أشارك ولكن صدقني أنا مبتدأ في عالم البرمجة ونأكد بأنه لو كانت لديا فكرة لما ترددت بطرحها في هذا الصرح الكبير وأنا آسف على عدم المشاركة الفعالة
السلام عليكم
موضوع جميل يستحق المتابعة ...
المسألة بسيطة والأفكار كثيرة ;)
لدي اقتراح :
1- استعمل ال Hashing أو ال Ciphering واعتمد على تشفير الملف الذي سيقوم بإنشائه برنامجك وخبئه في ال System32 بإسم غريب مثلا إجعله هكذا actsys.bin هذا مثال فقط .
ستقول كيف؟ ... مثلا سيقوم المستخدم بإرسال الأسم الدي يريد أن يسجل البرنامج به( هذا الخيار أجده جميلا بالنسبة للمستخدم- فقط عامل نفسي لا أكثر-) ثم بعد ذلك اعطه السريال الموافق لذاك الإسم .. ثم بعد إدخاله السريال سيقوم برنامجك بما أسلفت ذكره ;)
2- بالنسبة لمكتبات ال DLL فلا أنصحكم بها لأنها سهلة التتبع ... اقترح أن تبرمج بريمجا صغيرا لا يعمل إلا من خلال البرنامج الرئيسي وليس فيه واجهة(أي يعمل بشكل خفي) و فيه خوارزمية التحقق من السريال ودالك بفتح الملف السالف الذكر(actsys.bin) مثلا وقراءة ما فيه ... أنتم تعرفون الباقي ... ;)
واقتراحي الأخير هو أن تنشؤوا خلية من المبرمجين مهمتهم أن يبرمجوا خوارزمية قوية مثل md5 أو Base64 أو Haval أو Blowfish أو ....
ويجعلون هذه الخوارزمية خاصة فقط بالمسلمين ولا يجعلوها متاحة للجميع ..
اقترحت هذا لأنني أحبكم
والسلام عليكم
السلام عليكم ورحمة الله تعالى وبركاته
اين انتم يا اهل الخبرة
وأقصد اين اين انت يا mohfa ويا tahasit
ويا كل من له علاقة بهذا الموضوع
نحن بحاجة لنهاية هذا الموضوع
ارجو ان تكملوا الموضوع
وتعطون النتيجة الأخيرة من فضلكم ولا تنسو انكم تتعاملون مع اخوانكم الذين ليس لديهم خبرة كافية مثلي
واقصد التبسيط في عملية إدراج الموضوع في البرنامج
ارجو التعجيل في الموضوع نحن بأمس الحاجة لهذ الأمر
ووفقكم الله جميعًا
شكرا لجميع الاخوة على المجهود الرائع
الاخ medreg ممكن نفس البرنامج يلي عملتو حضرتك بس لو ممكن انو بعد اظهار الرقم الحقيقي للهارد ديسك ان يقوم البرنامج بحفظ هذا الرقم بملف نصي txt بجانب البرنامج تلقائيا
يعني لما يشتغل البرنامج تلقائيا يظهر رقم الهارد ويقوم بحفظة بملف نصي بجانب ملف البرنامج دون الحاجة للضغط على اي زر
وشكرا لكم
تم تعديل هذه المشاركة بواسطة alwady في 29 أبريل 2010 في 22:36
السلام عليكم
بارك الله فيكم اخوتي على هذا الموضوع الجيد، هناك تنبيه هو ان التحصل على الرقم الحقيقي للقرص الصلب بالطريقة التي قدمها اخي mohfa في بداية المشروع لا يمكن في ويندوز فيستا أو ويندوز ٧ لكن تصلح في ويندوز XP فالأفضل البحث عن طريقة أخرى شكرا
تريد الفوز إضغط هنا
اشِهِدي يَا سَمَـا وَاكْتُبَنْ يا وُجـودْ
إنَّـنَـا للِحـمَـا سَنَكُونُ الجُـنُـودْ
فـنَـزيحْ البَـلاَ وَنَـفُـكُّ الْقُيُـودْ
ونَنيلُ الـرِّضـا مِنْ وَفَّى بِالعْهُـودِ
الشيخ عبد الحميد ابن باديس
السلام عليكم
أولا بارك الله في الإخوة الذين أثرو هذا الموضوع
بركان مسعود كتب:السلام عليكم
بارك الله فيكم اخوتي على هذا الموضوع الجيد، هناك تنبيه هو ان التحصل على الرقم الحقيقي للقرص الصلب بالطريقة التي قدمها اخي mohfa في بداية المشروع لا يمكن في ويندوز فيستا أو ويندوز ٧ لكن تصلح في ويندوز XP فالأفضل البحث عن طريقة أخرى شكرا
أيضا لا يصلح في ويندوز XP في حالة إذا لم تكن لديك صلاحيات الـ Admin
وجهتني هذه المشكلة عند أحد زبائني ولم أجد الحل إلى الآن
وفقكم الله
السلام عليكم
أعلم أن الموضوع قديم، فقط أردت أن أذكر بخصوص 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;بالتوفيق.
جميل أخي العمل
لكن ركز على التصميم أيضا
السلام عليكم
اذا ينقص هذا الكود حتى يعمل مع الويندوز 7
لانه لاي يظهر بالويندوز 7 رقم هارذ
بمعنى واضح
عندما تضع برنامجك في جهاز به الويندوز7
يخرج لك النافذة التي تظهر لك رقم الهارد لن فارغة ليس بها اي شيء وبمجرد الضغط على زر اوكي واعادة الدخول الى البرنامج يسمح لك بالدخول الى البرنامج وبدوم طلب الكود
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…