بخشی از مقاله

بررسی سبک ها و الگوهای مهندسی نرم افزار

چکیده :
در این پروژه به بررسی سبک ها و متدهای مهندسی نرم افزار پرداخته شده است ، مهندسی نرم‌افزار پیشه‌ای است که به یاری دانش رایانه و دیگر فناوری‌ها و روش‌ها به آفریدن و نگاهداری نرم‌افزار رایانه‌ای می‌پردازد.
مسائل اصلی مهندسی نرم‌افزار تولید نرم‌افزار بر اساس موارد زیر است:
الزامات تعیین شده
در زمان تعیین شده

 


در محدودهٔ بودجه پیش‌بینی شده
مهندسی نرم‌افزار طراحی، برنامه نویسی، توسعه، مستندسازی و نگهداری نرم‌افزار با بکارگرفتن روشهای فنی و عملی از علوم کامپیوتر ، مدیریت پروزه ، مهندسی ، محدوده کاربرد، طراحی رابط، مدیریت تجهیزات دیجیتال و سایر زمینه‌ها است.
کاربردهای مهندسی نرم‌افزار دارای ارزش‌های اجتماعی و اقتصادی هستند، زیرا بهره‌وری مردم را بالا برده، چند و چون زندگی آنان را بهتر می‌کنند. مردم با بهره‌گیری از نرم‌افزار، توانایی انجام کارهایی را دارند که قبل از آن برایشان شدنی نبود. نمونه‌های از این دست نرم‌افزارها عبارت‌اند از: سامانه‌های توکار، نرم‌افزار اداری، نرم افزار‌های رایانه‌ای، و اینترنت.
فناوری‌ها و خدمات مهندسی نرم‌افزار به کاربران برای بهبود بهره‌وری و کیفیت یاری میرساند. نمونه‌هایی از زمینه‌های بهبود: پایگاه داده‌ها، زبان‌ها، کتابخانه‌ها، الگوها، فرآیندها و ابزار.


فصل اول
کلیات بحث


مقدمه :
با بزرگ شدن پروژه های نرم افزاری و پیشرفت علم مهندسی نرم افزار ، روش های سازمان یافته ای برای توسعه نرم افزارها ابداع شد که هر کدام بسته به نوع پروژه و محدودیت های آن در جای خاصی کاربرد دارد. برخی روش ها مانند R.A.D به دلیل کمبود زمان تولید، برخی مانند spiral به دلیل مشخص نبودن نیازمندی های اولیه نرم افزار و برخی مانند X.P برای کسانی که کار طراحی نرم افزار را با کدنویسی شروع میکنند ابداع شدند. ایجاد پروژه های بزرگ بدون بکارگیری یکی از روش های مهندسی نرم افزار ممکن نیست.

پیشینه مهندسی نرم‌افزار
اصطلاح مهندسی نرم‌افزار بعد از سال ۱۹۶۸ شناخته شد. این اصطلاح طی کنفرانس «مهندسی نرم‌افزار ناتو ۱۹۶۸» (که در گارمیش آلمان برگزار شد) توسط ریاست کنفرانس F.L. Bauer معرفی شد و از آن پس بطور گسترده مورد استفاده قرار گرفت.
اصطلاح مهندسی‌نرم‌افزار عموماً به معانی مختلفی به کار می‌رود:
به‌عنوان یک اصطلاح غیر رسمی امروزی برای محدوده وسیع فعالیت‌هایی که قبلا برنامه‌نویسی و تحلیل سیستم‌ها نامیده می‌شد.
به‌عنوان یک اصطلاح جامع برای تمامی جنبه‌های عملی برنامه‌نویسی کامپیوتر، در مقابل تئوری برنامه نویسی کامپیوتر، که علوم کامپیوتر نامیده می‌شود.
به‌عنوان اصطلاح مجسم کننده طرفداری از یک رویکرد خاص نسبت به برنامه‌نویسی کامپیوتر که اصرار می‌کند، مهندسی نرم‌افزار، بجای انکه هنر یا مهارت باشد، باید به‌عنوان یک رشته عملی مهندسی تلقی شود و از جمع کردن و تدوین روش‌های عملی توصیه شده به شکل متدولوژی‌های مهندسی نرم‌افزار طرفداری می‌کند.


مهندسی نرم‌افزار عبارتست از : الف) کاربرد یک رویکرد سیستماتیک، انتظام یافته، قابل سنجش نسبت به توسعه، عملکرد و نگهداری نرم‌افزار، که کاربرد مهندسی در نرم‌افزار است و ب) مطالعه روشهای موجود در استاندارد IEEE

محدوده مهندسی نرم‌افزار و تمرکز آن
مهندسی نرم‌افزار به مفهوم توسعه و بازبینی یک سیستم نرم‌افزاری مربوط می‌باشد. این رشته علمی با شناسایی، تعریف، فهمیدن و بازبینی خصوصیات مورد نیاز نرم‌افزار حاصل سر و کار دارد. این خصوصیات نرم‌افزاری ممکن است شامل: پاسخگویی به نیازها، اطمینان‌پذیری، قابلیت نگهداری، در دسترس بودن، آزمون‌پذیری، استفاده آسان، قابلیت حمل و سایر خصوصیات باشد.
مهندسی نرم‌افزار ضمن اشاره به خصوصیات فوق، مشخصات معین طراحی و فنی‌ای را آما

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

نیاز به مهندسی نرم‌افزار
نرم‌افزار عموماً از محصولات و موقعیتهایی شناخته می‌شود که قابلیت اطمینان زیادی از آن انتظار می‌رود، حتی در شرایط طاقت فرسا، مانند نظارت و کنترل نیروگاه‌های انرژِی هسته‌ای، یا هدایت یک هواپیمای مسافربری در هوا، چنین برنامه‌هایی شامل هزاران خط کد هستند، که از نظر پیچیدگی با پیچیده‌ترین ماشینهای مدرن قابل مقایسه‌اند. به‌عنوان مثال یک هواپیمای مسافربری چند میلیون قطعه فیزیکی دارد (و یک شاتل فضایی خدود ده میلیون بخش دارد)، در حالی که نرم‌افزار هدایت چنین هواپیمایی می‌تواند تا ۴ میلیون خط کد داشته باشد.

تکنولوژی‌ها و روشهای عملی
مهندسین نرم‌افزار طرفدار تکنولوژی‌ها و روشهای عملی بسیار متفاوت و مختلفی هستند، که با هم ناسازگارند. این بحث در سالهای دهه ۶۰ میلادی شروع شد و ممکن است برای همیشه ادامه پیدا کند. مهندسین نرم‌افزار از تکنولوژی‌ها و روشهای عملی بسیار متنوعی استفاده می‌کنند. کسانی که کار عملی می‌کنند از تکنولوژی‌های متنوعی استفاده می‌کنند : کامپایلرها، منابع کد، پردازشگرهای متن. کسانی که کار عملی می‌کنند از روشهای عملی بسیار متنوعی استفاده می‌کنند تا تلاشهایشان را اجرا و هماهنگ کنند : برنامه نویسی در دسته‌های دونفری، بازبینی کد، و جلسات روزانه. هدف هر مهندس نرم‌افزار بایستی رسیدن به ایده‌های جدید خارج از مدلهای طراحی شده قبلی باشد، که باید شفاف بوده و بخوبی مستند شده باشد.
با وجود رشد فزاینده اقتصادی و قابلیت تولید فزاینده‌ای که توسط نرم‌افزار ایجاد شده ، هنوز هم بحث و جدل‌های ماندگار درباره کیفیت نرم‌افزار ادامه دارند.


