Reverse Code Engineering

逆向工程代码 обратная код машиностроения

Reverse Code Engineering

逆向工程代码 обратная код машиностроения

Reverse Code Engineering

Share what I know............... learn what I don’t

آخرین نظرات

۴ مطلب در دی ۱۳۹۳ ثبت شده است

فایل اجرایی توی ویندوز یا به عبارتی PE با پسوند exe , dll و ... شناخته میشن که قطعا با فایلهایی با پسوند اینجوری روبرو شدید:)

اکثر اینا از یک قالب تعیین شده ای استفاده می کنند (VxDs و DLL های 16 بیتی ازین قالب مستثنی هستند) این قالب اجازه میده که یک فایل اجرایی توی همه نسخه های ویندوز قابل حمل باشه و دیگه ما نیاز به کامپایل دوباره مخصوص نسخه ی ویندوزیمون نداشته باشیم.

 

ساختار فایل اجرایی به شکل زیر هستش

 

اکثر مواقع نیاز نیست که ما تک تک دستورات رو آنالیز کنیم (مگر در مواقع ضروری), چونکه این کار واقعا خسته کننده هستش و ممکنه یه برنامه هزارها یا حتی میلیون ها دستور دیس اسمبل شده داشته باشه.پس برای رفع این مشکل ما میایم و دستورات رو بصورت گروهی بررسی میکنیم تا یه تصویر کلی از عاملیت برنامه داشته باشیم و بعد تنها روی دستورات خاصی که مد نظرمون هستش زوم می کنیم و آنالیز رو انجام میدیم.

همانطور که میدونید بیشتر نرم افزارها با زبان های سطح بالایی مثل C یا C++ توسعه داده میشند و اگه ما با دستورات اسمبلی تولید شده توسط کامپایلرهای این زبانها برای هر سازه آشنا باشیم پس می تونیم خیلی راحتتر کدهای دیس اسمبل شده ی برنامه های نوشته شده با این زبان هارو بررسی کنیم. -- خودمم نفهمیدم چی گفتم :) (منظورم از سازه همون دستورات برنامه نویسی استفاده شده توی کد هستش,مثل حلقه, عملیات محاسباتی و...)

پس ما قراره که سازه های زبان C رو در اسمبلی مورد بررسی قرار بدیم.مثلا حلقه ها, تعریف انواع متغیرها و... البته به این نکته هم توجه داشته باشید که نسخه کامپایلر و تنظیماتش هم روی کد اسمبلی تولید شدش تاثیر میزاره و همه مشابه هم نیستند.

 

برای یاد گیری کرک یا به صورت کلی مهندسی معکوس نرم افزار ما نیازمند یادگیری یه سری پیش زمینه ها هستیم.اولینش آشنایی با زبان اسمبلی هستش,نیاز نیست که برنامه نویسی با این زبان رو یاد بگیرید همینکه با دستورات مهمش آشنا باشید می تونید کار خودتون رو پیش ببرید.

OllyDbg و IDA Pro دوتا از ابزارهای رایج دیس اسمبل کردن فایل های باینری برای استخراج دستورات اسمبلی از زبان سطح ماشین هستند. پس عملکرد نرم افزار به زبان اسمبلی ازطریق این ابزارها قابل رویت هستش

در اینجا قصد آموزش کامل این زبان رو نداریم و فقط یک توضیح کلی در مورد بخش های اولیه و پرکاربرد این زبان را می دهیم.

 

پیش زمینه:

BIT : کوچکترین قسمت داده ای که یا 0 هستش یا 1

مثال: 00000001 = 1       00000010 = 2             00000011 = 3    

 

BYTE: یک بایت حاوی 8 بیت است که می تواند 255 حالت را بسازد.(0 تا 255)

 

WORD: یک WORD حاوی 2 بایت یا 16 بیت است.و بیشترین حالت ممکن آن 0FFFFh (یا 65535) است.

 

DOUBLE WORD: حاوی 2 تا WORD یا به عبارتی 32 بیت است و بیشترین مقدار ممکن آن 0FFFFFFFF (یا 4294967295) است.

 

KILOBYTE: یک کیلوبایت برابر با 1024 بایت (32*32) است.

 

MEGABYTE: محتوی 1024*1024 یا 1,048,578 بایت است.

 

قسمت اول: رجیسترها

 

در IA-32 هشت رجیستر عمومی وجود داره:

EAX:   Extended Accumulator Register

EBX:   Extended Base Register

ECX:   Extended Counter Register

EDX:   Extended Data Register

ESI:    Extended Source Index

EDI:    Extended Destination Index

EBP:   Extended Base Pointer

ESP:   Extended Stack Pointer

 

البته بغیر از اینها رجیسترهای دیگه ای هم وجود داره مثل EIP که حاوی اشاره گری به دستور جاری هستش.البته لازم نیست زیاد نگران باقی رجیسترها باشید.

توجه کنید که همه نام ها با حرف E شروع شده اند که این بمعنی 32 بیتی بودن آنهاست.

 

بسم اله الرحمن الرحیم
اولین پست وبلاگ رو به حرفهایی مختصر از اهداف خودم و وبلاگ اختصاص میدم,مباحثی که برای ما مهم هستند و قرار است که بهش بپردازیم در کل به زیر شاخه های مهندسی معکوس نرم افزار (مثل کرک نرم افزار,  امنیت نرم افزار,  توسعه اکسپلویت, شلکد, بررسی بدافزارها, برنامه ها و روشهای مهندسی معکوس نرم افزارو...) مربوط میشه, و قصدمون هم افزایش بار علمی خودم و شماست.
از شما دوستان هم می خوام که آموخته هاتون و تجربیاتتون رو در اختیار من و دیگران در این وبلاگ قرار بدید.
باتشکر
Pcrlth0n