مجموعه ایحساس از تکنیکها و ابزارها برای فهمیدن اینکه محتوای یک نرم افزار شامل چه چیزهاییمیباشد. به عبارت دیگر عمل تجزیه و تحلیل یک سیستم برای مشخص کردن مولفه های سیستمو رابطه متقابل آنها به منظور نمایش سیستم به شکلی دیگر یا در سطحی بالاتر میباشد. این نوع تکنیکها باعث میشود تا ساختار یک نرم افزار را نمایان نموده و راههایعملکرد آن و همچنین ویژگیهایی که طبق آن حرکت میکند را مشخص کنیم. در واقع مهندسیمعکوس زمانیکه شخصی کد شخص دیگری را کاوش کند نیز اتفاق می افتد. بحث در موردعلم مهندسی معکوس از سال 1990 میلادی آغاز شده و در بعضی مجله های علمی مثل IEEE Software به صورت یک طبقه بندی علمی از آن صحبت میشود. آیا شما مهندسی معکوس رانادیده میگیرید؟ فرض کنید شما نرم افزاری را توسعه داده و به فروش رسانده اید! آیا نمیخواهید دیگران به حقوق کپی (Copyright) شما احترام بگذارند؟ این بحث معمولا" از معانی منفی عبارت مهندسی معکوس به خصوص در صنعت نرم افزار سازی شروعمیشود. به هر حال تکنیکهای مهندسی معکوس راه هایی هستند برای تولید کننده ها ومصرف کننده های نرم افزار که با مقوله عرضه اقتصادی در یک زنجیره قرار میگیرند. درنظر داشته باشید که این ابزار (راهکار) به طور ذاتی خوب یا بد نیست، موضوع قابلتوجه این است که این ابزار در چه راه هایی مورد استفاده قرار میگیرد. مهندسی معکوسبه ویژه در نرم افزارهای پیشرفته برای اهداف خاص مورد استفاده قرار میگیرد - یافتن کدهای مخرب: تعدادی از تکنیکهای ویروس یابی از مهندسی معکوس برای دستیابی بهساختار و عملکرد این کدهای مخرب استفاده میکنند. به وسیله این تکنیکها نرمافزارهایی تولید میشود که برای مبارزه با ویروس های کامپیوتری مورد استفاده قرارمیگیرد. - کشف خطاهای ذاتی (Bug) و نقص های غیر منتظره: حتی بهترین سیستمهای نرمافزاری میتواند دارای خطا باشد که با استفاده از مهندسی معکوس میتوان آنها را پیداکرده و رفع نمود (Debug).
نرم افزارهای سطح پایین این نوع نرم افزارها شاملابزارهای توسعه از قبیل Compiler، Linker، Debugger، سیستم های عامل (Operating System) و زبان های برنامه نویسی سطح پایین مثل Assembly میباشد. در واقع لایه ایاست که جداکننده توسعه دهندگان نرم افزار و برنامه های کاربردی از سخت افزارمیباشد. اگر شخصی بخواهد در زمینه مهندسی معکوس مهارت به دست آورد باید فهم کاملینسبت به نرم افزارهای سطح پایین داشته باشد.

زبان Assembly
این زبانپایین ترین سطح زبان های برنامه نویسی میباشد که به طور باورنکردنی در مهندسی معکوسمورد استفاده قرار میگیرد. اگر یک نرم افزار عملی را انجام دهد آن عمل باید به زبان Assembly قابل رویت باشد. مبحث مهم دیگر، کد ماشین است که همراه با زبان Assembly دو نوع تعریف مختلف از یک چیز میباشد. کد ماشین چیزی نیست جز رشته ای از بیتها وشامل لیستی از دستورات (در واقع نمایش متنی آن بیتها)، كه توسط CPU باید اجراشود.

