• الإعلانات

    • فيصل الحربي

      تسجيل عضوية جديدة في المنتدى   01/31/2016

      السلام عليكم ورحمة الله وبركاته  عزيزي العضو الجديد :  حاليا رسالة الإيميل لتأكيد صحة إيميلكم تذهب للبريد العشوائي ( جاري حل المشكلة )  فإذا لم تجد رسالة التحقق من إيميلكم في صندوق الوارد لديكم إتجه للبريد العشوائي ( JUNK)  وقم بتفعيل إشتراككم من هناك   

Z3r0n3

مشرف مساعد
  • عدد المشاركات

    130
  • تاريخ الانضمام

  • تاريخ اخر زياره

كل شيء نشر بواسطة Z3r0n3

  1. بسم الله الرحمن الرحيم اولا قبل أن تقرأ هذا الدرس قم بقرائة الدرس على الرابط التالي : http://www.arabteam2000-forum.com/index.php?showtopic=221036&st=0&p=1092210entry1092210 للأننا سنستعمله في آخر خطوة من هذا الدرس حمل الملف المرفق و شغل البرنامج: لدينا نافذة تحتوي على قائمة, إضغط على ReverseMe ماذا حدث؟ لم يحدث شيئ, و ما سنقوم به في هذا الدرس هو إخراج صندوق رسالة عند الضغط على ReverseMe الدرس سيكون على المراحل التالية: 1/ المرحلة الأولى : */ سنتعرف على نوعين من الرسائل التي ترسلها النافذة الى البرنامج */ سنرى كيف يقوم البرنامج المرفق بفحص مدخلات النافذة 2/ المرحلة الثانية من الدرس ستكون كالتالي : */ تحديد قفزة شرطية مناسبة نقفز بها الى عنوان فارغ إخترناه في البرنامج */ نقوم بالبرمجة العكسية للبرنامج و نحفظ التغييرات و نشغل البرنامج 1/ المرحلة الأولى */أنواع الرسائل : WM_DESTROY : هذه الرسالة ترسلها النافذة الى البرنامج لتطلب منه أمر الإقفال عند الضغط على زر قفل WM_COMMAND : هذه الرسالة ترسلها النافذة الى البرنامج عند الضغط على زر ما (مثل : ReverseMe ) هناك الكثير من الرسائل التي ترسلها النافذة الى البرنامج, هاتين الرسالتين أكيد ستجدهم في أغلب البرامج هذه الرسائل تقارن مع متقبل الرسائل إسمه UINT و في ollydbg ستجده دائما [ARG.2] يعني عندما تراى في olly [ARG.2] إعرف أنه متقبل الرسائل */ كيف يقوم البرنامج بفحص المدخلات افتح البرنامج في ollydbg ستجد أنه يوجد 3 اجرائات, الأول عند العنوان 401000 الثاني في 401031 و مايهمنا هو الثالث في 401118 وهو الذي يهمنا إذهب إليه شاهد الصورة1: ماذا لدينا: 1/ مقارنة [ARG.2] مع الرسالة 2 (2=WM_DESTROY) تتحقق عند الضغط على زر قفل 2/ قفزة شرطية تكون صالحة للقفز الى العنوان 40112A عندما لاتتحقق المقارنة (رقم 1 في الصورة) 3/ أن تحققت المقارنة (رقم 1 في الصورة) ينفذ البرنامج أمر الإقفال ثم يقوم بقفزة غير شرطية الى العنوان 40113F وهي نهاية الإجراء أو نهاية عملية فحص مدخلات النافذة هذا المبدأ من عملية فحص المدخلات ستجده يتكرر في أغلبية البرامج 2/ المرحلة الثانية */ تحديد قفزة مشروطة مناسبة سنبحث عن قفزة مشروطة و نغيرها الى بداية الكود الخاص بنا بمأن هذا الإجراء فيه قفزة مشروطة واحدة فإنها هي التي نبحث عنها (رقم 2 في الصورة) عنوانها : 40111F ثم نختار بداية مكان فارغ في البرنامج لنحقن فيه الكود الصورة 2: أنا سأختار العنوان 40119C نقوم أولا بتغيير القفزة المشروطة الى عنواننا: اذهب الى العنوان 40111F , كليك يمين , اختار Assembe , اكتب Jne 40119c */ البرمجة العكسية فكرة عن الكود الذي سنحقنه: 1/ مقارنة [ARG.2] مع الرسالة 111 (111=WM_COMMAND) تتحقق عند الضغط على زر ما (مثل : ReverseMe ) 2/ إن لم تتحقق المقارنة يقفز الى 40112A مثل ماحصل في المقارنة السابقة (قفزة شرطية) 3/ إن تحققت المقارنة يخرج لنا صندوق رسالة ثم يقفز الى 40113F مثل ماحصل في المقارنة السابقة أيضا ملاحظة : قبل كتابة الكود يجب معرفة عنوان [ARG.2] في الذاكرة لنجري المقارنة إليكم ماذا سنفعل : اذهب الى عنوان مقارنة [ARG.2] مع الرسالة 2 (رقم 1 في الصورة1) الى من ضل الطريق, العنوان هو : 40111F كليك يمين , إختار Assemble و انسخ عنوان [ARG.2] في Notepad لنستعمله شاهد الصورة3: أنا أعرف أن هناك من لم يعرف إستخراج عنوان [ARG.2] لكن لا مشكلة سوف تجده في الكود الذي سأقدمه لمن يحب الإستهلاك فقط إذهب الى عنواننا الذي إخترناه و هو : 40119C و اكتب الكود الكود النهائي بالأسمبلي : CMP DWORD PTR SS:[EBP+C],111 JNE 40112A كود الرسالة Jmp 40113F كود الرسالة هو تمارين موجه لك و هو يتضمن : الكتابة في قسم البيانات: عنوان صندوق الرسالة محتوى الرسالة الكتابة في قسم الكود : تنفيذ دالة الرسالة هذا التمرين رأيناه في درسي الأول : إن اجتزت التمارين قم بحفظ التغييرات (رأيناه في الدرس السابق) و شغل البرنامج أما أنا فقد تحصلت عند الضغط على ReverseMe : ماذا عنكم؟ الى هنا ينتهي الدرس هذا هو ثاني درس لي و يمكن يكون آخر درس اقدمه في هذا المنتدى للأني لم أجد أي تفاعل لللأعضاء في درسي الأول يعني أن اللأعضاء لا يابهون بعالم البرمجة العكسية بتاتا أنتظر الرد و النقد منكم و الإستفسارات عن هذا الدرس أو سابقه Z3r0n3-ReverseMe.zip
  2. شرح الأخطاء التي تقع في البرامج و طريقة إصلاحها تجعلك خبير في البرمجة وهنا أشرح أخطاء و مشاكل مهمين يمكن أن تعترظك في البرمجة بالأسمبلي المشكل الرئيسي هو في كتابة الأرقام ذو حرفين أو أكثر (مثل 10,200,5000,10000...) طرح مشكلة تطبيقية : نختار رقم في برنامجنا (سأختار 5), نطلب من المستعمل أن يدخل أي رقم *-إذا كان الرقم مخالف للذي إخترناه, نطبع رسالة خطأ تقول بأنه ليس الرقم الصحيح ثم يعاود الإدخال *-إذا كان نفس الرقم الذي إخترناه, نطبع رسالة أنه وجد الرقم الصحيح وكذلك عدد مرات المحاولات قم بإنجاز برنامج يحل هذه المشكلة ثم إرجع إلى هذا الموضوع و سترى الأخطاء التي يتظمنها برنامجك الأخطاء التي يمكن أن يعترضك: أظن أن المشكلة سهلة, لكن الصعب هو في إظهار عدد مرات المحاولات أنت تقول لماذا ؟ (نستطيع إستعمال أي مسجل كعداد وكل مرة يدخل فيها رقم, نضيف 1 إلى المسجل العداد) أنا أيضا قلت نفس الكلام لكن المشكلة ليس في حساب عدد مرات المحاولات بل المشكل في كتابة عدد مرات المحاولات أنت تقول لماذا ؟ (نستطيع أن نطبع مباشرة عدد المرات من المسجل العداد) أنا أيضا قلت هذا الكلام لكن ظهر خاطأ, وسأضع لك أكواد كل الأخطاء التي مررت بها وإليك البرنامج الأول الذي كتبته لحل المشكلة : .model small .code Msg1 db 0Ah,"Enter a number in [0..9] :",0Ah,0Dh,"$" Msg2 db 0Ah,"Congratulation!, You find the right number",0Ah,"$" Msg3 db 0Ah,"Your number is wrong, try again",0Ah,"$" Msg4 db 0Ah,"Number Of trying is : ","$" start: PUSH CS POP DS MOV CL,00h OPERATION: MOV AH,9h MOV DX,OFFSET Msg1 INT 21h MOV AH,1h INT 21h CMP AL,35h JNZ WRONG INC CL MOV AH,9h MOV DX,OFFSET Msg2 INT 21h MOV AH,9h MOV DX,OFFSET Msg4 INT 21h MOV AH,2h MOV DL,CL INT 21h MOV AH,7h INT 21h MOV AH,4Ch INT 21h WRONG: MOV AH,9h MOV DX,OFFSET Msg3 INT 21h INC CL JMP OPERATION end start بعد ما إنتهيت, قلت هذا هو الحل J, عندما جربت البرنامج وجدته يشتغل بطريقة صحيحة لكن في عدد مرات المحاولات دائما يطبع لي رموز مثل ☺ هل هذا عدد المرات, طبعا لا لأن عدد المرات سيكون أرقام ليس رموز راجعت الكود عديد المرات, وتوصلت بأن الخطأ في السطر التالي: MOV CL,00h وهو عندما وضعت القيمة 00 في CL (عداد مرات المحاولات) لنفترظ أننا حاولنا 9 مرات لندخل الرقم الصحيح (من المفروض أن يطبع حرف 9) قيمة CL ستصبح 09هيكس, وعند طباعة محتواه سيطبع البرنامج كود ASCII لــ 09هيكس رجعت إلى الكود ASCII, وجدت أن مقابل 9هيكس في الأحرف هو : Char HEX DEC TAB (horizontal tab) 9 9 حسنا, أظن أن الخطأ أصبح واضحا أنا لا أريد طباعة TAB بل حرف 9 بحثت قليلا في الكود ASCII عن حرف 9 ووجدت: Char HEX DEC 9 39 57 عندها توضح لي الخطأ أن حرف 9 يساوي 39هيكس و ليس 9هيكس الذي يحمله CL تصحيح الخطأ هو أن نضع القيمة 30هيكس في CL (30هيكس = حرف 0) يعني يصبح هكذا : MOV CL,30h أو يمكن ان نضع مباشرتا حرف 0 هكذا MOV CL,'0' بعد تصحيح الخطأ جربت البرنامج, فتحته وحاولت 9مرات لأدخل الرقم الصحيح وفعلا طبع حرف 9. أنا قلت هذا هو الحل النهائي فتحت البرنامج مجددا وحاولت 10مرات لأدخل الرقم الصحيح و النتيجة طبع لي حرف ":" لماذا ؟ : نعلم أن كود ASCIIلحرف 9 يساوي 39هيكس, ونحن حاولنا 10مرات يعني قيمة CL (عداد مرات المحاولات) ستصبح : 39هيكس + 1هيكس = 3Aهيكس نلقي نظرة على مقابل 3A هيكس في الحروف : Char HEX DEC : 3A 58 عرفنا سبب حرف ':' نحن الآن نريد أن يطبع لنا 10, كيف ؟ (هذه هي المشكلة الكبيرة) 10 يتكون من حرفين (في كود ASCII لايوجد شيئ يتكون من حرفين) الحل هو أن نكتب كل حرف وحده يعني نكتب 1 ثم نكتب 0 ليظهر لنا 10 في الشاشة. لكن كيف؟ إليك الفكرة : هنا سنستعمل عدادين, واحد للآحاد و الآخر للعشرات. يعني عندما يصل عداد الآحاد إلى آخر حرف في الأرقام وهو 9 نضيف 1 لعداد العشرات و نصفر عداد الآحاد ليبدأ من جديد, وفي الأخير نطبع عداد العشرات أولا ثم عداد الآحاد أنا إخترت CL كعداد للأحاد و CH عداد للعشرات, إليكم الكود الذي كتبته: .model small .code Msg1 db 0Ah,"Enter a number in [0..9] :",0Ah,0Dh,"$" Msg2 db 0Ah,"Congratulation!, You find the right number",0Ah,"$" Msg3 db 0Ah,"Your number is wrong, try again",0Ah,"$" Msg4 db 0Ah,"Number Of trying is : ","$" start: PUSH CS POP DS MOV CL,30h ; نضع حرف 0 في عداد الأحاد MOV CH,30h ; نضع حرف 0 في عداد العشرات OPERATION: MOV AH,9h MOV DX,OFFSET Msg1 INT 21h CMP CL,39h ; نقارن الآحاد مع حرف 9 JG COUNTER ; إذا كان أكبر إقفز إلى COUNTER MOV AH,1h INT 21h CMP AL,35h ; نقارن الحرف المدخل مع 5 JNZ WRONG ; إذا كان غير مساوي إقفز إلى WRONG INC CL ; إذا كان مساوي نضيف 1 إلى عداد الأحاد MOV AH,9h MOV DX,OFFSET Msg2 INT 21h MOV AH,9h MOV DX,OFFSET Msg4 INT 21h MOV AH,2h ;\ MOV DL,CH ;| نطبع عدد العشرات INT 21h ;/ MOV AH,2h ;\ MOV DL,CL ;| نطبع عدد الآحاد INT 21h ;/ MOV AH,7h INT 21h MOV AH,4Ch INT 21h WRONG: MOV AH,9h MOV DX,OFFSET Msg3 INT 21h INC CL ; إذا كان الرقم المدخل غير مساوي نضيف 1 إلى عداد الآحاد JMP OPERATION COUNTER: MOV CL,30h ; إذا كان عداد الآحاد أكبر من حرف 9 نضع فيه حرف صفر INC CH ; ثم نضيف 1 إلى عداد العشرات JMP OPERATION ; نقفز إلى OPERATION end start مثل كل مرة أقول أن هذا هو الحل النهائي, فتحت البرنامج وجربت أن أدخل 14 مرة رقم خاطأ ثم أدخل الرقم الصحيح يعني عدد مرات المحاولات أصبح 15 وبالفعل طبع لي 15مرة. J أردت أن أتأكد, أدخلت 9مرات رقم خاطأ ثم أدخلت الرقم الصحيح يعني عدد مرات المحاولات هو 10, فطبع لي "0:" L, هذا ليس عدد المرات الصحيح لنحلل المشكل : لنفترض أننا وصلنا إلى عدد مرات المحاولات 9 هنا قيمة عداد الآحاد تساوي 39هيكس (39هيكس = حرف 9) ثم أدخلنا الرقم الصحيح, و لأوضح هذه المرحلة سنقوم بعملية فحص الكود وتتبعه خطوة خطوة لنراقب التغيرات التي تحصل في كلا العدادين لنكشف الخطأ. وذلك من خلال هذا الجدول : لنفترض أن قيمة CL تساوي 39 و قيمة CH تساوي 30 في هذا التنفيذ سندخل الرقم الصحيح يعني عدد مرات المحاولات ستصبح 10 حالة المسجلات عداد الآحاد : CL عداد العشرات : CH حالة القفز الكود بالأسمبلي 39 30 لايوجد CMP CL,39h 39 30 لايقفز JG COUNTER 30 لايوجد MOV AH,1h INT 21h هنا ندخل الرقم 5 39 30 لايوجد CMP AL,35h 39 30 لايقفز JNZ WRONG 40 30 لايوجد INC CL 40 30 لايوجد يطبع لنا عداد العشرات 30هيكس حرف 0 40 30 لايوجد يطبع لنا عداد الآحاد 40هيكس حرف : في النهاية سيطبع لنا :0 أظن أن المشكل أصبح واضح مكانه من خلال الجدول. قيمة CL أصبحت 40 عندما نفذ أمر INC CL, ونعلم عندما تفوق قيمة CL 39 نقفز إلى إجراء يصفر CL و يضيف واحد لــ CH ليعدل العدادات. لكن في الكود لايوجد إجراء يقارن حالة المسجلات ليعدل قيم العدادت بعد تنفيذ أمر INC CL وذلك عند إدخال الرقم الصحيح كيف نصلح هذه المشكلة : بعد أمر INC CL نضع أمر يقوم بمقارنة CL مع القيمة 39هيكس(حرف 9) ثم أمر يقفز إذا كانت أكبر. حيث سيصبح كود البرنامج كالتالي : .model small .code Msg1 db 0Ah,"Enter a number in [0..9] :",0Ah,0Dh,"$" Msg2 db 0Ah,"Congratulation!, You find the right number",0Ah,"$" Msg3 db 0Ah,"Your number is wrong, try again",0Ah,"$" Msg4 db 0Ah,"Number Of trying is : ","$" start: PUSH CS POP DS MOV CL,30h MOV CH,30h OPERATION: MOV AH,9h MOV DX,OFFSET Msg1 INT 21h CMP CL,39h JG COUNTER MOV AH,1h INT 21h CMP AL,35h JNZ WRONG INC CL ;---------------------------------------------- ; هنا سأضع الإجراء الجديد, لاحظ بعد تعليمة INC CL ;---------------------------------------------- CMP CL,39h ; نقارن الآحاد مع حرف 9 JG COUNTER ; إذا كان أكبر إقفز إلى COUNTER MOV AH,9h MOV DX,OFFSET Msg2 INT 21h MOV AH,9h MOV DX,OFFSET Msg4 INT 21h MOV AH,2h ;\ MOV DL,CH ;| نطبع عدد العشرات INT 21h ;/ MOV AH,2h ;\ MOV DL,CL ;| نطبع عدد الآحاد INT 21h ;/ MOV AH,7h INT 21h MOV AH,4Ch INT 21h WRONG: MOV AH,9h MOV DX,OFFSET Msg3 INT 21h INC CL ; إذا كان الرقم المدخل غير مساوي نضيف 1 إلى عداد الآحاد JMP OPERATION COUNTER: MOV CL,30h ; إذا كان عداد الآحاد أكبر من حرف 9 نضع فيه حرف صفر INC CH ; ثم نضيف 1 إلى عداد العشرات JMP OPERATION ; نقفز إلى OPERATION end start لنجرب البرنامج, أدخل 9 مرات رقم خاطأ ثم أدخل الرقم الصحيح. و النتيحة أن في المرة العاشرة وهي التي أدخلنا فيها الرقم الصحيح يعاود يقول لك أدخل رقم, ندخل الرقم الصحيح مجددا فيطبع لنا عدد المحاولات 11 ملاحظة : *- البرنامج عندما أدخلنا الرقم الصحيح في المحاولة 10 يعني قيمة عداد الآحاد فاقت حرف 9 فتجاهل البرنامج أننا أدخلنا الرقم الصحيح و إنشغل في تعديل قيم العددات ثم عاد ليقول لنا أدخل رقم *- لاحظ أنه لم يطبع لنا رسالة الرقم خاطأ, هذا يعني أنه لم يعد ليكمل الروتين OPERATION ولمعرفة مكان الخطأ كما فعلنا سابقا, سنتتبع البرنامج خطوة خطوة من خلال هذا الجدول : قيمة CL تساوي 39 و قيمة CH تساوي 30 في هذا التنفيذ سندخل الرقم الصحيح يعني عدد مرات المحاولات ستصبح 10 حالة المسجلات عداد الآحاد : CL عداد العشرات : CH حالة القفز الكود بالأسمبلي 39 30 لايوجد OPERATION: 39 30 لاوجد 3 أسطر : لطباعة رسالة أدخل رقم 39 30 لايوجد CMP CL,39h 39 30 لايقفز JG COUNTER 39 30 لايوجد MOV AH,1h INT 21h هنا ندخل رقم 5 39 30 لايوجد CMP AL,35h 39 30 لايقفز JNZ WRONG 40 30 لاوجد INC CL 40 30 لايوجد CMP CL,39h 40 30 يقفز JG COUNTER 40 30 لايوجد COUNTER: 30 30 لايوجد MOV CL,30h 30 31 لايوجد INC CH 30 31 يقفز JMP OPERATION في النهاية سيقفز البرنامج إلى OPERATION وسيقول لك أدخل رقم ثم تدخل رقم وقوم يبنفس الروتين الذي شرحته لكن قيم العددات تغيرت بعد هذا الجدول إكتشفت أن البرنامج فيه الكثير و الكثير من الأخطاء وهي: الخطأ الأول : مكان أمر مقارنة عداد الآحاد و القفز الخطأ الثاني : عدد مرات أمر إضافة 1 إلى عداد الآحاد و أمكنتها الخطأ الثالث : مكان الرجوع بعد تعديل حالة العددات أنت الآن تقول : ماهذه الأخطاء, هذا الكاتب خاطئ في كلامه الخطأ ليس هنا. في الحقيقة الحق معك لأن هذه الأخطاء لن تظهر لك إلا إذا تمعنت كثيرا في الكود و نفذته خطوة خطوة من أوله إلى آخره. سوف أبذل مجهود لكي أوضح لك الأخطاء, لكن يجب أن تتمعن في الكود مرارا و تكرارا لكي تفهم شرح هذه الأخطاء الخطأ الأول : في الكود لدينا أمرين مقارنة لعداد الآحاد يليهما القفز لتعديل العددات, الأول في بداية روتين OPERATION و الثاني بعد إدخال الرقم الصحيح. في الحقيقة مقارنة واحدة تفي بالغرض. نحن إستعملنا 2, و أسوء من هذا أن المقارنة الثانية زادتنا مشكلة و هي عندما تستهلك 10 محاولات لإدخال الرقم الصحيح يتجاهل البرنامج أنك أدخلت الرقم الصحيح لأنه سيقفز إلى إجرائية تعديل قيم العددات ثم يعاود طلب إدخال رقم (فسرت هذه المشكلة سابقا) أنت الآن تقول كيف علمت هذا ؟ , لو جربت تنفيذ البرنامج خطوة خطوة في العشر محاولات لإدخال الرقم صحيح ستعرف كيف عرفت هذا. تصحيح الخطأ : كما قلت مقارنة واحدة تفي بالغرض, نحذف المقارنة الثانية و نضع الأولى قبل مقارنة الرقم المدخل مع الرقم الصحيح ; نضع المقارنة هنا CMP AL,35h JNZ WRONG INC CL ستصبح هكذا : CMP CL,39h JG COUNTER CMP AL,35h JNZ WRONG INC CL إنتهينا من الخطأ الأول تماما الخطأ الثاني : لدينا أمرين يقومان بإضافة 1 إلى عداد الآحاد, الأول عندما يكون الرقم المدخل صحيح و الثاني عندما يكون الرقم المدخل خاطأ الأول هنا : CMP AL,35h JNZ WRONG INC CL ; أمر إظافة 1 إلى عداد الآحاد والثاني هنا : WRONG: MOV AH,9h MOV DX,OFFSET Msg3 INT 21h INC CL ; أمر إظافة 1 إلى عداد الآحاد JMP OPERATION حسنا, التمرين يطلب منا أن نحسب عدد المرات التي إستهلكها المستعمل لكي يدخل الرقم الصحيح و بدون إستثناء (يعني نحسب عدد المرات التي أدخل فيها المستعمل رقم سوى كان الرقم صحيح أو خاطئ) المنطق يقول أمر واحد يظيف 1 إلى عداد الآحاد يفي بالغرض و يكون بعد أن يدخل المستعمل أي رقم يعني بعد دالة إدخال حرف. نحذف الأمرين الذين يزيدان قيمة CL ونعوضهما بالتالي : MOV AH,1h INT 21h ; هنا نضع الأمر الذي يضيف 1 إلى عداد الأحاد الكود يصبح كالتالي : MOV AH,1h INT 21h INC CL وهكذا حللنا مشكلة إظافة 1 لعداد الآحاد و مكان وضعه الخطأ الثالث : من المفروض عند تعديل العددات يجب أن يعود البرنامج إلى السطر الذي يلي القفزة إلى إجراء تعديل العددات (نستطيع إستعمال CALL لتتوفر لنا هذه الخاصية أوتوماتيكيا, و هذا لو أننا في مستوى متقدم L) هنا سنعمل على الكود الذي نقحناه و ليس القديم وهو التالي : .model small .code Msg1 db 0Ah,"Enter a number in [0..9] :",0Ah,0Dh,"$" Msg2 db 0Ah,"Congratulation!, You find the right number",0Ah,"$" Msg3 db 0Ah,"Your number is wrong, try again",0Ah,"$" Msg4 db 0Ah,"Number Of trying is : ","$" start: PUSH CS POP DS MOV CL,30h MOV CH,30h OPERATION: ;-------------------------- ; كل الأكواد التي غيرنا فيها ; سأكتب أمامها تغيير ;-------------------------- MOV AH,9h MOV DX,OFFSET Msg1 INT 21h MOV AH,1h INT 21h INC CL ; تغيير CMP CL,39h ;\ JG COUNTER ;/ تغيير CMP AL,35h JNZ WRONG MOV AH,9h MOV DX,OFFSET Msg2 INT 21h MOV AH,9h MOV DX,OFFSET Msg4 INT 21h MOV AH,2h MOV DL,CH INT 21h MOV AH,2h MOV DL,CL INT 21h MOV AH,7h INT 21h MOV AH,4Ch INT 21h WRONG: MOV AH,9h MOV DX,OFFSET Msg3 INT 21h JMP OPERATION COUNTER: MOV CL,30h INC CH JMP OPERATION end start لنفترض أننا أدخلنا 9مرات عدد خاطأ و في المرة العاشرة أدخلنا رقم صحيح, قيمة CL ستفوق 39هيكس و لو تتبعنا البرنامج سنجده سينفذ القفزة إلى إجراء تعديل قيم العددات و بعدها سنقفز إلى بداية الروتين OPERATION, يعني سيطلب منا مجددا إدخال رقم رغم أننا أدخلنا الرقم الصحيح ثم يزيد قيمة عداد الآحاد... وبذلك سيتجاهل أننا أدخلنا الرقم الصحيح لأن مكان الرجوع بعد تعديل العددات خاطأ. تصحيح الخطأ : كما قلت سابقا أن بعد تعديل العددات يجب أن يعود البرنامج إلى السطر الذي يلي القفزة إلى إجراء تعديل العددات لكي يعود البرنامج إلى إكمال الروتين بمقارنة الرقم المدخل مع الصحيح وبذلك لا يتجاهله ... هنا يلزمنا Label جديد نضعه بعد قفزة إجراء تعديلات على العددات ولنسميه BACK : CMP CL,39h JG COUNTER BACK: ; بقية الكود ثم نعدل قفزة العودة من JMP OPERATION إلى JMP BACK الكود النهائي للبرنامج سيكون كالتالي : .model small .code Msg1 db 0Ah,"Enter a number in [0..9] :",0Ah,0Dh,"$" Msg2 db 0Ah,"Congratulation!, You find the right number",0Ah,"$" Msg3 db 0Ah,"Your number is wrong, try again",0Ah,"$" Msg4 db 0Ah,"Number Of trying is : ","$" start: PUSH CS ;\ POP DS ;/ تجهيز المقاطع MOV CL,30h ;\ القيمة الأولية لعداد الآحاد MOV CH,30h ;/ القيمة الأولية لعداد العشرات OPERATION: MOV AH,9h MOV DX,OFFSET Msg1 INT 21h MOV AH,1h INT 21h INC CL ; نزود الآحاد 1 CMP CL,39h JG COUNTER ; يقفز إذا كان CL أكبر من 39هيكس BACK: CMP AL,35h JNZ WRONG ; إذا كان الرقم خاطأ إقفز MOV AH,9h MOV DX,OFFSET Msg2 INT 21h MOV AH,9h MOV DX,OFFSET Msg4 INT 21h MOV AH,2h ;\ MOV DL,CH ;| طبع قيمة عداد العشرات INT 21h ;/ MOV AH,2h ;\ MOV DL,CL ;| طبع قيمة عداد الآحاد INT 21h ;/ MOV AH,7h INT 21h MOV AH,4Ch INT 21h WRONG: MOV AH,9h MOV DX,OFFSET Msg3 INT 21h JMP OPERATION COUNTER: MOV CL,30h ; نضع القيمة الأولية لعداد الآحاد INC CH ; نزود عداد العشرات 1 JMP BACK ; نقفز لإكمال الروتين end start نجرب البرنامج, نحاول 10 مرات لإدخال الكود الصحيح و النتيجة سيطبع لنا 10. أظن هكذا أصبح الكود صحيحا. لكن هناك مشكل ................, لاتقلق لايوجد أي مشكل كنت أمزح J, لكن لا تدري يمكن يكون هناك خطأ لست أعلم عنه, عموما إن وجدت خطأ أخبرني عنه و سوف أشرحه إن شاء الله. الحمد لله إنتهى الموضوع ملاحظة : هذا الموضوع طويل, و أرجو من مشرفي المنتدى أن لا يحذفو الموضوع لهذا السبب. الموضوع أرهقني جدا أمضيت يومين لكتابته, وذلك لصعوبة الشرح و إيصال المعلومة لذهن القارئ. كنت قادر أن أختصر كل هذا في أسطر معدودة و أعطيكم الكود النهائي لحل هذه المشكلة, لكنني أردت أن أستفيد و أفهم أكثر الأخطاء التي إعترضتني و في نفس الوقت أفيد القارئ من تجربتي حيث بدأت بالكود الأول الذي كتبته مرورا بالتغييرات التي صارت عليه إلى أن وصلت إلى الكود النهائي لحل المشكل. هل من شخص آخر يشرح لنا الأخطاء التي تعترضه و يفيدنا من تجربته ؟ السلام عليكم و رحمة الله و بركاته
  3. بسم الله الرحمن الرحيم سأقوم في هذا الدرس ببرمجة عكسية لملف تنفيذي فارغ و نقوم بإخراج صندوق رسالة اللأدوات المستعملة : Debugger: ollydbg مجمع Masm32 : Win32Asm و الأهم عقل قادر على التركيز الخطوات التي سنمر بها : الخطوة الأولى: سنستعمل مترجم Masm32 و نكتب هيكل عظمي لبرنامج قابل للتنفيذ النقال Pe الخطوة الثانية: ننتقل الىollydbg و نبرمج عكسيا : ينقسم الى قسمين الأول : نكتب البيانات التي سنحتاجها (عنوان الرسالة,محتوى الرسالة,بارامتر الدوال التي سنستعملها) الثاني : سنكتب الكود الخطوة الأخيرة نقوم بتسجيل التغييرات و نشغل البرنامج نبدأ بالشرح: الخطوة الأولى: نكتب الكود التالي في مترجم Masm32 : .386 .model flat,stdcall option casemap:none .data text db 0 .code start: ret end start ملاحظة: في قسم data. (قسم البيانات) وضعت متغير و ذلك عند عمل تجميع سيعلم المترجم أنه هناك قسم بيانات و بذلك ينشأ قسم خاص بالبيانات في الملف التنفيذي سنستعمله لاحقا عندما نبرمج البرنامج عكسيا للإضهار صندوق رسالة في قسم code. و ضعت تعليمة ret ليعلم بوجود كود في البرنامج كود للملف التنفيذي سنستعمله لنبرمح فيه عكسيا و يضيف قسم واللآن قم بعمل تجميع للكود الخطوة الثانية: قلنا أولا سنكتب البيانات التي نحتاجها في قسم البينات البيانات اللازمة للإخراج صندوق نص : دالة MessageBox تأخذ 4 بارامتر: 1/الزر: و سنضعه 0 ليخرج لنا زر Ok 2/عنوان صندوق الرسالة (سنكتبه في قسم البيانات) 3/محتوى الرسالة (سنكتبه في قسم البيانات) 4/المقبض و هنا ليس لدينا مقبض سنضعها 0 سؤال : لكن نحن لم نحمل المكتبة التي تتحتوي على هذه الدالة ماذا نفعل؟ جواب: بمأننا لم نحمل هذه الدالة في البرنامج الحل هو استعمال الدالتين GetProcAddress و LoadLibrary بعضكم يقول أن هاتين الدالتين لم نحملهم أيضا في البرنامج و لكني جربتها و اشتغلت, هل من أحد يفسر سبب الإشتغال؟ حسب ما أظن أن نظام التشغيل يقوم بتحميلهم تلقائيا ليشغل نفسه, هل من تفسير آخر؟ تعريف الدوال : LoadLibrary/1 :هذه الدلة تقوم بتحميل مكتبة من خلال إسمها و تأخذ بارامتر واحد وهو اسم المكتبة المراد تحميلها,اسم المكتبة سنكتبه في قسم البيانات وهي "user32.dll" التي تحتوي على دالة MessageBox GetProcAddress/2 : تقوم بجلب عنوان الدالة في البروسيسور من خلال اسمها الذي سنكتبه في قسم البيانات وهي تأخذ بارامترين 1/ يمثل مقبض الذي يعرف المكتبة,سنضع eax وهي القيمة المرجعة من الدالة السابقة 2/اسم الدالة التي نريد جلب عنوانهاوهي MessageBox التي سنكتبها في قسم البيانات ونضيف لها حرف A حيث تصبح MessageBoxA البيانات التي سنكتبها: اسم المكتبة : User32.dll اسم الدالة : MessageBoxA عنوان صندوق الرسالة : RE World محتوى الرسالة : !Hello RE World لنشرع في كتابة البيانات: نفتح الملف المستخرج بالديبغر, سوف يظهر لك نفس مافي الصورة 1/في قسم البيانات نعمل كليك على أول بايت في العنوان 402000 ومن لوحة المفاتيح نضغط على CTRL+E تخرج لنا نافذة جديدة نختار ASCII ونكتب اسم المكتبة 2/ نختار أول بايت في العنوان 402010 نفذ نفس العملية السابقة و نكتب اسم الدالة 3/نختار أول بايت في العنوان 402020 نفذ نفس العملية السابقة و نكتب عنوان صندوق الرسالة 4/نختار أول بايت في العنوان 402030 نفذ نفس العملية السابقة و نكتب محتوى الرسالة وفي الإخير سنتحصل على ماهو في الصورة أرجو أنكم فهمتم هذه الخطوة في قسم الكود من olly نعمل كليك يمين على التعليمة retn ونختار Assemble 1/ سنستعمل الدالة الأولى لتحميل المكتبة أولا ندفع اسم المكتبة المراد تحميلها من خلال عنوانها نكتب الأمر : Push 402000 ثم نضغط Assemble ثانبا نطلب تنفيذ دالة تحميل المكتبة بكتابة الأمر : Call LoadLibraryA ثم نضغط Assemble تنبيه : لا تنسو كتابة الحرف A بعد الدالة السابقة 2/نستعمل الدالة الثانية ندفع اسم الدالة المراد جلب عنوانها نكتب الأمر : Push 402010 ثم نضغط Assemble ثم ندفع معرف المكتبة التي تجد فيها الدالة السابقة بكتابة الأمر : Push eax ثم نضغط Assemble ثم نطلب تنفيذ دالة جلب العنوان بكتابة الأمر : Call GetProcAddess 3/تنفيذ دالة اضهار صندوق رسالة ندفع معرف الزر Ok بكتابة الأمر : Push 0 ثم نضغط Assemble ندفع عنوان صندوق الرسالة بكتابة الأمر : Push 402020 ثم نضغط Assemble ندفع محتوى الرسالة بكتابة الأمر : Push 402030 ثم نضغط Assemble ثم ندفع المقبض و قلنا سنضعه 0 بكتابة الأمر : Push 0 ثم نضغط Assemble ثم نطلب تنفيذ دالة اخراج رسالة صندوق بكتابة الأمر : Call ُEAX لماذا EAX : للأن بعد تنفيذ دالة جلب عنوان يصبح EAX يشير الى عنوان الدالة التي جلبناها وأخيرا نرجع التعليمة ret و سنتحصل على مافي الصورة: نمر الى الخطوة الأخير وهي تسجيل: أولا نقوم بعمل Select لكل ماأضفناه في قسم البيانات ثم كليك يمين نختار Copy to executable file راقب الصورة : ستخرج لك نافذة جديدة لا تفعل شيئ فقط قم بالرجوع الى النافذة السابقة و اللآن سنقوم بنفس العملية لكن في قسم الكود نقوم بعمل Select لكل ماأضفناه في قسم الكود ثم كليك يمين نختار Copy to executable --> َAll modifications --> Copy all ستخرج لك نافذة جديدة فيها الكود الذي أضف قم بعمل كليك يمين عليه و اختار Save File اكتب اسم الملف ثم Save قم بتشغيل البرنامج : وتخرج رسالة ترحب بعالم البرمجة العكسية الحمد لله الذي أعانني على إنهاء الدرس أرجو أنكم فهتم الدرس و أنا أنتظر نقدكم له السلام عليكم و رحمة الله و بركاته RE.zip
  4. السلام عليكم، الدرس الثاني في اكتشاف الثغرات بالتوفيق SEH_Based_Exploitation.zip
  5. ملاحظة مهمة: هناك فرق كبير بين الإمتدادات (Extensions) و الـ Plugins بالنسبة للمتصفح Firefox (لا اعلم اذا كان نفس الشيء ينطبق على بقية المتصفحات) انا تحدثت عن الـ Extensions في المشاركة السابقة، لا اعلم اذا كان هذا ما كنت تبحث عنه.
  6. بالنسبة لـ Firefox، يتم تطوير الـ Extensions باستعمال لغة (XUL (XML User interface Language و هي لغة ترتكز على لغة XML تم تطويرها من قبل Mozilla لبناء واجهات رسومية للتطبيقات التي تعمل على منصة  (...Mozilla (Firefox, ThunderbirdJavascript لمعالجة البيانات. يتم دمج الملفات الـ Extension في ملف واحد يحمل امتداد xpi وهو عبارة عن ملف ZIP يحتوي على تركيبة من الملفاات/المجلدات اهمها: :my_extension.xpi           chrome\                               content\                                    sample.xul                                   chrome.manifest                            install.rdf                install.rdf: عبارة عن ملف xml يحتوي على معلومات الـ Extensionchrome.manifest: يحتوي على وصف لمسارات (او روابط) لملفات الـ Extensionchrome\content\: مجلد يحتوي على ملفات XUL و Javascript لـ Extensionsample.xul: كما اشرت سابقا، فهو يحتوي على تعريفات الواجهة الرسومية للـ Extension (ازرار، قوائم، شريط ادوات...)بعد ذلك، نسخ الملف (xpi) و وضعه في مسار تواجد الـ Extensions رابط: مقالة تتحدث عن بناء Extension تقوم باإظافة Status Bar على واجهة المتصفح و كتابة "Hello, World!" عليه   ===== جاء على بالي كتابة مقالة عن اساسيات كتابة Extensions للمتصفح Firefox بعد ان بحثت عن مقالة بالعربي تتحدث عن هذا الموضوع و بالتأكيد لم أجدها  :blink: المشكلة هي الوقت  :cry:   بالتوفيق
  7. بسم الله الرحمن الرحيم السلام عليكم و رحمة الله و بركاته اسم البرنامج: Easy RM to MP3 Converter موقع البرنامج: http://www.rm-to-mp3.net تحميل هذا التطبيق الأول لدرس "ثغرة فيض مخزن المكدس". الموضوع عبارة عن نقاش و سيمّر بالمراحل التالية: طرق العثور على الثغرة جمع المعلومات اللازمة لإستغلال الثغرة كتابة الإستثمار أرجو من جميع الأعضاء المهتمين بالموضوع المشاركة بالتوفيق
  8.   ويشير إلى أن هناك فجوة خلال السنوات العشر القادمة ستظهر في الأعداد المتاحة للمبرمجين المناسبين لسوق العمل حيث ستكون هناك مليون وظيفة شاغرة في أمريكا فقط لن تجد من يعمل بها في مجال البرمجة و الوظائف المتعلقة بالحواسب.
  9. السلام عليكم أخي الكريم, بقية الأسئلة و حلولها ستجدها على الرابط التالي: http://www.arabteam2000-forum.com/index.php?showtopic=227500 باستثناء السؤال: What is the maximum length (in bytes) of an instruction for the 8086-based IBM PC? الإجابة: الحد الأقصى للبايتات لتعليمات المعالج 8086 هو 6 و هذا دليل من الكتاب بحد ذاته: بالتوفيق أخي
  10. ضع الملف irvine.lib في المسار masm32\lib و irvine.inc في المسار masm32\include لاتنسى ضبط المسارات في البرنامج WinAsm
  11. كلمة المرور تكون أطول من 20 حرف، على الأقل 36 حرف و يجب أن يكون أول 12 حرف متشابه مع آخر 12 عشر حرف. و ذلك لأن البرنامج يقوم بتوليد كلمة المرورة من خلال اول 6 حروف الاسم المدخل (لهذا السبب يجب ان يكون هذا الاسم على الاقل يتكون من 6 حروف). ماذا يحصل وراء ذلك البرنامج: ان تتبعنا البرنامج سنجده يقوم بحجز ثلال مساحات في ذاكرة الـHeap، الأول لاسم المستخدم، الثاني للباسورد المدخل و الثالث يضع فيه الباسورد الذي يقوم بتوليده. المهم في الأمر ان عنوان الذاكرة المخصصة للباسورد الذي يقوم بتوليده تأتي بعد عنوان الذاكرة التي يضع فيها الباسورد المدخل. يكون شكل الذاكرة كالتالي: Memory: Entered Password | 28 bytes | Generated Password Address: 006059F8 00605A20 ملاحظة: الإزاحة بين الباسورد المدخل و الباسورد الذي تم توليده دائما تكون 40 بايت عندما نقوم بتشغيل البرنامج داخل OllyDbg الفكرة هنا هو ان نقوم بادخال باسورد بطول معين ليقوم بالكتابة على ذاكرة الباسورد الصحيح بحيث يصبح مماثل للباسورد المدخل و بذلك نضمن رسالة الدخول. مع العلم ان الباسورد الصحيح يتم توليده من خلال اول 6 حروف من اسم المستخدم و يكون طوله 12 حرف (يمكنك التأكد من هذا من خلال تتبع البرنامج) شكل الباسورد الذي يجب علينا ادخاله لضمان الدخول: [PASSWORD]+[28 BYTES]+[PASSWORD] ; طول الباسورد يجب ان يكون 12 حرف مثال للباسورد: ARABTEAM2000############################ARABTEAM2000 أذكر مرة أخرة ان شكل هذا الباسورد سينجح إلا عندما يكون البرنامج يشتغل تحت OllyDbg. ماعدا ذلك يجب ان يكون على هذا الشكل [PASSWORD]+[12 BYTES]+[PASSWORD] ; طول الباسورد يجب ان يكون 12 حرف وصلنا للأهم و هي مجموعة اقتراحات: 1-اول اقتراح وهو عبارة عن قانون للمشاركة في في هذا النقاش: على كل مشارك ان تكون عدد الحلول التي قدمها مساوية لعدد الإختبارات التي طرحها مثال عني:قمت بطرح اختبار، و تقديم حل له. عدد الاختبارات المطروحة: 1 عدد الحلول المقدمة: 1 الفائدة من هذا هو تواصل النقاش في هذا الموضوع، فمثلا لو قمت بتقديم حل لإختبار ما، اصبح عليك عندها طرح اختبار آخر ليصبح هناك توازن في المشاركة داخل هذا النقاش. 2-ثاني اقتراح موجه لكل من يشارك في هذا النقاش وهو الضغط على (+) للتصويت على كل حل مقنع او اختبار مطروح. الغرض منه هو تشجيع الأعضاء للحصول على اكثر نقاط و هي صمعتنا في هذا الفريق :wink:
  12. إن تواصل هذا النقاش و بمشاركتك فيه ستلاحظ ان مستواك تحسن في تتبع البرامج. كذلك تحليلك صحيح :)
  13. بالنسبة لهذا، ان اعطيتك الكود المصدري، فان الأمر انتهى سيصبح من السهل الحصول على خوارزمية توليد الباسورد من خلال قراءة الكود.
  14. الصورة لا تضهر قم برفعها مجددا
  15. السلام عليكم، بالنسبة للغز الذي قمت بطرحه، تقريبا لا يوجد حل آخر عدا حل الأخ [email protected] للدخول من غير باسورد ===== الإختبار الثاني: 1- لغة البرمجة : Assembly 2- وظيفة البرنامج : يقوم البرنامج باستقبال اسم مستخدم (الذي يجب ان يكون طوله اكبر من 5 حروف) و كلمة المرور، بعدها اظهار رسالة نجاح/فشل الدخول 3- الهدف : الحصول على رسالة نجاح الدخول من خلال ادخال معلومات خاطئة. لا يسمح التلاعب بكود البرنامج لنصل للغرض هذا البرنامج قمت بكتابته منذ فترة تحضيرا لدرس عن فيض الكومة (Heap Overflow)، قررت بعدها بأن لا اكتب الدرس لأنه لن تكون هناك أي فائدة منه. فكل ما تحصل عليه من كتابة الدروس هو عبارات الشكر و جاري المتابعة... او الآخر يقولك جاري المشاهدة (و كأني أعرض عليه فيلم ليشاهده). لذلك اصبجت كتابة الدروس مضيعة للوقت مادام لايوجد افادة. تحياتي ExploitMe#2.zip
  16. بسم الله الرحمن الرحيم في الهندسة العكسية, هناك العديد من الأدوات التي يمكن أن تساعدك و تسهل عليك العمل في هذا الموضوع سأشرح الأدوات اللازمة فقط و كيفية التعديل عليه لتصبح سهلة للوصول إليها و إستعمالها § الأدوات الازمة و أدوارها : 1/ منقح (Debugger) وهو سلاحك الرئيسي في عالم الهندسة العكسية, حيث يمكنك من خلاله : *- فك تجميع البرامج حيث يصبح الكود واضح أمامك لكن بلغة الأسمبلي (يعني يجب أن تكون خبير بأتم معنى الكلمة في الأسمبلي) *- تتبع البرامج خطوة خطوة (يمكنك من هذه الخاصية معرفة مكان الخطأ...) *- وأهم شيئ فيه هو التنقيح حيث يمكنك التغيير في الكود مباشرة دون الحاجة إلى الكود المصدري (يمكنك تصحيح الأخطاء مثلا) أمثلة لبرامج التنقيح : ‍‍Ollydbg,SoftIce,Ida… سنستعمل برنامج ollydbg 2/ كاشف معلومات البرامج, أنا أسميه كاشف الألغام لأنه يمكنك من خلاله: *- التعرف على لغة البرمجة التي كتب بها أي برنامج *- يكشف لك عن المشفر الذي تمت به عملية التشفير و هذا إن كان البرنامج مشفر ( إذا يعتبر كاشف ألغام J ) *- كما يمكنك التعرف على أقسام البرنامج (Sections), الدلائل (Directories), كذلك يمكنك التعرف من خلاله على نقطة إدخال البرنامج و معلومات أخرى عن الـــ PE أمثلة لبرامج الكشف:... PeiD, RDG Packer Detector,FastScanner سنستعمل برنامج PEiD 3/ محرر هكس ( HexEditor) ويمكنك من خلاله *- الكتابة في البرنامج مباشرة دون أي عوائق, يمكنك إستخدامه للكتابة على البرامج المشفرة لأنها تكون محمية من الكتابة فوقها ( أسميه زارع الألغام J ) أمثلة لمحرر الهكس: HexWorkShop,HexEditor… سنستعمل برنامج HexWorkShop 4/ مجمع ( Assembler ) هذا تحتاجه إن كنت مبرمج أسمبلي, يمكنك من خلاله : *- البرمجة بلغة الأسمبلي *- تصحيح الأخطاء في الكود المصدري ( أنا أسميه سلاحي السري J ) أمثلة للمجمع : MASM,FASM,TASM… سنستعمل برنامج MASM32 للتجميع أما محرر الكود سنستعمل WinAsm WinAsm: يوضح الكود ( كود بالألوان J ) و يعرض لك الدوال و برامترها... § تعديل الأدوات و تجهيزها : 1/ تعديل Ollydbg *- خيار فتح مع Ollydbg عند عمل كليك يمين على البرامج هذه الخاصية ليست من خيارات ollydbg, لكن نحن سنفعلها يدويا J و لتفعيل هذه الخاصية نذهب إلى تنفيذ الأوامر Runو نكتب Regedit نذهب إلى المفتاح HKEY_LOCAL_MACHINE\SOFTWARE\Classes\exefile\shell ثم من قائمة Edit نختار الأمر New ثم Key, نكتب فيه مثلا : Open With Ollydbg دابل كليك على المفتاح الجديد, ثم نكرر نفس المراحل لإنشاء مفتاح جديد و نكتب عليه command ثم دابل كليك على Default لتغيير قيمته, و نكتب فيه مسار ollydbg مع كتابة الإمتداد .exe ثم %1 ملاحظة : المسار يكون بين "" و كذلك "%1" يعني قيمته ستكون : "C:\OllyDbg\OLLYDBG.EXE" "%1" *- تعديل مسارات Ollydbg من داخل مجلد ollydbg قم بإنشاء المجلدين udd و plugin udd: هذا المجلد خاص بالنسخ الإحتياطية للبرامج التي تنقحها كذلك يحفظ لك التغغيرات و التعاليق التي قمت بها أثناء التنقيح Plugin: هذا المجلد خاص بلواحق ollydbg, قم بجمع كل اللواحق التي لديك و إنسخها إلى هذا المجلد لتشتغل مع olly تعديل المسارات : من القائمة Options إختار Appearance ثم إضغط على Directories في UDD path قم يكتاية مسار مجلد الــ UDD, و ضع علامة صح على Backup old .udd files كذلك قم بتعديل مسار مجل الــ Plugin فى الــ Plugin path *- تعديل الإضاءة جرب إفتح أي برنامج مع ollydbg, أبدي رأيك في إضاءة الكود كله باللون الأسود, معقد, لا يفتح النفس لعكس الكود, لا يوجد فرق بين التعليمات حسنا, بكبسة زر ستتحسن الإضاءة Right Clic داخل مساحة الكود ثم Appearance, ثم Highlighting, واختر jumps 'n' calls ليضيئ لنا طريق الهندسة العكسية 2/ تعديل PEiD *- خيار الفحص مع PEiD عند عمل كليك يمين على البرامج لا تقلقوا لأننا لن نكرر ما فعلناه مع ollydbg لأن PEiD يوفر لنا هذه الخاصية حسنا, إفتح PEiD و إضغط على الزر Options ثم ضع علامة صح على Register Shell Extension كليك يمين على أي برنامج : 3/ تعديل HexWorkshop *- خيار الفتح مع HexWorkshop عند عمل كليك يمين على البرامج هذه الخاصية يوفرها لنا البرنامج إفتح HexWorkshop و من القائمة Options إختر Preference ثم Configuration وضع علامة صح على : Add Hex Edit item to Right Mouse Context Menu 4/ تعديل WinAsm أولا قم بتنصيب MASM32 وعند الإنتهاء أنشأ ملف جديد في C: بإسم WinAsm إفتح الملف المضغوط الخاص ببرنامج WinAsm و قم باستخراجه في المجلد الذي أنشأناه إفتح WinAsm ستظهر لك بما يسمى splash screen أنا أسميها الشاشة المزعجة لأنها تبقى ثواني أو أكثر وهي مفتوحة ماسنغيره هو نزع هذه الشاشة, تعديل المسارات, تفعيل خاصية عمل البرنامج بعد التجميع و SysTrayIcon و الــ Font, خاصيات أخر من القائمة Tools إختر Options : *- نزع الشاشة المزعجة و خاصيات أخرى : من القائمة Tools إختر Options أزل علامة صح على Show Splash On StartUp عدل البرنامج كما في الصورة *- تعديل المسارات قم بتعديل المسارات كما في الصورة إن كان لديك مرجع أو ملف يساعدك في البرمجة قم بوضع مساره في الــ Help File *- تفعيل خاصية عمل البرنامج بعد التجميع ضع علامة صح على Launch EXE on Go All قم بتعديل مسار olly في External Debugger قد تحاجه J *- تعديل الــ Font إختر Courier New للــ Font وهو المضل لي J, الحجم 9, و اختر Arabe للــ Script لكي نكتب تعاليق بلغتنا الحبيبة "العربية" و الآن جرب إستعماله و سترى كم هو ممتع و سهل J الحمد لله, أنهيت الدرس بسلام السلام عليكم و رحمة الله و بركاته لا تنسى أن تضغط موافق :)
  17. بالفعل متعة ما بعدها متعة :D هذا درس كامل عن الـWindows Hook و هو الطريق لكتابة أصغر Keylogger :P @X: مع تحيات "محاربي الأسمبلي" :wink:
  18. استفسار بخصوص الاسمبلى

    تريد تبرمج لكل انواع المعالجات، تعلم على معالج ثم انتقل إلى البقية. لا يوجد اختلاف كبير بينهم :)
  19. استفسار بخصوص الاسمبلى

    :blink: و ضّح سؤالك لكي نقدر مساعدتك
  20. الأخ الكريم/الأخت الكريمة السلام عليكم ورحمة الله وبركاته. مرحباً بكم في منتدى الفريق العربي للبرمجة تأسف إدارة المنتدى لغلق الموضوع وذلك لمخالفته قوانين المشاركات، فقرة طلب حل الواجبات والتمارين. قواعد طرح المشاركات http://www.arabteam2000-forum.com/index.php?showtopic=29343 شاكرين لكم حُسن تعاونكم
  21. الأخ الكريم/الأخت الكريمة السلام عليكم ورحمة الله وبركاته مرحباً بكم في منتدى الفريق العربي للبرمجة نود تنبيهك أن العنوان غير مناسب. الرجاء اختيار عنوان مناسب أكثر في مواضيعك القادمة، وهذا بمثابة إشعار للأهمية. وفي حال التكرار سيتعرض موضوعك للإغلاق والحذف!!! قواعد المشاركة http://www.arabteam2000-forum.com/index.php?showtopic=29343 شاكرين لكم حُسن تعاونكم
  22. كيف لمستقبل هذه الرسالة أن يقوم بفك الضغط؟
  23. برمجة winsock الدرس #3

    تستعمل الدالة WSAAsyncSelect لتحديد النافذة التي نريدها أن تستقبل من الـSocket الرسائل التي قمنا باختيارها و ذلك لغرض معالجتها. ليست تستعمل لتغيير نمط عمل الـSocket :wacko: