• 0
chik

أمثلة في الهندسة العكسية

سؤال

السلام عليكم,

لقد قام الأخ jaas بإعطاء دروس مهمة في هذا المجال. وهنا فتحت موضوع جديد في هذا الميدان أيضا حتى لا أضع له خللا في التسلسل الذي الذي يتصوره لدروسه. وبما أني لست أتذكر الرابط القديم سأعاود هذا علما أن القديم كان يستهدف نضام 98 فقط وهنا سنحاول أن نعممها على جميع الأنظمة إن شاء الله.

سنبدأ هنا إن شاء الله بزيادة MessageBox للنوتباد وستظهر هذه النافذة قبل أن يبدأ البرنامج.

هنا أفترض أنه لدينا بعض المعلومات عن Pe Header ويمكن أن نقرأ الملفات الخاصة بذلك وهي في المنتدى دائما - عفوا الأخ طارق لم أتذكر الرابط مرة أخرى ويمكن أن أعيد الملفات مرة أخرى إن اقتضى الحال - . وبعد هذا سنطور الطريقة وسنزيد في المرة القادمة نافذة تطلب منا إدخال بسوورد فإذا تحقق يشتغل البرنامج والعكس بالعكس.

هنا اشتغلت على نوتباد اللي في الوندوز 98 النسخة الفرنسية ويمكن عمل نفس الشيء إذا كان الملف مختلفا في الأنظمة الأخرى.

الطريقة الآن سنبدأ بالسهلة وهي كما يلي :

نقوم أولا بإلقاء نظرة على الملف المستهدف مثلا سنرى القطاعات التي يحويها هذا البرنامج Sections وسنرى أنه عندنا مساحة خالية في قطعة الكود وهذا يكون في أغلب الأحيان متحققا وذلك لأن الكود يكون له Alignement وهذا يجعله يترك فراغا في أغلبية البرامج .

فيما يخص هذه النسخة من نوتباد عندنا ما يكفينا من الفراغ وأكثر. وسنفتح الملف في برنامج للهيكس وسنتأكد أن لدينا مساحة خالية تمتد من الأوفسيت 4EA0 إلى الأوفسيت 5000 . وهنا اخترت أن أبدأ في 4F00 . في هذا الأوفسيت سنضع الكود الخاص ل MessageBox ونعرف أن برمجتها في الأسمبلر تكون كما يلي :

push KindOfMessageBox
push OffsetOfTitle
Push OffsetOfText
push HandleOfParentWindow
Call MessageBoxA

فيما يخص KindOfMessageBox سنعطيها قيمة 0 لأننا نريد النوع البدائي ويمكن أن نعطيها الأرقام الخاصة بكل نوع إذا ما أردنا.

OffsetOfTitle وهو العنوان الذي سيحتوي على عنوان النافذة وهنا اخترت أن أضع العنوان في الأوفسيت 4F50

OffsetOfText هو عنوان المسج الذي ستعطيه لنا النافذة وقد اخترت أن أضعه في الأوفسيت 4F60 . ومن هنا نستنتج أن لا يتعدى طول OffsetOfTitle السابق 15 حرفا مع 0 الختام . وكما نعلم جميع الجمل يجب أن تنتهي ب 0.

HandleOfParentWindow هنا بما أننا لا نريد زيادة الكود لنتعرف على النافذة الأم سنعطي لهذا البارامتر قيمة 0 ليكون إجمالي.

بعد هذا ما علينا سوى أن نستدعي عنوان الدالة MessageBoxA الموجودة في User32.dll . فكيف سنعثر على هذا العنوان.

من حسن حضنا البرنامج نوتباد يستدعي هذه الدالة ولهذا فإن عنوانها سيكون موجودا في ImpotTable . وهنا إما أن نكون نعرف كيف نبحث داخل هذه الطاولة - وسنعود إلى هذا الموضوع في الحلقات المقدمة لأني في صدد عمل برنامج لهذا الغرض - أو نستعمل بعض البرامج التي تعطينا هذا مثل برنامج FileInspector مثلا أو غيره. وحين يحمل البرنامج إلى الذاكرة سيقوم بالبحث عن الدوال المستوردة ويضعها كل واحدة في مكانها. وفي هذا المثال فإن عنوان MessageBox سيكون في العنوان التالي : 4064A8 حين يكون في الذاكرة وهذا ما كنا سنحتاجه.