Compiler
و Machine Code با توجه به اینکه CPU فقط قادر است کدهایماشین را اجرا کند با استفاده از Compiler کدهای زبانهای سطح بالا به زبان ماشینتبدیل میشوند.
زبانهایی مثل C++ و Pascal دارای این نوع Compiler هستند.
Virtual Machine
و Byte Code
زبانهایی مانند Java دارای کامپایلریهستند که به جای Object Code (کدهایی که Compiler آنها را تولید میکند)، Byte Code تولید میکنند. Byte Code ها شبیه به Object Code ها هستند با این تفاوت که توسط یکبرنامه (به جای CPU) Decode میشوند. به این برنامه Virtual Machine گفته میشود. یکیاز مزایای این نوع برنامه ها مستقل بودن آنها از محیط اجرا میباشد. مبحث مهندسیمعکوس در مورد Byte Code ها نسبت به کدهای ماشین کاملاً متفاوت بوده و در مقایسه باآن ساده تر میباشد.
شروع عملیات مهندسی معکوس
برای شروع، کار به دو بخش کلیتقسیم میگردد: 1- System Level: داشتن دیدي کلی از تمام برنامه. 2- Code Level: به دست آوردن اطلاعات کامل و جزیی روی قسمتی از کد برنامه.
ابزارهای System Monitoring برای بخش System Level ابزارهایی نیاز است که به وسیله آنهااطلاعات کلی در مورد برنامه (فایل اجرایی) را در اختیار قرار میدهد که معمولاً ایناطلاعات توسط سیستم عامل ایجاد میگردد براي مثال مشخص ميگردد كه نرم افزار با چهابزاري توسعه داده شده يا با چه ابزاري Protect شده است.

ابزارهای Code Level
Disassembler
ابزاری است که یک فایل اجرایی را دریافت نموده و یکفایل متنی که شامل کدهای زبان Assembly که مربوط به قسمتهای مختلف برنامه است راتولید میکند. Disassembler های پیشرفته یکی از ابزارهای کلیدی مهندسی معکوس به شمارمیروند. Debugger
Debugger
برنامه ای است که به توسعه دهنده (Developer) اجازه می دهد برنامه را در حال اجرا مشاهده نماید. Debugger یکی از مهمترینابزارهای مهندسی معکوس بوده که از یک Disassembler برای برگرداندن کدها به زباناسمبلی استفاده مینماید. زمانیکه یک فایل اجرایی با استفاده از یک Debugger بازمیشود حالت Register های CPU، محتویات حافظه و Stack های فعال قابل مشاهدههستند.
ویژگی های مهم Debugger ها Disassembler قدرتمند: یکی از ویژگیهایمهم و لازم برای هر Debugger بوده به طوریکه محتوای فایل اجرایی به وضوح قابلمشاهده میباشد. همچنین متدهای برنامه قابل تجزیه و تحلیل بوده و Trace کردن آنهاساده میشوند.
Breakpoint
های سخت افزاری و نرم افزاری: یکی دیگر از ویژگیهای مهم Debugger ها بوده و هر Debugger دارای این ویژگی میباشد. Breakpoint های نرم افزاریدستوراتی هستند که در زمان اجرا (Runtime) توسط Debugger به برنامه اضافه میشوند وباعث میشوند اجرای برنامه توسط پردازشگر متوقف شده و کنترل برنامه به Debugger سپرده میشود. Breakpoint های سخت افزاری یکی از قابلیتهای ویژه CPU بوده که بهپردازشگر اجازه میدهد اجرای برنامه را متوقف کرده و کنترل آنرا به Debugger منتقلنماید و زمانی اتفاق می افتد که یک آدرس از حافظه مورد دسترسی قرار گیرد.
دیدن Register ها و حافظه: یکی از قابلیتهای خوب Debugger ها دیدن Register ها و محتوایحافظه سیستم میباشد.
اطلاعات Process : یکی از قابلیتهای بسیار مفید Debugger هادیدن جزییات Process ها در حال Debug کردن میباشد. دیدن ماجول های قابل اجرا و یا Thread هایی که در حال اجرا هستند را امکان پذیر میسازد.