




السمعة:
- إنضم11 ديسمبر 2023
- المشاركات 186
- الحلول 10
- مستوى التفاعل 288
- النقاط 63
السلام عليكم و رحمة الله تعالى و بركاته
اولا قد تتساءل عن العنوان و لمادا ارتأيت أن أكتبه بتلك الطريقة ,جوابي سهل صراحة لأنني فعلا لست هنا لكسر هاته الحماية التي سنتحدث عنها. لأنه و ببساطة ليست هناك طريقة واضحة لفكها كاملة على حد علمي
ولو أحدكم يعرف شخصا قام بكسرها او صنع اداة لترجمة تعليماتها أرغب جدا في التحدث اليه هههه لأن هناك محاولات عديدة لفكها أشهرها استعمال سكريبت NoVMP و VTIL .الحماية التي سنتكلم عنها اليوم من أشرس الحمايات في المجال الى غاية يومنا هدا .و فيها خاصية تميزها عن غيرها وهي ما سنقوم بتحليلها فقط اليوم . وليس الحماية بالكامل فقط خاصية صغيرة فيها.لدا يمكنك اعتبار الموضوع كمقال بحثي صغير.
نبدة عن حماية vmprotect
VMProtect هو برنامج لحماية البرمجيات من القرصنة والهندسة العكسية. يعمل عن طريق تحويل كود البرنامج إلى تعليمات مخصصة تعمل داخل آلة افتراضية (Virtual Machine) خاصة به، مما يجعل تحليل الكود أو تعديله صعبًا للغاية. كما يوفر ميزات أخرى مثل إخفاء التعليمات البرمجية، والتشفير، وحماية ضد التفكيك (disassembly) والتصيّد العكسي (reverse engineering). يتم استخدامه غالبًا لحماية البرامج التجارية، الألعاب، ومكافحة الكراكات
ط
بدايـــــــــــــــــــــــــــــــــــة :
كل ما سيتم التطرق له في هدا الموضوع ناتج عن تجربتي الخاصة و من خلال بحثي و تحليلي لهاته الحماية.طوال مسيرتي المتواضعة في مجال الهندسة العكسية كانت تواجهني حمايات كثيرة البعض سهل و البعض الاخر صعب .و كل واحدة تحتاج مستوى من الفهم و الوقت لفكها. لكن هاته الحماية بالتحديد جعلتني أتأمل كثيرا في طريقة صنعها و أهم ما شدني اليها هو شيء يسمى بال(virtual machine) .لا تدع عقلك يدهب بك للمحاكاة كما في vmware او virtual box هاته الvirtual machine خاصية مميزة جدا , على الاقل بالنسبة لي ,فالفكرة وراءها عبقرية ,أعرف فقط حمايتين تدعم هاته الخاصية و هي vmprotect و themida .حمايتين قويتين في المجال .جمايتين تجعلك ترفع القبعة للمطورين لأنه حقيقة اقل ما يقال عنهما انهم الافضل في المجال و لن تكون الأفضل في مجالك الا ادا كان هناك شيء مميز فيك.
التحليل :
بعد مواجهاتي العديدة مع هاته الحماية . أسرتني virtual machines الخاصة بها و أردت التعمق أكثر فتعلقت بها الى حد انني أردت انشاء حماية بvirtualalization خاصة بي .و بعد معاناة نجحت لكن بالطبع ليست بمستوى vmprotect ليس حتى 10% من تعقيدها سأتركها لموضوع اخر لو سمحت الضروف.
المهم صنعت بريمج صغير بالأسمبلي لأقوم بحمايته و تحليله . اخترت الأسمبلي لأنني لم أرد كل الdependencies التي في c++ ولا الframworks التي في c# ولم أرد حقا الخوض في معضلة disabling مكاتب CRT.أردت أن أبدأ العمل مباشرة و أردت اداة التي تراه هو ما ستحصل عليه (what you see is what you get) بعد الcompilation و الlinking و من الأفضل في دلك من غير الأسمبلي ( الأسمبلي المنقدة
)
الكود المصدري :
البرنامج سهل يفتح لك dialog box صغيرة كالاتي :
لكن لو لاحضت معي هناك procedure في البداية باسم ITACHI بروك سهلة جدا و تعمدت جعلها سهلة .لدواعي تحليلية
فهاته التعليمات البسيطة ستتحوال لmachine كاملة
نقوم باضافة 2+1 ونضعها في register eax فقط لا أكثر و لا أقل
حماية التطبيق :
بالنسبة لحماية vmprotect تأتي بنسختين واحدة مدفوعة و الاخرى demo , النسخة demo دعنا نقول عنها أنها بدائية و لا تصل لمستوى النسخة المدفوعة و لا توجد بالطبع Virtualization
النسخة المدفوعة حوالي 250 دولار . طبعا من اجل هدا الدرس استعملت نسخة مدفوعة اصدار 3.x و قمت بحماية بريمج x86 bit . هناك فرق بين ال64-بت و 86-بت في طريقة تخزين الregisters و table تدعى handle offset table سنصل لها فيما بعد و العديد من الأشياء الاخرى لمن دعنا نركز على x86
برنامجنا قبل الحماية نجده على هدا الشكل
تعليماتنا بفضل الأسملبي و ااااضحة في الأعلى لدينا call للaddress التي تدهب بنا لITACHI procedure
عند حمايتي للبرنامج قمت بتعطيل كل الoptions بما في دلك خاصية تدعى code mutation وهي خاصية تصعب أكثر التحليل لأنها تضع لك اكواد غير مرغوب فيها junk CODE . مع دلك رغم تعطيلها سنجد ان الحماية تضيف junk code في كل الحالات و هدا امر أثار انتباهي و أردت تنبيهكم لو أراد أحد ان يحللها بأن لا يتفاجأ ادا وجدها .طريقة التغلب على هاته الjunk code بسيطة و توجد العديد من الطرق سأشرح احداها عند البدء في التحليل
بعض الخيارات التي قمت بتعطيلها
خيارات قوية صراحة لكن ليست محور موضوعنا
بعد الحماية :
بعد حماية برنامجنا أول ما ستلاحضه انه تم اضافة section جديدة باسم .vmp0 , هاته الsection تتضمن كود الvirtual machine بأكمله في بعض الحالات لو أضفت بعد الخيارات ستجد انه تم اضافة section أخرى باسم vmp1 يتم وضع فيها handlers table التي تحدثنا عنها من قبل . لكن هاته المرة كل شيء موجود داخل الsection الوحيدة
نفتح برنامجنا بIDA PRO و نرى أنه التعليمات تغيرت بالكامل
ستجد انه تم تعويض 5 bytes الى قفزة لعنوان خارج .text section ونعم كما توقعت عزيزي القارئ .انها اول قفزة لنا لvmp section و تبدأ رحلتنا .
عند تتبعنا للقفزة نجد أنفسنا هنا
ما نبحث عنه حقيقة هو مدخل يدعى VMENTER و هو مدخلنا للvirtual machine هي procedure تحضر الcontext وتخزن registers و تصنع لنا virtual stack و العديد من الأشياء
سنجد ضالتنا هنا الحماية استدعت دالة VMENTER (أطلقت عليها الاسم حتى لا يكون هناك خلط و نتعرف عليها)
قبل الدخول للدالة نجد التعليمات التالية
لاحض معي انه في الصورة السابقة تم دفع القيمة 9F7AA2D2 وهي قيمة مهمة سنتطرق لها فيما بعد لكن وجب تدكرها.
لاحض معي انه تم اضافة قيمة في الاول لreturn address لتصفيره بعدا سيتم دفع القيمة 9F7AA2D2 كبرامتر لVMENTER وهدا ما سيجعلك تشك في دور هاته القيمة
ثم ندخل للمكان الدي سيبدأ فيه كل شيء
هنا سنستهل قراءتنا بأول مثال عن الjunk code التي دكرتها من قبل فادا رأيت esi في الاول يتم تمرير قيمةhard coded 6D60620E له .في بادئ الأمر ضننت أنها قيمة قد تكون لها دلالة في المستقبل لكن بعدها تجد ان esi تم تغيير قيمتها عبر mov esi,ebx و هدا ما يتناقض مع طرحنا الأول.
سنجد أيضا انه تم دفع كل الregisters بدون استثناء وهدا pattern معروف لدى vmp وفي الاخير يتم ادخال 0 للستاك على ما أضن كدلالة على نهاية push instructions
لكي لا نمل من الشرح سنكمل بادن الله حيث وصلنا في الموضوع القادم. ولنرى ادا كان هناك تفاعل مع الموضوع.
و مرحب بكل التساؤلات
اولا قد تتساءل عن العنوان و لمادا ارتأيت أن أكتبه بتلك الطريقة ,جوابي سهل صراحة لأنني فعلا لست هنا لكسر هاته الحماية التي سنتحدث عنها. لأنه و ببساطة ليست هناك طريقة واضحة لفكها كاملة على حد علمي