بعد هذا سنحتاج إلى الكود محول إلى بايناري للكود السابق. وهنا يمكن أن نستعمل عدة طرق وأنا مثلا أكتبها في ديبوغر - سفتايس - وبعد ذلك أنقل الكود الذي سيعطيني إلى ملف معين . والكود الكامل الذي نريد أن نترجم هو كالآتي :

push 0
push 404f50h
push 404f60h
push 0
call [4064A8h]
mov eax,4010cch
jmp eax

والسطور الأولى كما ذكرت هي لإظهار النافذة ونلاحظ العناوين 404F50 و 404F60 وهي العنواوين التي ستكون في الذاكرة بعد تحميل البرنامج بواسطة لودر الوندوز. وهنا كان الأمر سهلا لأنه عندنا في برنامج نوتباد هذا نفس العناوين في الملف على القرص وفي الذاكرة.

وبعد هذا سنقفز إلى نقطة الدخول الأصلية للبرنامج والتي هي في هذه الحالة 4010CC .

وهنا طبعا سنغير نقطة بداية البرنامج الأصلية لنجعلها تؤشر إلى الكود الذي أضفناه.وكما نعلم فإن نقطة بداية كل برنامج تكون في الملف في الأوفسيت 28 هكس بعد ابتداء Pe Header وفي مثالنا ستكون في الأوفسيت A8 وفيه ستكون النقطة الأصلية فيها

CC-10-00-00 وسنغيرها على الشكل 00-4F-00- صفر . كلمة صفر يعني أن نضع هنا صفر لأن الكتابة لم ترد أن تضع الصفر هنا.

وهكذا فحين سنشغل البرنامج وبما أننا غيرنا نقطة البداية فهو سيذهب إلى الكود الذي أضفناه وسيضهر لنا الرسالة وبعد هذا يذهب إلى النقطة الأصلية وسيشتغل البرنامج كأن شيئ لم يكن.

هذه بداية وسأحاول أن أعطي مثالا في المرة المقبلة كبف شنضيف نافذة كاملة تطلب منا PassWord. وبما أنني لا أريد البداية بالأشياء الصعبة سأبحث عن برنامج يكون يستورد الدوال التي تلزمنا وهي على سبيل المثال :

DialogBoxIndirectParamA

GetDlgItemTextA

EndDialog

ExitProcess

GetModuleHandle

حاولت أن أضع هذا المثال على نوتباد ولكنه لا يستورد كل هذه الدوال ولذى أبحث عن ملف لهذا الغرض. لقد قمت مثلا بهذا على برنامج Winzip32.exe النسخة 9.0 ولكن الملف طويل وسيكون عائقا في التحميل.

ولكن بعد هذا وبعد أن نكتسب شيئا من الخبرة سنحاول عمل ما نريد على أي ملف حتى ولو كان لا يستورد هذه الدوال إذ سنبحث عنها مباشرة في الدوال الأم إما مثلا user32 أو kernel32 أو غيرها.

وفي الملف المرفق أعطيت نوتباد النسخة الأصلية والمغيرة حتى إذا كان لأحد ما نسخة غير هذه.

في انتظار أسئلتكم أو اقتراحاتكم أقول لكم إلى اللقاء.

RevNotePad.ZIP

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

16 إجابة على هذا السؤال .

  • 0

أخ chik

هل وصلتك رسالتي الخاصة ؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلاه عليكم,

الأخ seme اقرأ ردي في الموضوع السابق.

إلى اللقاء.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم,

سنستمر في أمثلتنا وهده المرة سنضع نافدة تطلب منا كلمة المرور قبل أن يشرع البرنامج وفي حالة عدم إعطاء هده فلن يشتغل - أو على الأقل بالطريقة العادية - .

