بسم الله الرحمن الرحيم
السلام عليكم,,,,
برمجة الـــ Crackme هو مستوى متقدم من عالم كسر البرامج (Cracking)
لماذا برمجة الــ Crackme ؟
هناك العديد من العوامل :
إجتناب كسر البرامج التجارية محفوظة الحقوق, حيث يمنع حتى عكسها
تعلم حماية البرامج و هذا يتطلب منك خبرة في كسر البرامج
عامل آخر و هو التحدي بين خبراء هذا المجال, حيث أن كسر حماية crackme تكون أصعب من كسر برنامج عادي, لأن من برمج هذا الــ crackeme هو خبير في كسر حماية و أ كيد مبرمج أسمبلي محترف
ملاحظة : حماية برنامج و أنت لست مبرمج أسمبلي تكون شبه معدومة إلا عند إستعمال برامج التشفير, عموما لغة الأسمبلي مهمة جدا و أنصحك أن لا تتردد في تعلمها لأن متعة البرمجة تكون في هذه اللغة أكثر من لغة أخرى
لنبدخل في الموضوع
سأقدم مثال بسيط لـ crackme, ويمكنكم أن تعدلوا ما تريدون فيه
أولا في برمجة الــ crackmes تقوم بتجهيز شكله أي النافذة و الأزرار ...
هنا سنستعمل أي برنامج يحرر المصادر (Resource Editor) و أنا سأستعمل محرر Winasm لعمل هذا
على فكرة يمكن تجهيز واجهة الــ crackme بالبرمجة لكن سيكون الأمر صعب و طويل
لن أشرح كيف نقوم بعمل صندوق تخاطب (DialogBox) و مكوناته لأنه سهل فافتح محرر مصادر Winasm و تفنن كما تشاء
هنا سأضع script لملف مصدر من عندي
#define IDD_DLG 100 #define IDC_LBL1 200 #define IDC_NAME 201 #define IDC_OK 202 #define IDC_SERIAL 1001 #define IDC_LBL2 1002 #define IDC_ABOUT 1003 #define IDC_EXIT 1004 #define ICO 2000 1 24 DISCARDABLE "XPVisualStyle.xml" ICO ICON DISCARDABLE "إسم الأيقونة.ico" IDD_DLG DIALOGEX 6,5,146,56 CAPTION "CrackMe - Z3r0n3" FONT 8,"MS Sans Serif" STYLE 0x90ca0800 EXSTYLE 0x00000080 BEGIN CONTROL "Name",IDC_LBL1,"Static",0x50001201,2,1,24,11,0x00000000 CONTROL "",IDC_NAME,"Edit",0x50010080,30,1,114,11,0x00000200 CONTROL "OK",IDC_OK,"Button",0x50010001,0,37,44,13,0x00000000 CONTROL "",IDC_SERIAL,"Edit",0x50010080,30,18,114,11,0x00000200 CONTROL "Serial",IDC_LBL2,"Static",0x50001201,2,17,24,11,0x00000000 CONTROL "About",IDC_ABOUT,"Button",0x50010001,50,37,44,13,0x00000000 CONTROL "Exit",IDC_EXIT,"Button",0x50010001,100,37,44,13,0x00000000 END
إفتح برنامج Winasm و إختر New Project ثم Standard EXE
من نافذ Explorer, كليك يمين و إختر Add New RC
إضغط F12 ثم إنسخ الــ script
ثم أعد الضعط على F12 ليظهر لك محتوى الــ script
حسنا, الآن شكل crackme جاهز و ما نحتاجه من الــ script هو معرفات محتويات النافذة و أسمائها و ذلك بالضغط على F12 ثم أنسخ كل الأسطر التي تبدأ بـ #define
في مفكرة جديدة سنحتاجه لاحقا
الآن ندخل في برمجة crackme
إضغط على ملف .asm لنبدأ بكتابة الكود
أكتب التالي:
.386 .model flat,stdcall Option casemap:none Include windows.inc Include kernel32.inc Include user32.inc Includelib kernel32.lib Includelib user32.lib
أظن أن هذا الجزء واضح, فقط قمنا بوضع لائحة التضمينات التي تحتوي على المكاتب التي سيستعملها برنامجنا
نكمل:
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
هنا أبلغنا البرنامج بأننا سنقوم باستعمال إجراء يأخذ 4 بارامتر من نوع DWORD
لنكمل البرنامج :
.const IDD_DLG equ 100 IDC_LBL1 equ 200 IDC_NAME equ 201 IDC_OK equ 202 IDC_SERIAL equ 1001 IDC_LBL2 equ 1002 IDC_ABOUT equ 1003 IDC_EXIT equ 1004
هنا أظفنا قسم خاص بالثوابت و وضعنا في معرفات النافذة كما هي فقط حذفنا #define و أضفنا equ قبل الارقام
ندخل في قسم المتغيرات
.data Cap DB "Crackme",0 Aboutmsg DB "CodedBy Z3r0n3",0 Errmsg DB "Invalid serial",0 Sucmsg DB "Valid serial",0
أضفنا قسم متغيرات و وضعنا الرسائل التي نحتاجها
.data? hInst HINSTANCE ? userbuffer DB 32 dup(?) passbuffer DB 32 dup(?) validpass DB 32 dup(?)
هنا أضفنا قسم متغيرات لا تحتوي على قيمة إبتدائية و فيه :
hInst : و هو مقبض صندوق التخاطب
Userbuffer : هنا سنضع إسم المستخدم المدخل
Passbuffer : نضع فيه السريال المدخل
Validpass : بعد ما نستخرج السريال الصحيح لإسم المستخدم نضعه هنا لنقارنه مع المدخل
الآن لندخل في قسم الكود :
.code Start: Invoke GetModuleHandle,NULL MOV hInst,EAX Invoke DialogBoxParam,hInst,IDD_DLG,0,DlgProc,0 Invoke ExitProcess,0
GetModuleHandle : نجلب بها مقبض البرنامج
MOV hInst,EAX : نضع المقبض في المتغير الخاص به
DialogBoxParam : هذه تحدث لنا صندوق تخاطب نحدده كنافذة رئيسية لبرنامجنا حسب الإجراء الذي نحدده و تأخذ 5 بارامتر :
1/ مقبض البرنامج
2/ إسم الــ DialogBox
3/ لا يهم
4/ إسم الإجراء الخاص بمدخلات و مخرجات البرنامج
5/ لا يهم
ExitProcess : عند الضغط على زر إقفال ينفذ البرنامج هذه الدالة للخروج من التنفيذ
وهنا يبدأ الجزء الأهم في البرنامج و هو الإجرء DlgProc
التبليغ عن الإجراء :
DlgProc proc hwnd:HWND,msg:UINT,wparam:WPARAM,lparam:LPARAM
hwnd:HWND : هذا مقبض الــ DialogBox
Msg:UINT : هنا توضع الرسائل (تتعامل البرامج مع المدخلات و المخرجات بالرسائل)
Wparam:WPARAM : هنا ترجع المدخلات (مثال : معرف الزر الذي ضغط)
Lparam:LPARAM : هنا أيضا ترجع مدخلات أخرى (مثال : إحداثيات مؤشر الفأرة)
لنكمل :
.if msg==WM_COMMAND MOV eax,wparam
هنا إذا كان المدخل زر سنقوم بوضع معرف الزر في EAX
.if ax== IDC_ABOUT Invoke MessagBox,hwnd,addr aboutmsg,addr cap,MB_OK .elseif ax== IDC_EXIT Invoke SendMessage,hwnd,WM_CLOSE,0,0
1/ إذا ضغط المستعمل على زر About سيخرج له رسالة
2/ إذا ضغط المستعمل على زر Exit, نرسل رسالة نخبرفيها بأن المستعمل يريد إنهاء البرنامج
.elseif ax==IDC_OK Invoke GetDlgItemText,hwnd,IDC_LBL1,addr userbuffer,32 Invoke GetDlgItemText,hwnd,IDC_LBL2,addr passbuffer,32 CALL CHECK Invoke lstrcmp,addr passbuffer,addr validpass Cmp EAX,0 JNE Wrong Invoke MessageBox,hwnd,addr sucmsg,addr cap,MB_OK JMP continue Wrong: Invoke MessageBox,hwnd,addr errmsg,addr cap,MB_OK Contine: .endif
حسنا إن ضغط المستعمل على زر OK يقوم البرنامج بجلب الإسم المدخل و السريال و وضعهم في حجراتهم
ثم يستدعي إجراء يقوم بحساب السريال الصحيح حسب الإسم المدخل. يمكنك وضع في هذا الإجراء الطريقة أو الفكرة التي تريد بها تشفير إسم المستخدم
و إن شاء إن سمحت لي الفرصة سأضع في هذا الموضوع مثال للتشفير
نكمل الشرح, بعد ما يستخرج الإجراء السريال الصحيح يصعه في مكانه في المتغير المخصص لذلك
ثم إستعملنا دالة lstrcmp التي تقوم بمقارنة متغيرين حيث ترجع القيمة 0 في المسجل EAX إذا كان مساويين بخلاف القيمة 0 يعني ليس مساووين
ثم قارنا المسجل EAX مع 0 و إذا كان مخالف نقفز إلى رسالة الخطأ, إذا كان مساوي نظهر رسالة الصح و نقفز لإكمال عملية فحص المدخلات و ذلك لتجنب ظهور رسالة الخطأ
نكمل بقيمة البرنامج:
.elseif msg==WM_CLOSE Invoke EndDialog,hwnd,0 .endif XOR EAX,EAX Ret DlgProc endp
إذا كانت الرسالة هي CLOSE يقوم البرنامج بإنهاء الخطاب
ملاحظة :
كود البرنامج لم أقم بتجربته يعني أنه يمكن أن يحتوي على أخطاء
هذا أبسط crackme ستراه في حياتك مع الـــ cracking
إلى اللقاء
