كود
HANDLE CreateFile(
LPCTSTR lpFileName, // مؤشر للمتغير الذي يحمل إسم الملف
DWORD dwDesiredAccess, // العملية المراد إجرائها على الملف
DWORD dwShareMode, // نمط المشاركة بين العمليات،اي انك بعد فتح المقبض للملف يمكنك ان تحدد نوع المشاركة في الملف مع العمليات الأخرى حذف او قرائة او كتابة.
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // لا يهمك
DWORD dwCreationDistribution, // كيف يتم التعامل مع الملف في حالة وجوده او عدم وجوده
DWORD dwFlagsAndAttributes, // لتحديد نوع الملف،مخفيي ،للقرائة فقط،ملف نظام....
HANDLE hTemplateFile // مقبض لملف تستطيع اخذ الإعدادات منه.
);
القيمة المرجعة هي عبارة عن مقبض للملف تستطيع من خلاله الكتابة او القرائة من وإلى الملف.
الدالة ReadFile :
كود
BOOL ReadFile(
HANDLE hFile, // المقبض المرجع من طرف الدالة CreateFileA
LPVOID lpBuffer, // عنوان لمساحة في الذاكرة او مؤشر لمتغير الذي سيتقبل البينات من الملف
DWORD nNumberOfBytesToRead, // عدد البيانات المراد قرائتها
LPDWORD lpNumberOfBytesRead, // بفر يتم كتابة فيها عدد البايتات التي تم قرائتها
LPOVERLAPPED lpOverlapped // بها بعض التعقيدات لاذلك لا تحتجها لأننا طور التحليل فقط
);
بعد تعريف بسيط للدالتين الان يأتي وقت العمل.
افتح البرنامج ف Olly مع ملاحظة ان البرنامج مضغوط بالــ ASPack 2.001 وسيتم إرفاق نسخة مفكوكة في النهاية.
بعد فتح البرنامج في OllyDBG الان ما نريده منه هو ان يتوقف البرنامج اثناء عملية القرائة من ملف easy.cfg
إضغط CTRL+N لرؤية قائمة الدوال، ضع نقطة توقف على الدالتين CreateFileA و ReadFile وذلك بالضغط على زر الفأرة الأيمن وإختر Set breakpoint on every reference شغل البرنامج بـ F9 سيوتقف البرنامح عند اول عملية فتح مقبض او إنشاء ملف شاهد الصورة.

كما هو موضح في الصورة فإن البرنامج قام بإنشاء مقبض للملف easy.cfg ولذلك تمهيدا لعملية قرائته.
شاهد الصورة.

البرنامج إستدعى دالة القرائة ReadFile لقرائة المحتويات وذلك بإسناد قيمة 289 كطول محدد لحجم البيانات المراد قرائتها و التي تمثل حجم الملف،اتضح ان صاحب البرنامج بعرف حجم الملف في اي جهاز
نعم، ربما في الخصائص او الإعدادات هنالك ملاحظة بأن حجم إسم المستخدم وكلمة السر محددتين المهم،مانستفيده هو انه اما البرنامج لا يستخدم حوارزمية تشفير معينة لأن خوارزمية التشفير يتغير طولها من PlainText إلى آخر ومن جهة اخرى يثبت لنا اما انه يستعمل Hash او Obfuscation Data فقط (نعم هو يستخدمها
كما قلنا سابقا ).
لنلقي نظرة على هذه الصورة المهمة