كما دكرت في الموضوع السابق فلهادا الغرض سنحتاج الدوال التالية

DialogBoxIndirectParamA

GetDlgItemTextA

EndDialog

ExitProcess

GetModuleHandle

MessageBoxA

فبما أننا نريد أن نستعمل الطريقة السهلة فسنحاول التجربة على برنامج يكون يستورد هده الدوال كلها إلا أنني لم أستطع العثور على ملف يكون فيه كل ما نريد . ولهدا اخترت ملف Calc.exe وسنجرب عليه المثال وسنغير شيئا ما الطريقة السابقة. فبرنامج الآلة الحاسبة يستورد الدوال التالية

GetModuleHandle

EndDialog

MessageBoxA

إدن ستبقى لنا 3 دوال أخرى ولحسن الحض فالبرنامج يستورد الدالة ExitProcess وهده ستساعدنا في العثور على العناوين الباقية.

كما قلت المثال سيكون على calc.exe التي مع الوندوز 98 . وبعد إلقاء نضرة على هدا البرنامج نحصل على المعلومات التالية :

Virtual Address = 1000

Virtual Size = 11A0E

Entry Point = 119E0

Image Base = 1000000

وبعد هدا نتصفح الملف ونلاحظ أنه فيه مكان فارغ في قطعة الكود سنستغلها لإضافة الكود الدي نريده. ولهدا اخترت أن أبدأ في الأوفسيت في الملف 12A30 وسأستغله كما يلي :

12A30 سأضع هنا عناوين الدوال التي أحتاجها وستكون في الترتيب التالي ونعلم أن كل عنوان سيأخد 4 بايت :

12A30 : ExitProcess - GetModuleHandle - GetProcAddress - EndDialog

12A40 : DialogBoxIndirectParam - GetDlgtemText - MessageBox

هدا اختيار ويمكن أن نختار الترتيب الدي نريده

12A50 : سنضع هنا عنوان الدي ستحتاجه MessageBox في حالة كلمة سر خاطئة

12A60 : سنضع هنا رسالة المسج

12A80 : بافر الدي سيستقبل ما ندخله في نافدة كلمة المرور

12AA0 : كلمة KERNEL32.DLL سنحتاجها عندما نريد أن نبحث عن دالة فيها

12AB0 : كما سبق لكن هده المرة ل USER32.DLL

12AC0 : كلمة ExitProcess هي أيضا سنحتاجها عندما نريد البحث عن عنوان هده الدالة.

12AD0 : نفس ما سبق فيما يخص GetDlgItemTextA

12AE0 : أيضا كما سبق والدالة هنا DialogBoxIndirectParamA

هدا فيما يخص المعطيات وفيما يخص الكود . فقد قمت بكتابته في الماسم ونقلت القطع التي أحتاجها إلى هدا الملف وقد كانت كما يلي :

12B00 : هنا سأضع الكود الخاص ب DialogProc والدي سيقوم بمعالجة الرسائل الموجهة إلى النافدة التي سنخلقها وهم تقريبا نفس الكود الدي أعطيته في مثال سابق لنافدة تطلب كلمة السر.

12B90 : هنا سيكون الكود الأول وسيكون على الطريقة التالية وحاولت أن يكون سهلا ومفهوما :

push 12AA0   هنا نسجل تاعنوان اللي فيه kerne32.dll 
Call [1012A34]  هنا نحاول أخد هاندل هده المكتبة
push 1012AC0  تسجيل عنوان ExitProcess
push eax تسجيل الهاندل السابق
Call [1012A38] محاولة العثور على عنوان الدالة
mov dword ptr [1012A30],eax نضع العنوان الدي عثرنا عليه في عنوانه الخاص به

ونعمل نفس الشيء بالنسسبة للدوال GetDlgItem و DialogBoxIndirectParam علما أن بالنسبة للدوال التي يستوردها البرنامج سنضع عناوينها في الأمكنة التي اخترناها باستعمال الطريقة مثل الموضوع السابق.

