ar
Feedback
ReverseEngineering

ReverseEngineering

الذهاب إلى القناة على Telegram
1 265
المشتركون
لا توجد بيانات24 ساعات
-37 أيام
+730 أيام
أرشيف المشاركات
(Shadow space) فضای سایه چیست ؟ فضای سایه به عنوان یک مکان موقت برای ذخیره‌سازی آرگومان‌های ورودی عمل می‌کنه این فضا معمولاً به اندازه‌ی 128 بایته و برای نگهداریه مقادیر ورودی به توابع استفاده میشه

طول رشته های متغیر میتونن به اندازه لازم کاراکتر داشته باشن به طور کلی طول رشته را با دو روش مشخص میکنیم * معمولا طول رشته ذخیره میشه * با استفاده از یک کاراکتر sentinel میتونیم طول رشته رو با استفاده از نماد $ که نشون دهنده مقدار فعلی ذخیره کنیم مثال: msg db َ Hello,Friendَ ,0xa len equ $ - msg اشــاره به بایت بعد از آخرین کاراکتر متغیر رشته msg بنابراین msg-$ طول رشته رو به ما میده

بیت ها (bit) در مهندسی معکوس در مهندسی معکوس بیت ها که کوتاه شده از "binary digit" استفاده میشن مهمترین نقش رو دارن از اونجا که اطلاعات در سیستم‌ها و فایل‌ها به صورت بیتی ذخیره میشن مهندسین معکوس برای تحلیل و بازسازی اطلاعات از بیت‌ها استفاده می‌کنن بیت‌ها به عنوان واحدهای کوچیکتر داده‌ها که معمولا با مقادیر 0 و 1 هستن و در قالب رشته‌های بیتی در فایل‌ها و حافظه‌های سیستم ذخیره می‌شن به مهندسین معکوس کمک می‌کنند تا اطلاعات رو تحلیل کنن و به حالت اولیه اون برگردن این فرایند از تحلیل فایل‌های باینری یا کدگذاری دیجیتالی تا بازگشت داده‌های اصلی با بهره‌گیری از بیت‌ها انجام می‌شه جا به جایی بیت ها در دو مرحله انجام میشه اول به صورت پایین جا به جا میشن و بعد به صورت بالا

نمایش BCD دو نمایش BCD وجود داره نمایش BCD بسته بندی نشده Unpacked BCD نمایش BCD بسته بندی شده packed BCD در نمایش BCD بسته بندی نشــده هر بایت معادل دودویی یک رقم دسیمال را ذخیره میکنه به عنوان مثال اعداد 1234 به صورت زیر ذخیره میشه 04H 03 02 01 برای پردازش این اعداد دو دستورالعمل وجود داره
AAM - Ascii Adjust After Multiplication AAD - Ascii Adjust Before Division
چهار دستورالعمل تنظیم اسکی AAD و AAM و AAS و AAA با نمایش BCD بسته بندی نشده (Unpacked BCD) قابل استفاده ان در نمایش BCD بسته بندی شده هر رقم با استفاده از 4 بیت ذخیره میشه دو رقم دهدهی در یک بایت بسته بندی میشن مثال 1234به صورت زیر ذخیره میشه
34H 12
برای پردازش این اعداد دو دستورالعمل وجود داره DAA - Decimal Adjust After Addition DAS - Decimal Adjust After Subtraction نکته: در نمایش BCD بسته بندی شده هیچ پشتیبانی برای ضرب و تقسیم وجود نداره

نمایش ASCII اعداد دهدهی به عنوان رشته ای از کاراکترهای ASCII ذخیره میشن به عنوان مثال مقدار دهدهی 1234 به صورت زیر ذخیره میشه 34H 33 32 31 که 31H مقدار ASCII برای 1 اســت H32 مقدار ASCII برای ۲ است و غیره چهار دستورالعمل برای پردازش اعداد در نمایش ASCII وجود دارد
*AAA - Ascii Adjust After Addition *AAS - Asciii Adjust After Subtraction *AAM - Asciii Adjust After Multiplication *AAD - Ascii Adjust Before Division

اعداد دودویی را میتوان به چند شکل نشان داد: فرم ASCII فرم دهی (BCD) Binary Coded Decimal نمایش ASCII

اعداد در زبان اسمبلی داده های عددی به طور کلی در سیستم دودویی نمایش داده میشن دستورالعمل های حسابی روی داده های باینری عمل میکنن وقتی اعداد روی صفحه نمایش داده میشن یا از صفحه کلید وارد میشن به شکل ASCII هستن

