مهندسي معكوس چيست؟
مهندسي معكوس عمل محاسبة چگونگي اجزاء نرمافزار است كه شما هيچ كدي براي ساختار آن در دست نداريد، يا عمليات ايجاد اين كدها در سطوح متفاوت و يا ايجاد آنها از طرقي غيروابسته به آن كار ميباشد.
در زمينههاي طبيعي پوشش دادن مهندسي معكوس بسيار سخت است و نياز به چندين مهندس متفاوت داشته و مقادير مناسبي از پشتيبانيهاي نرمافزاري را فقط براي تغيير آن به يك سيستم ايدهآل نياز دارد. هر چند، ما خواهيم فهميد كه توسط ابزارهايي كه در اختيارمان هستند، در دست داشتن يك راهنماي مناسب ميتوانيم كارمان را شروع نماييم. ما بايد بتوانيم اطلاعاتي را كه دربارة مواد نياز داريم بتوانيم استخراج نمائيم: ايجاد اصلاحات و هك كردن نمائيم تا بتوانيم نرمافزاري كه كد آن را در اختيار نداريم براي اينكه بتوانيم كارهايي را كه بطور طبيعي اين نرمافزار انجام ميدهد در دست بگيريم
مطمئن باشيد كه بحث مهندسي معكوس در بحث مهندسي نرمافزار بسيار اهميت داره كه من اين همه براتون مطلب در اين زمينه ارسال ميكنم!
2ـ مهندسي معكوس
مهندسي معكوس به معني بدست آوردن سطح بالايي از نمايش برنامهها و سيستمهاي نرمافزاري است. معمولاً مهندسي نرمافزار بوسيلة يك نمايش سطح پايين از يك سيستم (مثل مقادير باينري، كدهاي ساده، و يا اجراهاي قدم به قدم ) شروع ميشود و سعي در بدست آوردن نمايش بهتر از موارد مطروحه را دارد. بعنوان مثال بدست آوردن سورس برنامه، نماهايي از معماري، يا use caseها و ترتيب اجراي آنها در يك سيستم نمونهاي از اين موارد است. روشهاي مهندسي معكوس و تكنولوژي نقشي مهمي در بسياري از وظايف مهندسي نرمافزار ايفا ميكنند. ميتوان اداراك بهتر نرمافزاري، مهاجرت سيستمها رو به نسلهاي جديد و تكامل نرمافزار را نمونههايي از كاربردهاي مفيد مهندسي معكوس ناميد [1]. در تعريفي ديگر مهندسي معكوس تفهيم يك سيستم از شناسايي اجزاء يا مصنوعات سيستم كه موجب يافتن روابط ميان آنها و ايجاد اجزاء انتزاعي از اطلاعات يك سيستم ميشود را گويند. البته بايد بخاطر داشته باشيم كه هدف مهندسي معكوس تغيير اهداف سيستم به سمتي ديگر نميباشد [2]. تعريفي ديگر از مهندسي معكوس داريم كه مهندسي معكوس عبارت است از توانايي گرفتن اطلاعات از كد منبع و ايجاد يا ارتقاء مدل سيستم در زبان برنامهنويسي مورد نظر تيم مهندسي معكوس؛ يكي از موانع موجود بر سر راه پروژههاي علم فناوري اطلاعات سازگار نگاه داشتن مدل آبجت با كد است. با تغيير نيازها، تغيير مستقيم كد ميتواند وسوسهانگيز باشد، تا اينكه مدل را تغيير داده شود و سپس كد تغيير يافته را از مدل سيستم توليد نمائيم. مهندسي معكوس به ما امكان ميدهد تا هميشه مدل سيستم را با كد، همسان نگاه داريم[3].
البته تعاريفي كه در اينجا مطرح گرديد تعاريف مثبتي از مسئلة مهندسي معكوس نرمافزار را مطرح كردهاند. در اينجا ما نيز يكي ديگر از كاربردهاي مهندسي معكوس كه بوسيلة سارقان نرمافزار بكار برده ميشود را ارائه ميدهيم. سارقان نرمافزار با در دست داشتن سيستم نرمافزاري توليد شده و اجراي فرآيندهاي مهندسي معكوس بر روي آنها به كدهاي سيستم و تمامي اجزاء آن خواهند رسيد و به تغيير آنها ميپردازند. از جملة اين تغييرات ميتوان به حذف قفلهاي نرمافزاري، تغيير عناوين و نشانهاي مالكين سيستم به عناوين سارقان نرمافزار، تغيير روند اجراي سيستم طبق خواستة سارقان و مواردي از اين قبيل اشاره نمود.
مهندسي معكوس سيستمهاي نرمافزاري بزرگ به علت حجم بزرگ و پيچيدگيهاي آنها مشكل است. هرچند كه اين امر پيشنيازي براي نگهداري، مهندسي مجدد، و تكامل نرمافزار ميباشد. چيكوفسكي مهندسي معكوس را چنين تعريف ميكند:« فرآيند تجزية يك سيستم براي شناسايي اجزاء سيستم و روابط ميان آنها و ايجاد نمايشهايي از سيستم در شكلي ديگر يا در يك سطح بالاتر از اجزاء انتزاعي آن است». نگهداري و توسعه دادن سيستمهاي نرمافزاري امروزي به چند دليل مشكل ميباشد. از جمله اين موارد بالا بردن سرعت تغيير و تحول كار توليدكنندگان، افزايش اندازه و پيچيدگي سيستمهاي نرمافزاري، و تغيير احتياجات ثابت سيستمهاي نرمافزاري ميباشد. بعنوان مثال سيستمهاي قديمي بزرگ، كامل و متشكل از سيستمهاي نرمافزاري پيچيدهاي هستند كه نتيجة يك سرمايهگذاري بلند مدت توسط يك شركت و بيشتر به همين دليل نگهداري و پشتيباني شدهاند پس ملزومات جديد ميبايست اتمام گشته و سرمايهگذاري شركت بايد بازگردد. پارنِس تخمين زده است كه بيشتر سيستمهاي قديمي از مشكلات متنوعي مانند اينكه توليدكنندگان اصلي ممكن است تا مدت زيادي در دسترس نباشند، روشهاي پيشبرد منسوخ و يا زبانهاي قديمي، و يا مستندسازيهاي گمشده و يا غيركافي و منسوخ ميباشند است [4].
دلايل جدا بودن از دشواريهاي تكنيكي و گران بودن نگهداري و تكامل بعضي از سيستمها بدين ترتيب است: سامرويل و دويس تخمين زده است كه هزينة حسابهاي نگهداري نرمافزار 50 تا 75 درصد از كل هزينة يك سيستم نرمافزاري است. بازنويسي اين سيستمها از روي چكنويس هميشه مسئلهدار بوده است زيرا اين قضيه حجم بزرگي از زمان، پول و منابع انساني را نياز دارد [4].
از زماني كه سيستمهاي قديمي به سمت حجيم شدن توسط هزاران خط كد نويسي بدليل وجود مستندسازيهاي ناقص رفته است، نياز به راهنماييهاي خاصي كه در فهميدن و رفع نقص نرمافزار كمك كند احساس ميشود. تمركز ما بر روي سيستمهاي شئگرا قديمي بوده كه اساساً بدليل وجود بسياري سيستم متفاوت كه با اين روش نوشته شدهاند و بدليل اينكه عمر مسبب تغيير قسمتي از يك سيستم نرمافزاري در سيستمهاي قديمي نميشود، اما سرعت در هر كدام توسعه و تغيير يافته است [4].