ماهیت مهندسی نرم‌افزار
دیوید پارناس گفته‌است که مهندسی نرم‌افزار یک شکل از مهندسی است. استیو مک‌کانل گفته‌است که هنوز اینطور نیست، ولی مهندسی نرم‌افزار باید یک شکل از مهندسی بشود. دونالد کنوت گفته‌است که برنامه نویسی یک هنر است. دیوان فعالیتهای آماری آمریکا مهندسان نرم‌افزار را به عنوان زیرگروهی از «متخصصین کامپیوتر»، با فرصت‌های شغلی‌ای مانند «دانشمند کامپیوتر»، «برنامه نویس» و «مدیر شبکه» دسته بندی کرده‌است. BLS تمام مهندسین دیگر این شاخه

علمی، که شامل مهندسین سخت‌افزار کامپیوتر نیز هست، را به‌عنوان «مهندسین» دسته بندی می‌کند.

1 - روش آبشاری (waterfall) :
این روش اولین روش مهندسی نرم افزار محسوب میشود و گاهی آنرا روش سنتی نیز می‌نامند. هر روش مهندسی معمولا شامل 5 پروسه اصلی است که عبارتند از آنالیز سیستم، طراحی سیستم، کدنویسی و اجرا، تست و تحویل و پشتیبانی . این 5 پروسه در روش آبشاری به ساده ترین شکل بیان میشوند. بدین ترتیب که هر فاز از پروسه ی کلی، انجام میشود و بعد فاز بعدی آغاز میشود. این روش در پروژه هایی کاربرد دارد که فاز اول که آنالیز است توسط مهندس نرم افزاری که کار تحلیل را بر عهده دارد کاملا شناخته شود و طراح کاملا نیازمندی های سیستم مربوطه را بداند تا در فاز بعدی بتواند طراحی معماری سیستم را آغاز کند. در عکس زیر نمودار عملیاتی روش آبشاری را مراجعه میکنید. گرچه در هر مرحله امکان برگشت به مرحله قبل گنجانده شده، اما این برگشت هزینه ی بسیاری را بر دوش تیم نرم افزاری میگذارد. زیرا هر تغییر در مرحله قبل، میتواند باعث شود تا پروژه در فاز بعدی نیازمند شروع از ابتدا باشد.

2 - روش افزایشی (Incremental):


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


3 - روش R.A.D :
این روش زیر مجموعه روش افزایشی است و بر روی چرخه ی کوتاه مدت تولید نرم افزار تاکید دارد. در این روش از برنامه نویسی با استفاده از کامپوننت های آماده بیشترین بهره را می بریم تا سرعت تحویل پروژه را افزایش دهیم . معمولا پروژه هایی با این روش اجرا میشوند که کمتر از 90 روز وقت می گیرند و برای افزایش سرعت از تیم های موازی نیز برای اجرا کمک میگیریم تا هر تیم بخشی از نرم افزار را اجرا کند و نهایتا آن بخش ها را با هم یکپارچه میکنیم. با توجه به اهمیت سرعت در این مدل ، افراد تیم باید همگی زبده باشند تا بتوانند بدون هدر رفتن وقت پروژه را در موعد مقرر تحویل دهند. همانطور که در تصویر زیر میبینید پروژه توسط چند تیم در حال پیشبرد است:

4 - روش الگویی (prototyping) :
این روش معمولا زمانی بکار گرفته میشود که مشتری مجموعه ای از نیازها را بیان میکند ، اما از ورودی و خروجی ها و الگوریتم های داخلی اش اطلاع کافی ندارد. با توجه به اینکه معمولا اولین نسخه ی هیچ نرم افزاری کامل نیست و نیازمند بازنگری است، این روش با چرخه ی تولید و تست خود باعت میشوند ایرادات نرم افزار استخراج و رفع شود. اما گاهی خارج شدن از این سیکل (با توجه به بالارفتن سطح توقع مشتری) سخت میشود.

5 - روش حلزونی (spiral) :
این روش ترکیبی از روش سیستماتیک آبشاری و روش prototyping است. در این روش نرم افزار طی چندین نسخه ی ارائه شده به تکامل می رسد. در هر مرحله ریسک های پروژه با جزئیات بررسی میشوند. همانطور که درنمودار زیر میبینید، کلیه ی مراحل انجام پروژه در هر گردش در سایز بزرگتری اجرا میشوند.

 

6 - روش مهندسی همزمان (concurrent development) :
این روش شامل یکسری فاز اجرایی است. هر فاز خود شامل یکسری وضعیت (state) است. هر یک از اینstate ها بر اساس event هایی که برایشان تعریف میکنیدم تغییر میکنند و به وضعیت دیگری می روند. در عکس زیر بخش آنالیز را در این مدل مهندسی مشاهده میکنید. اگر در موقعیت development باشیم و تغییری در نیازمندی های تعریف شده توسط مشتری ایجاد شود، به وضعیت awaiting changes می رویم. زیرا تغییراتی در ساختار پروژه ایجاد شده که میتواند منجر به تغییر در فاز development شود. این روش معمولا برای نرم افزارهایی که بصورت کلاینت سروری کار میکنند بکار می رود.



علاوه بر مدل های مهندسی نرم افزار فوق، روش های دیگری مانند XP ، Clean Room ، component-based ، Agile و غیره وجود دارند. که هر یک در جای خود قابل استفاده هستند. اما روش های فوق متداول ترین مدل هایی هستند که بکار گرفته میشوند.

برنامه نویسی :
برنامه‌نویسی رایانه در فرهنگ واژه غیر متخصصین ممکن است به تمام پروژه ساخت نرم‌افزار یا برنامهٔ رایانه‌ای گفته شود. با این همه برنامه‌نویسی تنها بخشی از فرآیند توسعه نرم‌افزار یا برنامه رایانه‌ای است. اهمیت، توجه و منابع اختصاص داده شده به برنامه‌نویسی، بسته به ویژگی‌های مشخص شده محصول و خواست افراد درگیر در پروژه و کاربران و در نهایت شیوهٔ انتخاب شده مهندسی نرم‌افزار متغیر است.
برنامه‌نویسی کامپیوتر (که اغلب در انگلیسی programming یا coding گفته می‌شود) فرآیند نوشتن، اشکال زدایی(debug) و نگهداری کد منبع (source code) برنامه کامپیوتر می‌باشد. این کد منبع با یک زبان برنامه نویسی نوشته شده است. این کد منبع ممکن است تغییر داده شده یک کد قبلی و یا یک کد کاملا جدید باشد. هدف برنامه نویسی ساختن یک برنامه می‌باشد که یک رفتار خواسته شده را به نمایش بگذارد.

تاریخچه
موضوع دستگاه‌هایی که به دنباله‌ای از دستورالعمل‌های از قبل تعریف شده عمل می‌کند بر می‌گردد به Greek Mythology.

برنامه نویسی مدرن
الزامات کیفیت


پیچیدگی الگوریتم
متدولوژی (روش شناسی)
اندازه گیری کاربرد زبان
تعیین اینکه محبوب‌ترین زبان برنامه نویسی مدرن کدام است کار بسیار مشکلی است. بعضی از زبان‌ها در کاربردهای خاصی محبوب است و بعضی دیگر مرتبا در نوشتن کاربردهای گوناگون استفاده می‌شود. روش‌های اندازه گیری محبوبیت زبان شامل موارد زیر می‌باشد : شمردن تعداد آگهی‌های اشتغال و توجه به یک زبان، تعداد کتاب‌های آموزشی فروخته شده در مورد یک زبان، تخمین تعداد خطوط کد نوشته شده در یک زبان

