مرحبـــــــــا مجددا ...
أنا لا أقول أبدا أنة يمكن منع كسر البرامج بشكل قطعي ونهائي , عليك أن تعلم أن كبار شركات العالم لم تستطع تحقيق هذا الهدف .... !
ولكن على كل حال مهما كان الهاكر (الكلمة الأصلية هي كراكر , ولكني سأستخدم الأولى لإنها الأكثر شيوعا) وضيعا فعلينا على الأقل أن نكسب إحترامة , وبالتأكيد الهاكر لن يحترم مبرمج أستطاع كسر منتجة في خمس دقائق , أي وبكل بساطة فقط دعونا نفكر في جعل برامجنا أكثر صعوبة للكسر , ومقتصرة على الهاكرز المحترفين . أي إستبعاد كل اللذين يكسرون البرامج من أجل اللهو والمتعة بعد أن يضيقو ذرعا ببرامجنا , وعليك أن تعلم أن هؤلاء يشكلون النسبة العظمى منهم , وأن تجاوزهم قد يكون مهما كفاية لشخص يهتم بالتسويق الرابح للمنتجات ..
حسنا ,,, إهدأ أولا وركز جيدا , أريدك أن تفهم كلامي جيدا وتمخمخ معي , فأنا لن أتحدث بالتفصيل الممل كما تعتقد صديقي العزيز ,, للأسف خيبت ظنك فأنا أيضا " شغلي لفوق راسي " ولست متفرغ لكتابة مواضيع تراعى فيها الدقة والموضوعية والتفصيل ...... حسنا إذا دعنا نبدأ ببعض النصائح العامة التي لن ندخل بها شفرات دلفي , وسنخصص مقالات أخرى خاصة باللغة دلفي من أجل حماية البرامج ... :
-لا تستخدم أبدا أسماء ذات معنى للتوابع وإجرائيات .
مثال :
• function RegistrationOK: Boolean;
أعرف أن الأسماء التي تحمل معاني مفيدة جيدة جدا من أجل فهم البرنامج وتنقيحة , ولكن إذا كنت مهتما بجعل برنامجك أصعب للكسر لا أنصحك أبدا بإستخدام أسماء توابع تدل على عملها , لإن ذلك سيجعل الهاكر يعرف موقع العمل الصحيح وبالتالي أظن أنة بعد ذلك سيبطل عملة في خمس دقائق .. وسلامة فهمك ؟
-لا تستخدم أبدا رسائل-إعلام إنتهاء الصلاحية أو عدم سماحية كلمة المرور .
مثال :
Invaled Password , please try agine ?
بالتأكيد لن يقوم الهاكر بتفحص 500 كيلوبايت مثلا من شفرة لغة التجميع Assimply لكي يعرف أين يوجد الجزء الخاص من الكود الذي يجب علية تعديلة لكسر كلمة مرورك . ولكنة سيجرب أولا إدخال كلمة عشوائية لكي يعرف ماهي رسالة-إعلام عدم سماحية الكلمة , ويترقب الرسالة الناتجة , والتي تكون مخزنة بصيغة نصية في الملف التنفيذي ويسهل العثور عليها , ثم يبحث عنها في شفرة الآلة لملفك التنفيذي , وبالتأكيد هذا هو الجزء من الشفرة الذي يحوي شرط سماحية كلمة المرور والذي يمكن تعطيلة أو قلبة ببساطة فائقة .. لذلك لا تسمح لة بتحديد موقع العمل بسهولة , تجنب كتابة هذا النوع من الرسائل , أو إفصلة بعيدا عن الجزء الخاص بإختبار كلمة المرور .
-جزء برنامجك إلى ملفات متعددة
-لا تستخدم أبدا أسماء ملفات ذات معنى .
مثال:
License.Dat
لا تجعل الهاكر يتوقع أي ملف يجب أن يبدأ بة أولا , وحاول تضليلة بتشتيت الإجراءات في عدة ملفات بدلا من تجميعها في ملف واحد .
-أستخدم أدوات تشفير الملفات .
لا يكفي أن لانجعل أسماء ملفاتنا تدل عليها , بل يجب تشفير الملفات ما أمكن , ويمكن ذلك ببساطة بإستخدام أدوات خاصة (العديد منها مجاني مع الشفرة, كلف نفسك عناء البحث على النيت ) , هكذا تستطيع جعل الهاكر مشغولا لشهور (إذا أراد المثابرة). وبالتأكيد أذكرك أن لاتضع شفرة التشفير وفك التشفير في نفس البرنامج .
-أضف فترات إنتظار طويلة .
لا تحذر المستخدم مباشرة بعد إنتهاء فترة صلاحية برنامجة , أنتظر قليلا ربما ليوم أو يومين , الهاكرز يكرهون ذلك كثيرا
-أضف فترات إنتظار أخرى .
تأخر ثانية أو ثانيتين بعد إدخال كلمة المرور , بدلا من المباشرة بروتينات التحقق من الصحة , ولا ضير من تنفيذ إجراءات أخرى لاعلاقة لها بها في هذة الفترة , إن ذلك نوع من التموية .
ملاحظة , قد تسبب لك هذة الطريق سيل من الشتائم , أذكرك ..... لن يكون الهاكر راضيا .
-أضف شفرات checksums خاصة.
مثل شفرات التعرف على حجوم ملفات برنامجك ومنع البرنامج من العمل بشكل صحيح عند حدوث أي تغيير في حجوم الملفات , . لإن معظم حالات كسر البرامج يحدث معها تغيير بالزيادة أو النقصان على حجم البرنامج المكسور .
-برىء رسائلك من البرنامج .
بدلا من إستخدام رسائل نصية عادية عند حدوث إستثناءات , قم برفع إستثناءات مشهورة من النظام مثل أخطاء وحدات الأقراص الصلبة و وعدم إستجابة المودم ... الخ إن ذلك سيقود الهاكر إلى الغرق في بحر من التعقيدات والقفزات مع ملفات النظام التي صدر الخطأ منها بدلا من أن يصدر من برنامجك ... (أهلا بك صديقي الهاكر مع لب نظام التشغيل!!)
-رقع برنامجك .....
قم بتعديل شفرتك بحيث تستدعي روتينات تحقق من الصحة مختلفة في كل مرة ,
بإمكانك مثلا تصميم عدة إجراءات تحقق من الصحة , ويتم إستدعاء أحدها بخوارزمية عشوائية في كل مرة ...
لنرى كيف سيغرق أصحابنا الهاكرز بمستنقع من العشوائية ..!!!
لإنة يجب أن تتذكر دائما أن الطرق القياسية والهندسية في العمل سهلة الإكتشاف والتدمير ....
-خزن كلمات المرور في أماكن غير معتادة
بالتأكيد لن تخزن كلمة مرورك في ملف نصي بالإسم Password.txt في نفس مجلد البرنامج ؟؟؟؟
بإمكانك تخزينها في أحد حقول قاعدة البيانات المستخدمة , أو خزنها بملف وأعطة إمتداد DLL وضعة في مجلد النظام SYSTEM32 مثلا , وليكن إسمة RDC123.dll على سبيل المثال .....
-إذا أردت إستخدام رسائل توضيحية للمستخدم , لا تستخدم سلاسل محرفية مخزنة.
إن أول شيء سيحاول الهاكر البحث عنة هو الرسائل النصية لإنة يستطيع بواستطها تحديد أجزاء الكود المختلفة ومعرفة المكان الذي يجب العمل فية , فسيعرف الجزء الخاص بإختبار كلمة المرور مثلا من رسالة : "شكرا لتسجيل الدخول"
لذلك أنصحك بتخزينها جميعها في مكان واحد , على شكل إجراءات مثلا ولتكن في ملف DLL خاص يتم إستدعائها منة ويفضل تنفيذ خوارزمية تشفير معينة مثل عمليات النسخ من السلاسل ,, لإن ذلك سيقطع علية طريق معرفة المكان المناسب للبدء ,..
-لا تفصل إجراء التحقق من الصحة لوحدة بشكل مستقل
لا داعي لجعلة محددا وواضحا , حيث يسهل العثور علية وفهمة وبالتالي منع عملة ,
لذلك أنصحك بكتابة تعليمات التحقق من الصحة في جسم البرنامج الرئيسي , أظن أن ذلك مفيد أكثر ..!
-إستخدم أسماء محجوزة أو شبيهه بها أو أسماء للنظام
بالتأكيد لن تقول لي أنك تخزن كلمة المرور في متحول بالإسم Password ؟؟؟؟
إستخدم أسماء تبدو وكأنها من تعليمات البرنامج والنظام , أو تبدو كأنها رموز ست عشرية
مثال : "73AF" or "GetWindowText "or "handle73").
ربما ستقطع بذلك علية إمكانية التوقع السهل لمتحولاتك .
- لا يفضل إستخدام ميزات التعطيل ,
عندما لايسمح للمستخدم بالقيام بعمل ما , لا تجعل عنصر التحكم الخاص بة معطلا , مثلا لاداعي لجعل القائمة معطلة (رمادية وغير قابلة للضغط) أو الزر غير مفعل , عندما لايحق للمستخدم نظريا القيام بالفعل الخاص بها , بل إترك برنامجك بلا إستجاية (تذكر لا رسائل تنبية ولا إجراءات معاكسة .. ) لإن عدم القيام بإجراء معاكس قد يكون أفضل بكثير من القيام به ,, مثلا لاداعي لإغلاق البرنامج إذا لم تكن كلمة المرور المدخلة صحيحة , لإن العثور على شفرة إغلاق البرنامج سهل للغاية , وبالتالي العثور على الجزء الذي يجب عدم العثور علية ..
بإمكانك إستخدام تعليقات المترجم أيضا :
• {$IFDEF trial}
• ... no action here ...
• {$ELSE}
• ... advanced functionality for registered user ...
• {$ENDIF}
إن جعل كلمات تسجيل الدخول متعلقة بظروف مختلفة أفضل مليون مرة من الكلمات المخزنة سلفا .
مثال أن تكون كلمة المرور متعلقة بالرقم التسلسلي للقرص الصلب , بحيث ستكون مختلفة حسب كل مستخدم وسيضطر المستخدم للإتصال بك للحصول على إذنة الخاص (مع أنها طريقة ناجحة ولكن لا تنغش باتت سهلة الكسر هذة الأيام) ...
نكمل في المرة القادمة ,,, مع ملاحظات أكثر تخصص مع دلفي ..
عروة علي عيسى ..
أنا لا أقول أبدا أنة يمكن منع كسر البرامج بشكل قطعي ونهائي , عليك أن تعلم أن كبار شركات العالم لم تستطع تحقيق هذا الهدف .... !
ولكن على كل حال مهما كان الهاكر (الكلمة الأصلية هي كراكر , ولكني سأستخدم الأولى لإنها الأكثر شيوعا) وضيعا فعلينا على الأقل أن نكسب إحترامة , وبالتأكيد الهاكر لن يحترم مبرمج أستطاع كسر منتجة في خمس دقائق , أي وبكل بساطة فقط دعونا نفكر في جعل برامجنا أكثر صعوبة للكسر , ومقتصرة على الهاكرز المحترفين . أي إستبعاد كل اللذين يكسرون البرامج من أجل اللهو والمتعة بعد أن يضيقو ذرعا ببرامجنا , وعليك أن تعلم أن هؤلاء يشكلون النسبة العظمى منهم , وأن تجاوزهم قد يكون مهما كفاية لشخص يهتم بالتسويق الرابح للمنتجات ..
حسنا ,,, إهدأ أولا وركز جيدا , أريدك أن تفهم كلامي جيدا وتمخمخ معي , فأنا لن أتحدث بالتفصيل الممل كما تعتقد صديقي العزيز ,, للأسف خيبت ظنك فأنا أيضا " شغلي لفوق راسي " ولست متفرغ لكتابة مواضيع تراعى فيها الدقة والموضوعية والتفصيل ...... حسنا إذا دعنا نبدأ ببعض النصائح العامة التي لن ندخل بها شفرات دلفي , وسنخصص مقالات أخرى خاصة باللغة دلفي من أجل حماية البرامج ... :
-لا تستخدم أبدا أسماء ذات معنى للتوابع وإجرائيات .
مثال :
• function RegistrationOK: Boolean;
أعرف أن الأسماء التي تحمل معاني مفيدة جيدة جدا من أجل فهم البرنامج وتنقيحة , ولكن إذا كنت مهتما بجعل برنامجك أصعب للكسر لا أنصحك أبدا بإستخدام أسماء توابع تدل على عملها , لإن ذلك سيجعل الهاكر يعرف موقع العمل الصحيح وبالتالي أظن أنة بعد ذلك سيبطل عملة في خمس دقائق .. وسلامة فهمك ؟
-لا تستخدم أبدا رسائل-إعلام إنتهاء الصلاحية أو عدم سماحية كلمة المرور .
مثال :
Invaled Password , please try agine ?
بالتأكيد لن يقوم الهاكر بتفحص 500 كيلوبايت مثلا من شفرة لغة التجميع Assimply لكي يعرف أين يوجد الجزء الخاص من الكود الذي يجب علية تعديلة لكسر كلمة مرورك . ولكنة سيجرب أولا إدخال كلمة عشوائية لكي يعرف ماهي رسالة-إعلام عدم سماحية الكلمة , ويترقب الرسالة الناتجة , والتي تكون مخزنة بصيغة نصية في الملف التنفيذي ويسهل العثور عليها , ثم يبحث عنها في شفرة الآلة لملفك التنفيذي , وبالتأكيد هذا هو الجزء من الشفرة الذي يحوي شرط سماحية كلمة المرور والذي يمكن تعطيلة أو قلبة ببساطة فائقة .. لذلك لا تسمح لة بتحديد موقع العمل بسهولة , تجنب كتابة هذا النوع من الرسائل , أو إفصلة بعيدا عن الجزء الخاص بإختبار كلمة المرور .
-جزء برنامجك إلى ملفات متعددة
-لا تستخدم أبدا أسماء ملفات ذات معنى .
مثال:
License.Dat
لا تجعل الهاكر يتوقع أي ملف يجب أن يبدأ بة أولا , وحاول تضليلة بتشتيت الإجراءات في عدة ملفات بدلا من تجميعها في ملف واحد .
-أستخدم أدوات تشفير الملفات .
لا يكفي أن لانجعل أسماء ملفاتنا تدل عليها , بل يجب تشفير الملفات ما أمكن , ويمكن ذلك ببساطة بإستخدام أدوات خاصة (العديد منها مجاني مع الشفرة, كلف نفسك عناء البحث على النيت ) , هكذا تستطيع جعل الهاكر مشغولا لشهور (إذا أراد المثابرة). وبالتأكيد أذكرك أن لاتضع شفرة التشفير وفك التشفير في نفس البرنامج .
-أضف فترات إنتظار طويلة .
لا تحذر المستخدم مباشرة بعد إنتهاء فترة صلاحية برنامجة , أنتظر قليلا ربما ليوم أو يومين , الهاكرز يكرهون ذلك كثيرا
-أضف فترات إنتظار أخرى .
تأخر ثانية أو ثانيتين بعد إدخال كلمة المرور , بدلا من المباشرة بروتينات التحقق من الصحة , ولا ضير من تنفيذ إجراءات أخرى لاعلاقة لها بها في هذة الفترة , إن ذلك نوع من التموية .
ملاحظة , قد تسبب لك هذة الطريق سيل من الشتائم , أذكرك ..... لن يكون الهاكر راضيا .
-أضف شفرات checksums خاصة.
مثل شفرات التعرف على حجوم ملفات برنامجك ومنع البرنامج من العمل بشكل صحيح عند حدوث أي تغيير في حجوم الملفات , . لإن معظم حالات كسر البرامج يحدث معها تغيير بالزيادة أو النقصان على حجم البرنامج المكسور .
-برىء رسائلك من البرنامج .
بدلا من إستخدام رسائل نصية عادية عند حدوث إستثناءات , قم برفع إستثناءات مشهورة من النظام مثل أخطاء وحدات الأقراص الصلبة و وعدم إستجابة المودم ... الخ إن ذلك سيقود الهاكر إلى الغرق في بحر من التعقيدات والقفزات مع ملفات النظام التي صدر الخطأ منها بدلا من أن يصدر من برنامجك ... (أهلا بك صديقي الهاكر مع لب نظام التشغيل!!)
-رقع برنامجك .....
قم بتعديل شفرتك بحيث تستدعي روتينات تحقق من الصحة مختلفة في كل مرة ,
بإمكانك مثلا تصميم عدة إجراءات تحقق من الصحة , ويتم إستدعاء أحدها بخوارزمية عشوائية في كل مرة ...
لنرى كيف سيغرق أصحابنا الهاكرز بمستنقع من العشوائية ..!!!
لإنة يجب أن تتذكر دائما أن الطرق القياسية والهندسية في العمل سهلة الإكتشاف والتدمير ....
-خزن كلمات المرور في أماكن غير معتادة
بالتأكيد لن تخزن كلمة مرورك في ملف نصي بالإسم Password.txt في نفس مجلد البرنامج ؟؟؟؟
بإمكانك تخزينها في أحد حقول قاعدة البيانات المستخدمة , أو خزنها بملف وأعطة إمتداد DLL وضعة في مجلد النظام SYSTEM32 مثلا , وليكن إسمة RDC123.dll على سبيل المثال .....
-إذا أردت إستخدام رسائل توضيحية للمستخدم , لا تستخدم سلاسل محرفية مخزنة.
إن أول شيء سيحاول الهاكر البحث عنة هو الرسائل النصية لإنة يستطيع بواستطها تحديد أجزاء الكود المختلفة ومعرفة المكان الذي يجب العمل فية , فسيعرف الجزء الخاص بإختبار كلمة المرور مثلا من رسالة : "شكرا لتسجيل الدخول"
لذلك أنصحك بتخزينها جميعها في مكان واحد , على شكل إجراءات مثلا ولتكن في ملف DLL خاص يتم إستدعائها منة ويفضل تنفيذ خوارزمية تشفير معينة مثل عمليات النسخ من السلاسل ,, لإن ذلك سيقطع علية طريق معرفة المكان المناسب للبدء ,..
-لا تفصل إجراء التحقق من الصحة لوحدة بشكل مستقل
لا داعي لجعلة محددا وواضحا , حيث يسهل العثور علية وفهمة وبالتالي منع عملة ,
لذلك أنصحك بكتابة تعليمات التحقق من الصحة في جسم البرنامج الرئيسي , أظن أن ذلك مفيد أكثر ..!
-إستخدم أسماء محجوزة أو شبيهه بها أو أسماء للنظام
بالتأكيد لن تقول لي أنك تخزن كلمة المرور في متحول بالإسم Password ؟؟؟؟
إستخدم أسماء تبدو وكأنها من تعليمات البرنامج والنظام , أو تبدو كأنها رموز ست عشرية
مثال : "73AF" or "GetWindowText "or "handle73").
ربما ستقطع بذلك علية إمكانية التوقع السهل لمتحولاتك .
- لا يفضل إستخدام ميزات التعطيل ,
عندما لايسمح للمستخدم بالقيام بعمل ما , لا تجعل عنصر التحكم الخاص بة معطلا , مثلا لاداعي لجعل القائمة معطلة (رمادية وغير قابلة للضغط) أو الزر غير مفعل , عندما لايحق للمستخدم نظريا القيام بالفعل الخاص بها , بل إترك برنامجك بلا إستجاية (تذكر لا رسائل تنبية ولا إجراءات معاكسة .. ) لإن عدم القيام بإجراء معاكس قد يكون أفضل بكثير من القيام به ,, مثلا لاداعي لإغلاق البرنامج إذا لم تكن كلمة المرور المدخلة صحيحة , لإن العثور على شفرة إغلاق البرنامج سهل للغاية , وبالتالي العثور على الجزء الذي يجب عدم العثور علية ..
بإمكانك إستخدام تعليقات المترجم أيضا :
• {$IFDEF trial}
• ... no action here ...
• {$ELSE}
• ... advanced functionality for registered user ...
• {$ENDIF}
إن جعل كلمات تسجيل الدخول متعلقة بظروف مختلفة أفضل مليون مرة من الكلمات المخزنة سلفا .
مثال أن تكون كلمة المرور متعلقة بالرقم التسلسلي للقرص الصلب , بحيث ستكون مختلفة حسب كل مستخدم وسيضطر المستخدم للإتصال بك للحصول على إذنة الخاص (مع أنها طريقة ناجحة ولكن لا تنغش باتت سهلة الكسر هذة الأيام) ...
نكمل في المرة القادمة ,,, مع ملاحظات أكثر تخصص مع دلفي ..
عروة علي عيسى ..
المنتديات
التعليقات
Re: كيف تحمي برنامجك من الكســـر ؟
Re: كيف تحمي برنامجك من الكســـر ؟
Re: كيف تحمي برنامجك من الكســـر ؟
object RegButton: TButton Left = 200 Top = 176 Width = 97 Height = 25 Caption = 'Register' TabOrder = 1 OnClick = RegButtonClick end
ماهذا ,, حسنا إنة الزر الذي عنوانة Register حيث بإمكانك أن ترى حجمة وموقعة , وسترى أيضا إسم آخر مع العبارة OnClick ,,, هذا الإسم يخبرنا ما هو إسم الروتين المتولد عند النقر على الزر (الجزء المهم من الطريقة) ,وبالتالي يمكن معرفة عنوان حدث عند النقر لزر تسجيل الدخول Rigister .. وكما أوردنا سابقا سيتم نسب الروتين إلى معالج الحدث عند نقر المستخدم على الزر بواسطة الإسم المرفق مع OnClick وهو RegButtonClick .. وبالتالي الكلمة RegButtonClick ستكون مخزنة بشكل نصي في الملف التنفيذي وسيسهل العثور عليها بأي محرر ست عشري .! وعندما جربت ذلك على محرر ست عشري عثرت عليها بكل بساطة وكان الناتج :000A4990 ____ ____ ____ BC57 4A00 0E52 6567 4275 ______.WJ..RegBu 000A49A0 7474 6F6E 436C 6963 6B__ ____ ____ ____ ttonClick_______
وإذا نظرنا إلى الأرقام التي قبل الإسم , سنجد البايت (0E) والذي يحدد طول ال" RegButtonClick " (14 محرف) . وقبل ذلك يوجد العنوان 004ABC57 . الخ .. لن نخوض كثيرا في ذلك وسوف ننتقل الآن إلى الجزء المهم , وهو كيف نمنع هذا النوع من الكسر . أي النوع الذي يتم الإعتماد فية على معرفة مكان الإجراء المرتبط بعنصر معين عن طريق الإسم .. وبكل بساطة أقول لك ( ذا كنت مهتما بمنع هذا النوع من الكسر طبعا) : لا تستخدم الطريقة الأوتوماتيكية في تعين معالج الحدث لزر معين وذلك بالنقر المزدوج على الزر , أو من مربع النص الخاص بة في ضابط الكائنات , . ولا تستخدم أسماء قياسية مثل " RegButtonClick , بل قم بكتابة شفرة الزر في مكان ما من البرنامج , (على شكل إجراء مثلا )أو ربما في وحدة أخرى غير البرنامج الرئيسي . ثم قم بنسبة يدويا إلى الزر بإستخدام كود مثل :RegButton.OnClick := RButtonClick;
على إفتراض سميتها RbuttonClick , (يفضل إستخدام أسماء لاتدل على عملها) طبعا يجب وضع هذا الكود بعد إنشاء الفورم FormCreate ( ولكن ليس بعد إستدعائة) . بهذة الطريقة لن يسرد إسم الروتين عند إستخدام برامج تجسس الأشكال , وسيصبح العثور على إسم الروتين الخاص أصعب بكثير من الحالة السابقة ... وبالتأكيد طالما لم يستطع الهاكر العثور على مكان الشفرة التي يبحث عنها لن يستطيع فعل شي ذا قيمة ... مثال على نسب الحدث في زمن التشغيل ((النسب الديناميكي)): ننشيء مشروع دلفي جديد , ونضع زر على الفورم . ما نريدة الآن هو تعيين حدث للزر عند النقر علية ولكننا لا نريد إستخدام الطريقة العادية بتحديد OnClick من ضابط الكائنات , أو بالنقر المزدوج على الزر . لذلك سنقوم بنسبة في زمن التشغيل إلى الحدث المناسب . لنقم أولا بإنشاء إجراء بسيط يظهر عبارة Hello world , ((ولكي يقبل النسب إلى TnotifyEvent يجب أن يحوي المتحول الوسيطي Sender )). إذن :procedure TForm1.hi(Sender: TObject) ; begin showmessage('Hello World … '); end;
ثم عند إنشاء الفورم نكتبprocedure TForm1.FormCreate(Sender: TObject); begin Button1.OnClick:=hi; end;
نلاحظ بعد تشغيل البرنامج والضغط على الزر تظهر لنا عبارة Hello World وهكذا نكون حددنا الحدث المطلوب عند النقر على الزر في زمن التشغيل Run Time ,. تستخدم هذة الطريقة في بعض الحالات التي تختلف فيها إستجابة العنصر (زر مثلا) حسب شروط معينة يحددها المستخدم أثناء التشغيل , وبالتالي يمكن تغيير إستجابة عنصر معين حسب الشروط أثناء تشغيل البرنامج . كما أنها مفيدة في حالات أخرى مثل حالتنا هذة . الشفرة الكاملة :unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); private procedure hi(Sender: TObject) ; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure tform1.hi(Sender: TObject) ; begin showmessage('how are you'); end; procedure TForm1.FormCreate(Sender: TObject); begin Button1.OnClick:=hi; end; end.
نكمل قريبا ...Re: كيف تحمي برنامجك من الكســـر ؟
Re: كيف تحمي برنامجك من الكســـر ؟
[ code ] Your code here [ /code ]
ولكن بدون الفراغات ضمن الأمرRe: كيف تحمي برنامجك من الكســـر ؟
إضافة تعليق جديد