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

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

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

اود مشاركتكم بطريقة قمت بها بحماية احد برامجي

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

"طبعا هناك تعديل وحذف جزء من الكود حماية للخصوصية"

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

هذا الرقم يرسله الزبون للمبرمج او الشركة البائعة للبرنامج

عندها يوضع رقم المنتج في البرنامج ليطبق عليه ايضا بعض العمليات التشفيرية لينتج بالنهاية مفتاح المنتج

"طبعا تطبق هذه العمليات في البرنامج المنتج ايضا لتقارن مع المفتاح "

اعتمدت في البداية على ارسال المفتاح للزبون مباشرة ولكن وزيادة للحماية اضفت طريقة اخرى لزيادة صعوبة كسر المفتاح

وهذه الطريقة تعتمد على تخبئة المفتاح ضمن ملف كبير نسبيا (60 كيلو في المثال)وأرسال الملف للزبون بحيث يضعه في مجلد البرنامج مباشرة ليستخرج البرنامج المفتاح لاحقا

هذه الطريقة اسهل للزبون واكثر حماية لك

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

ملاحظة "الكود لايعمل ضمن بيئة فيستا إلا بعد تشغيل البرنامج كمدير "

post-114608-1242721014_thumb.jpg

تم تعديل هذه المشاركة بواسطة decompiler في 23 مايو 2009 في 17:26

#27

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

أولاً جزاكم الله خيراً على هذا الموضوع

وأود المشاركة في بعض الأفكار التي قد تفيد في زيادة درجة صعوبة كسر البرنامج.

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

و لكن الأهم من ذلك هو استراتيجية اختبار رقم التسجيل الناتج في البرنامج الأساسي, لأن هذا الجزء معرض لمحاولات الكركركز في تحطيمه وتجاوزه.

و أيضاً هو كيفية تفعيل المزايا التي ينتظرها المستخدم بعد تسجيل البرنامج, و ماذا سيحصل إذاكان الرقم خاطىء.

لماذا هاتين النقطتين,

الثانية هي التي تدل محطمين البرامج على منطقة اختبار الرقم في برنامجك ومن ثم تجاوزها, مثلاً في برنامج أنت تظهر رسالة hahaha إذا كان الرقم خطأ,

فمن السهل البحث في الـ exe على الـ string = hahaha و التتبع تعليمات الـ Asm التي قبلها و تعديلها إلى jmp مثلاً و بذلك يكون قد تجاوز كامل كود الاختبار الخاص بالسيرال و انتقل ليحصل على نسخة أصلية من البرنامج, وأما عن الرقم الناتج و الذي سوف تخزنه في الريجيستري, فإذا استطاعوا تجاوز كود الاختبار فإن برنامجط سيقبل أي سيريال و يخزنه في الريجستري.

إذا لابد من مراعاة النتائج التي تحصل بعد اختبار الرقم و محاولة تبهيمها قدر الإمكان لكي يصعب عليهم البحث عن هذا الجزء في الـ exe, وأهم شيء رسائل الـ string.

أما عن النقطة الأولى فهي جيدة في برنامجك, أي توليد رقم و اختباره, ويمكن زيادة تعقديها.

المهم:

دعونا نتحدث عن بعض الطرق التي تصعب الموضوع قليلاً على المحطمين و ذلك بإعطاء الاهتمام إلى الجزء المتعلق بالتحقق من الرقم السري من أوله إلى آخره, أي من مرحلة الدخول في الاختبار إلى مرحلة اظهار النتيجة.

1- فكرة استعمال ملفات الـ DLL.

-هدفنا هو تضليل المحطمين عن مكان اختبار الرقم التسلسلي و مكان وضع الناتج أيضاً-

لنقم بوضع الجزء الخاص بالتحقق من السيريال في ملف dll و بذلك نكون قد فصلنا كود الاختبار عن الملف التنفيذي أصلاً, ومن ثم نقوم باستدعاء ملف الـ dll و اختبار الرقم المدخل و إظهار النتيجة.

حسناً كيف نستدعي ملف الـ dll:

1- استدعاء ساكن؟

2- استدعاء دايناميكي؟

إن عيب الاستدعاء الساكن هو سهولة معرفة اسم ومكان ملف الـ dll المستخدم, لأنك إذا أخذت ملف الـ exe مثلاً إلى جهاز آخر و قمت بتشغيله سيطلب منك فوراً ملف الـ dll وهذا قد يكون طرف خيط.