اشکال زدایی
اشکال زدایی وظیفه بسیار مهمی در فرآیند توسعه نرم‌افزار می‌باشد، زیرا یک برنامه غلط می‌تواند پیامدهای مهمی برای کاربر خود داشته باشد. بعضی از زبان‌ها بیشتر در معرض برخی اشتباهات می‌باشند، به خاطر خصوصیاتشان نیاز به بررسی بیشتر کامپایلر نسبت به زبان‌های دیگر ندارند.

زبان برنامه‌نویسی
اجرا و عملی ساختن الگوریتم‌های انتزاعی وابسته به هم به‌وسیله تولید یک برنامه رایانه‌ای مشخص با ابزار زبان برنامه‌نویسی ممکن است.

طراحی و برنامه نویسی تحت وب:
بسیاری از دانشجویان نرم افزار در حین تحصیل به یکی از رشته های زیرمجموعه نرم افزار علاقه مند میشوند و در آن رشته شروع به فعالیت میکنند. رشته هایی مانند هوش مصنوعی ، برنامه نویسی ، روباتیک ، طراحی وب و غیره.


این روزها بخصوص در ایران با توجه به نبود قانون کپی رایت، برنامه نویسی و تولید نرم افزار چندان طرفداری ندارد و این موضوع باعث گرایش دانشجویان به برنامه نویسی تحت وب شده است که بیشترین بازار کار را برای دانشجویان رشته نرم افزار فراهم میکند. اما این رشته جزئیات بسیاری را می طلبد که ممکن است در دانشگاه بعنوان یک درس مطرح نشوند و به دلیل گشترش بسیار سریع اینترنت و ظهور تکنولوژی های جدید ، دانشجو پس از فارغ التحصیلی با مفاهیمی از وب روبرو میشود که هرگز در دانشگاه با آنها برخورد نکرده است.


اگر شما هم برنامه نویسی تحت وب را بعنوان شغل خود انتخاب کرده اید نیازمند یادگیری تکنولوژی های بسیاری هستید که در هنگام ایجاد یک پروژه تحت وب با آن برخورد خواهید کرد و باید از آن تکنولوژی حداقل به میزانی که بتوانید به کارش ببندید، مطلع باشید. در این مقاله تعدادی از این تکنولوژی ها را معرفی خواهم کرد.

تکنولوژی های لازم برای شروع برنامه نویسی تحت وب:
--- زبان HTML :
این زبان برای چیدن اشیائی که روی صفحه وب مشاهده میکنید استفاده میشود. محل قرارگیری عکس هاف متون ، جداول ، لینک ها و هر چیزی که در یک صفحه وب مشاهده میکند با این کدها در کنار هم قرار می گیرند. و مرورگر با دریافت کدهای اچ تی ام ال آنها را تفسیر میکند و شکل کلی یک صفحه وب را به شما نشان می دهد. یک طراح و حتی برنامه نویس وب باید به زبان html آشنا باشد تا بتواند سرویس بهینه ای را طراحی کند. پس از اینکه این زبان را آموختید میتوانید از نرم افزارهایی مانند ExpressionWeb و DreamWeaver که کار ساختن کدهای HTML را انجام میدهند استفاده کنید و کار خود را به دوش آنها بیندازید. اما شما باید طرز استفاده از آنها را بدانید. اینکار مانند این است که ابتدا ضرب را بیاموزید و بعد از ماشین حساب استفاده کنید.

--- یک زبان برنامه نویسی تحت وب:
پیشنهاد ما بخصوص در ایران ASP.net و با استفاده از زبان پایهء C# است. گرچه دانستن زبانی مانند PHP هم میتواند موقعیت های شغلی خوبی را برای شما ایجاد کند.

--- طراحی بانک اطلاعاتی رابطه ای:


اولین چیزی که یک سایت بزرگ نیاز دارد یک بانک اطلاعاتی قدرتمند و بهینه شده است. شما باید اصول طراحی بانک های اطلاعاتی ، نرمال سازی در طراحی بانک های اطلاعاتی ، و سپس پیاده سازی را توسط یک بانک قدرتمند مانند SQL Server و یا MySQL بدانید تا بتوانید اولین قدم را در برنامه نویسی تحت وب بردارید.

--- آشنایی با وب :


شما نمی توانید ساختمانی مناسب بسازید، مگر اینکه قبلا ساختمان های متفاوتی را دیده باشید. ضعف بزرگی که بسیاری از مهندسین نرم افزار دارند، آشنا نبودن آنان با محیط اینترنت و دنیای مجازی است. برای حل این مشکلتان پیشنهاد میکنم یک وبلاگ درست کنید و مدتی وبلاگ نویس شوید و وبلاگ خوان . خواندن وبلاگ های متفاوت و آشنایی با سرویس های اینترنتی شما را با محیطی که قرار است در آن مشغول به ساخت و ساز شوید آشنا میکند.
شما بعنوان یک مهندس نرم افزار باید با سایت های اینترنتی زیادی آشنا باشید. هر سایت یک دیدگاه جدید در طراحی وب به شما میدهد. پیشنهاد میکنم برای شروع با سایتهایی مانند جیمیل، فلیکر، پرشین بلاگ، فرندفید ، یاهو360 ، پیکاسا ، یوتیوب، لست.اف.ام آشنا شوید. هرکدام از این سایتها یکی از برجهای افراشته شده در دنیای مجازی وب است. کم کم در وبلاگهایی که میخوانید با سایت های جدید آشنا خواهید شد. هنگام گشت و گذار در این سایت ها به معماری بکار رفته در طراحی آنها دقت کنید.

 

--- آشنایی با شبکه :
مفاهیمی در برنامه نویسی تحت وب هست که ممکن است در برنامه نویسی تحت ویندوز هرگز با آن مواجه نشوید. مفاهیمی مانند IP ، Server Configuration ، Browser Compatibility و صدها واژه و مفهوم دیگر که جزئی جدانشدنی از وب هستند. سعی کنید با مفاهیم شبکه ها ، پروتکل های وب مانند FTP و HTTP و تاریخچه ای از وب آشنا باشید. این اطلاعات نه تنها مفید بلکه برای برنامه نویسی تحت وب ضروری است.
نکاتی که در بالا ذکر شد برای شروع برنامه نویسی تحت وب است و برای اینکه بتوانید سایتهای بهینه و مفیدی طراحی کنید نیازمند تکنولوژی های روز دنیای وب هستید ک

ه در ادامه به تعدادی از آنها اشاره میکنم.

• CSS:
سی اس اس امکان تغییر گرافیکی صفحات وب را بسیار ساده میکند و دانستن آن کمک بسیاری به شما در طراحی سایت هایی میکند که امکان تغییر صفحات سایت را مانند تغییر قالب وبلاگ فراهم میکنند.

• جاوا اسکریپت :
این زبان اسکریپتی کاربرد بسیار زیادی در طراحی وب دارد و بسیاری از رویدادهای صفحات وب با استفاده از جاوا اسکریپت کنترل میشوند. نیازی نیست کل دستورات و نکات موجود در این زبان دا یاد بگیرید. اما باید دستورات ابتدایی و نوع بکاربردن آنها را بیاموزید تا بعدها بتوانید از سورسهای آمادهء جاوا اسکریپتی در پروژه هایتان استفاده کنید.


• آجاکس :
احتمالا یک اکانت جیمیل دارید. آیا سرعت حذف نامه ها را در این سرویس با سایت های دیگه مقایسه کرده اید؟ گاهی کمتر از نیم ثانیه. جیمیل یکی از سایت هایی است که خیلی زود و درست از تکنولوژی آجاکس استفاده کرد ، امروزه بسیاری از سایت ها از این روش برای بالابردن سرعت لود صفحات سایت خود استفاده میکنند و حتی سایت های ایرانی نیز از اجاکس برای طراحی بهره می برند.

• XML:


فایل های XML برای ذخیره و بازیابی اطلاعات حجیم در سرویس های تحت وب استفاده بسیاری دارند. همچنین گاهی شما مجبورید بخشی از اطلاعات موجود در بانک اطلاعاتی را در فایل XML ذخیره کنید تا باری که روی دوش بانک اطلاعاتی است کاهش یابد. XML در این زمینه بهترین انتخاب است.

• Regular Expressions:
یا عبارات منظم برای خواندن و بازیابی اطلاعات از میان فایل های متنی مانند XML و یا صفحات وب سایتها قدرت بسیاری را در دستان شما قرار می دهند. ممکن است در طراحی سایت مورد نظر خود نیازمند استخراج اطلاعات از روی یک سایت دیگر باشید. اگر سایت مورد نظر فید

• Security :
وقتی شما یک سایت را طراحی میکند و روی اینترنت قرار میدهید مانن این است که یک ساختمان را که با چوب کبریت ساخته اید در مقابل باد قرار دهید. همیشه هکر ها و رقبایی هستند که با نیت های گوناگون دنبال ضربه زدن به سایت شما هستند . بنابراین بخش مهمی از آموزش های خود را به آموزش امن کردن سایت های اینترنتی و برنامه ای که نوشته اید اختصاص دهید.

• Stored Prcedure Programming :
برای اتصال به بانک اطلاعاتی از طریق برنامه ای که نوشته اید چندین راه وجود دارد. شما میتوانید فرمان های SQL را در داخل صفحات وبی که ایجاد کرده اید بنویسید. اما این راه نه تنها امن نیست، بلکه سرعت و قابلیت های برنامه شما را کاهش میدهد. برای نوشتن دستورات SQL باید از بخش پروسیجر های SQL استفاده کنید. با اینکار، برنامه شما بسیار استاندارد تر نوشته شده و از امنیت بالاتری نسبت به حالت قبلی برخوردار میشود.
آنچه در این بخش معرفی شد مهم ترین تکنولوژی هایی هستند که شما را در طراحی سیستم های تحت وب یاری میکنند و پشتوانه شما برای انتخاب شغل آینده تان بعنوان یک برنامه نویس وب است. در راهی که انتخاب کرده اید با روش هایی برای کوتاه کردن پروسه های برنامه نویسی نیز آشنا میشوید مانند استفاده از سورس کدهای آماده ، کامپوننت ها و ...
همچنین سعی کنید از سایت های برنامه نویسی و طراحی در اینترنت بیشترین بهره را ببرید. بسیاری از تکنولوژی هایی که امروزه بصورت متداول در آمده است روزی بعنوان یک ایده در یک وبلاگ مطرح شده است.


فصل دوم
مهندسی معکوس در طراحی نرم افزار


کاربرد مهندسی معکوس در طراحی نرم افزار های رایانه ای :
به هر گونه تلاش و فعاليت در راستاي رسيدن از مراحل بالاتر طراحي و توليد به يك يا چند مرحله پايين‌تر، مهندسي معكوس گويند. اين مفهوم در تمامي شاخه‌ها و زمينه‌هاي مهندسي از جمله نرم‌افزار و سخت‌افزار مطرح است. براي مثال دستيابي به ايده‌ها و روش‌هاي توليد يك محصول، از نمونه محصول نهايي نمونه‌اي از مهندسي معكوس است. يكي از اهداف مهندسي معكوس، شناسايي اجزاي سازنده يك محصول و روابط بين ‌آنهاست كه گاهي از آن اجزا براي ساخت يك محصول جديد نيز بهره گرفته مي‌شود.


گاهي نيز به‌منظور ايجاد تغييرات در سيستمي است كه طرح و اجزاي اوليه آن در دسترس نيست. اين كار كه به‌منظور مطابقت سيستم جديد با خواسته‌ها و نيازهاي جديد صورت مي‌گيرد، مهندسي دوباره (Reengineering) نيز ناميده مي‌شود. همچنين با اين كار مي‌توان مشكلات موجود در يك سيستم را رديابي و بررسي كرد: طي بررسي يك سيستم مي‌توان به مستندسازي آن سيستم نيز پرداخت تا با ايجاد درك بهتر از سيستم در جهت بهبود آن گام برداشت.
البته بايد توجه داشت كه به‌كارگيري فنون مهندسي معكوس در هر رشته‌اي، دشواري‌ها و مشكلات خاص خود را دارد و به ابزار و امكانات خاصي نياز دارد و گاهي با و

جود كامل بودن ابزار و امكانات ممكن است نتيجه مطلوب نهايي حاصل نشود. بنابراين در به‌كارگيري اين فنون بايد تمامي هزينه‌ها و زمان مصرفي و نتيجه نهايي در نظر گرفته شوند. به‌عبارتي بايد توجه داشت كه ميزان هزينه مورد نظر در مقابل دسترسي به چه هدفي صرف مي‌شود.
در ادامه تلاش خواهيم كرد كه به چند مورد از كاربردهاي مهندسي معكوس در شاخه نرم‌افزار اشاره‌اي كوتاه داشته باشيم تا هدف از اين شاخه از علم رايانه‌ نيز تا حدي روش شود.


كشف رمزها و كدها
بايد توجه داشت كه از هر ابزاري مي‌توان در راه خوب يا بد استفاده كرد. اين كه شخص از مهارت خود و ابزارهاي موجود استفاده نادرست كند، خود مسوول آن كار خواهد بود.
معمولا كشف كدها يا شكستن رمز، ذهن را به سمت اعمال غيرقانوني مي‌برد. كشف كدها و رمزها و كدهاي يك نرم‌افزار بانك از جمله اين موارد است. اما شكستن رمز هميشه بد و غيرقانوني نيست. اغلب اطلاعات رد و بدل شده بين مجرمان نيز رمزگذاري مي‌شود و براي جلوگيري از فعاليت آنها، پليس بايد اطلاعات به‌دست آمده از آنها را كشف رمز كند. بايد توجه داشت كه معمولا عمل رمزگشايي با استفاده از كليد صورت مي‌گيرد و در صورت در دسترس نبودن كليد، ناچار به شكستن رمز يا كشف رمز هستيم. بنابراين خوب است در به‌كارگيري اين اصطلاحات دقت كنيم.


معمولا در شكستن رمزها از تكنيك‌هاي مهندسي معكوس استفاده مي‌شود. بدون استفاده از اين تكنيك‌ها اگر بخواهيم اقدام به كشف رمز كنيم،چاره‌اي جز حدس، آزمون و خطا و يا بررسي كليه حالت‌هاي ممكن (Brute force) نخواهيم داشت كه كار بس زمان‌گير، دشوار و طاقت‌فرساست.

تغيير در كار يا ظاهر نرم‌افزار
ممكن است نرم‌افزاري در اختيار داشته باشيم كه كدهاي برنامه‌نويسي آن در دسترس ما نباشد و بخواهيم تغييركوچكي در روند اجراي برنامه اعمال كنيم. همچنين ممكن است بخواهيم تغييري در ظاهر برنامه ايجاد كنيم. حتي برخي اوقات لازم است قابليت‌هاي جديدي به يك نرم‌افزار اضافه شود و يا اشكالات موجود در آن رفع شوند. در كليه اين موارد نيز جز تكنيك‌هاي مهندسي معكوس، راه ديگري نخواهيم داشت. اغلب اين مسايل در مواقعي رخ مي‌دهد كه كد برنامه در دسترس نبوده و شركت توليدكننده نرم‌ افزار نيز ديگر از آن پشتيباني نمي‌كند.


