السلام عليكم و رحمة الله و بركاته امانة يا جماعة كل مين عنده سؤال صغير و حلو (يعني مشان ما تزهئ العالم و هي عم تقرأ :wacko: ) يبعته السؤال بتخصص بلغة التجميع مثلا كود صغير و يلخبط حتى المحترفي :rolleyes: ن خلينا نستفيد و الله يتجزاكم كل خير
اسئلة ذكية وtricks
السلام عليكم ورحمة الله وبركاته
وكل عام وانتم بخير
فكرة رائعة ويمكننا تطويرها والاستمرار فى طرح الافكار و الالغاز إلى ما لا نهاية
السؤال الاول :
حاول فهم ا يفعله هذا الكود واشرح ما توصلت إليه
.386 .Model Flat ,StdCall option casemap:none include D:\Masm32\include\windows.inc includelib kernel32.lib includelib user32.lib GetModuleHandleA PROTO :DWORD ExitProcess PROTO :DWORD MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD .Data MB1Titel db "Playing with OpCodes",0 MB1Text db "for programmers only ...",0 .data? hInstance dd ? .Code Main: push 0h call GetModuleHandleA mov hInstance,eax nop mov eax,OFFSET My_Box db 0EBh call eax nop nop nop nop nop nop ExitPrg: push hInstance call ExitProcess My_Box: push 0h push OFFSET MB1Titel push OFFSET MB1Text push 0h call MessageBoxA ret end Main
البرنامج مقتبس من دروس قديمة للاسمبلى ولكن فيه خدعة لم ارها فى درس اخر من قبل...
hint : الرقم 0EBh يعنى call , حاول تتبع البرنامج من خلال debugger او بإستخدام الـhex editor حاول إستنتاج ما يحدث ثم اشرح عمل البرنامج ...
والسلام عليكم
لا إله إلا الله محمد رسول الله
busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.
ماعرف في masm32
بس اعجني الكود
push 0h call GetModuleHandleA mov hInstance,eax
الحصول على handelللبرنامج
ثم عمل initialize اعتقد كذا البرنامج مايحتاج
بس هنا ما عرفت ليش تكرار call مرتين
يمكن الاولى للـــــــــmassagebox
والثانيه للخروج
db 0EBh call eax
لبرنامج بس messge
:D
هناك طريقة افضل فى masm32 وهى على النحو التالى :
invoke GetModuleHandle mov hInstance,eax
ميزة هذه الطريقة هى انهو إذا كان لديك دالة تستعيها بعدد كبير من المتغيرات لن تحتاج لعمل push بعدد المتغيرات وإنما يكفى عمل invoke فى سطر واحد, وفى هذه الحالة الشفرة تصبح سهلة القرائه .
ننتظر باقى الاخوة قبل ان نشرح البرنامج وشكراً للمحاولة...
والسلام عليكم
لا إله إلا الله محمد رسول الله
busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.
طبعا أولا نعمل Instance للبرنامج وحفظ المقبض له لاستخدامها في اغلاق البرنامج
اللعب مع الـ opcode للمبتدئين مثلي :lol: :
حول
call eax
الى opcode تحصل على
FFD0
ضع قبلها
EB
EBFF D0xxxx
وحولها من البدايه مره اخرى الى أسمبلي لتفهم معنى التعليمه
Jmp $+2-1; jmp $+1
ترى أن معناها ارجع بايت واحد من العنوان التالي - لا اعرف كيف افسرها -
db 0ebh db 0ffh; اطرح منه واحد db 0d0h; العنوان التالي
يعني لو بدلنا - هنا فقط - EB بالـ 90 تعطي نفس العمل يعني nop
حينفذ التعليمه call eax يعني حيحفظ العنوان التالي (للرجوع اليه بعد تنفيذ الداله) وينتقل الى العنوان المحفوظ في eax
طبعا حيروح ينفذ الكود من عند My_Box يعني يظهر الرساله وبعدها يرجع تاني من بعد الـ call eax - عنوان الرجوع - بسبب كلمة ret بعد الرساله, يعدي على ال nop's , و يخرج من البرنامج
كام من عشره ؟؟؟
تم تعديل هذه المشاركة بواسطة Asm4all في 2 نوفمبر 2005 في 06:28
الخدعة في الHint :D
EB ليست إستدعاء Call و إنما قفزة Jmp
db 0EBh call eax
نوع من أنواع التمويه
تستخدم في الفيروسات
إستخدام Opcode الأمر الموالي في الأمر السابق لتصعيب الأمر لمن يحلل البرنامج
مثل
db 0e8h, 0f9h,0ffh,0ffh,0ffh;call $-7
أو أخر
jmp $+4 db 0Fh db D6h
السلام عليكم
طلعتو مش سهلين فى تحليل البرامج الاخ Asm4All جاب الاجابة الصحيحة فى اقل من 5 ساعات, انا اخذ مني يوم كامل لفهم ما يحدث, طبعاُ الكلام دا من سنتين لكن الان الحمد لله اصبحت افضل بكثير فى تحليل البرامج...
يلا عايزين مواضيع مشابهه حتى نحرك بها عضلات المخ الراكده
والسلام عليكم
لا إله إلا الله محمد رسول الله
busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.
هذا الموضوع مغلق.