نبدة عن حماية vmprotect
VMProtect هو برنامج لحماية البرمجيات من القرصنة والهندسة العكسية. يعمل عن طريق تحويل كود البرنامج إلى تعليمات مخصصة تعمل داخل آلة افتراضية (Virtual Machine) خاصة به، مما يجعل تحليل الكود أو تعديله صعبًا للغاية. كما يوفر ميزات أخرى مثل إخفاء التعليمات البرمجية، والتشفير، وحماية ضد التفكيك (disassembly) والتصيّد العكسي (reverse engineering). يتم استخدامه غالبًا لحماية البرامج التجارية، الألعاب، ومكافحة الكراكات
ط
بدايـــــــــــــــــــــــــــــــــــة :
كل ما سيتم التطرق له في هدا الموضوع ناتج عن تجربتي الخاصة و من خلال بحثي و تحليلي لهاته الحماية.طوال مسيرتي المتواضعة في مجال الهندسة العكسية كانت تواجهني حمايات كثيرة البعض سهل و البعض الاخر صعب .و كل واحدة تحتاج مستوى من الفهم و الوقت لفكها. لكن هاته الحماية بالتحديد جعلتني أتأمل كثيرا في طريقة صنعها و أهم ما شدني اليها هو شيء يسمى بال(virtual machine) .لا تدع عقلك يدهب بك للمحاكاة كما في vmware او virtual box هاته الvirtual machine خاصية مميزة جدا , على الاقل بالنسبة لي ,فالفكرة وراءها عبقرية ,أعرف فقط حمايتين تدعم هاته الخاصية و هي vmprotect و themida .حمايتين قويتين في المجال .جمايتين تجعلك ترفع القبعة للمطورين لأنه حقيقة اقل ما يقال عنهما انهم الافضل في المجال و لن تكون الأفضل في مجالك الا ادا كان هناك شيء مميز فيك.
التحليل :
بعد مواجهاتي العديدة مع هاته الحماية . أسرتني virtual machines الخاصة بها و أردت التعمق أكثر فتعلقت بها الى حد انني أردت انشاء حماية بvirtualalization خاصة بي .و بعد معاناة نجحت لكن بالطبع ليست بمستوى vmprotect ليس حتى 10% من تعقيدها سأتركها لموضوع اخر لو سمحت الضروف.
المهم صنعت بريمج صغير بالأسمبلي لأقوم بحمايته و تحليله . اخترت الأسمبلي لأنني لم أرد كل الdependencies التي في c++ ولا الframworks التي في c# ولم أرد حقا الخوض في معضلة disabling مكاتب CRT.أردت أن أبدأ العمل مباشرة و أردت اداة التي تراه هو ما ستحصل عليه (what you see is what you get) بعد الcompilation و الlinking و من الأفضل في دلك من غير الأسمبلي ( الأسمبلي المنقدة