يكي از اين مشكلات، مشكل سال‌2000 (Y2K) بود كه شايد آن را به‌خاطر داشته باشيد. اين مشكل با آغاز هزار جديد به‌وجود آمد و در آن زمان بسياري از سازمان‌ها و كاربران در حال استفاده از نرم‌افزارهايي بودند كه شايد سال‌ها با آن كار كرده بودند و مشكلات آن را رفع كرده و اطلاعات زيادي در آنها جمع‌آوري كرده بودند. بسياري از اين نرم‌‌افزارها به‌علت آن كه قديمي شده بودند، ديگر از جانب شركت توليدكننده، پشتيباني نمي‌شدند و يا شركت‌ها به‌طور كامل منحل شده‌ بودند. اما همچنان براي آن سازمان پركاربرد بودند. با مطرح شدن مشكل سال 2000، شركت‌ها و سازمان‌هاي زيادي بار مالي زيادي را براي رفع اين مشكل با استفاده از تكنيك‌هاي مهندسي معكوس، متحمل شدند.

طراحي مجدد
يكي از كاربردها و زمينه‌هاي فعاليت براي مهندسي معكوس كه بسياري مفيد است، طراحي مجدد يك نرم‌افزار بر اساس يك نمونه موجود است. اين كار معمولا به‌دلايل زيادي، از جمله تغيير سيستم عامل، صورت مي‌گيرد و كاري بسيار پيچيده و دقيق است كه معمولا به‌صورت كار گروهي و توسط شركت‌هاي بزرگ انجام مي‌شود.
مراحل اين كار كه به دو قسمت مهندسي معكوس و مهندسي مستقيم (Forward Engineering)تقسيم مي‌شود، به اين صورت است كه ابتدا كليه ايده‌ها و روش‌هاي پياده‌سازي نرم‌افزار مورد نظر تشخيص داده شده و سپس با توجه به اطلاعات به‌دست آمده، نرم‌افزار جديدي طراحي و پياده‌سازي مي‌شود. شايد اين يكي از دشوارترين و مفيدترين زمينه‌هاي كار در مهندسي معكوس باشد.


مستندسازي‌
براي برنامه‌ها و يا توابع كتابخانه‌اي كه بدون كد برنامه‌نويسي عرضه مي‌شودند معمولا مستنداتي نيز وجود ندارد. مانند توابع محلي ويندوزNT كه شامل چندين هزار تابع است كه براي آنها جز چند صفحه اطلاعات ابتدايي، مستنداتي از سوي شركت سازنده يعني مايكروسافت ارايه نشده است. براي مستندسازي اين‌گونه برنامه‌ها يا توابع نيز، تكنيك‌هاي مهندسي معكوس چاره‌ساز خواهند بود.

زبان و كامپايلر
پيش از هر چيزي، لازم است بدانيم، نرم‌افزاري را كه مي‌خواهيم بررسي كنيم با چه زباني نوشته شده است و با چه كامپايلري به فايل اجرايي تبديل شده است. معمولا كامپايلرها با روش‌هاي به‌خصوصي اقدام به ساخت فايل‌هاي اجرايي مي‌كنند. با توجه به آن روش‌ها كه در همه فايل‌هاي اجرايي نيز يكسان است مي‌توان فهميد كه آن برنامه با چه كارهايي ساخته شده است. البته به‌دليل آن كه شناخت كامپايلرها و طريقه ساخت فايل‌هاي اجرايي توسط هر كدام از آنها نيز

مستلزم داشتن آگاهي و شناخت كافي از آنهاست، اين كار با استفاده نرم‌افزارهاي ويژه‌اي انجام مي‌شود. برنامه‌هاي بسياري هستند كه پس از اجراي آنها و انتخاب فايل اجرايي دلخواه، اطلاعات كاملي در مورد زبان برنامه‌نويسي، كامپايلر مورد نظر و حتي نگارش كامپايلر و اطلاعات مفيد ديگر را در اختيارتان قرار مي‌دهد. خوب است بدانيم كه شناسايي نوع كامپايلر مي‌تواند استراتژي ما را در مراحل بعد، كاملا تحت تاثير قرار دهد. زيرا معمولا هر كامپايلر ساختار خاصي را براي مديريت و سازماندهي كدها، داده‌ها و منابع در فايل اجرايي خاص خود در نظر مي‌گيرد كه با كامپايلرهاي ديگر كاملا متفاوت است.


فايل‌هاي وابسته‌
بسياري از نرم‌افزارها و فايل‌هاي اجرايي، به‌هنگام اجرا از كتابخانه‌ها و فايل‌هايي استفاده مي‌كنند كه معمولا اين فايل‌ها با پسوند.dll شناخته مي‌شوند. گاهي لازم است بدانيم كه هرdll شامل چه توابعي است و يك فايل اجرايي در هنگام كار به كدام فايل‌ها وابسته است و كدام‌يك را فراخواني مي‌كند. نرم‌افزارهايي وجود دارند كه قادر هستند كليه فايل‌هاي مورد نياز يك برنامه در هنگام اجرا را به‌صورت چند سطحي تشخيص دهند، به اين معنا كه اگر يك فايل وابسته، خود به فايل ديگري نيز وابسته بود، آن را هم شناسايي كنند.

منابع به‌كار رفته‌


يكي از اجزاي مهم به‌كار رفته در فايل‌هاي اجرايي، به منابع (Resources) معروف هستند كه در واقع داده‌هاي از پيش تعريف‌شده را براي برنامه‌ نگهداري مي‌كنند. پنجره‌هاي از پيش تعريف‌شده،‌ آيكون‌ها، تصاوير گرافيكي موجود در برنامه، رشته‌هاي متني، فايل‌هاي صوتي و تصويري و ... از جمله منابع يك فايل اجرايي به‌شمار مي‌روند. يك برنامه‌نويس مي‌تواند به هر تعداد و از نوع منبع به فايل ارجايي خود بيافزايد و در مهندسي معكوس مي‌توان اين منابع را استخراج كرده يا تغيير داده و يا نمونه ديگري جايگزين كرد.
نرم‌افزارهاي ويژه‌اي هستند كه مي‌توان با استفاده از آنها به منابع يك فايل اجرايي دسترسي پيدا كرد و آنها را مطابق ميل خود تغيير داد و يا آنها را از دل فايل اجرايي بيرون كشيد. با استفاده از همين برنامه‌هاست كه مي‌توان زبان منوها، پنجره‌هاي و محيط برنامه را بدون دسترسي داشتن به كد برنامه تغيير داد. انواع نرم‌افزارهاي فارسي‌ساز با استفاده از همين تكنيك‌ها طراحي مي‌شوند

Disassemblerها
هر برنامه، مستقل از زبان برنامه‌نويسي آن به كد ماشين تبديل مي‌شود. حال اگر بخواهيم كه ماشين را دوباره به كدهاي زبان‌ برنامه‌نويسي تبديل كنيم، ممكن است اين كار امكان‌پذير نباشد. اما با توجه به اين‌كه هر دستور زبان ماشين معادل يك دستور زبان اسمبلي است، مي‌توان هر برنامه‌اي را به‌زبان اسمبلي برگرداند كه اين عمل را Disassemble يا عكس‌ عمل اسمبل گويند. با اين كار، اگر شخص به‌قدر كافي به زبان اسمبلي مسلط باشد، مي‌تواند هر تغييري در كد برنامه بدهد و مجددا آن را اسمبل كرده و فايل اجرايي جديد با اعمال تغييرات ايجاد كند. نرم‌افزارهاي توانمندي هستند كه مي‌توانند علاوه بر عمل disassemble ، امكانات بسياري را براي اعمال تغييرات در فايل اجرايي در اختيار كاربران قرار دهند.

 

