
السلام عليكم ورحمة الله تعالى وبركاته
إن الحمد لله نحمده ونستعينه ونستغفره ، ونعوذ بالله من شرور أنفسنا وسيئات أعمالنا ، من يهده الله فلا مضل له ومن يضلل
فلا هادي له ، وأشهد أن لا إلـه إلا الله وحده لا شريك له وأشهد أن محمـدا عبده ورسوله صلى الله عليه وعلى آله وصحبه
وسلم تسليما كثيرا إلى يوم الدين .
أما بعد ، فأهدي سلامي لكل أعضاء وزوار منتدنا الحبيب
.
شاهدوا هذا البرنامج المسكين الذي يطلب منك إدخال السريال ، ألا تجدونه مملا ؟

عندما تدخل سريالا خاطئا تظهر لك هذه الرسالة المزعجة :

ما رأيكم في أن نبرمج لهذا البرنامج باتشا قاتلا ؟ يجعله يتمنى لو لم يبرمجه حمزة
إذا هيا بنا ، أول خطوة علينا أن نقوم بفتح الOLLY

تظهر لنا تعليمات البرنامج بالأسمبلي ، علينا أن نذهب إلى هذا العنوان :

العنوان هو : 00401360
قبل هذا العنوان هناك التعليمة cmp وهي تعليمة تقارن ما أدخلته أنت أي السريال مع السريال الذي يطلبه البرنامج
بعد هذه المقارنة ، نجد التعليمة jnz أو jne وهي تعني "إقفز إذا كان لا يساوي" ، أي سيتم القفز إلى الميساج الذي سوف يعرض
لك في حالة ما إذا أدخلت سريالا صحيحا أو خاطئا .
يا ترى كيف سنستطيع تغيير هذه التعليمة لكي يتم قبول أي سريال يدخله المستخدم ؟
بالنسبة للطريقة فهناك حلين يدوين يمكن تحويلهما إلى برمجة طبعا :
الحل 1 : هو تغيير التعليمة jnz إلى jz أو je أي " إقفز إذا كان يساوي "
الحل 2 : تغيير التعليمة jnz إلى nop أي "لا تعمل أي شيء" وبالتالي تخطي تعليمة المقارنة وعرض رسالة التسجيل.

إلى حد الآن كل شيء واضح ، لكن بقي علينا معرفة الأوفسيت offset لكي نبرمج الباتش .
نفتح هذا البرنامج :

نذهب إلى العنوان الذي استخرجناه بواسطة olly :

لاحظوا أنه أعطانا رقم الأوفسيت والذي هو :760 بالهكس.
بقي شيء واحد لم أذكره ، بعدها سنبرمج الباتش . قلنا سابقا أننا سنستعمل التعليمة nop ولكي نتمكن من استعمال هذه التعليمة في برنامجنا
يجب علينا تحويل هذه التعليمة إلى الهكس أو الديسيمال أي النظام العشري :
nop ==> 90h ==> 144D
هي 90 بالهكس و 144 بالديسمال .
كود سورس الباتش بلغة السي :
// Patch for Serial-Program By Hamza Qdider
int main()
{
char data[]={0x90};// nop التعليمة
int offset=0x760; // رقم الأوفسيت
FILE *Patch; // نصرح بملف
if((Patch=fopen("SerialProgram.exe","r+b"))!=NULL)
{ // نقوم بفتح البرنامج الضحية في وضعية القراءة + البيناري لكي نقوم بالكتابة فيه
fseek(Patch,offset,SEEK_SET);
// هنا نذهب إلى الأوفسيت لكي ندخل التعليمة مع وضع مؤشر القراءة في البدابة
fwrite(data,sizeof(data),sizeof(data),Patch);
// هنا نقوم بكتابة التعليمة في البرنامج
fclose(Patch); // نغلق البرنامج لكي يتم حفظ التغييرات
printf("Patched By Hamza Qdider !!!");
getchar();
}
else{ // في حالة ما إذا تعذر فتح البرنامج أو كان هذا البرنامج غير موجود أصلا
printf("File Not Found !!!");
getchar();
}
return 0;
}
كود سورس الباتش بلغة السي++ :
#include <iostream>
#include <fstream> // مكتبة ضرورية
// Patch for Serial-Program By Hamza Qdider
using namespace std;
int main()
{
ofstream patch;
char nop[1]={0x90};// nop التعليمة
int offset=0x760; //the Offset
patch.open("SerialProgram.exe",ios::in|ios::binary);
// نقوم بفتح البرنامج الضحية في وضعية القراءة + البيناري لكي نقوم بالكتابة فيه
if(patch!=NULL)
{
patch.seekp(offset,ios::beg);
// هنا نذهب إلى الأوفسيت لكي ندخل التعليمة مع وضع مؤشر القراءة في البدابة
patch.write(nop,sizeof(nop));// هنا نقوم بكتابة التعليمة في البرنامج
patch.close(); // نغلق البرنامج لكي يتم حفظ التغييرات
cout << "SerialProgram.exe is Patched"<<endl;
cin.get();
}
else{ // في حالة ما إذا تعذر فتح البرنامج أو كان هذا البرنامج غير موجود أصلا
cout<<"Oops File not Found !!!"<<endl;
cin.get();
}
return 0;
}
ضع الباتش قرب البرنامج أي في نفس مسار البرنامج الضحية، ثم اضغط على الباتش
عد إلى البرنامج ثم أدخل أي سريال و لاحظ هذه الرسالة الجميلة

أتمنى أن يعجبكم الموضوع
السلام عليكم ورحمة الله تعالى وبركاته ،،،
