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

برمجة ال Crackmes

بدأه Z3r0n3 في 16 يوليو 2010 · 2 رد · 1,022 مشاهدة · في منتدى تحليل التطبيقات البرمجية وحمايتها
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

السلام عليكم,,,,

برمجة الـــ 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

إلى اللقاء

تم تعديل هذه المشاركة بواسطة Xacker في 1 أغسطس 2010 في 20:53

#2

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

Z3r0n3 كتب:

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

ليس شرطا ان تكون مبرمج Assembly بقدر وجوب اتقان لغة برمجة والتمكن من النظام الذي تعمل عليه الحماية

d4baa0.gif
#3

قلت هذا لأن مبرمج الأسمبلي يتعامل مع المسجلات أكثر من ما يتعامله مبرمج لغة أخرى

انا قلت هذا لأن عند كسري لعديد البرامج غير مكتوبة بالأسمبلي , بعد تنفيذ دالة حساب الكود يظهر لي السريال الصحيح في أحد المسجلات

شكرا

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