حلقه ها در زبان اسمبلی دستورالعمل JMP میتونه برای پیاده سازی حلقه ها استفاده شه به عنوان مثال قطعه کد زیر میتونه 10 بار <LOOP-BODY> رو اجرا کنه
MOV CL,10 L1: <LOOP-BODY> DEC CL JNZ L1
دستور اصلی LOOP LOOP lable

photo content

photo content

در عکس زیر دســتورالعمل های پرش شرطی مورد اســتفاده در داده های بدون علامت استفاده شدن برای عملیات منطقی کاربرد دارن

photo content

photo content

پرش شرطی Jump Conditional اگر برخی از شــروط مشــخص در پرش شرطی براورده شن جریان کنترل به دستورالعمل هدف منتقل میشه بسته به شرایط و داده ها دستورالعمل های پرش شــرطی متعددی وجود داره برخی از اونا رو در عکس زیر میتونید ببینید

پرش غير شرطی Jump Unconditional همان طور که قبلا گفتیم این کار با دستور JMP انجام میشه اجرای شرط ها اغلب شــامل انتقال كنترل به آدرس دستورالعملی اســت كه از دستورالعمل اجرای كنونی پیروی نمی کنه انتقال کنترل ممکنه رو به جلو باشــه برای اجرای مجموعه جدیدی از دستورالعمل یا قبلی اجرایی دوباره همان مراحل دســتورالعمل JMP اسم لیبلی رو در اختیار شما قرار میده که سریعا جریان کنترل انتقال داده بشه سینتکس دستورالعمل JMP به شکل زیر است: JMP label

دوستان ری اکشن بزنید که قوی تر بریم جلو و اگه میتونید لطفا کانال رو Share کنید

دستورالعمل CMP دو عملوند رو مقایســه میکنه معمولا در اجرای شرطی مورد اســتفاده قرار میگیره این دستورالعمل اساسا برای مقایسه این که آیا عملوند برابره یا نه یک عملوند رو از عملوند دیگه کم میکنه که باعث اختلال در عملوند های منبع یا مقصد نمیشه از اون به همراه دستورالعمل پرش شرطی برای تصمیم گیری استفاده میشه مثال CMP: CMP operand1,operand2 Operand1 = 10 Operand2 = 20 CMP 10,5 خب حالا CMP چکار‌ میکنه دو فیلد داده عددی رو مقایسه میکنه عملوند مقصد میتونه در ثبات یا در حافظه باشه عملوند منبع میتونه یک داده ثابت فوری ثبات یا حافظه باشه بیش تر برای مقایسه این که یک مقدار شمارنده به تعداد دفعاتی که یک حلقه برای اجرا نیاز داره رسیده استفاده میشه

ساختار شرطی در زبان اسمبلی اجرای شرط ها به زبان اسمبلی توسط چندین دستورالعمل حلقه و branching پرش انجام میشه این دستورالعمل ها میتونن جریان کنترل رو داخل یک برنامه تغییر بدن اجرای شرط ها در دو سناریو مشاهده میشن مثال:
روش غير شرطی Jump unconditional توسط دســتورالعمل JMP انجام میشه اجرای شرط ها اغلب شامل انتقال كنترل به آدرس دستورالعملیه كه از دستورالعمل اجرای الان پیروی نمی کنه انتقال کنترل ممکنه رو به جلو باشه برای اجرای مجموعه جدیدی از دستورالعمل یا قبلی اجرای دوباره همون مراحل

پرش شرطی jump Conditional بســته به شــرایط توســط مجموعــه ای از دســتورالعمل هــای پرش j condition انجام میشه دستورالعمل های شرطی کنترل رو با شکستن جریان پی در پی انتقال میدن و اونا رو با تغییر مقدار افست در IP انجام میدن

دستورالعمل NOT عملیات NOT بیتی رو انجام میده عملیات NOT بیت ها رو در یک عملوند معکوس میکنه این عملوند میتونه داخل یک ریجستر یا حافظه باشه مثال:
Operand1: 0101 0011 After NOT -> Operand1: 1010 1100

دستورالعمل TEST مثل عملیات AND کار میکنه، اما بر عکس دستور AND اولین عملکرد رو تغییر نمیده اگر بخایم بررسی کنیم ی عدد تو ریجستری زوج‌ یا فرده میتونیم این کار رو با استفاده از دستور TEST بدون تغییر عدد اصلی انجام بدیم مثال:
TEST AL,01H JZ EVEN_NUMBER عدد زوج