فعاليت‌هاي فايل اجرايي‌
به‌عنوان اطلاعات اوليه، شايد لازم باشد كه بدانيم يك فايل اجرايي در زمان اجرا چه رفتاري از خود نشان مي‌دهد و فعاليت آن چگونه است. به‌عنوان مثال چه ميزان حافظه اصلي را اشغال مي‌كند و چه ميزان از حافظه مجازي روي ديسك را به خود اختصاص مي‌دهد يا در زمان اجرا تا چه حد از توان پردازنده را در اختيار خود مي‌گيرد. اين اطلاعات و بسياري اطلاعات ديگر، از جمله مواردي هستند كه مي‌توان در زمان اجرا، از يك فايل اجرايي كسب كرد. براي اين كار نيز نرم‌افزارهاي متنوعي وجود دارند. ساده‌ترين ابزار موجود در اين زمينه Task Manager موجود در ويندوز است كه تا حدي، اطلاعات مفيدي در مورد برنامه‌هاي در حال اجرا در اختيار كاربران قرار مي‌دهد.

 

ورودي و خروجي‌
بيشتر برنامه‌ها عمل ورودي و خروجي روي فايل دارند. يعني يا از فايل خواند يا بر روي آن مي‌نويسند. اطلاعات مربوط به اين فعاليت‌ها نيز ممكن است در جايي لازم باشد.
نرم‌افزارهايي وجود دارند كه به‌محض اجراي يك برنامه، تمامي فعاليت‌هاي ورودي و خروجي مربوط به فايل آن را تحت نظارت و كنترل قرار مي‌دهند. با استفاده از اين‌گونه نرم‌افزارها مي‌توان اطلاعات ارزشمندي در مورد اين نوع فعاليت‌ فايل‌هاي اجرايي نيز كسب كرد.

فعاليت در رجيستري و شبكه‌
دو نوع فعاليت ديگر وجود دارد كه در حوزه‌هاي جداگانه بررسي مي‌شوند و مي‌توانند اطلاعات خوبي در اختيار كار برقرار دهند و يكي تاثيرات كه يك فايل اجرايي در رجيستري ويندوز اعمال مي‌‌كند و ديگري ارتباطات و اتصال‌هايي كه برنامه با شبكه و اينترنت برقرار مي‌كند. در اين زمينه‌ها نيز نرم‌افزارهايي وجود دارند كه كليه كارهاي يك برنامه را براي تغيير دادن رجيستري در نظر مي‌گيرد و مي‌توان با بررسي آن به رفتارهاي فايل اجرايي پي برد. برنامه‌هايي نيز تحت عنوان كليNetwork monitor هستند كه كليه اتصال‌ها، نوع اتصال و پروتكل به‌كار رفته در آن و ديگر جزييات مربوط به ارتباطات و شبكه را كنترل مي‌كنند.


ارتباطات سخت‌افزاري‌
و بالاخره يك فايل اجرايي ممكن است در طول اجرا با سخت‌افزارهاي مختلف و درگاه‌ها، تبادل اطلاعات و ارسال و دريافت داده داشته باشد. ارتباط با درگاه‌هاي سريال، موازي، USB و ... . ارسال اطلاعات به نمايشگر و تبادل اطلاعات با ديسك‌ها و درايوها و ديگر لوازم جانبي رايانه از جمله مواردي هستند كه مي‌توانند در بررسي رفتار يك فايل اجرايي و كسب اطلاعات اوليه در گام اول مهندسي معكوس موثر واقع شوند.


اگر سابقه ي صنعت و چگونگي رشد آن در كشورهاي جنوب شرقي آسيا را مورد مطالعه قرار دهيم به اين مطلب خواهيم رسيد كه در كمتر مواردي اين كشورها داراي ابداعات فن آوري بوده اند و تقریباً در تمامي موارد، كشورهاي غربي (‌آمريكا و اروپا) پيشرو بوده اند. پس چه عاملي باعث اين رشد شگفت آور و فني در كشورهاي خاور دور گرديده است؟در اين نوشتار به يكي از راهكارهاي اين كشورها در رسيدن به اين سطح از دانش فني مي پردازيم.
در صورتی كه به طور خاص كشور ژاپن را زير نظر بگيريم، خواهيم ديد كه تقریباً تمامي

مردم دنيا از نظر كيفيت، محصولات آنها را تحسین مي کنند ولی به آنها ايراد مي گيرند كه ژاپني ها از طريق كپي برداري از روي محصولات ديگران به اين موفقيت دست يافته اند.این سخن اگر هم كه درست باشد و در صورتي كه كپي برداري راهي مطمئن براي رسيدن به هدف باشد چه مانعي دارد كه اين كار انجام شود.اين مورد، به خصوص درباره ي كشورهاي در حال توسعه ويا جهان سوم به شكاف عميق فن آوري بين اين كشورها و كشورهاي پيشرفته دنيا، امري حياتي به شمار مي رود و اين كشورها بايد همان شيوه را پيش بگيرند(البته در قالب مقتضيات زمان و مكان و ساير محدوديت ها) به عنوان يك نمونه، قسمتي از تاريخچه ي صنعت خودرو و آغاز توليد آن در ژاپن را مورد بررسي قرار مي دهيم:
توليد انبوه خودرو در ژاپن قبل از جنگ جهاني دوم ودر سال 1920 بوسيله ي كارخانه ها "ايشي كاواجيما" آغاز شد كه مدل ژاپني فورد آمريكايي را كپي كرده و به شكل توليد انبوه به بازار عرضه نمود.
همچنين شورلت ژاپني AE جزو اولين خودرو هاي كپي شده آمريكايي توسط ژاپني ها بود كه به تعداد زياد توليد مي شد. سپس با تلاش هاي فراواني كه انجام شد(آنهم در شرايط بحراني ژاپن در آن دوره) مهمترين كارخانه‌ي خودرو سازي ژاپن يعني "تويوتا" درسال 1932 فعاليت خود را با ساخت خودرويي با موتور "كرايسلر" آغاز نمود ، در سال 1934، نوع ديگري از خودرو را با موتور"شورلت" ساخته و وارد بازار نموده و از سال 1936، اولين تلاش ها براي ساخت خودروي تمام ژاپني آغاز شد. البته تا مدت ها ژاپني ها مشغول كپي برداري از اتومبيل هاي آمريكايي و اروپايي بودند.


آنها خودروي پاكارد و بيوك آمريكايي و رولزرويس، مرسدس بنز و فيات اروپايي را نيز توليد كردند كه همين توليدها زمينه ساز گسترش فعاليت خودروسازي ژاپن شد و سرانجام در دهه ي 1960 ميلادي پس از سعي و كوشش فراوان ، اولين اتومبيل تمام ژاپني كه ضمنا داراي استاندارد جهاني بود، توليد و به بازار عرضه شد.
در تمامي مطاب فوق رد پاي يك شگرد خاص و بسيار مفيد به چشم مي خورد كه "مهندسي معكوس"(Reverse Engineering ) نام دارد.
مهندسي معكوس روشي آگاهانه براي دستيابي به فن آوري حاضر و محصولات موجوداست. در ا

ين روش، متخصصين رشته هاي مختلف علوم پايه و كاربردي از قبيل مكانيك، فيزيك و اپتيك، مكاترونيك، شيمي پليمر، متالورژي،الكترونيك و ...جهت شناخت كامل نحوه ي عملكرد يك محصول كه الگوی فن آوري مذكور مي باشد تشكيل گروه هاي تخصصي داده و توسط تجهيزات پيشرفته و

دستگاه هاي دقيق آزمايشگاهي به همراه سازماندهي مناسب تشكيلات تحقيقاتي و توسعه هاي R&D "سعي در به دست آوردن مدارك و نقشه هاي طراحي محصول فوق دارند تا پس از

مراحل نمونه سازي (Prototyping) و ساخت نيمه صنعتي (Pilot plant) در صورت لزوم ، توليد محصول فوق طبق استاندارد فني محصول الگو انجام خواهد شد . همان گونه كه اشاره شد استفاده از روش مهندسي معكوس براي كشورهاي در حال توسعه يا عقب مانده روش بسيار مناسبي جهت دسترسي به فن آوري ، رشد و توسعه ي آن مي باشد. اين كشور ها كه در موارد بسياري از فن آوري ها در سطح پاييني قرار دارند، در كنار روش ها و سياست هاي دريافت دانش فني، مهندسي معكوس را مناسب ترين روش دسترسي به فن آوري تشخيص داده و سعي مي كنند با استفاده از روش مهندسي معكوس، اطلاعات و دانش فني محصولات موجود ، مكانيزم عمل كرد و هزاران اطلاعات مهم ديگر را بازيابي كرده و در كنار استفاده ار روش هاي مهندسي مستقيم

(Forward Engineering) و روش هاي ساخت قطعات ، تجهيزات ، تسترهاي مورد استفاده در خط مونتاژ و ساخت مانند قالب ها ،گيج و فيكسچر ها و دستگاههای كنترل، نسبت به ايجاد كارخانه اي پيشرفته و مجهز جهت توليد محصولات فوق اقدام نمايند. همچنين ممكن است مهندسي معكوس، براي رفع معايب و افزايش قابليت هاي محصولات موجود نيز مورد استفاده قرار مي گيرد. به عنوان مثال در كشور آمريكا ، مهندسي معكوس توسط شركت "جنرال موتور" بر روي محصولات

كمپاني "فورد موتور" و نيز برعكس، براي حفظ وضعيت رقابتي و رفع نواقص محصولات به كار برده شده است.
بسياري از مديران كمپاني هاي آمريكايي، هر روز قبل از مراجعت به كارخانه، بازديدي از جديدترين محصولات عرضه شده در فروشگاه ها و نمايشگاه هاي برگزار شده انجام داده و جديدترين محصولات عرضه شده مربوط به محصولات كمپاني خود را خريداري نموده و به واحد تحقيق و توسعه R&D تحويل مي دهند تا نكات فني مربوط به طراحي وساخت محصولات مذكور و آخرين تحقيقات ،

هر چه سريع تر در محصولات شركت فوق نيز مورد توجه قرار گيرد.
جالب است بدانيد كه مهندسي معكوس حتي توسط سازندگان اصلي نيز ممكن است به كار گرفته شود . زيرا به دلايل متعدد، نقشه هاي مهندسي اوليه با ابعاد واقعي قطعات (مخصوصا زماني كه قطعات چندين سال پيش طراحي و ساخته و به دفعات مكرر اصلاح شده اند)مطابقت ندارد براي مثال جهت نشان دادن چنين نقشه هايي با ابعاد واقعي قطعات و كشف اصول طراحي و تلرانس گذاري قطعات، بخش ميكروسويچ شركتHonywell از مهندسي معكوس استفاده نموده و با استفاده از سيستم اندازه گيري CMM (Coordinate Measuring Machine) با دقت و سرعت زياد ابعاد را تعيين نموده و به نقشه هاي مهندسي ايجاد شده توسط سيستم CAD منتقل مي كنند.
متخصصين اين شركت اعلام مي دارند كه روش مهندسي معكوس و استفاده از ابزار مربوطه، به نحو موثري زمان لازم براي تعمير و بازسازي ابزارآلات ، قالب ها و فيكسچرهاي فرسوده را كم مي كند و لذا اظهار مي دارند كه "مهندسي معكوس زمان اصلاح را به نصف كاهش مي‌دهد."


مهندسين معكوس، اضافه بر اينكه بايد محصول موجود را جهت كشف طراحي آن به دقت مورد مطالعه قرار دهند، همچنين بايد مراحل بعد از خط توليد يعني انبارداري و حمل و نقل را از كارخانه تا مشتري و نيز قابليت اعتماد را در مدت استفاده ي مفيد مورد تجزيه و تحليل قرار دهند. چرا كه مثلا فرايند آنيلينگ مورد نياز قطعه،ممكن است براي ايجاد مشخصات مورد نظر در هنگام عمل كرد واقعي محصول يا در طول مدت انبارداري و حمل و نقل طراحي شده و لزوم وجود آن تنها در هنگام اجراي مراحل مذكور آشكار خواهد شد.


چه بسا كه بررسي يك پيچ بر روي سوراخي بر بدنه ي محصول(كه به قطعات و اجزاي ديگر متصل نشده) ، متخصصان مهندسي معكوس را ماه ها جهت کشف راز عملياتي آن به خود مشغول كند، غافل از اينكه محل اين پيچ، امانم جهت تخليه ي هوا، تست آب بندي يا امكان دسترسي به داخل محصول جهت تست نهايي مي باشد. از سوي ديگر مهندسين معكوس بايد عوامل غير مستقيمي را كه ممكن است در طراحي و توليد محصول مذكور تاثير بگذارند، را به دقت بررسي نمايند. به دليل اينكه بسياري از اين موارد با توجه به خصوصيات و مقتضيات زماني و مكاني ساخت محصول مورد

نظر، توسط سازندگان اصلي توجيه پذير باشد اما ماجراي آن به وسيله ي مهندسين معكوس فاجعه ساز باشد. مثلا فرايند توليد قطعات تا حدود قابل توجهي بستگي به تعداد محصولات مورد نياز و ... دارد . اگر تعداد محصولات مورد نياز جهت كشور ثانويه در بسيار كمتر از كشور اصلي كه در حد جهاني و بين‌المللي فعاليت نموده ، باشد پس به عنوان مثال تعيين فرايند يك قطعه با باكاليتي (نوعي مواد پليمري) از طريق ساخت قالب هاي چند حفره اي با مكانيزم عملكرد خود كاربا توجه به معضلات پخت قطعه در داخل قالب ، مي تواند براي مجريان مهندسي معكوس فاجعه ساز باشد ( اگر كه اين مهندسان از فرايند هاي ساده تر با توجه به تيراژ توليد محصول و نيز خصوصیات

تكنولوژيكي كشور خود استفاده نكنند.) بنابراين، مرحله بعد از كشف طراحي، تطبيق طراحي انجام شده بر مقتضيات زماني و مكاني كشور ثانويه مي‌باشد كه بايد به دقت مورد توجه متخصصين مهندسي معكوس واقع شود.
خلاصه اينكه مهندسي معكوس ممكن است يك كاربرد غير معقول و نامناسب از كاربرد هنر و علم مهندسي به نظر برسد، اما آن يك حقيقت از زندگي روزمره ي ما به شمار مي رود.

دسته بندی ابزارهای اصلی مورد استفاده در معکوس سازی
1 - hex editor
2 - debugger
3 - disassembler


4 - decompiler
5 - patcher
6 - compressorفشرده ساز
7 - analyzerتحلیل گر
8 - monitoring tools
9 - protector

Hex Editor