بعد العثور على كل العناوين المحتاجة تتمة الكود ستكون كما يلي :

push 0
call [1012A34]  أخد هاندل البرنامج الحالي
push 0
push 1012B00  عنوال DialogProc
push 0  هاندل النافدة الأب
push 1012D00  في هده الداكرة سنضع ما يماثل الرسورس لهده الدالة وهي ستحتوي على مواصفات النافدة التي سنخلقها.
push eax  تسجيل هاندل هدا البرنامج
Call [1012A40]  إظهار النافدة
cmp eax,55 اخترت عودة هده الدالة يساوي 55 إدا كانت كلمة السر صحيحة
jnz NoGood
mov eax,10119E0  نضع في الرجستر نقطة بداية الأصلية للبرنامج
jmp eax  نستدعي البرنامج الأصلي
NoGood:
Push 0
Call [1012A30]  استدعاء ExitProcess في حالة الخروج من النافدة بدون إعطاء كلمة سر صحيحة.

هدا وبالطبع نغير نقطة بداية البرنامج لتؤشر إلى الكود الجديد. وهدا يكون في الأوفسيت F0 ونغير طول الكود إلى 12000 في الأوفسيت 1C8

في هده المرحلة نشغل البرنامج ونلاحظ أنه يعطينا خطأ في الإنجاز. وأردت أن أركز على هده النقطة. فهدا الخطأ امر طبيعي لأن معظم الكمبايلرات تعطي لقطعة الكود خصائص للتشغيل والقراءة فقط. ولكن نحن قمنا أيضا بالكتابة داخل هده القطعة فمثلا سنكتب العناوين بعد أن نعثر عنها كما سنكتب ما تدخله النافدة وهدا هو سر الخطء لدى يجب أن نغير حالة قطعة الكود حتى نجعلها تسمح بالكتابة أيضا وتجدون الأرقام الخاصة بهدا في ملفات Pe Header ولكن أنا شخصيا تعودت أن أعطي في هده الحالات جميع الخصائص للقطعة المستهدفة ولهدا أغير البايت الرابع إلى قيمة E0 . وخصائص قطعة الكود تكون في الأوفسيت 1E4 وسنغير بايت 1E7 من 60 إلى E0 كما دكرت وبعد هدا يجب على البرنامج أن يشتغل .

وفي البرنامج المرفق تجدون البرنامج الأصلي والبرنامج المغير ويمكن أن تتبعوه بديبوغر لتروا المراحل كما يمكنكم مشاهدة التغييرات ببرنامج للهيكس.

ملاحظة : كل الأرقام التي أعطيتها هي بنظام الهيكس.

إلى اللقاء.

Rev_Calc.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم,

بعد مراجعة البرنامج المغير الدي أعطيته سابقا اتضح لي أنني لم أقم بتغيير caracteristics للقطعة text . ولهدا إدا لم يشتغل البرنامج المرجو تغيير هدا كما دكرت سابقا ونغير القيمة 60 إلى E0 وهدا سيكون في بداية القطعة text . + 27 .

فمع كثرة الملفات حملت الملف الدي لم أغير فيه هدا البت.

إلى اللقاء.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اخي الحبيب chik

السلام عليكم وحمة الله وبركاته

اخي لي سؤال محتاج اجابته منك الله يعطيك العافية

وهو كيف اعرف بداية الكود ونهايته في أي برنامج غي الذاكرة وهو مايعرف بـ OEP

و هي بداية انطلاق البرنامج لكي يسهل علي فك ضغط البرنامج او تشفيره وجزاك الله خير انت ومن يرد على مشاركتي وشكرا

تم تعديل بواسطه sgr2001
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

Assalam

Sorry to not write in Arabic cause I haven't this on this computer.

First I want to say for the question that the Entry point is located at the offset of the Pe Header + 28h .But if the program is zipped or encrypted the encrypt programm will chage this OEP to point to the encrypt program so it will do what it has to do and the OEP will be dissimulated in the code somewhere and this depends of the type of the encryption. So we cant say that the OEP will be this address if we don't trace the program and see what it has done to the original Entry Point.