أم الثاني فهي استدعاؤه عند اللزوم و يمكنك وضع الاستدعاء ضمن try لكي لايظهر البرنامج أي رسالة تدل على على عدم وجود الملف.

إذا الثانية أفضل نوعاً ما من الأولى.

السؤال الآن أين سنضع ملف الـ dll:

1- بداخل مكتبة البرنامج مباشرة؟

2- بداخل مكتبة البرنامج مباشرة, و نقوم بتغيير امتداده و عند استعماله ننسخه مثلاً إلى الـ temp و نتعامل معه ثم نحذفه فوراً؟

3- بداخل مكتبة ما من مكتبات الويندوز, نضعه عندما نقوم بعمل setup للبرنامج ومن ثم نتعامل معه بطريقة مخفية أيضاً؟

الطريقة الثالثة أفضل شيء, ويصعب عليهم معرفة مكان الملف هذا, لأن في الطريقة أولى هو من الملفات المشبوهة,و التي تحثهم على فحصها جميعاً, و الطريقة الثانية أصعب قليلاً و لكنها أيضاً تحت الشبهة

إذا نضع الكود ضمن ملف الـ dll و نخبئه في النظام في مكان ما, ونتعامل معه تعامل دايناميكي عند اللزوم.

ماذا عن طريقة إظهار أن هذا الرقم خاطىء:

البعض يرى أن لا تقوم بوضع أي رسالة في حال كان الرقم خطأ, فقط في حال الرقم صحيح نتعامل مع الحالة.

و البعض يرى أن نقوم بتشفير رسالة الـ string هذه, ولكن يبقى تابع showmessage أو أي تابع إظهار رسالة موجود وواضح في الـ exe

و قد يمكن أيضأ استعمل صورة تحتوي على نص معين يتم إظهارها على الشاشة في حال كان خطأ

...إلخ

هناك الكثير من الأفكار لهذا الجزء.

----------------------------------------------------------

آسف على الإطالة, نكمل معكم إن شاء الله لاحقاً.

ووفقني الله و إياكم إلى ما يحب و يرضى.

قال تعالى: ((وَمَا أَصَابََكُمْ مِنْ مُصِيبَةٍ فَبمَا كَسَبَتْ أَيْدِيكُمْ وَ يَعْفُو عَنْ كَثِيرٍ)) :.:.: الشورى: الآية 30.

IN ALLAH WE TRUST

:.:.:.:.:.:.:.:.:.:.:.:.:.:

#28

السلام عليكم

بارك الله فيكم جميعا على المشاركة والله أفكار رائعة ومثالية وكما أخبرتكم هناك العديد والعديد من طرق التشفير وإخفاء البيانات

ولكن ما رأيكم أن نكمل موضوع الريجيستري أولا لأنه وكما تعلمون لا يستعمل فقط من أجل تخزين كلمات المرور ولكن نحتاجه في كثير من جوانب

البرنامج ومن المهم لكل مبرمج أن يكون على إطلاع بالريجيستري

وهذه المشاركة مثال على كلامي حيث نستعمل الريجيستري هنا من أجل الإحتفاظ بإعدادات البرنامج

/index.php?showtopic=191981

986902102.jpg
#29
Like Delphi كتب:
السؤال الآن أين سنضع ملف الـ dll:

1- بداخل مكتبة البرنامج مباشرة؟

2- بداخل مكتبة البرنامج مباشرة, و نقوم بتغيير امتداده و عند استعماله ننسخه مثلاً إلى الـ

temp و نتعامل معه ثم نحذفه فوراً؟

3- بداخل مكتبة ما من مكتبات الويندوز, نضعه عندما نقوم بعمل setup للبرنامج ومن ثم نتعامل معه بطريقة مخفية أيضاً؟

4- ندمجه داخل البرنامج ونستعمله مباشرة من الذاكرة

يكون مكانه بالذاكرة مختلف كل تنفيذ

هذا يصعب على الكراكر صنع باتش

تم تعديل هذه المشاركة بواسطة 213 في 19 مايو 2009 في 16:12

#30

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

لقد قمت بالتعديل على المشروع كما أشار الإخوة :

أولا تخلصنا من مشكل الفراغات في رمز الهارد ديسك

كما أنشأت المفتاح الخاص ببرنامجنا من أجل تخزين كلمة المرور وربطت إنشاءه بصحة كلمة المرور

أي إذا لم تكن كلمة المرور صحيحة فلن يتم إنشاء المفتاح