كما نشاهد في الصورة الجزء المؤطر في أسفل الصورة هي المعلومات التي تم قرائتها من الملف ،و الأهم هو الكود فوق في النافذة الرئيسة،وكما هو مذكور في الصورة فإن ذلك الروتين هو المسؤول عن إستخراج الباسورد مع ملاحظة ان الكود مازال طويلا.
هاهو جزء من الشفرة مع العلم أن الشفرة تتكرر مع تغيير بعض القيم،وهذا الجزء هو الشكل العام لها.
كود
LEA EAX,DWORD PTR SS:[EBP-0xD0]
MOV EDX,DWORD PTR DS:[0x4E7650]
MOV DL,BYTE PTR DS:[EDX+0x14]
MOV BYTE PTR DS:[EAX+0x1],DL
MOV BYTE PTR DS:[EAX],0x1
LEA EDX,DWORD PTR SS:[EBP-0xD0]
LEA EAX,DWORD PTR SS:[EBP-0xD4]
CALL 0x0403144
نأتي الان لشرحها.
كود
LEA EAX,DWORD PTR SS:[EBP-0xD0] // يشير إلى عنوان في المكدس الذي سيتم فيه تخزين الحرف الأول من الباسورد "مسبوقا ب 01" بعد إستخراجه EAXجعل المسجل
MOV EDX,DWORD PTR DS:[0x4E7650] // نقل عنوان المساحة التي تم الكتابة فيها والتي هي تحتوي الان على البيانات من ملف الإعدادات
ملف الإعدادت=easy.cfg
لاحظ هذا اهم جزء:
كود
MOV DL,BYTE PTR DS:[EDX+0x14]
نعلم أن المسجل EDX يشير الان إلى محتويات الملف،نلاحظ هنا في هذا الكود أن البرنامج يقوم بأخذ البايت رقم 20 "14 في HEX" إبتداءا من من بداية الملف ونقله إلى المسجل DL،لماذا ياترى؟..يقوم بنقل ذلك الحرف الذي يمثل E إلى المسجل DL؟ ألآ يعني ذلك الحرف شيئ...دعونا نكتشف ذلك مع الأكواد الأخرى.
كود
MOV BYTE PTR DS:[EAX+0x1],DL
نقل محتويات المسجل DL إلى العنوان المسجل في EAX زائد 1 اي وكما ذكرنا سابقا ان هذا العنوان هو الذي سيتم فيه تخزين الحرف الأول من السلسلة، اذاا حرف E جزء من الباسورد ، نعم هو كذلك لأن الباسورد الذي قمت بوضعه او الباسورد الإفتراضي هو EASYCAFE اي انه يبدأ بـحرف E دعونا نتابع ونعرف الباقي.
كود
MOV BYTE PTR DS:[EAX],0x1
هذه التعليمة هي المسؤولة عن كتابة رقم 1 (الرقم 01 في النزام السداسي عشر يقابله 1 في النظام العشري) قبل الحرف وذلك لأنه سيتم جمعه بعد قليل مع الرقم 1 الذي يكون قبل الحرف الثاني من السلسلة وبالتالي فإن المجموع سيكون 2 وسيشير إلى أن المعلومات التي تم قرائتها 2.
هذه الثلاث التعليمات هي التي تفيدنا أما التعليمات الأخرى Call و التعليمة الأخيرة أظن انها لن تفيدنا فهي مخصصة لحساب طول سلسلة الباسورد و اشياء اخرى.
الآن ننتقل للأكواد الثلاثة الأخرى:
كود
LEA EAX,DWORD PTR SS:[EBP-0xD8] // يشير إلى عنوان في المكدس الذي سيتم فيه تخزين الحرف الثاني من الباسورد بعد إستخراجه EAXجعل المسجل
MOV EDX,DWORD PTR DS:[0x4E7650] // كالعادة عنوان المساحة التي تحتوي على بيانات الملف.
الآن نأتي للتعليمة المهمة:
كود
MOV DL,BYTE PTR DS:[EDX+0x22]
مثل سابقتها نقل البايت الموجود في الموضع 34 "22 بـ HEX" إلى المسجل DL،هذا ان دل على شيئ فإنه يدل على أن البرنامج يختار بايتات معينة هي التي تمثل الباسورد ويقوم بإضافة Obfuscation Data فقط،الآن ماهو الحرف او البايت الموجود في الموقع 34؟
إتضح أن البايت هو الحرف A وهو الحرف الثاني من الباسورد الإفتراضي E ASYCAFE
الآن لن نكمل شرح التعليمات الأخر وما سنقوم به هو إستخراج التعليمة التي تكون باشكل التالي:
كود
MOV DL,BYTE PTR DS:[EDX+0x??]
وهي:
كود
MOV DL,BYTE PTR DS:[EDX+0x14]
MOV DL,BYTE PTR DS:[EDX+0x22]
MOV DL,BYTE PTR DS:[EDX+0x28]
MOV DL,BYTE PTR DS:[EDX+0x30]
MOV DL,BYTE PTR DS:[EDX+0x3D]
MOV DL,BYTE PTR DS:[EDX+0x68]
MOV DL,BYTE PTR DS:[EDX+0x6E]
MOV DL,BYTE PTR DS:[EDX+0x85]
MOV DL,BYTE PTR DS:[EDX+0xCA]
MOV DL,BYTE PTR DS:[EDX+0xE3]
من هذا الكود نستنتج أن المواقع التالية تمثل اماكن أحرف الباسورد:
في النظام السداسي عشر Hexadecimal
كود
0x14,0x22,0x28,0x30,0x3D,0x68,0x6E,0x85,0xCA,0xE3
في النظام الثماني decimal
كود
14,34,40,48,61,104,110,133,202,277
شاهد الصورة بعد جمع الباسورد وإتمام عملية إستخارجه.