الكود المصدري :
البرنامج سهل يفتح لك dialog box صغيرة كالاتي :
لكن لو لاحضت معي هناك procedure في البداية باسم ITACHI بروك سهلة جدا و تعمدت جعلها سهلة .لدواعي تحليلية

نقوم باضافة 2+1 ونضعها في register eax فقط لا أكثر و لا أقل
حماية التطبيق :
بالنسبة لحماية vmprotect تأتي بنسختين واحدة مدفوعة و الاخرى demo , النسخة demo دعنا نقول عنها أنها بدائية و لا تصل لمستوى النسخة المدفوعة و لا توجد بالطبع Virtualization
النسخة المدفوعة حوالي 250 دولار . طبعا من اجل هدا الدرس استعملت نسخة مدفوعة اصدار 3.x و قمت بحماية بريمج x86 bit . هناك فرق بين ال64-بت و 86-بت في طريقة تخزين الregisters و table تدعى handle offset table سنصل لها فيما بعد و العديد من الأشياء الاخرى لمن دعنا نركز على x86
برنامجنا قبل الحماية نجده على هدا الشكل
تعليماتنا بفضل الأسملبي و ااااضحة في الأعلى لدينا call للaddress التي تدهب بنا لITACHI procedure
عند حمايتي للبرنامج قمت بتعطيل كل الoptions بما في دلك خاصية تدعى code mutation وهي خاصية تصعب أكثر التحليل لأنها تضع لك اكواد غير مرغوب فيها junk CODE . مع دلك رغم تعطيلها سنجد ان الحماية تضيف junk code في كل الحالات و هدا امر أثار انتباهي و أردت تنبيهكم لو أراد أحد ان يحللها بأن لا يتفاجأ ادا وجدها .طريقة التغلب على هاته الjunk code بسيطة و توجد العديد من الطرق سأشرح احداها عند البدء في التحليل
بعض الخيارات التي قمت بتعطيلها
خيارات قوية صراحة لكن ليست محور موضوعنا
بعد الحماية :
بعد حماية برنامجنا أول ما ستلاحضه انه تم اضافة section جديدة باسم .vmp0 , هاته الsection تتضمن كود الvirtual machine بأكمله في بعض الحالات لو أضفت بعد الخيارات ستجد انه تم اضافة section أخرى باسم vmp1 يتم وضع فيها handlers table التي تحدثنا عنها من قبل . لكن هاته المرة كل شيء موجود داخل الsection الوحيدة
نفتح برنامجنا بIDA PRO و نرى أنه التعليمات تغيرت بالكامل
ستجد انه تم تعويض 5 bytes الى قفزة لعنوان خارج .text section ونعم كما توقعت عزيزي القارئ .انها اول قفزة لنا لvmp section و تبدأ رحلتنا .
عند تتبعنا للقفزة نجد أنفسنا هنا
ما نبحث عنه حقيقة هو مدخل يدعى VMENTER و هو مدخلنا للvirtual machine هي procedure تحضر الcontext وتخزن registers و تصنع لنا virtual stack و العديد من الأشياء
سنجد ضالتنا هنا الحماية استدعت دالة VMENTER (أطلقت عليها الاسم حتى لا يكون هناك خلط و نتعرف عليها)
قبل الدخول للدالة نجد التعليمات التالية
push edi
mov edi, 102B5A49h
pushf
and edi, 7AA11CBAh
mov edi, [esp+8+var_4]
mov [esp+8+var_4], 9F7AA2D2h
call sub_464296
تم دفع edi الدي يحتوي هنا على address التعليمة التي وجهتنا لITACHI procedure وقمنا بعدها بدفع flags register و قمنا ببعض العمليات الحسابية عليه لكن في الاخير و ضعنا local variable داخله وهي نفسها الaddress السابقةmov edi, 102B5A49h
pushf
and edi, 7AA11CBAh
mov edi, [esp+8+var_4]
mov [esp+8+var_4], 9F7AA2D2h
call sub_464296
لاحض معي انه في الصورة السابقة تم دفع القيمة 9F7AA2D2 وهي قيمة مهمة سنتطرق لها فيما بعد لكن وجب تدكرها.
ثم ندخل للمكان الدي سيبدأ فيه كل شيء
هنا سنستهل قراءتنا بأول مثال عن الjunk code التي دكرتها من قبل فادا رأيت esi في الاول يتم تمرير قيمةhard coded 6D60620E له .في بادئ الأمر ضننت أنها قيمة قد تكون لها دلالة في المستقبل لكن بعدها تجد ان esi تم تغيير قيمتها عبر mov esi,ebx و هدا ما يتناقض مع طرحنا الأول.
سنجد أيضا انه تم دفع كل الregisters بدون استثناء وهدا pattern معروف لدى vmp وفي الاخير يتم ادخال 0 للستاك على ما أضن كدلالة على نهاية push instructions
لكي لا نمل من الشرح سنكمل بادن الله حيث وصلنا في الموضوع القادم. ولنرى ادا كان هناك تفاعل مع الموضوع.
و مرحب بكل التساؤلات