For example in the examples I have done before I have changed the OEP to let it point to my code and when this is terminated I pass to the OEP. Here since I don't want to do some encryption it is easy to locate the OEP after a quick trace but if the encryption is very gard we must trace a little bit harder to define the OEP.

For the example I have given before here is a copy of the programm where I have done the correction for the caracteristics of the code section. And I have forgotten to give the PassWord it is : CHIK in capital letters

Ila Lika3

Rev_Calc2.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ..

عمل رائع أخي .. اهنئك

ولكن لي ملاحظة : الا يمكن اعادة كتابة الطريقة باستخدام لغة السي مثلاً ؟؟

بصراحة خبرتي لا تساعدني في فهم برامج الاسمبلي بوضوح :(

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا اخي على الرد chik

لكن للاسف في اللغة الانجليزية تعبان بالمرة سوف انتظر منك الحل بالصور وبالعربي

إذا تمكنت بارك الله فيك وجزاك عني خير الجزاء

شاهد الصورة التالية وقلي اين الـ OEP

اين بداية الكود ونهايته

11.gif

برأيي ان البداية هي 1000+400000 اول واحدة text

والله اعلم منتظر الرد

تم تعديل بواسطه sgr2001
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مرحبا أخي chik

فيما يخص المثال الأول والخاص بالنوتباد :

بعد هذا سنحتاج إلى الكود محول إلى بايناري للكود السابق. وهنا يمكن أن نستعمل عدة طرق

ممكن أن تورد بعض الطرق غير طريقة السوفت أيس وحبذا لو كان فيه شئ من التفصيل ؟

وهنا طبعا سنغير نقطة بداية البرنامج الأصلية لنجعلها تؤشر إلى الكود الذي أضفناه

لم استطع فهم هذه النقطة ايضا ...

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم,

أولا أعتذر عن الكتابة باللغة الإنجليزية في الموضوع السابق لضروف خارجة عن إرادتي. وسأحاول ان أجب عن الأسئلة.

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

- الأخ sgr2001 : إن ما أعطيت في الصورة يعطينا تفاصيل القطعات أو Sections وهذه الخانات في مثالك هي كما يلي من اليسار إلى اليمين :

1 - اسم القطعة وهو اسم يتكون من 8 حروف على الأكثر .

2 - VOffset وهي أين ستبتدء هذه القطعة حين يحمل البرنامج في الذاكرة. ويجب أن نعلم أن هذه نسبية بالنسبة لما يسمى Image Base أو أين سيحمل البرنامج ككل. في أغلب الأحيان تكون هذه الأخيرة في الذاكرة 400000 لذا في المثال السابق فإن القطعة text ستكون في الذاكرة 400000 + VOffset يعني ستكون في 401000 .

3- طول القطعة بالبايت ودائما في الذاكرة. وهنا يجب أيضا أن نوضح شيئا فهذا في غالب الأحيان يكون طول الكود الحقيقي أما طول القطعة فيكون دائما على الأقل أكبر من هذا لأن القطع تمشي بما يسمى ب Alignement فمثلا نقول أن قطعة ما تحتوي على معطيات تقدر ب 795 فإذا كان Alignement هو 1000 فستكون القطعة طولها 1000 وكما ذكرت مسبقا فهذا ما يجعلنا في الكثير من الأحيان نلقى مكانا فارغا وسط البرامج لأن هناك احتمال ضعيف جدا أن يتوافق طول القطعة الحقيقية مع Alignement .

4- RawOffset هذا هو مكان القطعة ولكن هذه المرة على القرص أو نقول على الملف بنفسه. وهنا أيضا ليس بالضرورة أن تكون عندنا نفس الأرقام كما في الذاكرة.

5- RawSize وهو كما سبق طول القطعة ولكن هذه المرة على القرص وفي غالب الأحيان يكون هذا هو طول File Alignement لأن هناك كما ذكرنا Alignement خاص بالذاكرة وآخر خاص بالملف على القرص وليس بالضرورة أن يكونا متساويان.

6- هذه الخانة تحتوي على Caracteristics القطعة يعني هل المعطيات التي فيها يمكن قراءتها وهل يمكن الكتابة في هذه القطعة وغير ذلك.

إذن إذا اكتفينا بمشاهدة هذا الجدول فسنتعرف عن القطع الموجودة في البرنامج لكن لا يمكن أن نعرف نقطة بداية البرنامج. ولمعرفة هذه النقطة يمكن أن نقوم بما يلي :

لا أعلم ما هو البرنامج الذي استعملته ليعطيك هذه المعلومات ولكن احتمال كبير أنه يعطيك نقطة بداية البرنامج في مكان آخر فكل البرامج تقريبا التي تعطي هذه المعلومات يكون فيها المعلومات الأخرى.

كما يمكن أن نتعرف على ذلك يدويا كما يلي :

نفتح البرنامج في برنامج للهيكس. نذهب إلى الأوفسيت 3C هذا سيعطينا بداية Pe Header نقول مثلا أن في 3C تكون عندنا الأربح بايتات هي 00 00-01 -00 بما أن البايتات تكون مقلوبة فهذا يعطينا الرقم 100 بعد أن نزيل أصفار اليسار وهذا سيعني أن في الأوفسيت 100 يكون بداية Pe Header وهذا يجب أن يحتوي على الكلمات PE وهي كإمضاء ونعرف أن نقطة بداية البرامج تكون في بداية Pe Header زائد 28 لإذن نقطة بداية البرنامج في هذا المثال ستكون في 128 - الأرقام طبعا كلها بالهيكس - .

الأخ شادي :

بعد هذا سنحتاج إلى الكود محول إلى بايناري للكود السابق. وهنا يمكن أن نستعمل عدة طرق

إذا لم نرد استعمال ديبوغر ليعطينا ما نريد يمكن أن نكتب برنامجا في الأسمبلر يعطينا المقصود ونأخذ منه الكود الخاص بالقطعة التي نريدها.إلا أن الطريقة الأولى حسب رأيي تكون أسهل لأنها تعطينا الهدف الذي نريده مباشرة بينما الطريقة الأخرى قد نكتب فيها الكود كامل حتى يقبل الكمبايلر أن يبني البرنامج .

وهنا طبعا سنغير نقطة بداية البرنامج الأصلية لنجعلها تؤشر إلى الكود الذي أضفناه

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

أتمنى أني أكون فلحت في التفسير وإذا كانت هناك إضافات أخرى .

وسأحاول في المرة القادمة أن نعطي نفس ما سبق ولكن هذه المرة سنضيف قطعة خاصة بنا ولكن بعد شيء من الوقت لأنه لدي إنشغالات هذه الأيام. لكن ليس هناك مشكل في الردود.

إلى اللقاء.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بارك الله فيك اخيchik

راجع رسائلك الخاصة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أخي chik لو تكرمت ممكن تشرح لي طريقة تحويل الكود إلى بايناري باستخدام السوفت ايس ؟؟

اقصد الكريقة التي ذكرتها بالأعلى ..

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم,

حين نكون في سوفتايس يمكن أن نكتب كود بالأسمبلر باستعمال :

a address

address هي العنوان الذي نريد أن نكتب فيه الكود .

وبعد كتابة الكود إذا استعملنا مثلا d address سنرى الكود الذي نتج عما كتبناه.

وإذا كنا نستعمل IceDump يمكن أن نطبع الكود الناتج مباشرة في ملف.

إلى اللقاء.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يا ســـــــــــــــلام على الأمثلة الرائعة

وفي إنتظار المزيد ...

وبالتوفيق ,,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم,

سعيد بقراءتك يا أخ Jaas وأتمنى لك التوفيق.

إلى اللقاء.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مشكور اخي و شرح متعوب عليه

وإن شاء الله تعم الفائده عالجميع

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .