عنای Reverse Engineering به فارسی آموزش مهندسی معکوس هست و همانطور که از معنای آن مشخص هست ، این علم طرف مقابل مهندسی نرم افزار می باشد. در واقع مهندسی نرم افزار و مهندسی معکوس دو روی یک سکه هستند. برای درک بهتر این مطلب، موضوع ر بازتر می کنیم:
فرض کنیم که نتیجه نهایی کار یک برنامه نویس (یا همان مهندس نرم افزار) یک فایل exe هست که با اجرای آن یک سری محاسبات انجام می شود. به عنوان مثال این برنامه عددی را از شما می گیرد و با انجام محاسباتی، تغییراتی بر روی آن عدد اعمال می کند و نتیجه را به شما نشان می دهد. تمامی این کارها در پشت پرده انجام می شود و شما فقط عددی را به برنامه می دهید و بلافاصله نتیجه ای می بینید. ولی نحوه رسیدن به این نتیجه را نمی بینید. حال شما می خواهید با طریقه انجام محاسبات و نحوه رسیدن به نتیجه آشنا شوید. اولین راه برای آشنایی با نحوه انجام محاسبات این برنامه داشتن Source Code1 آن است. اما در خیلی از موارد شما سورس کد برنامه ها را در اختیار ندارید. تنها چیزی که برای شما موجود هست همان فایل exe و بقیه فایل های جانبی مربوط به برنامه می باشد.شاید در اولین نگاه فکر کنیم که آشنایی با نحوه انجام محاسبات یک برنامه بدون دردوره ی مهندسی معکوس داشتن سورس کد آن غیر ممکن باشد. ولی با استفاده از علم Reverse Engineering این کار غیر ممکن نیست و ما می توانیم بدون داشتن سورس کد برنامه و یا اطلاعات دقیقی در رابطه با طراحی آن به مراحل طراحی و کد نویسی برنامه پی ببریم و با طریقه انجام محاسبات آن آشنا شویم.تعریف زیر یک تعریف ابتدایی از Reverse Engineering هست. وقتی به بخش رابطه بین Reverse Engineering و Assembly برسیم مفهوم دقیق تری از مهندسی معکوس بیان می کنیم :
Reverse Engineering علمی است که توسط آن می توان بدون داشتن سورس کد یک برنامه به نحوه انجام محاسبات آن برنامه پی برد.
مهندسی معکوس چیست ؟
مهندسی معکوس ، به روندی گفته می شود که برای استخراج دانش طراحی از هر ساخته دست بشر استفاده می شود. استفاده از این علم در تحقیقات بسیار متداول است و تفاوت اصلی مهندسی معکوس با تحقیقات متعارف علمی در این است که هدف این علم ، بررسی چگونگی طراحی فناوری به کار رفته در ساخته های دست بشر است ، در صورتی که که علوم طبیعی ، به دنبال تحلیل پدیده های جاری در طبیعت هستند . ضمن اینکه در مهندسی معکوس با بررسی و تجزیه و تحلیل فناوری به کار رفته در یک محصول تولید و عرضه شده به نوعی به ساختار آن پی برده و امکان تولید مشابه آن و حتی افزودن ویژگیهای مثبتی به آن محصول ، توسط محققین و پژوهشگران فراهم می شود.
کاربرد مهندسی معکوس در نرم افزار :
سازمان دهی مجدد و تغییر دادن در یک نرم افزار موجود بدون اخلال در کار آن نرم افزار از دلایل عمده استفاده از مهندسی معکوس در صنعت نرم افزار است.
معمولاً زمانی از مهندسی معکوس استفاده می کنیم که دیگر سخت افزار و یا نرم افزار های موجود ، از نرم افزارهای قدیمی تر پشتیبانی نمی کند و همچنین برای ما توانایی و ابزار این کار وجود داشته باشد. در حقیقت برخی مواقع شما امکان دسترسی قانونی به سورس های یک پروژه انجام شده را ندارید ، ولی امکان استفاده از این علم برای شما وجود خواهد داشت در این مقاله به کاربردن مهندسی معکوس در نرم افزار را با عنوان معکوس سازی بیان می کنیم و به طور معمول از معکوس سازی برای به دست آوردن پایگاههای داده و اطلاعات نهفته در یک نرم افزار استفاده می شود.
در عین حال هزینه مهندسی معکوس ، معمولاً از ایجاد یک نرم افزار جدید خیلی کمتر است و همچنین در ایجاد یک نرم افزار جدید ، مخاطرات زیادی از جمله تغییر کادر برنامه نویسی ، و خطاهای جدید وجود دارد که این موارد تمایل به استفاده از مهندسی معکوس را به شدت افزایش می دهد.
همچنین گاهی برای آن که یک گروه کاری دستاوردهای گر.وه کاری را که قبلاً ر.وی یک زمینه یا یک نرم افزار کار کرده اند ، متوجه شوند و بتوانند آن را بهبود داده و ارتقا ببخشند ، به این روش ها نیاز است . در این رابطه می توان به کار افراد بر روی پروژه های open source مثل develop کردن Samba یا Open Office اشاره کرد.
روند اصلی کار :
ابتدا فرض می کنیم که یک برنامه داریم که می خواهیم آن را معکوس کنیم در این میان، نخستین مرحله انجام source code translation است که به معنای تبدیل کد از یک زبان حتی زبان ماشین به زبان برنامه نویسی دیگر است که خود این کار نیز می بایست توسط برنامه تخصصی در این زمینه صورت پذیرد، زیرا تبدیل کد های بسیار بلند برای انسان کار مشکلی است و همچنین میزان اشتباه انسان دائماً زیاد تر می شود ( برخی از نرم افزار ها از هزاران یا صدها هزار سطر برنامه نویسی تشکیل شده اند و در برنامه هایی از جمله سیستم عاملها ، از میلیون ها سطر برنامه نویسی استفاده شده است) پس از این مرحله source code به دست آمده توسط انسان یا برنامه مورد تحلیل قرار گرفته و اطلاعات لازم از آن اسخرتاج شده و در صورت لزوم تغییراتی در ساختار برنامه داده میشود
دسته بندی ابزارهای مورد استفاده در معکوس سازی :
1. Hex Editor
2. Debugger
3. Disassembler
4. Decompiler

مفهوم مهندسی معكوس

به هر گونه تلاش و فعالیتدر راستای رسیدن از مراحل بالاتر طراحی و تولید به یك یا چند مرحله پایین تر،مهندسی معكوس گویند. این مفهوم در تمامی شاخه ها و زمینه های مهندسی از جمله نرمافزار و سخت افزار مطرح است. برای مثال دستیابی به ایده ها و روش های تولید یكمحصول، از نمونه محصول نهایی نمونه ای از مهندسی معكوس است. یكی از اهدافمهندسی معكوس، شناسایی اجزای سازنده یك محصول و روابط بین آنهاست كه گاهی از آناجزا برای ساخت یك محصول جدید نیز بهره گرفته می شود.گاهی نیز به منظورایجاد تغییرات در سیستمی است كه طرح و اجزای اولیه آن در دسترس نیست. این كار كه بهمنظور مطابقت سیستم جدید با خواسته ها و نیازهای جدید صورت می گیرد، مهندسیدوباره(Reengineering) نیز نامیده می شود. همچنین با این كار می توان مشكلات موجوددر یك سیستم را ردیابی و بررسی كرد: طی بررسی یك سیستم می توان به مستندسازی آنسیستم نیز پرداخت تا با ایجاد درك بهتر از سیستم در جهت بهبود آن گامبرداشت.البته باید توجه داشت كه به كارگیری فنون مهندسی معكوس در هر رشتهای، دشواری ها و مشكلات خاص خود را دارد و به ابزار و امكانات خاصی نیاز دارد وگاهی با وجود كامل بودن ابزار و امكانات ممكن است نتیجه مطلوب نهایی حاصل نشود. بنابراین در به كارگیری این فنون باید تمامی هزینه ها و زمان مصرفی و نتیجه نهاییدر نظر گرفته شوند. به عبارتی باید توجه داشت كه میزان هزینه مورد نظر در مقابلدسترسی به چه هدفی صرف می شود.در ادامه تلاش خواهیم كرد كه به چند مورد ازكاربردهای مهندسی معكوس در شاخه نرم افزار اشاره ای كوتاه داشته باشیم تا هدف ازاین شاخه از علم رایانه نیز تا حدی روش شود.
كشف رمزها و كدها
باید توجه داشت كه از هرابزاری می توان در راه خوب یا بد استفاده كرد. این كه شخص از مهارت خود و ابزارهایموجود استفاده نادرست كند، خود مسوول آن كار خواهد بود. معمولا كشف كدها یاشكستن رمز، ذهن را به سمت اعمال غیرقانونی می برد. كشف كدها و رمزها و كدهای یك نرمافزار بانك از جمله این موارد است. اما شكستن رمز همیشه بد و غیرقانونی نیست. اغلباطلاعات رد و بدل شده بین مجرمان نیز رمزگذاری می شود و برای جلوگیری از فعالیتآنها، پلیس باید اطلاعات به دست آمده از آنها را كشف رمز كند. باید توجه داشت كهمعمولا عمل رمزگشایی با استفاده از كلید صورت می گیرد و در صورت در دسترس نبودنكلید، ناچار به شكستن رمز یا كشف رمز هستیم. بنابراین خوب است در به كارگیری ایناصطلاحات دقت كنیم.معمولا در شكستن رمزها از تكنیك های مهندسی معكوساستفاده می شود. بدون استفاده از این تكنیك ها اگر بخواهیم اقدام به كشف رمزكنیم،چاره ای جز حدس، آزمون و خطا و یا بررسی كلیه حالت های ممكن (Brute force) نخواهیم داشت كه كار بس زمان گیر، دشوار و طاقت فرساست.
مبارزه با ویروس ها
مبارزه با ویروس ها و كشفنرم افزارهای مخرب، از دیگر كاربردهای مهندسی معكوس است. معمولا نویسندگان ویروس هاو تولیدكنندگان نرم افزارهای مخرب از زبان های سطح پایین و اغلب از زبان اسمبلیاستفاده می كنند. دلیل این امر نیز آن است كه اولا ویروس ها قصد دارند به نقاطی ازسیستم دسترسی پیدا كنند كه شاید زبان های سطح با امكان دستیابی به آن را نداشتهباشند. در ثانی می خواهند تا جای ممكن اندازه ویروس كوچك بوده و سرعت اجرای بالاییداشته باشد. پس از نوشتن ویروس آن را به كد ماشین تبدیل كرده و اجرا می كنند. حالبرای این كه بتوان از كاركرد آن ویروس مطلع شده و جلوی فعالیت آن را بگیریم، بایدبا استفاده از تكنیك های مهندسی معكوس، به كد آن دسترسی پیدا كنیم. در طراحی نرمافزارهای ضدویروس، با استفاده از تكنیك های گفته شده، به نشانه های مختص هر ویروسپی برده می شود و با توجه به طریقه عمل آن ویروس، راه های بازگردانی تغییرات طراحیشده و در نهایت راه از بین بردن آن ویروس تعیین می شود.
تغییردر كار یا ظاهر نرم افزار
ممكن است نرم افزاری دراختیار داشته باشیم كه كدهای برنامه نویسی آن در دسترس ما نباشد و بخواهیمتغییركوچكی در روند اجرای برنامه اعمال كنیم. همچنین ممكن است بخواهیم تغییری درظاهر برنامه ایجاد كنیم. حتی برخی اوقات لازم است قابلیت های جدیدی به یك نرم افزاراضافه شود و یا اشكالات موجود در آن رفع شوند. در كلیه این موارد نیز جز تكنیك هایمهندسی معكوس، راه دیگری نخواهیم داشت. اغلب این مسایل در مواقعی رخ می دهد كه كدبرنامه در دسترس نبوده و شركت تولیدكننده نرم افزار نیز دیگر از آن پشتیبانی نمیكند.یكی از این مشكلات، مشكل سال 2000 (Y2K) بود كه شاید آن را به خاطرداشته باشید. این مشكل با آغاز هزار جدید به وجود آمد و در آن زمان بسیاری ازسازمان ها و كاربران در حال استفاده از نرم افزارهایی بودند كه شاید سال ها با آنكار كرده بودند و مشكلات آن را رفع كرده و اطلاعات زیادی در آنها جمع آوری كردهبودند. بسیاری از این نرم افزارها به علت آن كه قدیمی شده بودند، دیگر از جانب شركتتولیدكننده، پشتیبانی نمی شدند و یا شركت ها به طور كامل منحل شده بودند. اماهمچنان برای آن سازمان پركاربرد بودند. با مطرح شدن مشكل سال 2000، شركت ها وسازمان های زیادی بار مالی زیادی را برای رفع این مشكل با استفاده از تكنیك هایمهندسی معكوس، متحمل شدند.
طراحی مجدد
یكی از كاربردها و زمینههای فعالیت برای مهندسی معكوس كه بسیاری مفید است، طراحی مجدد یك نرم افزار بر اساسیك نمونه موجود است. این كار معمولا به دلایل زیادی، از جمله تغییر سیستم عامل،صورت می گیرد و كاری بسیار پیچیده و دقیق است كه معمولا به صورت كار گروهی و توسطشركت های بزرگ انجام می شود.مراحل این كار كه به دو قسمت مهندسی معكوس ومهندسی مستقیم (Forward Engineering)تقسیم می شود، به این صورت است كه ابتدا كلیهایده ها و روش های پیاده سازی نرم افزار مورد نظر تشخیص داده شده و سپس با توجه بهاطلاعات به دست آمده، نرم افزار جدیدی طراحی و پیاده سازی می شود. شاید این یكی ازدشوارترین و مفیدترین زمینه های كار در مهندسی معكوس باشد.
مستندسازی
برای برنامه ها و یا توابعكتابخانه ای كه بدون كد برنامه نویسی عرضه می شودند معمولا مستنداتی نیز وجودندارد. مانند توابع محلی ویندوزNT كه شامل چندین هزار تابع است كه برای آنها جز چندصفحه اطلاعات ابتدایی، مستنداتی از سوی شركت سازنده یعنی مایكروسافت ارایه نشدهاست. برای مستندسازی این گونه برنامه ها یا توابع نیز، تكنیك های مهندسی معكوس چارهساز خواهند بود.
Crack
یكی از كاربردهای غیرقانونیمهندسی معكوس، كرك كردن یك نرم افزار است. معمولا شركت های تولیدكنده نرم افزار، كلامكانات مربوط به برنامه را در بسته نرم افزاری قرار می دهند. اما برایمجبور كردن كاربران به خرید برنامه، برای آن محدودیت زمانی می گذارند. افراد بسیاریهستند كه با نفوذ به این نرم افزارها، محدودیت آن را برداشته و یا كد تولید و تشخیصكلید را از درون برنامه استخراج می كنند و در اختیار دیگران قرار می دهند. به این ترتیب كاربران بدون پرداخت هزینه، از نرم افزار مورد نظر برای مدتزمان نامحدود استفاده می كنند. البته همه جای دنیا افرادی وجود دارند كه برای حمایتاز تولیدكنندگان نرم افزار از نسخه های كرك شده استفاده نكرده و اصل آن را خریداریمی كنند. مسلما كاربردهای مهندسی معكوس به همین چند مورد خلاصه نمی شود و با توجهبه شرایط و زمان های مختلف می تواند كاربردهای دیگر و حتی كاربردهای دیگری نیزداشته باشد.
مهندسی معکوس فرایند اکتشاف فن آوری‌های بکار رفته در یک دستگاه، شی و یا سیستم از طریق تحلیل ساختار، عملکرد و وظیفه آن می‌باشد. معمولاً از این فرایند برای دست یابی به (برای مثال یک دستگاه مکانیکی، قطعه الکترونیکی و یا برنامه نرم‌افزاری) و تحلیل جزییات نحوه عملکرد آن در نگهداری یا ساخت یک دستگاه یا برنامه مشابه استفاده می‌شود. حاصل این فرایند مشابه کپی کردن یک چیز از روی اصل آن می‌باشد.درک سیستم نرم‌افزاری بر هر نوع تغییر مقدم است. فرآیند درک، مقدار زیادی از کل زمان صرف شده را در اِعمال تغییر می‌گیرد. نگهدارندگان دلایلی از جمله مستندات ناصحیح یا قدیمی، نبود مستندات، پیچیدگی سیستم و عدم شناخت کافی از قلمرو را علت فقدان درک صحیح از سیستم می‌دانند. راه تسهیل این مسایل، خلاصه کردن اطلاعات مربوط به سیستم (مثل تبین مشخصات و طرح) از طریق کد منبع است، به‌شکلی که درک آن‌را بالا برد.مهندسی معکوس تکنیکی است که می‌توان از آن برای این کار استفاده مهندسی معکوس به تنهایی منجر به تغییر در برنامه نمی‌شود، بلکه فقط راه را برای اجرای آسان‌تر تغییراتِ مطلوب هموار می‌نماید. تغییرات با استفاده از فنونی چون مهندسی پیشرو، بازسازی، و مهندسی مجدد پیاده‌سازی می‌شوند.هدف از مهندسی معکوس تسهیل در اِعمال تغییر از طریق فهمیدن سیستم نرم‌افزاری با توجه به ماهیت کار، چگونگی کار و نمایش معماری آن است. به‌عنوان اهداف پیگیریِ این مقصود می‌توان به ترمیم اطلاعات از دست رفته، تسهیل جابه‌جایی بین بسترها، بهبود و (یا) تهیهٔ مستندات جدید، استخراج عناصر قابل استفادهٔ مجدد، کاهش تلاش برای نگهداری، مقابله با پیچیدگی، کشف عوارض جانبی، کمک به انتقال به محیط CASE و ایجاد محصولات مشابه یا رقابتی اشاره کرد. از دیگر مزایای مهندسی معکوس کاهش هزینه‌ها و سریع آماده شدن نرم افزار است.