فيما يخض تلك المسافات بعد بعد كلمة السر فإن البرنامج يقوم بوضعها لأن اقصى حد لكلمة السر هو 10 أحرف "0A"،كلمة EASYCAFE مكونة من 8 احرف + الفراغين "الفراغ هو بمثابة الضغط على Space في لوحة لمفاتيح ويقابله الرقم 20 في HEX"و المجموع يكون 10،وهذا عيب في البرنامج فماذا لو وضعت فراغ في كلة السر؟طبعا لن يقبلها وسيتوقف عندها واذا اردت التجريب ضع الباسورد بالشكل التالي EASY CAFE وسترى ان البرنامج لن يعمل وستقف عاجز امام شاشة طلب كلمة السر.
نسيت امرا قد كنا تحدثنا عنه وهو إسم المستخدم وظهوره بهذا الشكل TINASOFTsper.
إفتح البرنامج في محرر HEX و انظر قبل السلسلة مباشرة لاحظ.

هل ترى الرقم 08 ذلك يشير إلى طول السلسلة "سلسلة إسم المستخدم"،وبالتالي اثناء عملية القرائة فإنه يتم تجاهل الحروف الأخيرة التي تمثل "sper".
مرحلة كتابة الإستثمار:
سنقوم فيه بكتابة الأكواد المهمة و الخاصة بإستخراج الباسورد،صادفتني مشكلة مع عملية إنشاء مقبض عندما يكون البرنامج يعمل لا اعلم لماذا رغم أن البرنامج وضع خيار SaredMode للقرائة و الكتابة لذلك قمت بنسخ ملف الإعدادات و القرائة منه،ربما يفيدنا بعض الإخوة في هذا الأمر.
وهذا الكود غير كامل لكن يوصل الفكرة،وضعته هكذا لكي لا يستعمله الذين في قلوبهم مرض "اصحاب النسخ واللصق"
واني ابرئ ذمتي امام الله من اي عمل غير شرعي فيه اذية للمؤمنين.
كود
invoke CopyFile,addr easyPath,addr newPath,0
invoke CreateFile,addr newPath,GENERIC_READ,FILE_SHARE_READ and FILE_SHARE_WRITE ,0,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE and FILE_ATTRIBUTE_HIDDEN,0
mov FileHandle,eax
invoke ReadFile,FileHandle,addr filecontent,121h,addr address,0
xor eax,eax
xor edx,edx
mov eax,offset password
///////////////إستخراج الباسورد من البيانات/////////////////
mov dl,byte ptr [filecontent+14h]
MOV BYTE PTR DS:[eax],dl
mov dl,byte ptr [filecontent+22h]
MOV BYTE PTR DS:[eax+1h],dl
mov dl,byte ptr [filecontent+28h]
MOV BYTE PTR DS:[eax+2h],dl
mov dl,byte ptr [filecontent+30h]
MOV BYTE PTR DS:[eax+3h],dl
mov dl,byte ptr [filecontent+3Dh]
MOV BYTE PTR DS:[eax+4h],dl
mov dl,byte ptr [filecontent+68h]
MOV BYTE PTR DS:[eax+5h],dl
mov dl,byte ptr [filecontent+6Eh]
MOV BYTE PTR DS:[eax+6h],dl
mov dl,byte ptr [filecontent+85h]
MOV BYTE PTR DS:[eax+7h],dl
mov dl,byte ptr [filecontent+0cah]
MOV BYTE PTR DS:[eax+8h],dl
mov dl,byte ptr [filecontent+0E3h]
MOV BYTE PTR DS:[eax+9h],dl
//////////////////////////////////////////////////////////////////
invoke MessageBox,0,addr password,addr titl,MB_OK
invoke CloseHandle,FileHandle
ملاحظة:
الثغرة موجودة في هذا الإصدار لا اعلم ان كانت الإصدارات الأخرى او التحديثات ترقع هذه الثغرة،وهنالك شيئ آخر اذا اردت تطبيق الدرس انتبه للمشاكل الذي ستحدث من بينها تشغيل البرنامج في Startup او إغلاق البرنامج من Olly ثم يظهر من جديد ويطلب منك الباسورد لذلك تأكد قبل الخروج من Olly أن تغلق العملية guardit.exe لكي لا يتم تشغيله بعد إغلاق البرنامج من Olly،احذر من ان تدخل كلمة سر فيها فراغ.
في الأخير اردت ان اجمع فيها هذا الدرس بين تحليل الثغرات و البرمجة بالأسمبلي فأرجوا من الله ان يوفقني فيما اردت.
تقبلوا إعتذاري ان كان الدرس غير مفهوم او فيه بعض الغموض لذلك لا تتردد بالإستفسار.
لقد تم إرفاق الصور لمن يعاني مشكلة في الإتصال.
واختم كلامي بالصلاة على المصطفى، صلى الله عليه وسلم.
الملفات المرفقة