از جمله editorهایی مانند notepad یا Tex pad محسوب می شود و تنها تفاوت آن با editorهای معمولی در آن است که محتویات فایل را به صورت hexadecimal(در مبنای 16) نمایش می دهد و امکان تغییر در محتویات فایل یا search کردن و... را به صورت های binary یا در hexadecimal یا ASII را فراهم می آورد. همچنین از جمله کارهای دیگری که hex editor ها انجام می دهند، امکان تبدیل از مبنای 16 به مبنای 2 و ... اطلاعات است.
در حال حاضر به عنوان یک ابزار مهم در روند و فرایند معکوس سازی ، hex editor های بسیار متنوعی وجود دارند که از مشهورترین آنها می توان به hiew یا Win Hex یا Hack man و یا hex workshop اشاره کرد. همچنین برخی hex editorها مثل Win Hex یا HackMan و يا hex workshop، امکاناتی مانند انجام محاسبات آماری بر روی داده های یک فایل و یا امکان encrypt يا decrypt کردن فایل ها و یا امکان مقایسه محتویات فایل ها به یکدیگر را نیز میسر می سازند. مثلاٌ WinHex ، الگوریتم های رمزی مثل AES و PCI را پشتیبانی می کند. البته WinHex الگوریتم های بیشتری را پشتیبانی می کند و یک ابزار بسیار قوی در این دسته محسوب می شود.

نقش Debugger در طراحی نرم افزار :


Debugger به برنامه اي گفته مي شود كه به كمك آن مي توان روند اجراي يك برنامه را به طور دقیق کنترل کرد. به طور مثال برنامه را دستور به دستور اجرا کرد، یا تا سر یکinstruction خاص برنامه را اجرا کرد. احتمالاٌ تابحال از Debuggerهای معمولی برای debug کردن برنامه ایی که به یک زبان سطح بالا مثل C يا java نوشته اید، استفاده کرده اید. منظور ما اینجا از Debugger، برنامه ای است که machine code يك برنامه (file exe به طور معمول را گرفته و کد assembly آن را براي debug کردن نمایش دهد. در debuggerها معمولاً امكانات مشابهي مانند break point یا step over و watch و ... وجود دارد که امکان اجرای کنترل شده برنامه را برای کاربر فراهم می کنند.


از دیگر امکاناتی که debuggerها دارند، فراهم آوردن window هايي است كه در آنها محتويات memory و registerها CPU و stack در هر لحظه مشخص است، و امکان search در هر كدام از اين windowها مثل allocated memory را به شما مي دهد.
معمولاً از debugger ها می توان برای یافتن bugها برنامه و يا مطالعه رفتار virusها و يا backdoorها و .... و یا تشخیص نحوه عملکرد یک برنامه استفاده کرد. Debuggerها به دو دسته kernel-levelها و user-level تقسیم می شوند که توسط kernel- level debugger ها مي توان كار debuggerرا براي developmentهای سطح kernel، مثل نوشتن driverها انجام داد و همچنین امکان نظارت بر

تمامی کار سیستم را فراهم می کنند که در همین زمینه از جمله مشهورترین kernel-level debuggerها، مي توان به SoftIce محصول شرکت Numega و WinDbg محصول Microsoft اشاره كرد.
از debuggerهاي user-level نیز می توان به OllyDbg و pro IDA و twr2000 اشاره کرد، که معمولاٌ به یک process خاص خود را attach می کنند و کنترل آن را به دست می گیرند

Disassembler
تفاوت debugger و disassembler در این است که disassembler امكان كنترل اجراي برنامه را براي ما فراهم نمي كند و صرفاً يك machine code را به assembly آن ماشين تبديل ميكند (عملاً در debugger ما ميتوانيم رفتار dynamic برنامه را بررسی کنیم، در حالی که در disassembler تنها رفتار static قابل مشاهده است). از مشهورترین آنها می توان به WinDasm و ILDasm و یا IDA (interactive disassemble) اشاره کرد، که البته IDA يكي از قويترين disassemblerهاست که توانایی هایی نظیر تحلیل کد و بدست آورند flow chart برنامه از روي binary file را نیز دارد (منظور از binary file در اينجا، كد ماشين فايل اجرايي است)، و همچنین توانایی disassemble کردن فایل binary file را به assembly مربوط به CPU ها مختلفي مثل AMD64 و Itanium-64 و Itanium-32 را دارد.


Decompiler
کاربرد اصلی این نوع برنامه ها آن است كه از يك فايل اجرايي (binary file)، یک فایل خروجی به یک زبان برنامه نویسی سطح میانه مثل C يا سطح بالا مانند Java تولید کنند،که درک آن برای فرد آسانتر شود،که از جمله آنها می توان به JAD براي تبديل java class file به java source code و Reflector براي تبديل فايل exe خروجی net. به source اشاره کرد. حتی برای خروجی flash هم با پسوندswf، انواع decompilerهای زیادی مثل SWF Decompiler موجود است که فایل swf را به فايل fla تبدیل می کنند و سپس شما می توانید فایل fla را توسط macromedia flash باز كرده و آن را edit كنيد و فايل fla جدیدرا به swf ديگري تبديل كنيد.

 

Patcher
زماني كه ما يك فايل exe (در حالت كلي يك فايل اجرايي) را تغيير داديم، ميتوانيم به كمك patcherها، يك برنامه توليد كنيم كه با دادن فايل exe اوليه به آن، فايل exe همراه با تغييرات را از روي آن ايجاد كند. حسني كه اين برنامه ها دارند اين است كه مثلاً ممكن است فايل exe اصلي، 200 MB باشد، در اين صورت ما مي توانيم با استفاده از patcherها برنامه اي مثلاً در حدود 10 KB توليد كنيم كه هر فايل 200 Mb اولیه را به یک فایل exe تغيير كرده مورد نظر ما تبديل كند (يعني

عملاً patcherها برنامه اي توليد مي كنند كه فقط تفاوتهايي را كه ما در exe فايل اصلي ايجاد كرديم، بتواند روي هر فايل exe اوليه ايجاد كند و آن را مانند فايل نهايي مورد نظر ما كند.
در واقع patcherها مي توانند عمل patching را شبيه سازي كنند (patching يعني تغيير binary file به نحوي كه كاري را كه برنامه انجام مي دهد، مطابق خواست ما كند)، كه از جمله آنها مي توان Patch Engine را نام برد.

Compressor
براي اينكه حجم فايل هاي اجرايي را تا حد امكان كم كنيم، اغلب و معمولاً از اين نوع ابزارها استفاده مي شود كه عملاً يك فايل اجرايي مثل يك exe file رابه اين صورت تغيير ميدهند كه ابتدا كد آن را zip كرده و سپس يك hear به آن اضافه كرده كه خود فايل exe بتواند خودش را unzip كند. ضمناً يكي از مطرح ترين الگوريتم هاي compression، UPX است كه معمولاً يك فايل exe را تا ميزان 30% مي تواند كوچك كند. (مي توانيد به سايت upx.sourceforge.met مراجعه كنيد.)

Analyzers


معمولاً به كمك اين ابزارها سعي مي كنند فايل اجرايي، مثل exe file را تحليل كنند كه مثلاً شامل چه توابعي است (در windows استفاده از توابع API اهميت بيشتري دارد و در linux استفاده از system callها) و يا نوع compilerاي كه اين برنامه به كمك آن compile شده است را تشخيص دهند و يا اينكه برنامه شامل چه stringها و نام فايل ها و directoryهايي است و يا چه dll file هايي

توسط اين برنامه load مي شود (كه تحت عنوان import table شناخته مي شود) و ... كه از اين دسته مي توان به PEBrowse professional اشاره كرد كه حتي اين قابليت را دارد كه فايل هاي image درون برنامه را نيز نشان دهد و اين برنامه حتي شامل يك disassembler نيز هست!

در متن اصلی مقاله به هم ریختگی وجود ندارد. برای مطالعه بیشتر مقاله آن را خریداری کنید