تنقصنا الآن إجرائية التحقق من أن المستخدم قد قام بإدخال كلمة المرور من قبل من أجل تجنب إعادة إدخالها

key_gen_tahasit_v1.rar

986902102.jpg
#31

الله يعينكم

ونسأل الله عز وجل أن يضع كل هذه المجهودات في ميزان حسناتكم

وفقكم الله لما يحبه ويرضاه

أخي لقد أحسنتم صنعًا

وإلى الأمام

#32

بســم الله الـرحمــن الرحيــم

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

أضفت بعد التعديلات التي أتمنى أن تنال إعجابكم :wink:

ملاحظة: يمكن استعمال النقر المزدوج على أي "إديت" من أجل اللص أو النسخ

شكرا كثيرا.

GetAndSetSerialNumber.rar

#33
kachwahed كتب:
 

أضفت بعد التعديلات التي أتمنى أن تنال إعجابكم :wink:

المرفق ناقص اهم شي unit1.*

#34

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

طرح الأخ mohfa في موضوع برنامج تسيير مؤسسة تربوية طريقة رائعة من أجل حماية البرنامج

وأنا أرى أن هذه النوع من الحماية مكمل وضروري لأي برنامج ويزيد من قيمته كثيرا

هذا رابط مشاركة الأخ mohfa في برنامج تسيير مؤسسة تربوية :

/index.ph...st&p=928937

بعد إذنك أخي mohfa أرفع مثالا مبسطا عن مشاركتك لأنها وفي إطار مشروع مؤسسة تربوية يصعب الإلمام بها -- تجدون المثال في المرفقات --

هذه صورة المثال المرفق

post-145519-1243064957_thumb.png

نعود لموضوعنا الآن

أرجو من الإخوة طرح آرائهم حول طريقة التحقق من أن المستخدم قد أدخل من قبل كلمة المرور ولا يضطر لإدخالها في كل مرة يعيد فيه تشغيل البرنامج

لأني حاولت ولم أفلح لحد الآن :wacko:

mohfa.rar

تم تعديل هذه المشاركة بواسطة tahasit في 23 مايو 2009 في 16:20

986902102.jpg
#35

اخي tahasit , صراحة اعجبني فيك اصرارك و متابعتك للموضوع .

اكمل هكذا .

تفظل , المرفق المعدل .

تمت اظافة وحدة ال Hash - MD5- . وذلك ليتم حساب ال MD5hash لكلمة المرور والناتج يحفظ في مفتاح PWD_Hash في الريجستري وكل مرة يتم فيها تنفيذ البرنامج سوف يتم التاكد من وجود المفتاح الرئسي و تطابق كلمة السر بعد حساب ال Hash و تطابقه مع ال MD5_HASH الموجود مسبقا في مفتاح ال PWD_Hash اذا كانت النتيحة صحيحة فلاتظهر مربع كلمة السر والا فكلمة السر غير متطابقة اذن اظهر صندوق كلمة السر .

طريقة العمل :

اذا كان المفتاح غير موجود فننشئه مع كلمة المرور الجديدة .

في حالة ان المفتاح موجود فسنتاكد من صحة كلمة المرور .

لتجربة حاول حذف المفتاح من الريجستري او حاول تغيير اي حرف في مفتاح PWD او PWD_Hash في الريجستري و سترى النتيجة .

التطابق يحسب على اساس قيمة ال PWD_Hash تساوي MD5HASH لكلمة السر .

المثال جيد لمن يريد ان يتعلم هكذا اشياء

ملاحظة : المقارنة في المثال بسيطة يمكن التعديل عليها

**

محمد

**

mohfa.zip

تم تعديل هذه المشاركة بواسطة mohfa في 23 مايو 2009 في 19:52

عزيزي :

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

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

*****

2_header.png

#36

بارك الله فيك أخي mohfa وجزاك الله عنا خير الجزاء

شكرا على التشجيع وشكرا على تواصلك معنا

986902102.jpg
#37

هل تمت التجربة ؟

عزيزي :

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

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

*****

2_header.png

#38

نعم أخي محمد بارك الله فيك

حقيقة أدهشني عملك ما شاء الله ما شاء الله

بقي علي الآن أن أدمج المشروعين معا شكرا مرة أخرى

986902102.jpg
#39

هل حاولت حذف او التعديل على المفاتيح في الريجستري وماذا كانت النتيجة ؟

عزيزي :

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

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

*****

2_header.png

#40

لقد قمت بحذف المفتاح من الريجيستري ولكن البرنامج طالبني بكلمة المرور الأولى

التي كنت قد وضعتها قبل الحذف

كما أن التعديل في القيمة المخزنة في الريجيستري في PWD اوPWD_Hash يؤدي إلى نفس النتيجة

هذا يعني أن نسبة الأمان هنا عالية

هل كلامي صحيح

تم تعديل هذه المشاركة بواسطة tahasit في 23 مايو 2009 في 22:39

986902102.jpg
#41

باذن الله .

المهم لاتنسى ان المقارنة في البرنامج جد بسيطة اعتمدتها فقط لكي ترى كيف تعمل , يعني لاتعتمد عليها 100% .

اقصد :

if A<>B then

والله المستعان

تم تعديل هذه المشاركة بواسطة mohfa في 23 مايو 2009 في 23:06

عزيزي :

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

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

*****

2_header.png

#42

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

وتبقى لكل واحد منا طريقته الخاصة في إجراء العمليات الأخرى من مقارنة وغيرها

المهم سأحاول الآن دمج المشروعين كما أخبرتك ووفقنا الله وإياكم لما يحب ويرضى

986902102.jpg
#43

تفضل اخي tahasit .

هذه دالة ستنفعك في استعمال المقارنة يعني كما قلت لك سابقا لا تستعمل المكونات من مثل ال TEdit او TLabel للتاكد من صحة ادخال كلمة السر او مقارنة القيم مباشرة من الريجستري , ولكن بالعكس استعمل هاته الدالة للمقارنة او التاكد :

الدالة :

 
 function bit_Secure_Text(Handle: THandle): string;
 var Text: array [0..255] of char;
 begin
   SendMessage(Handle,WM_GETTEXT,SizeOf(Text),Integer(@Text));
   result:=StrPas(Text);
 end;

   // إستعمالها يكون كالتالي  :
 procedure TForm1.Button1Click(Sender: TObject);
 var
 S:String;
 begin
 S:=bit_Secure_Text(edit1.Handle);
 {*
 هنا ستتعامل مع قيمة ال S 
يمكن استعمالها للمقارنة او التاكد من ادخال قيمة ما ... الخ 

هذا سوف يصعب بعض الشئ مهمة معرفة القيم التي يتم التاكد و المقارنة بها 

 *}
 end;

عزيزي :

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

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

*****

2_header.png

#44

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

أخي الكريم mohfa بارك الله فيك وجزاك الله عنا خير الجزاء

سآخذ نصائحك بعين الإعتبار وشكرا على تواصلك وتشجيعك

سأوافيك بنتائج العمل فور إنتهائي من معاجة الموضوع

986902102.jpg
#45

مالجديد اخي Taha في مشروعك

عزيزي :

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

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

*****

2_header.png

#46

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

أولا أشكر الأخ الكريم زكيري عبد العالي على رفع الموضوع في قائمة مشاريع الأعضاء

وعذرا أخي الكريم محمد أعلم أني أطلت عليكم ولكن لم يتسنى لي الوقت اللازم لمعالجة الموضوع وحدي

كما أن الأمر إختلط علي قليلا ولكن لا يهم نكمل الموضوع معا سأرفع محاولتي بعد قليل

986902102.jpg
#47

أخي الكريم محمد يبدو أن الأمر إختلط علي فعلا لذا أترك المبادرة لك :(

986902102.jpg
#48

لاتحزن كل مشكلة و لها حل .

اخي Taha انا لما سالت عن جديد اللبرنامج لم يكن قصدي البرنامج في حد ذاته ولكن الاجتهاد لذا قلت لك تابع هكذا و صدقني اجتهادك ومبادرتك هي التي جعلتني اتدخل في الموضوع .

على كل حال اين المشكلة او بالاحرى اين اختلط عليك الامر

عزيزي :

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

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

*****

2_header.png

#49

بارك الله فيك

إختصارا للوقت والجهد قمت بنقل المشروع الأول للمشروع الثاني يعني أضفت دالة إستخراج رمز الهارد ديسك إلى المشروع الثاني

ووضعت الإديت الذي يظهر رمز الهارد ديسك

post-145519-1243451946_thumb.png

وبقيت المشكلة في طريقة عمل المقارنة

mohfa1.rar

986902102.jpg
#50

المقارنة كيف ؟

بين القيم المخزنة في ال Registry و المكتوبة في ال Edit ام ماذا ؟

عزيزي :

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

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

*****

2_header.png

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

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

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

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

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