مقدمه
مهندسی معکوس فرایند اکتشاف فن آوریهای بکار رفته در یک دستگاه، شی و یا سیستم از طریق تحلیل ساختار، عملکرد و وظیفه آن میباشد. معمولاً از این فرایند برای دست یابی به (برای مثال یک دستگاه مکانیکی، قطعه الکترونیکی و یا برنامه نرمافزاری) و تحلیل جزییات نحوه عملکرد آن در نگهداری یا ساخت یک دستگاه یا برنامه مشابه استفاده میشود. حاصل این فرایند مشابه کپی کردن یک چیز از روی اصل آن میباشد.
درک سیستم نرمافزاری بر هر نوع تغییر مقدم است. فرآیند درک، مقدار زیادی از کل زمان صرف شده را در اِعمال تغییر میگیرد. نگهدارندگان دلایلی از جمله مستندات ناصحیح یا قدیمی، نبود مستندات، پیچیدگی سیستم و عدم شناخت کافی از قلمرو را علت فقدان درک صحیح از سیستم میدانند. راه تسهیل این مسایل، خلاصه کردن اطلاعات مربوط به سیستم (مثل تبین مشخصات و طرح) از طریق کد منبع است، بهشکلی که درک آنرا بالا برد.مهندسی معکوس تکنیکی است که میتوان از آن برای این کار استفاده کرد ، مهندسی معکوس به تنهایی منجر به تغییر در برنامه نمیشود، بلکه فقط راه را برای اجرای آسانتر تغییراتِ مطلوب هموار مینماید. تغییرات با استفاده از فنونی چون مهندسی پیشرو، بازسازی، و مهندسی مجدد پیادهسازی میشوند.
هدف از مهندسی معکوس تسهیل در اِعمال تغییر از طریق فهمیدن سیستم نرمافزاری با توجه به ماهیت کار، چگونگی کار و نمایش معماری آن است. بهعنوان اهداف پیگیریِ این مقصود میتوان به ترمیم اطلاعات از دست رفته، تسهیل جابهجایی بین بسترها، بهبود و (یا) تهیهٔ مستندات جدید، استخراج عناصر قابل استفادهٔ مجدد، کاهش تلاش برای نگهداری، مقابله با پیچیدگی، کشف عوارض جانبی، کمک به انتقال به محیط CASE و ایجاد محصولات مشابه یا رقابتی اشاره کرد. از دیگر مزایای مهندسی معکوس کاهش هزینهها و سریع آماده شدن نرم افزار است.
برای مثال هنگامیكه یك خودرو به بازار میآید رقیبان آن شركت تولیدی ، مدلی از خودرو را تهیه كرده و آن را جداسازی میكنند (Disassembling) تا طرز كار و چگونگی ساخت آن را ببینند و از تكنیكهای آن در تولیدات خود استفاده كنند ؛ یا در مهندسی راه و ساختمان از طرح پلها و ساختمانهای قدیمی كه هنوز پابرجا باقی ماندهاند كپی گرفته میشود و در مورد چگونگی ساخت آنها ، مواد اولیه استفاده شده و علل سالم ماندن آن تحقیق میشود تا در طرحهای خود برای استحكام بیشتر استفاده كنند .
در بعضی موارد طراحان ، شكلی از ایدههایشان را با استفاده از گچ ، سفال و ... نشان میدهند (ساخت ماكت) كه نیازی به اندازهگیری دقیق ندارد ؛ این در حالیست كه مدل كامپیوتری (CAD) نیاز به اندازهگیری دقیق قسمتهای مختلف دارد و تا زمانی كه این اندازهها دقیق نباشند وارد كردن آن در CAD بسیار دشوار و حتی ناممكن است ؛ زیرا هیچ تضمینی وجود ندارد كه مدل ارائه شده در CAD و مدلهای ساخته شده بعدی با مدل اولیه مطابقت داشته باشند . مهندسی معكوس راه حلی برای این مشكل دارد :
از نطر مهندسی معكوس در این حالت مدل فیزیكی یك منبع اطلاعاتی مناسب برای مدل CAD است . در این حالت با استفاده از ابعاد سهبعدی و اسكنرهای لیزری و سطحنگارها با در نظر گرفتن ابعاد فیزیكی ، جنس ماده تشكیل دهنده و دیگر جنبهها یك مدل و الگوی پارامتری بدست میآید ؛ سپس این مدل به CAD فرستاده میشود و تغییرات نهایی روی آن انجام میشود و سپس به دستگاههای برش و تولید (CAM ) فرستاده میشود كه CAM این قسمت فیزیكی را تولید مینماید .
پس میتوان گفت كه مهندسی معكوس با كالا آغاز میشود و به فرایند طراحی میرسد و این دقیقا مخالف مسیر روش تولید (Product Definition Statement = PDS) است و به همین علت آن را مهندسی معكوس نامیدهاند . به وسیله این روش بیشترین اطلاعات ممكن درباره ایدههای مختلف طراحی كه برای تولید یك كالا استفاده میشود بدست میآید . بدین وسیله هم میتوان كالا را دوباره تولید كرد و هم میتوان از ایدههای مفید آن برای تولید كالایی جدید بهره برد . همین امر باعث شده كه مهندسی معكوس به یكی از شاخههای مهم مهندسی تبدیل گردد و همواره نگاهها به سوی تولیدات وارد شده به بازار جلب شود .
تاریخچه کاربردی مهندسی معکوس :
اگر سابقه ی صنعت و چگونگی رشد آن در کشورهای جنوب شرقی آسیا را مورد مطالعه قرار دهیم به این مطلب خواهیم رسید که در کمتر مواردی این کشورها دارای ابداعات فن آوری بوده اند و تقریبا در تمامی موارد، کشورهای غربی (آمریکا و اروپا) پیشرو بوده اند. پس چه عاملی باعث این رشد شگفت آور و فنی در کشورهای خاور دور گردیده است؟
در این نوشتار به یکی از راهکارهای این کشورها در رسیدن به این سطح از دانش فنی می پردازیم.
در صورتی که به طور خاص کشور ژاپن را زیر نظر بگیریم، خواهیم دید که تقریبا تمامی مردم دنیا از نظر کیفیت، محصولات آنها را تحسین می کنند ولی به آنها ایراد می گیرند که ژاپنی ها از طریق کپی برداری از روی محصولات دیگران به این موفقیت دست یافته اند.
این سخن اگر هم که درست باشد و در صورتی که کپی برداری راهی مطمئن برای رسیدن به هدف باشد چه مانعی دارد که این کار انجام شود.این مورد، به خصوص درباره ی کشورهای در حال توسعه ویا جهان سوم به شکاف عمیق فن آوری بین این کشورها و کشورهای پیشرفته دنیا، امری حیاتی به شمار می رود و این کشورها باید همان شیوه را پیش بگیرند(البته در قالب مقتضیات زمان و مکان و سایر محدودیت ها) به عنوان یک نمونه، قسمتی از تاریخچه ی صنعت خودرو و آغاز تولید آن در ژاپن را مورد بررسی قرار می دهیم:
تولید انبوه خودرو در ژاپن قبل از جنگ جهانی دوم ودر سال ۱۹۲۰ بوسیله ی کارخانه های "ایشی کاواجیما" آغاز شد که مدل ژاپنی فورد آمریکایی را کپی کرده و به شکل تولید انبوه به بازار عرضه نمود.
همچنین شورلت ژاپنی AE جزو اولین خودرو های کپی شده آمریکایی توسط ژاپنی ها بود که به تعداد زیاد تولید می شد. سپس با تلاش های فراوانی که انجام شد(آنهم در شرایط بحرانی ژاپن در آن دوره) مهمترین کارخانهی خودرو سازی ژاپن یعنی "تویوتا" درسال ۱۹۳۲ فعالیت خود را با ساخت خودرویی با موتور "کرایسلر" آغاز نمود ، در سال ۱۹۳۴، نوع دیگری از خودرو را با موتور"شورلت" ساخته و وارد بازار نموده و از سال ۱۹۳۶، اولین تلاش ها برای ساخت خودروی تمام ژاپنی آغاز شد. البته تا مدت ها ژاپنی ها مشغول کپی برداری از اتومبیل های آمریکایی و اروپایی بودند.
آنها خودروی پاکارد و بیوک آمریکایی و رولزرویس، مرسدس بنز و فیات اروپایی را نیز تولید کردند که همین تولیدها زمینه ساز گسترش فعالیت خودروسازی ژاپن شد و سرانجام در دهه ی ۱۹۶۰ میلادی پس از سعی و کوشش فراوان ، اولین اتومبیل تمام ژاپنی که ضمنا دارای استاندارد جهانی بود، تولید و به بازار عرضه شد.
در تمامی مطاب فوق رد پای یک شگرد خاص و بسیار مفید به چشم می خورد که "مهندسی معکوس"(Reverse Engineering ) نام دارد.
مهندسی معکوس روشی آگاهانه برای دستیابی به فن آوری حاضر و محصولات موجوداست. در این روش، متخصصین رشته های مختلف علوم پایه و کاربردی از قبیل مکانیک، فیزیک و اپتیک، مکاترونیک، شیمی پلیمر، متالورژی،الکترونیک و ...جهت شناخت کامل نحوه ی عملکرد یک محصول که الگوی فن آوری مذکور می باشد تشکیل گروه های تخصصی داده و توسط تجهیزات پیشرفته و دستگاه های دقیق آزمایشگاهی به همراه سازماندهی مناسب تشکیلات تحقیقاتی و توسعه های R&D "سعی در به دست آوردن مدارک و نقشه های طراحی محصول فوق دارند تا پس از مراحل نمونه سازی (Prototyping ) و ساخت نیمه صنعتی (Pilot plant ) در صورت لزوم ، تولید محصول فوق طبق استاندارد فنی محصول الگو انجام خواهد شد . همان گونه که اشاره شد استفاده از روش مهندسی معکوس برای کشورهای در حال توسعه یا عقب مانده روش بسیار مناسبی جهت دسترسی به فن آوری ، رشد و توسعه ی آن می باشد. این کشور ها که در موارد بسیاری از فن آوری ها در سطح پایینی قرار دارند، در کنار روش ها و سیاست های دریافت دانش فنی، مهندسی معکوس را مناسب ترین روش دسترسی به فن آوری تشخیص داده و سعی می کنند با استفاده از روش مهندسی معکوس، اطلاعات و دانش فنی محصولات موجود ، مکانیزم عمل کرد و هزاران اطلاعات مهم دیگر را بازیابی کرده و در کنار استفاده ار روش های مهندسی مستقیم (Forward Engineering ) و روش های ساخت قطعات ، تجهیزات ، تسترهای مورد استفاده در خط مونتاژ و ساخت مانند قالب ها ،گیج و فیکسچر ها و دستگاههای کنترل، نسبت به ایجاد کارخانه ای پیشرفته و مجهز جهت تولید محصولات فوق اقدام نمایند. همچنین ممکن است مهندسی معکوس، برای رفع معایب و افزایش قابلیت های محصولات موجود نیز مورد استفاده قرار می گیرد. به عنوان مثال در کشور آمریکا ، مهندسی معکوس توسط شرکت "جنرال موتور" بر روی محصولات کمپانی "فورد موتور" و نیز برعکس، برای حفظ وضعیت رقابتی و رفع نواقص محصولات به کار برده شده است.
بسیاری از مدیران کمپانی های آمریکایی، هر روز قبل از مراجعت به کارخانه، بازدیدی از جدیدترین محصولات عرضه شده در فروشگاه ها و نمایشگاه های برگزار شده انجام داده و جدیدترین محصولات عرضه شده مربوط به محصولات کمپانی خود را خریداری نموده و به واحد تحقیق و توسعه (R&D ) تحویل می دهند تا نکات فنی مربوط به طراحی وساخت محصولات مذکور و آخرین تحقیقات ، هر چه سریع تر در محصولات شرکت فوق نیز مورد توجه قرار گیرد.
جالب است بدانید که مهندسی معکوس حتی توسط سازندگان اصلی نیز ممکن است به کار گرفته شود . زیرا به دلایل متعدد، نقشه های مهندسی اولیه با ابعاد واقعی قطعات (مخصوصا زمانی که قطعات چندین سال پیش طراحی و ساخته و به دفعات مکرر اصلاح شده اند)مطابقت ندارد برای مثال جهت نشان دادن چنین نقشه هایی با ابعاد واقعی قطعات و کشف اصول طراحی و تلرانس گذاری قطعات، بخش میکروسویچ شرکت(Honywell ) از مهندسی معکوس استفاده نموده و با استفاده از سیستم اندازه گیری CMM (Coordinate Measuring Machine ) با دقت و سرعت زیاد ابعاد را تعیین نموده و به نقشه های مهندسی ایجاد شده توسط سیستم CAD منتقل می کنند.
متخصصین این شرکت اعلام می دارند که روش مهندسی معکوس و استفاده از ابزار مربوطه، به نحو موثری زمان لازم برای تعمیر و بازسازی ابزارآلات ، قالب ها و فیکسچرهای فرسوده را کم می کند و لذا اظهار می دارند که "مهندسی معکوس زمان اصلاح را به نصف کاهش میدهد."
مهندسین معکوس، اضافه بر اینکه باید محصول موجود را جهت کشف طراحی آن به دقت مورد مطالعه قرار دهند، همچنین باید مراحل بعد از خط تولید یعنی انبارداری و حمل و نقل را از کارخانه تا مشتری و نیز قابلیت اعتماد را در مدت استفاده ی مفید مورد تجزیه و تحلیل قرار دهند. چرا که مثلا فرایند آنیلینگ مورد نیاز قطعه،ممکن است برای ایجاد مشخصات مورد نظر در هنگام عمل کرد واقعی محصول یا در طول مدت انبارداری و حمل و نقل طراحی شده و لزوم وجود آن تنها در هنگام اجرای مراحل مذکور آشکار خواهد شد.
چه بسا که بررسی یک پیچ بر روی سوراخی بر بدنه ی محصول(که به قطعات و اجزای دیگر متصل نشده) ، متخصصان مهندسی معکوس را ماه ها جهت کشف راز عملیاتی آن به خود مشغول کند، غافل از اینکه محل این پیچ، امکانی جهت تخلیه ی هوا، تست آب بندی یا امکان دسترسی به داخل محصول جهت تست نهایی می باشد. از سوی دیگر مهندسین معکوس باید عوامل غیر مستقیمی را که ممکن است در طراحی و تولید محصول مذکور تاثیر بگذارند، را به دقت بررسی نمایند. به دلیل اینکه بسیاری از این موارد با توجه به خصوصیات و مقتضیات زمانی و مکانی ساخت محصول مورد نظر، توسط سازندگان اصلی توجیه پذیر باشد اما ماجرای آن به وسیله ی مهندسین معکوس فاجعه ساز باشد. مثلا فرایند تولید قطعات تا حدود قابل توجهی بستگی به تعداد محصولات مورد نیاز و ... دارد . اگر تعداد محصولات مورد نیاز جهت کشور ثانویه در بسیار کمتر از کشور اصلی که در حد جهانی و بینالمللی فعالیت نموده ، باشد پس به عنوان مثال تعیین فرایند یک قطعه با باکالیتی (نوعی مواد پلیمری) از طریق ساخت قالب های چند حفره ای با مکانیزم عملکرد خود کاربا توجه به معضلات پخت قطعه در داخل قالب ، می تواند برای مجریان مهندسی معکوس فاجعه ساز باشد ( اگر که این مهندسان از فرایند های ساده تر با توجه به تیراژ تولید محصول و نیز خصوصیات تکنولوژیکی کشور خود استفاده نکنند.) بنابراین، مرحله ی بعد از کشف طراحی، تطبیق طراحی انجام شده بر مقتضیات زمانی و مکانی کشور ثانویه میباشد که باید به دقت مورد توجه متخصصین مهندسی معکوس واقع شود.
خلاصه اینکه مهندسی معکوس ممکن است یک کاربرد غیر معقول و نامناسب از کاربرد هنر و علم مهندسی به نظر برسد، اما آن یک حقیقت از زندگی روزمره ی ما به شمار می رود.
مزایا و دستاوردهای مهندسی معكوس:
مهندسی معكوس یكی از روشهای دسترسی به دانش فنی است . لازمه اجرای این روش وجود نمونههایی از محصول است كه مبنای كار تحقیقات قرار میگیرد ؛ در این روش برای دستیابی به دانش فنی به برونفكنی اطلاعات فنی از طریق تجزیه محصول متوسل میشویم كه اصطلاحا كشف كردن دانش فنی نامیده میشود . در این فرایند كارشناسان مربوطه ، مشخصات ، هدف و شرایط طراحی محصول را درنظر گرفته و سعی در ساخت و تولید محصول طبق استانداردهای ملی و رایج خود دارند و نقاط مجهول و ناشناخته مساله را نیز با درایت و بررسیهای كارشناسی و تحقیقاتی پوشش میدهند ، بدون اینكه از ابتدا درگیر جزئیات فنی و طراحی محصول شده باشند . شاید بتوان از مهندسی معكوس به عنوان كپیبرداری آگاهانه از یك محصول نام برد ، روشی كه عدهای از كشورهای شرق آسیا و نیز تعدادی از كشورهای اروپایی بعد از جنگ جهانی دوم عملا پیاده كردند و در حال حاضر جزء كشورهای پیشرفته و صنعتی محسوب می شوند .
مزایا و دستاوردهای مهندسی معكوس را میتوان در موارد ذیل خلاصه نمود :
1 - ایجاد توانایی و تقویت تكنیكی - فناوری ساخت از طریق شناخت و درك كامل محصول (اخذ دانش فنی محصول) و بوجود آوردن اعتمادبهنفس در مهندسان و كارشناسان صنعت در مواجهه با صنایع و فنآوریهای وارداتی .
2 - امكان طراحی یك محصول بهنگام ، در سطح استانداردهای جهانی با كشف راههای جدید بهبود و توسعه محصول در جهت ارضای نیازهای مشتری همانند عملكرد بهتر ، افزودن ویژگیهای مطلوب و رفع نواقص محصول ؛ همچنین ارضای نیازهای بازار مثل تغییر فناوری یا بهبود آن و كاهش هزینه .
3 - ایجاد توان بالقوه جهت جذب ، به هنگام انتقال فناوریهای پیشرفته در عرصه جهانی .
4 - تربیت نیروی متخصص موردنیاز در صنایع استراتژیك .
5 - بوجود آوردن قدمهای سیستماتیك برای كمك به درك و مستندسازی طراحی و فرایند طراحی .
6 - امكان الگوبرداری رقابتی در جهت درك محصولات رقبا و توسعه بهتر محصولات خود .
7 - امكان انجام مهندسی مجدد با استفاده از دانش فنی اخذ شده بوسیله مهندسی معكوس .
مهندسی معكوس در زمینههای مختلف سختافزاری و نرمافزاری از جمله برای غلبه بر عیبها یا گسترش تواناییهای دستگاههای موجود ، تهیه قطعات یدكی و ایجاد مراكز تعمیر و نگهداری دستگاههای پیشرفته ، به عنوان ابزاری برای یادگیری ، ابزاری برای ساختن محصولات جدید و سازگار كه از محصولات موجود در بازار ارزانتر باشند ، ابزاری برای رقابت ، برای بالا بردن كارایی نرمافزارها مورداستفاده قرار میگیرد و در حیطههای سختافزار و نرمافزار رایانهای نیز اهمیت ویژهای دارد .
متدولوژی مهندسی معكوس:
مهندسی معكوس یكی از روشهاییست كه شركتها با بكارگیری آن ، فرایند تكوین محصول خود را سرعت میبخشند . این روش بویژه در كشورهای درحالتوسعه كه از نظر دانش طراحی محصول و فناوری تولید عقبتر از كشورهای پیشرفته هستند ، پاسخی به افزایش توان طراحی و تسریع فرایند تكوین است .
ایجاد یك روش منطقی و سیستماتیك برای تعیین میزان كمبود اطلاعات فنی برای پشتیبانی از تولید یك محصول و سپس انجام یك كار تیمی منسجم برای تكمیل این اطلاعات ، مجموعه عملیاتی است كه در فرایند مهندسی معكوس بوقوع میپیوندد . سطحی از اطلاعات فنی موردنیاز كه كلیه تلاشها در راستای تشخیص میزان كمبود آن و سپس رفع این كمبود اطلاعاتی است ، بسته اطلاعات فنی (Technical Data Package) نامیده میشود .
به رغم ظرافت و نیاز به دقت بسیار زیاد در مهندسی معكوس ، كاهش زمان عملیات امری بسیار مهم در این زمینه است . در اینجا شرح مختصری از فرایند كلی مهندسی معكوس و متدولوژی آن بیان میكنیم :
مرحله اول - تجزیهوتحلیل عملكردی - اقتصادی :
این فعالیت شامل 2 بخش است :
الف - هدفگذاری و جمعآوری اطلاعات : در این مرحله توسعه محصول ، رفع عیب محصول و خودكفایی معرفی و سپس هدف از انجام پروژه درمورد هر یك تبیین میشود . هدف از فاز جمعآوری اطلاعات این است كه كلیه مستندات جمعآوری شده و تولید اطلاعات و مستندات فنی در حین اجرای مهندسی معكوس آسان گردد .
با روشهایی چون شناسایی موارد مشابه ، جمعآوری اطلاعات در زمینه تولیدكنندگان و مورد بررسی قراردادن قطعات و مجموعههای مونتاژی یك سطح بالاتر كه اطلاعات موجود در مورد عوامل خروجی و ورودی ، قطعات مجاور و مصرف نهایی را مشخص می سازد ، مشخصات و توضیحات مربوط به خرید قطعات ، فهرست قطعات و شماتیكها كه اطلاعات اولیه برای بررسی پیكربندی یك قطعه و یا یك مجموعه را در اختیار قرار میدهند ، میتوان بسته اطلاعات فنی را بدست آورد . طبیعی است كه با طبقهبندی سطح اطلاعاتی در فرایندهای مهندسی ، این فعالیت جامعتر و سیستماتیكتر انجام میشود و از دوبارهكاریهای احتمالی جلوگیری و در هزینهها صرفهجویی به عمل خواهد آمد .
ب - ارزیابی اطلاعات و برنامهریزی : هدف از انجام این فاز ، مشخص كردن سطح اطلاعات ناقص موردنیاز و نیز تخمین هزینه انجام مهندسی معكوس است . باتوجه به این سطح تخمین زده شده ، برآوردهای اولیه روی تخصصها ، آزمایشات ، تجهیزات و مواردی ازین دست برای اجرای مهندسی معكوس صورت میگیرد و پس از تخمین هزینه ، تخصیص منابع و برآورد زمان معقول برای تولید این اطلاعات در جهت كامل كردن بسته اطلاعات فنی ، نمودار گانت اجرایی پروژه ارائه میشود و یك نقشه برای روند كار حاصل میآید .
مرحله دوم - آنالیز عملكرد و دمونتاژ مورد :
هر مـــوردی میتواند متشكل از چند جزء (مكانیسمها و اجزای مختلف) باشد كه هر یك وظیفه خاصی را بر عهده دارند و برایند آنها وظیفه موردنظر را برای مورد بوجود می آورد . در این مرحله از فرایند ، تیم مهندسی معكوس باید بتواند پارامترها و مشخصههای مهم ورودی و خروجی هر جزء را شناسایی كند ؛ پس از شناسایی اجزاء و ورودی و خروجیهای آن (با استفاده از قضاوت مهندسی ، طراحی آزمایشات ، شبیهسازی رایانهای و ...) باید عملكرد اجزاء با مدارك فنی موجود ممیزی شود تا مغایرتهای آن مشخص شود (فاز FCA یا ممیزی عملكرد فنی اجزاء) . در ادامه اطلاعات فنی موردنیاز اجزاء ازطریق آزمایش استخراج میشود (فاز PCA یا ممیزی فیزیكی اجزاء) . تفكیك و مونتاژ اجزاء ، درصورتیكه قابلتجزیه به اجزای سطح پایینتر باشند میتواند تا رسیدن به سطح قطعه ادامه یابد تا اینكه یك سطح برای مونتاژ بیان شود . درتفكیك بایـــد وظیفه عملكردی اجزای پایینتر شناسایی شود تا ممیزی عملكرد فنی اجزاء و ممیزی فیزیكی اجزاء بر روی آنها نیز صورت گیرد .
در انتهای این مرحله بستههای اطلاعات فنی كه طی عملیات ممیزی عملكرد فنی اجزاء و ممیزی فیزیكی اجزاء ایجاد و تكمیل شدهاند پس از صحهگذاری ، اطلاعات لازم درباره تهیه نقشههای سطح یك (كه چگونگی حركت مكانیسمها و انتقال عملكرد به اجزای دیگر را كاملا مشخص می كنند) را فراهم خواهندآورد .
مرحله سوم - آنالیز سختافزاری و نرمافزاری :
این فعالیت كه مهمترین بخش مهندسی معكوس است شامل موارد زیر است :
الف) آنالیز مواد : با آنالیز شیمیایی و متالورژیك ، مطالعه لایههای سطحی ، اندازهگیری خواص مكانیكی ، بررسیهای ساختاری و عیوب انجام میگیرد .
ب) بررسی فرایند ساخت : باتوجه به نوع سطوح فیزیكی در قطعه ، فرایند ممكن برای تولید این سطوح ، بررسی تنشهای سطحی و ساختار میكروسكوپی و اندازه گیری بعضی از ویژگیهای غیـــربحرانی مانند صافی سطح كه به طور فرعی در تشخیص فرایند ساخت كمك می كند ، انجام میشود .
ج) آنالیز ابعادی : كه مشتمل بر مراحلی چون اندازهگیری ابعادی ، آنالیز تلرانس و آنالیز حساسیت است .
د) آنالیز الكتریكی - الكترونیكی درصورت نیاز : باتوجه به مشخصههای خروجی مدار ، مسیر مدارها ، مواد ، روشهای زدودن پوششها ، اتصالات موردنیاز برای تولید مجدد مورد بررسی قرار میگیرند . نتایج حاصل از این قسمت در نقشههای سطح دو ثبت و ترسیم می شوند .
مرحله چهارم - بهبود محصول و آنالیز ارزش :
با استفاده از اطلاعات جدید تهیه شده هنگام فرایند و انجام بازنگری مهندسی ارزشی در كاندیداهای درنظر گرفته شده برای مهندسی معكوس ، میتوان برخی از حوزههای پرهزینه مثل عیوب طراحی ، طراحی اضافی ، عملكرد بهبود ، محدودیتهای بیش از حد در مورد تلرانسها ، نیازمندیهای بیش از اندازه برای عملكردها و مواردی این چنینی را آشكار و آنها را قبل از تكمیل فرایند اصلاح كرد .
مرحله پنجم - برنامهریزی فرایند تولید و تهیه ملزومات تضمین كیفیت :
در این مرحله كلیه بستههای اطلاعاتی كه تاكنون كامل شده از دیدگاه قابلیت تولید و فرایندهای ساخت موردتوجه قرار میگیرند ؛ به طور خلاصه خروجی این مرحله به ایجاد نقشههای سطح سه منجر میشود كه ملزومات ضروری و موردنیاز واحدهای طراحی ، مهندسی ، ساخت و كنترل كیفیت را برای دستیابی یا ساخت آیتم موردنظر شامل میشود .
به طوركلی نقشههای سطح سه نتیجه فرایند مهندسی معكوس بوده كه شامل كلیه پارامترهای مستندسازی شده لازم جهت تولید یك آیتم خواهند بود و هدف از انجام آن تصدیق و تایید دقت بسته اطلاعات فنی برای پشتیبانی از تولید قطعات است تا از این طریق اطمینان كافی از صحت و دقت و كامل بودن نقشهها و مشخصههای ایجاد شده توسط فرایند مهندسی معكوس حاصل شود .
مرحله ششم - تهیه مستندات نهایی :
درهنگام ساخت و تست محصول تولیدی در فاز تولید نمونــــه ، بسیاری از نقشههای مهندسی و رویههای تست چندین بار بازنگری و اصلاح میشوند كه تمام سطوح بازنگری شده از سطح صفر تا آخرین نتایج باید در بسته اطلاعات فنی قرار داده شوند ؛ با اضافه شدن اطلاعات بدست آمده از بازرسیها و اطمینان كیفیتِ نمونههای تولید شده به بسته اطلاعات فنی ، یك بستـــه اطلاعات فنی كامل شده بدست میآید و پس از مطابقت با استانداردهای بستههای اطلاعات فنی ، در انتها یك بسته اطلاعات فنی نهایی كامل در ارتباط با محصول كه هدف فراینـــــد مهندسی معكوس است ، بدست میآید .
ضرورت شناخت رفتار فناوری برای انتخاب استراتژی مناسب:
یکی از تصمیم گیریهای استراتژیک در زمینه دستیابی به یک محصول و یا فناوری، انتخاب مناسبترین روش دستیابی به آن است که این تصمیم گیری به مرحله رشد و توسعه آن محصــــول یا فناوری (در مهد شکل گیری و پیدایش و تکامل آن فناوری) بستگی شدیدی دارد. مثلاً اگر یک فناوری در مهد پیدایش خود (کشور اولیه) در مرحله معرفی باشد، اقدام برای دستیابی به آن ازطریق انتقال فناوری کاری نسنجیده است. همچنین اگر محصول در مهد پیدایش خود در مرحله افول بوده و فناوری برتری جایگزین آن شده باشد، اقدام برای دستیابی به محصول اولی ازطریق همین استراتژی، کاری مخاطره آمیز است .
اصولاً اقدام برای انتقال فناوری درمورد محصولاتی که در مهد پیدایش خویش مرحله معرفی را سپری کرده و در مرحله رشد هستند برای کشورهای درحال توسعه معقول تر است. در این صورت اقدام یک کشور درحال توسعه برای دستیابی به عین این محصول یا فناوری ازطریق استراتژی تحقیق تا تولید، امری غیراقتصادی و غیرعاقلانه خواهدبود مگرآنکه اهدافی مانند تقویت پایه های علمی و فنی کشور مطرح باشد که بازهم انتخاب این استراتژی احتمالاً امری مطلوب نخواهدبود. هرچه درجه تکامل یک فناوری بیشتر باشد تا قبل ازمرحله افول و منسوخ شدن، استراتژی خرید محصول و فناوری مقرون به صرفه تر خواهدبود .
نگاهی به مهندسی مجدد:
مهندسی مجدد چیست ؟
هر سازمان و یا شركت ، یك نهاد اجتماعی است كه مبتنی بر هدف بوده و دارای سیستمهای فعال و هماهنگ است و با محیط خارجی ارتباط دارد . در گذشته ، هنگامی كه محیط نسبتا باثبات بود بیشتر سازمانها برای بهرهبرداری از فرصتهای پیشآمده به تغییرات تدریجی و اندك اكتفا میكردند ؛ اما با گذشت زمان ، در سراسر دنیا سازمانها دریافتهاند كه تنها تغییرات تدریجی راهگشای مشكلات كنونی آنان نیست و گاهی برای بقای سازمان لازم است تغییراتی به صورتی اساسی و زیربنایی در سازمان ایجاد شود . امروزه در سراسر دنیا این تغییرات انقلابی را با نام مهندسی مجدد می شناسند ؛ مهندسی مجدد (BPR) روندی است كه در آن وظیفههای فعلی سازمان جای خود را با فرایندهای اصلی كسبوكار عوض كرده و بنابراین ، سازمان از حالت وظیفهگرایی به سوی فرایندمحوری حركت میكند . همین امر موجب سرعت بخشیدن به روند كسبوكار و كاهش هزینهها و درنتیجه رقابتیتر شدن سازمان میگردد .
مهندسی مجدد یعنی آغازی دوباره ، فرصتی دیگر برای بازسازی فرایندها و دوبارهسازی روشهای كار . مهندسی دوباره بهمعنای كنار گذاشتن بخش بزرگی از دانش و یافتههای صدسال اخیر مدیریت صنعتی و شكستن فرضیات و قواعد قبولشده داخل سازمان است . در این رویكرد ، روش انجام كار در دوره تولید انبوه و عنوانهای كهن و ترتیبات سازمانی گذشته همچون بخشبندی اداره ، شرح وظایف ، و استانداردسازی از اهمیت میافتند ؛ آنها ساخته دورهای هستند كه دیگر سپری شده است . اساس مهندسی مجدد بر بررسیهای مرحلهای و حذف مقررات كهنه و تصورات بنیادینی استوار است كه زمینهساز عملكرد كسبوكار كنونیاند . اكثر شركتها انباشته از مقررات نانوشتهای هستند كه از دهههای پیشین برجا ماندهاند . این مقررات بر پایه فرضهایی درباره فناوری ، كارمندان و اهداف سازمان بهوجود آمدهاند كه دیگر كاربردی ندارند ؛ تا هنگامی كه این شركتها اینگونه مقررات را از سر خود باز نكنند هرگونه بازسازی و نوسازی بیتاثیر بوده و همانند گردگیری میز و صندلیها در ساختمانهای ویرانه خواهد بود .
مهندسی مجدد عبارت است از بازاندیشی بنیادین و ریشهای فرایندها برای دستیابی به پیشرفتی شگفتانگیز در معیارهای حساسی چون كیفیت و سرعت خدمات . اگر تنها یك سرانجام غیرقابلقبول وجود داشته باشد آن است كه همه شركتها و سازمانها و از جمله دولتها امروزه ناچارند كه خود را از نو تعریف كنند . نیروهای زیربنایی نقشآفرین كنونی روشنتر از آن هستند كه دست از آینده بردارند . سازمانهای تازه ، شركتهایی خواهند بود كه بهطور مشخص برای بهرهبرداری در جهان امروز و فردا طراحی میشوند و نهادهایی نیستند كه از یك دوران اولیه و باشكوه كه ربطی به امروز ندارند انتقال یابند .
در مهندسی مجدد اعتقاد براین است كه مهندسی مجدد را نمیتوان با گامهای كوچك و محتاط به اجرا درآورد . این قضیه همان قضیه صفر یا یك است ؛ به عبارت دیگر یا تغییری تحقق نیابد و یا در صورت تحقق از ریشه و بنیان تغییر حاصل گردد . مهندسی مجدد به این معنا نیست كه آنچه را كه از پیش وجود دارد ترمیم كنیم یا تغییراتی اضافی بدهیم و ساختارهای اصلی را دست نخورده باقی بگذاریم ؛ مهندسی مجدد یعنی از نقطه صفر شروع كردن ، یعنی به كنار نهادن روشهای قدیمی و افكندن نگاهی نو به كار .
مهندسی مجدد در پی اصلاحات جزیی و وصلهكاری وضعیت موجود و یا دگرگونیهای گسترشی كه ساختار و معماری اصلی سازمان را دستنخورده باقی میگذارد ، نخواهد بود . مهندسی مجدد در پی آن نیست كه نظام موجود را بهبود بخشیده و نتیجه كار را بهتر كند . مهندسی مجدد به معنای ترك كردن روشهای دیرپا و كهنه و دستیابی به روشهای تازهای است كه برای تولید كالاها و خدمات شركت و انتقال ارزش به مشتری لازم هستند . شركتها باید از خود بپرسند اگر با آگاهیهای گسترده امروزی و در اختیار داشتن فناوریهای نوین می خواستیم شركتی برپا كنیم ، آنرا چگونه میساختیم .
مهندسی مجدد را با نامهای متفاوتی میتوان شناخت ، نامهایی از قبیل طراحی مجدد فرایندهای اصلی (كالپان و مورداك) ، نوآوری فرایندی (داونپورت) ، طراحی مجدد فرایندهای كسبوكار (داونپورت و شورت ، ابلنسكی) ، مهندسی مجدد سازمان (لوونتال ، هامر و چمپی) ، طراحی مجدد ریشهای (جوهاتسون) و معماری مجدد سازمان (تالوار) همگی از نامهایی هستند كه مقوله مهندسی مجدد را معرفی كردهاند .
پس چنانچه از ما خواسته شود تعریف كوتاهی از مهندسی مجدد به عمل آوریم پاسخ میدهیم :
همه چیز را از نو آغاز كردن .
دنیای Crack
بخش اول:
معرفی
با وجود پیشرفت روز به روز علوم کامپیوتری در ایران بسیاری از این علوم هنوز فراگیر نشده و تعداد بسیار کمی از علاقه مندان به علوم کامپیوتری با این علوم آشنایی دارند. یکی از مهمترین علومی که در برنامه نویسی و مهندسی نرم افزار از آن استفاده می شود و برای برنامه نویسان حرفه ای کاربرد فراوان دارد علم Reverse Engineering 1 است. در واقع برنامه نویسان توسط این علم می توانند Bug ۲ های موجود در برنامه خود را پیدا کنند و به رفع آنها بپردازند.
علم Cracking ۳ شاخه ای از علم Reverse Engineering است. از این رو برای درک معنا و مفهوم علم Cracking باید با Reverse Engineering آشنا شویم. اما برای درک مهندسی معکوس هم باید یک پله عقب تر برویم : تا زمانی که با علم مهندسی نرم افزار یا همان برنامه نویسی آشنا نشویم ، متوجه Reverse Engineering هم نخواهیم شد. به همین خاطر تمام کسانی که مایل به یادگیری علم کرک هستند باید تا حدودی با برنامه نویسی و مهندسی نرم افزار آشنایی داشته باشند.
برای اینکه بتوانیم یک Cracker 4 حرفه ای باشیم باید معنا و مفاهیم خیلی از علوم پایه ای کامپیوتر را بدانیم. در واقع علم Cracking چندان علم آسانی نیست و مشکلات زیادی در راه یادگیری این علم خواهیم داشت. به عنوان مثال لازم هست بدانیم زبان ماشین چیست، CPU 5 چگونه کار میکند، تا حدودی با برنامه نویسی آشنا باشیم، زبان Assembly 6 را بلد باشیم، ساختار فایل های PE 7 را بشناسیم و… . در واقع پیش نیازهای یادگیری علم Cracking زیاد هستند و اگر شما واقعا دوست دارید تا این علم را یاد بگیرید باید به دنبال خیلی از علوم کامپیوتری بروید و دانسته های خود را در مورد خیلی از مسائل کامپیوتری افزایش دهید.
با وجود اینکه مدت زیادی از شیوع این علم در ایران می گذرد اما هنوز آموزش های خوبی برای رواج این علم به زبان فارسی نوشته نشده به همین خاطر بر آن شدیم تا آموزشی را تدوین نماییم و دشواری های راه را برای علاقه مندان تازه کار بر طرف نماییم. ما در این دوره آموزشی سعی داریم تا نیازهای ابتدایی یک تازه کار در دنیای Crack را برای شروع Cracking بر طرف کنیم. بحث های حرفه ای در مورد Cracking نیز در دیگر آموزش های گروه قابل دسترسی هستند.
نکته ای که قبل از شروع باید به آن اشاره کنیم این است که اگرچه مطالب استفاده شده در این مجموعه برای افرادی که با برنامه نویسی آشنا نیستند قابل فهم است اما آشنایی با یک زبان برنامه نویسی سطح بالا (مانند ++C یا Delphi و یا Visual Basic ) برای درک بهتر مطالب بسیار ضروری است. به همین خاطر در صورتی که تمایل به یادگیری Cracking دارید، همانطور که قبلا هم اشاره شد باید با یک زبان برنامه نویسی آشنا باشید.
مهندسی نرم افزار ، برنامه نویسی و طراحی
یک برنامه نویس با به کار گیری زبان های برنامه نویسی می تواند برنامه خود را طراحی و برای آن کد نویسی کند. به عنوان مثال می تواند برای برنامه Menu قرار دهد، متن های مورد نظر خود را داخل آن قرار دهد، قسمت های مختلف برنامه را به هم ارتباط دهد و از همه مهمتر برای برنامه خود کد بنویسید تا برنامه یک سری محاسبات اصلی را انجام دهد. بنابر این به مجموعه کارهایی که برنامه نویس (یا همان مهندس نرم افزار) برای طراحی نرم افزار خود انجام می دهد مهندسی نرم افزار گفته می شود. در واقع اگر بخواهیم یک تعریف دقیق و کتابی از مهندسی نرم افزار داشته باشیم به جمله زیر می رسیم:
مهندسی نرم افزار عبارت است از به کار گیری اصول علمی (مانند زبان برنامه نویسی) برای طراحی و یا ساخت یک نرم افزار.
بخش دوم:
Reverse Engineering یا مهندسی معکوس چیست؟
معنای Reverse Engineering به فارسی مهندسی معکوس هست و همانطور که از معنای آن مشخص هست ، این علم طرف مقابل مهندسی نرم افزار می باشد. در واقع مهندسی نرم افزار و مهندسی معکوس دو روی یک سکه هستند. برای درک بهتر این مطلب، موضوع ر بازتر می کنیم: فرض کنیم که نتیجه نهایی کار یک برنامه نویس (یا همان مهندس نرم افزار) یک فایل exe هست که با اجرای آن یک سری محاسبات انجام می شود. به عنوان مثال این برنامه عددی را از شما می گیرد و با انجام محاسباتی، تغییراتی بر روی آن عدد اعمال می کند و نتیجه را به شما نشان می دهد. تمامی این کارها در پشت پرده انجام می شود و شما فقط عددی را به برنامه می دهید و بلافاصله نتیجه ای می بینید. ولی نحوه رسیدن به این نتیجه را نمی بینید. حال شما می خواهید با طریقه انجام محاسبات و نحوه رسیدن به نتیجه آشنا شوید. اولین راه برای آشنایی با نحوه انجام محاسبات این برنامه داشتن Source Code 1 آن است. اما در خیلی از موارد شما سورس کد برنامه ها را در اختیار ندارید. تنها چیزی که برای شما موجود هست همان فایل exe و بقیه فایل های جانبی مربوط به برنامه می باشد.
شاید در اولین نگاه فکر کنیم که آشنایی با نحوه انجام محاسبات یک برنامه بدون داشتن سورس کد آن غیر ممکن باشد. ولی با استفاده از علم Reverse Engineering این کار غیر ممکن نیست و ما می توانیم بدون داشتن سورس کد برنامه و یا اطلاعات دقیقی در رابطه با طراحی آن به مراحل طراحی و کد نویسی برنامه پی ببریم و با طریقه انجام محاسبات آن آشنا شویم.
تعریف زیر یک تعریف ابتدایی از Reverse Engineering هست. وقتی به بخش رابطه بین Reverse Engineering و Assembly برسیم مفهوم دقیق تری از مهندسی معکوس بیان می کنیم :
Reverse Engineering علمی است که توسط آن می توان بدون داشتن سورس کد یک برنامه به نحوه انجام محاسبات آن برنامه پی برد.
بخش سوم:
برنامه های امروزی و حفاظت از آنها
روزانه در سراسر دنیا برنامه های زیادی از طریق اینترنت در اختیار کاربران کامپیوتر قرار می گیرد و هر روز هم به تعداد این نرم افزارها اضافه می شود. اما بسیاری از این نرم افزارها خریدنی هستند و تنها نسخه هایی از آنها در اختیار کاربران قرار می گیرد که دارای محدودیت هستند. به عنوان مثال فقط ۱۵ روز کار می کنند و یا قابلیت Save (ذخیره سازی) ندارند. به این نوع برنامه ها که همراه با محدودیتی ارائه می شوند Trial یا Shareware گفته می شود.
در اختیار گذاشتن برنامه های Shareware برای کاربران به این دلیل است که کاربران بتوانند به صورت موقت از برنامه ها استفاده کنند و در صورت رضایت از برنامه، آنرا به صورت قانونی خریداری کنند. وقتی یک کاربر نرم افزاری را خریداری می کند در واقع یک نسخه از این نرم افزار را به نام خود ثبت یا Register می کند.
محدودیت موجود در برنامه ها توسط برنامه نویسان در داخل برنامه ها قرار داده می شود. مثلا برنامه نویس در داخل برنامه یک شرط قرار می دهد : در صورتی که کاربر Serial (سریال) مربوط به برنامه را وارد نکند برنامه تا ۱۵ روز بیشتر کار نکند. در واقع برنامه نویس به نوعی از این طریق (یعنی قرار دادن محدودیت) برنامه خود را Protect (محافظت) می کند تا اشخاصی که برنامه را نخریده اند نتوانند به طور کامل و مداوم از آن استفاده کنند.
کاری که Cracker ها انجام میدهند عبور از این حفاظت یا Protection هست. به طوری که با عبور از این Protection می توان از برنامه بدون هیچ محدودیتی استفاده کرد و مانند کسی که برنامه را خریداری کرده از برنامه سود برد. بنابراین می توانیم Protrction را به صورت زیر معنا کنیم:
Protection یا حفاظت از برنامه مجموعه اعمالی ست که یک برنامه نویس برای جلوگیری از استفاده شدن از برنامه خود بدون Register کردن آن انجام می دهد.
Protection و Cracking
از آنجایی که برای تغییر در Protection موجود در یک برنامه ما سورس کد آنرا در اختیار نداریم بنابراین باید از علم Reverse Engineering کمک بگیریم تا بتوانیم به مراحل طراحی و کد نویسی Protection
توسط برنامه نویس پی ببریم.
آن چیزی که مهندسی معکوس را از Cracking متمایز می کند همین قسمت از کار است. مهندسی معکوس بیشتر جنبه علمی دارد و از آن برای تغییر در برنامه و خصوصا بخش حفاظتی آن استفاده نمی شود. این در حالیست که در Cracking ما فقط به فکر تغییر در حفاظت برنامه هستیم. باید توجه داشت که راه های زیادی برای محافظت از برنامه ها موجود هست و ما سعی می کنیم تعدادی از این راه ها را بیان کنیم و به راه و روش های مقابله با این محافظت ها بپردازیم. ولی همیشه این شعار Cracker ها را به خاطر بسپارید:
هیچ برنامه ای نیست که کرک نشود.
و هیچ کرکری نیست که بتواند تمام برنامه ها را کرک کند.
انواع حفاظت
در اینجا به معرفی انوع حفاظت هایی که امروزه رواج دارد و بر روی اکثر برنامه های Shareware دیده می شود می پردازیم:
شماره سریال (Serial Number ) یکی از ساده ترین راه های حفاظت از نرم افزار می باشد. در این روش برای Register کردن برنامه باید یک شماره سریال وارد نماییم که این شماره سریال برای همه کاربران کامپیوتر و در همه کامپیوترها یکسان است. شماره سریال وارد شده توسط برنامه با شماره سریال اصلی طبق یک الگوریتم مقایسه می شود و در صورت صحیح بودن ، برنامه Register می شود.
شماره سریال و نام (Registration Code ) در این روش ما باید یک نام کاربری و یک شماره سریال وارد نماییم. شماره سریال واقعی از نام کاربری مشتق می شود و برای هر نام کاربری ، شماره سریال هایی معتبر خواهند بود که از نام کاربری (طی یک الگوریتم خاص) نتیجه گرفته شده باشد. در این روش با وارد کردن نام کاربری و سریال مربوط به آن در هر کامپیوتری می توان نرم افزار را Register کرد.
شماره سریال وابسته به سخت افزار (Node Locking )
در این نوع از حفاظت برای هر کامپیوتر تنها یک شماره سریال خاص در نظر گرفته می شود. به طوری که با یک شماره سریال نمی توان در کامپیوتر های مختلف برنامه را Register کرد. در این روش برنامه نویس شماره ی مربوط به یکی از سخت افزار های کامپیوتر شما را (مثل هارد یا مادربرد) که توسط کمپانی سازنده آن سخت افزار به آن اختصاص داده شده را به دست می آورد و شماره سریال برنامه را طبق آن شماره تهیه می کند.
Nag Screen
یکی از رایج ترین روش ها برای حفاظت از برنامه می باشد. در این روش هر بار که کاربر برنامه را اجرا می کند صفحه ای نمایش داده می شود تا به کاربر بگوید چند روز از مدت استفاده از برنامه باقی مانده و یا پیغام دیگری مبنی بر Register نبودن برنامه را نشان می دهد.
Time Trial
این نوع از حفاظت خود به چند دسته تقسیم می شود.
الف) محدود کردن نرم افزار در تعداد روزهایی که از آن استفاده می شود. مثلا نرم افزار ۳۰ روز بیشتر قابل استفاده نخواهد بود. شروع شمارش این روز ها از تاریخ نصب برنامه می باشد. ب) پایان یافتن استفاده از نرم افزار در یک روز مشخص. در این روش برنامه در یک روز از پیش تعیین شده دیگر اجرا نخواهد شد و محدودیت استفاده از برنامه ربطی به زمان نصب آن ندارد. ج) محدود کردن برنامه نسبت به مقدار دقایق یا ثانیه هایی که از آن استفاده شده است. د) محدود کردن برنامه نسبت به تعداد دفعاتی که اجرا شده است
Dongle 3 کرک کردن این نوع از حفاظت ها دشوار می باشد. در این روش یک قطعه ی سخت افزاری از طریق یکی از پورت های کامپیوتر (مثلا پورت LPT ) به کامپیوتر شما وصل می شود. برنامه ای که این نوع از حفاظت بر روی آن اجرا شده ابتدا وجود این قطعه ی سخت افزاری را چک می کند. در صورتی که این قطعه سخت افزاری وجود داشته باشد برنامه روند عادی خود را پیش می گیرد و در غیر این صورت اجرا نخواهد شد. این نوع از حفاظت از نظر اقتصادی به صرفه نیست و تنها در نرم افزارهایی که ارزش مالی زیادی دارند استفاده می شود. Sentinel یک نوع از این حفاظت هاست که بسیار استفاده می شود.
حفاظت های از پیش تهیه شده و فروشی
بسیاری از برنامه نویسان وقت با ارزش خود را صرف نوشتن کد برای حفاظت از برنامه نمی کنند و ترجیح می دهند این وقت را صرف گسترش برنامه خود کنند. به همین علت از پروتکشن هایی استفاده می کنند که توسط بعضی از شرکت های امنیت نرم افزار تهیه شده. امروزه بعضی از شرکت های نرم افزاری به طور تخصصی بر روی نرم افزارهای امنیتی کار می کنند تا بتوانند از برنامه های دیگران حفاظت کنند. عبور از این نوع حفاظت ها بسیار سخت می باشد. چون به صورت حرفه ای برای جلوگیری از Cracking ساخته شده اند. اما معمولا ضعف هایی هم در بر دارند. اگر شخصی بتواند یکی از برنامه هایی را که با این نوع از Protection حفاظت می شود Crack نماید، می تواند تمامی برنامه های دیگری که با همین نوع از Protection حفاظت شده اند را هم Crack کند.
حفاظت های دیگر
تعداد زیادی از حفاظت های دیگری هم موجود هستند. مثل CD Rom Protection که بر روی سی دی ها اطلاعاتی را قرار می دهند که قابل خواندن نیست و به همین دلیل کپی از روی آن سخت است (ولی غیر ممکن نیست). یا غیر فعال سازی بعضی از امکانات برنامه مثل توانایی ذخیره سازی یا Save .
بخش چهارم:
رابطه Reverse Engineering و Assembly
اکنون که ارتباط بین Reverse Engineering و Cracking را متوجه شدید شاید بپرسید برای یادگیری Reverse Engineering باید از کجا شروع کنیم.
به طور کلی کامپیوتر فقط یک زبان را تشخیص می دهد و آن هم زبان ماشین است. تمامی فایل های اجرایی (مانند برنامه ها) برای اجرا شدن باید به این زبان تبدیل شوند. زبان ماشین فقط از اعداد باینری (۰ و ۱) تشکیل شده و به همین دلیل برنامه نویسی به این زبان بسیار سخت است. به همین خاطر زبان Assembly (اسمبلی) ساخته شد. زبان اسمبلی در واقع همان زبان ماشین هست با این تفاوت که به جای استفاده از اعداد باینری از یک سری دستورات واقعی که بسیار شبیه به کلمات زبان انگلیسی هستند استفاده می شود. از آنجایی که تمامی فایل های اجرایی برای اجرا شدن و کار کردن باید به زبان ماشین تبدیل شوند به دست آوردن سورس کد آنها به زبان اسمبلی که همان زبان ماشین هست کار بسیار ساده ای است ، بنابر این در صورتی که ما به زبان اسمبلی مسلط باشیم می توانیم به مراحل طراحی یک برنامه پی ببریم. چون سورس آن برنامه را به زبان اسمبلی در اختیار داریم.
در واقع مهندسی معکوس وابسته به اسمبلی است. چون تمامی مراحل پی بردن به مراحل طراحی یک نرم افزار و فهمیدن اصول محاسباتی یک نرم افزار از طریق علم مهندسی معکوس، به واسطه ی زبان اسمبلی انجام می گیرد. بنابراین حالا می توانیم معنای دقیق تری از مهندسی معکوس بیان کنیم :
مراحل پی بردن به طرز محاسبات یک نرم افزار از طریق زبان اسمبلی را مهندسی معکوس می گوییم (توجه داشته باشید که این کار بدون داشتن سورس کد اصلی نرم انجام می شود).
اگر دقت داشته باشید Protection های یک برنامه هم قسمتی از محاسبات آن برنامه هستند و در واقع نرم افزار طبق یک محاسباتی تشخیص می دهد که آیا برنامه توسط کاربر رجیستر شده است یا نه. بنابراین اگر ما بتوانیم تشخیص دهیم که برنامه چگونه این محاسبات را انجام می دهد و روش انجام این محاسبات را به نفع خودمان تغییر دهیم می توانیم یک برنامه را Crack کنیم.
اما ممکن هست بپرسید که چه طور می توان سورس یک فایل اجرایی را به زبان اسمبلی به دست آورد. در بخش آشنایی با Disassembler با چگونگی انجام این کار آشنا خواهیم شد. اما فعلا بهتر است تا کمی بیشتر درباره Assembly بدانیم.
آشنایی بیشتر با Assembly و دیگر زبان های برنامه نویسی
مطالب زیر قسمت هایی از کتاب C++ How To Program است که قسمت هایی از آن را خلاصه کردیم و توضیحاتی مرتبط به بحث خودمان را به آن اضافه کردیم:
برنامه نویسان، دستورالعمل ها را به زبانهای برنامه نویسی گوناگونی می نویسند. برخی از این زبان ها مستقیما برای کامپیوتر قابل فهمند و برخی دیگر نیاز به مراحل میانی ترجمه دارند. امروزه از صدها زبان کامپیوتری استفاده می شود که میتوان آنها را به سه نوع کلی تقسیم کرد:
زبان های ماشین۱
زبان اسمبلی۲
زبان های سطح بالا۳
کامپیوتر ها می توانند زبان ماشین مربوط به خودشان را مستقیما درک کنند. زبان ماشین، «زبان طبیعی» کامپیوتر است و توسط طراحی سخت افزار آن کامپیوتر طراحی می شود. برنامه هایی که به زبان ماشین طراحی شده اند به طور کلی شامل رشته هایی از اعداد (که نهایتا تبدیل به ۱ و ۰ می شوند) هستند که به کامپیوتر دستور اجرای ابتدایی ترین اعمال را یکی پس از دیگری می دهند. همانطور که در قطعه برنامه زیر دیده می شود کار با زبان ماشین برای انسانها دشوار است. قطعه برنامه زیر اضافه پرداخت را با حقوق پایه جمع می کند و نتیجه را در حقوق کل ذخیره می کند.
+۱۳۰۰۰۴۲۷۷۴ +۱۴۰۰۵۹۳۴۱۹ +۱۲۰۰۲۷۴۰۲۷
با رواج بیشتر کامپیوتر ، برنامه نویسان دریافتند که برنامه نویسی به زبان ماشین بسیار سخت و وقت گیر است . از این رو کار با رشته هایی از اعداد که توسط کامپیوتر قابل فهم بودند را رها کرده و شروع به استفاده از مخففهای انگلیسی گونه ای که بیانگر اعمال ابتدایی کامپیوترند نمودند. این مخفف ها اساس زبان اسمبلی را تشکیل داد. در پی آن برنامه هایی نیز ایجاد شدند تا برنامه های ایجاد شده توسط زبان اسمبلی را به سرعت به زبان ماشین ترجمه کنند که به این برنامه ها اسمبلر می گویند . قطعه برنامه اسمبلی زیر هم اضافه پرداخت را با حقوق پایه جمع می کند و نتیجه را با حقوق کل ذخیره می کند . ولی این کار را واضح تر از زبان معادل ماشین انجام می دهد :
LOAD ADD STORE BASEPAY OVERPAY GROSSPAY
گرچه این کد برای انسان واضح تر است ولی زبان اسمبلی هم حتی برای انجام ساده ترین کارها نیاز به تعداد زیادی دستورالعمل داشت. از این رو برای سرعت بخشیدن به فرایند برنامه نویسی، زبان های سطح بالا ایجاد شدند که در آن ها یک جمله کارهای بزرگی انجام می دهد. برنامه های سطح بالا به برنامه نویسان اجازه می دهند دستورالعمل هایی بنویسند که بسیار شبیه انگلیسی روزمره و شامل نمادهای ریاضی معمول هستند . مانند :GrossPay = BasePay + OverTimePay
بخش پنجم:
نگاهی به کدینک
قبل از شروع به یادگیری زبان اسمبلی نیاز هست تا با بعضی از سیستم های عددی آشنا شوید.
Decimal و Binary
مطمئنا تا کنون شنیده اید که کامپیوتر به غیر از ۰ و ۱ چیز دیگری را نمی فهمد و تمامی محاسبات کامپیوتری برای رسیدن به نتیجه ای معین باید به ۰ و ۱ تبدیل شوند. حتی فایل های موجود در کامپیوتر شما هم از صفر و یک تبدیل شده اند. فایل هایی مثل mp3, doc, exe و … همگی از ۰ و ۱ تشکیل شده اند. ۰ و ۱ کوچکترین واحدهای ذخیره سازی اطلاعات در کامپیوتر هستند که به آنها Bit 1 گفته می شود.
برای اینکه بدانیم کامپیوتر چگونه با ۰ و ۱ کار می کند باید با سیستم عددی Binary 2 آشنا شویم. در این سیستم فقط ۲ رقم وجود دارد و مبنای اعداد هم عدد ۲ می باشد. ما در مدرسه یاد گرفته ایم که اعداد ۰ تا ۹ را به ترتیب بخوانیم. وقتی به عدد نه (۰۹) می رسیم چون رقم دیگری بعد از آن وجود ندارد مجبوریم به رقم سمت چپ آن ( که در اینجا صفر هست و با رنگ قرمز نشان داده شده) یک عدد اضافه کنیم و رقم سمت راست را (که همان ۹ هست) صفر کنیم و آنرا به ترتیب بالا ببریم. همچنین وقتی به عدد ۱۹ می رسیم مجبوریم به رقم سمت چپ یک عدد اضافه کنیم و رقم سمت راست را صفر کنیم تا مجموعه اعداد بین ۲۰ تا ۲۹ را به دست آوریم و همینطور برای ۲۹ و ۳۹ و ۴۹ و … هم باید از همین روش استفاده کنیم. به این روش که روشی است که در طول روز برای شمردن از آن استفاده می کنیم و مبنای آن ده است Decimal 3 گفته میشود.
در سیستم عددی باینری هم همین قانون اعمال می شود با این تفاوت که ما فقط ۲ رقم داریم : ۰ و ۱٫ فرض کنید در دنیا تنها ۲ رقم برای نوشتن اعداد وجود دارد. در این صورت برای نوشتن اعداد چه می کردید؟ بیائید تا شروع به شمارش در باینری کنیم:
۰۰۰۰ (که برابر با « صفر » در شمارش معمولی هست) ۰۰۰۱ (که برابر با « یک » در شمارش معمولی هست)
حالا که از هر دو رقم موجود استفاده کردیم چون رقم دیگری موجود نیست باید به رقم سمت چپ (که به رنگ قرمز درآمده) یک عدد اضافه کنیم و رقم سمت راست را به صفر تبدیل کنیم و به ترتیب به آن اضافه کنیم تا عدد بعدی بدست آید.
۰۰۱۰ (که برابر با « دو » در شمارش معمولی هست اما به علت کمبود ارقام در سیستم باینری آنرا به صورت ۱۰ نمایش می دهیم. درواقع ۱۰ می نویسیم اما دو می خوانیم) ۰۰۱۱ (که برابر با « سه » در شمارش معمولی هست)
باز هم به انتهای ارقام موجود رسیدیم و باز هم باید به رقم سمت چپ یک عدد اضافه کنیم و ارقام سمت راست را برابر صفر قرار دهیم و ……
۰۱۰۰ (که برابر با « چهار » در شمارش معمولی هست) ۰۱۰۱ (که برابر با « پنج » در شمارش معمولی هست) ۰۱۱۰ (که برابر با « شش » در شمارش معمولی هست) ۰۱۱۱ (که برابر با « هفت » در شمارش معمولی هست)
باز هم به رنگ قرمز رسیدیم و باز هم همان روش …..
۱۰۰۰ (که برابر با « هشت » در شمارش معمولی هست) ۱۰۰۱ (که برابر با « نه » در شمارش معمولی هست) ۱۰۱۰ (که برابر با « ده » در شمارش معمولی هست) ۱۰۱۱ (که برابر با « یازده » در شمارش معمولی هست) ۱۱۰۰ (که برابر با « دوازده » در شمارش معمولی هست) ۱۱۰۱ (که برابر با « سیزده » در شمارش معمولی هست) ۱۱۱۰ (که برابر با « چهارده » در شمارش معمولی هست) ۱۱۱۱ (که برابر با « پانزده » در شمارش معمولی هست)
جدول زیر اعداد ۰ تا ۱۵ را در مبنای دسیمال و باینری نمایش می دهد.
۱۵
۱۴
۱۳
۱۲
۱۱
۱۰
۹
۸
۷
۶
۵
۴
۳
۲
۱
۰
Decimal
1111
1110
1101
1100
1011
1010
1001
1000
111
110
101
100
11
10
1
0
Binary
فلسفه ی استفاده از سیستم باینری در ساختار کامپیوتر
شاید فکر کنید که چرا کامپیوتر فقط ۰ و ۱ را درک می کند. شاید تعجب کنید اما می خواهم بگویم که کامپیوتر حتی ۰ و ۱ را هم درک نمی کند. چیزی که کامپیوتر درک می کند وجود و یا عدم وجود ولتاژ است. در ساختار کامپیوتر از دستگاهی به نام flip-flop استفاده شده است. این دستگاه توانایی ذخیره سازی ۲ سطح از ولتاژ را دارا می باشد، یکی سطح پایین از ولتاژ که معمولا ۰٫۵ ولت هست و دیگری سطح بالایی از ولتاژ که معمولا ۵ ولت است. سطح پایین تر از ولتاژ در دستگاه flip-flop به عنوان Off یا ۰ تفسیر می شود و سطح بالاتر از ولتاژ به عنوان On یا همان ۱ تفسیر می شود. این ۲ حالت را در کامپیوتر Bit می نامند که کوچکترین واحد ذخیره اطلاعات در کامپیوتر است.
تعریف WORD , BYTE , NIBBLE و DWORD
NIBBLE : به مجموعه ای از ۴ بیت گفته میشود و بزرگترین عددی که در بر می گیرد ۱۵ در مبنای دسیمال یا ۱۱۱۱ در باینری می باشد. BYTE : به مجموعه ای از ۸ بیت یا ۲ NIBBLE گفته می شود و بزرگترین عددی که در بر می گیرد ۲۵۶ در مبنای دسیمال یا ۱۱۱۱۱۱۱۱ در باینری می باشد. WORD : به مجموعه ای از ۱۶ بیت یا ۲ بایت گفته می شود و بزرگترین عددی که در بر می گیرد ۶۵۵۳۵ در مبنای دسیمال یا ۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱ در باینری می باشد. DWORD : مخفف Double Word و شامل ۳۲ بیت یا ۲ کلمه یا ۴ بایت می باشد.
سیستم عددی Hexadecimal 4
تاکنون با باینری و دسیمال آشنا شدیم. از آنجایی که در سیستم عددی باینری برای نوشتن کوچک ترین عددها باید رشته ی طویلی از صفرها و یک ها را پشت هم قرار دهیم و کار با آن کمی سخت است ، سیستم عددی هگزادسیمال راه حل مناسبی برای این مشکل است. از اینرو برای یادگیری اسمبلی باید با سیستم عددی هگزادسیمال هم آشنا باشیم : اگر به خاطر داشته باشید در سیستم عددی باینری تعداد ارقام کمتر از ۱۰ بود و فقط ۲ رقم در اختیار داشتیم. اما در سیستم عددی هگزادسیمال تعداد ارقامی که استفاده می شوند بیشتر از ۱۰ می باشند. در این سیستم ما از ۱۶ رقم برای نوشتن اعداد مختلف استفاده می کنیم. حالا باید فرض کنیم در دنیا ۱۶ رقم موجود است یعنی از علامت های A تا F به جای علائم رقمی بعد از ۹ استفاده می کنیم.
جدول زیر اعداد ۰ تا ۱۵ را در مبنای دسیمال و هگزادسیمال نمایش می دهد.
F
E
D
C
B
A
9
8
7
6
5
4
3
2
Hexadecimal
همانطور که مشاهده می نمایید اعداد ۰ تا ۹ در هر دو سیستم عددی مثل هم هستند. اما اعداد دو رقمی ۱۰ تا ۱۵ در سیستم هگزادسیمال جای خود را به اعداد تک رقمی E, D , C, B, A و F داده اند. بیائید تا شروع به شمارش در هگزادسیمال نماییم :
۰۰۰۰ (که برابر با « صفر » در شمارش معمولی هست) ۰۰۰۱ (که برابر با « یک » در شمارش معمولی هست) ۰۰۰۲ (که برابر با « دو » در شمارش معمولی هست) ۰۰۰۳ (که برابر با « سه » در شمارش معمولی هست) ۰۰۰۴ (که برابر با « چهار » در شمارش معمولی هست) ۰۰۰۵ (که برابر با « پنج » در شمارش معمولی هست) ۰۰۰۶ (که برابر با « شش » در شمارش معمولی هست) ۰۰۰۷ (که برابر با « هفت » در شمارش معمولی هست) ۰۰۰۸ (که برابر با « هشت » در شمارش معمولی هست) ۰۰۰۹ (که برابر با « نه » در شمارش معمولی هست) ۰۰۰A (که برابر با « ده » در شمارش معمولی هست. چون مبنای ما ۱۶ هست و همچنان بعد از ۹ رقم های دیگری هم موجود است، مجبوریم از آنها استفاده کنیم) ۰۰۰B (که برابر با « یازده » در شمارش معمولی هست) ۰۰۰C (که برابر با « دوازده » در شمارش معمولی هست) ۰۰۰D (که برابر با « سیزده » در شمارش معمولی هست) ۰۰۰E (که برابر با « چهارده » در شمارش معمولی هست) ۰۰۰F (که برابر با « پانزده » در شمارش معمولی هست)
به پایان ارقام رسیدیم. باز هم باید از همان روش استفاده کنیم. به رقم سمت چپ که باز هم قرمز رنگ است یک عدد اضافه می کنیم و رقم سمت راست را از صفر شروع می کنیم. به این ترتیب خواهیم داشت :
۰۰۱۰ (که برابر با « شانزده » در شمارش معمولی هست) ۰۰۱۱ (که برابر با « هفده » در شمارش معمولی هست) ۰۰۱۲ (که برابر با « هجده » در شمارش معمولی هست) . . . . ۰۰۱۹ (که برابر با « بیست و پنج » در شمارش معمولی هست) ۰۰۱A (که برابر با « بیست و شش » در شمارش معمولی هست) ۰۰۱B (که برابر با « بیست و هفت » در شمارش معمولی هست) ۰۰۱C (که برابر با « بیست و هشت » در شمارش معمولی هست) ۰۰۱D (که برابر با « بیست و نه » در شمارش معمولی هست) ۰۰۱E (که برابر با « سی » در شمارش معمولی هست) ۰۰۱F (که برابر با « سی و یک » در شمارش معمولی هست)
بنابر این طبق قاعده عدد بعدی باید ۲۰ در مبنای هگزادسیمال باشد که در مبنای دسیمال یا همان شمارش معمولی برابر با « سی و دو » خواهد بود.
جدول زیر اعداد ۰ تا ۱۵ را در مبنا های دسیمال ، هگزادسیمال و باینری نمایش می دهد.
چگونه هگزادسیمال کار را راحت تر می کند؟
عدد ۰۰۱۰۱۰۱۰۰۰۱۱۱۱۱۰ را در مبنای باینری در نظر بگیرید. این عدد یک WORD است. چون از ۱۶ بیت تشکیل شده است. بیائید این عدد را از سمت راست به چهار NIBBLE تقسیم کنیم. به این ترتیب چهار عدد زیر را خواهیم داشت :
۱۱۱۰ و ۰۰۱۱ و ۱۰۱۰ و ۰۰۱۰
حال با توجه به آخرین جدولی که نمایش داده شده معادل این اعداد را در مبنای هگزادسیمال در نظر می گیریم :
۱۱۱۰ = E و ۰۰۱۱ = ۳ و ۱۰۱۰ = A و ۰۰۱۰ = ۲
بنابراین معادل عدد ۰۰۱۰۱۰۱۰۰۰۱۱۱۱۱۰ در باینری برابر با ۲A3E در هگزادسیمال خواهد بود. برای امتحان می توانید از ماشین حساب ویندوز استفاده کنید. از منوی Start گزینه Run را انتخاب کنید و در پنجره ای که نمایش داده می شود حروف calc را تایپ نمایید و بر روی OK کلیک نمایید. حال از منوی View در ماشین حساب گزینه Scientific را انتخاب نمایید. حالا بر روی گزینه Hex کلیک کنید و عدد ۲A3E را وارد نمایید. بعد از وارد کردن عدد اگر گزینه Bin را انتخاب نمایید مشاهده می کنید که ماشین حساب بعد از تبدیل این عدد از هگزادسیمال به باینری عدد ۱۰۱۰۱۰۰۰۱۱۱۱۱۰ را نمایش خواهد داد که معادل همان عدد در باینری است.
مشاهده می نمایید که ما می توانیم به جای نوشتن ۱۶ رقم در باینری تنها از ۴ رقم در هگزادسیمال استفاده کنیم. یعنی ۱۲ رقم صرفه جویی کرده ایم. اما فراموش نکنید که این تبدیلات برای راحت تر شدن در کار ماست. در کامپیوتر همه چیز نهایتا به ۰ و ۱ یعنی باینری تبدیل می شود.
نکته : بعضی از کتاب های آموزش اسمبلی علاوه بر آموزش سیستم های عددی باینری ، دسیمال و هگزادسیمال، یک سیستم عددی دیگر به نام Octal یا هشت تایی را هم اموزش می دهند. اما آشنایی با این سیستم در بحث ما کاربردی ندارد.
مهندسی معکوس و امنیت در دنیای نرم افزار
مجموعه ای حساس از تکنیکها و ابزارها برای فهمیدن اینکه محتوای یک نرم افزار شامل چه چیزهایی میباشد. به عبارت دیگر عمل تجزیه و تحلیل یک سیستم برای مشخص کردن مولفه های سیستم و رابطه متقابل آنها به منظور نمایش سیستم به شکلی دیگر یا در سطحی بالاتر میباشد . این نوع تکنیکها باعث میشود تا ساختار یک نرم افزار را نمایان نموده و راههای عملکرد آن و همچنین ویژگیهایی که طبق آن حرکت میکند را مشخص کنیم. در واقع مهندسی معکوس زمانیکه شخصی کد شخص دیگری را کاوش کند نیز اتفاق می افتد .
بحث در مورد علم مهندسی معکوس از سال 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 هایی که در حال اجرا هستند را امکان پذیر میسازد .
انواع Debugger
1- User Mode Debugger
بیشتر Debugger ها از این نوع هستند. این نوع Debugger ها برنامه هایی هستند که به Process های دیگر متصل شده و کنترل آنرا در دست میگیرند . مزیت دیگر آنها نصب و استفاده آسان از آنها میباشد. از طرف دیگر User Mode Debugger ها فقط میتوانند با یک Process کار کنند و کدهای User Mode درون آن Process را ببینند. گاهی اوقات شما با استفاده از این نوع Debugger برنامه ای را باز میکنید که چندین Process را شامل میشود که به نوعی به هم متصل هستند. در اینطور موارد شما ممکن است ندانید کد مورد نظر شما در کدام Process اجرا میشود . User Mode Debugger ها معمولاً مشکل خاصی ایجاد نمیکنند مگر اینکه برنامه ای که در حال Debug شدن میباشد دارای مولفه های Kernel Mode باشد (همانند Device Driver). بعضی از این نوع Debugger ها عبارتند از :
- OllyDbg
این Debugger توسط Oleh Yuschuk ساخته شده که شاید یکی از بهترین ها در نوع خود باشد، این Debugger دارای یک Disassembler بسیار قدرتمند بوده که برای افرادی که در زمینه مهندسی معکوس در سطح مبتدی هستند بسیار مناسب میباشد. وجود Analyzer در این Debugger باعث میشود که حلقه های تکرار و شرطها (for ، switchو ...) و همچنین پارامترهای متدها به راحتی قابل تشخیص باشد . OllyDbg دارای امکان patching نیز میباشد به این ترتیب که میتوان تغییراتی در فایل اجرایی ایجاد نموده و آنرا ذخیزه نمود. این ابزار کاملا رایگان بوده و از سایت
[URL]http://home.t-online.de/home/Ollydbg[/URL]
قابل دریافت میباشد .
- WinDbg
یک Debugger رایگان بوده که سازنده آن شرکت Microsoft میباشد. در حالیکه تعدادی از ویژگیهای آن از طریق رابط کاربر قابل دسترسی هستند، دارای یک کنترلگر دستوری نیز میباشد. دارا ی یک Disassembler ضعیف بوده و امکانات دیگر آن نیز چندان برای کاربران ساده نیست . [URL="http://www.microsoft.com/whdc/devtools/debugging/default.mspx"]http://www.microsoft.com/whdc/devtoo...g/default.mspx[/URL] - IDA Pro
یک User Mode Debugger است که دارای Assembler بسیار قدرتمند و همچنین امکانات Debug فراوان میباشد و میتوان گفت از قدرتمندترین Debuggerها میباشد. این Debugger رایگان نبوده ولی میتوان از نسخه های Trial آن استفاده نمود .
Decompiler Decompiler یک سطح بالاتر از Disassembler میباشد . Decompiler یک فایل اجرایی را به عنوان ورودی دریافت نموده و سعی میکند کد سطح بالا را از آن تولید کند. با توجه به اینکه فایل اجرایی با چه ابزاری تولید شده باشد معمولاً Decompile کردن آنها غیر ممکن است .
نتیجه گیری
مهندسی معکوس یکی از روشهای دسترسی به دانش فنی است. لازمه اجرای این روش وجود نمونه هایی از محصول است که مبنای کار تحقیقات قرار می گیرد. در این روش برای دستیابی به دانش فنی به برون فکنی اطلاعات فنی از طریق تجزیه محصول متوسل می شویم که اصطلاحاً کشف کردن (DEFAKTAGE) دانش فنی نامیده می شود. در این فرایند، کارشناسان مربوطه، مشخصات، هدف و شرایط طراحی محصول را درنظر گرفته و سعی در ساخت و تولید محصول طبق استانداردهای ملی و رایج خود دارند و نقاط مجهول و ناشناخته مسئله را نیز با درایت و بررسیهــــای کارشناسی و تحقیقات پوشش می دهند، بدون اینکه از ابتدا درگیر جزئیات فنی و طراحی محصول شده باشند. شاید بتوان از مهندسی معکوس به عنوان کپی برداری آگــــاهانه از یک محصول نام برد، روشی که عده ای از کشورهای شرق آسیا و اروپا بعداز جنگ جهانی دوم عملاً پیاده کردند و درحال حاضر جزء کشورهای پیشرفته و صنعتی محسوب می شوند .
درهر صورت تجربه های مفیدی که در دهه اخیر با حمایت طرح اعطای کمکهای فنی و تکنولوژیک به صنایع به وسیله تامین سرمایه ارزان و حمایتهای دولتی ازطریق سیاستگذاری مناسب مالیاتی و... روی موضوعها و محصولات مختلف در کشور صورت گرفته، همه مؤید بهره وری و مثمرثمربودن این استراتژی در پاسخ به نیازهای کشور است . نکته جالب اینکـــه کارشناسان داخلی با چنین تجربه هایی اعتماد به نفس و جسارت فنی لازم برای مواجهه با کارشناسان خارجی در مرحله انتقال فناوری پیدا می کنند و بدیهی است در این صورت، شرایط جذب کامل مراحل انتقال فناوری، شناختن نقاط کور فنی و علمی صنایع داخلی و سعی در برطرف کردن آن، جهت دادن صحیح به انتقال فناوری، مشاوره با مسئولان در راستای تصمیم گیری و عقد قراردادهای تولید و مشارکت با شرکتهای خارجی و... فراهم خواهدآمد .
از مهندسی معکوس در زمینه های مختلف سخت افزاری و نرم افزاری ازجمله: برای غلبه بر عیبها یا گسترش تواناییهای دستگاههای موجود، تهیه قطعات یدکی و ایجاد مراکز تعمیر و نگهداری دستگاههای پیشرفته، به عنوان ابزاری برای یادگیری، ابزاری برای ساختن محصولات جدید و سازگار که از محصولات موجود در بازار ارزان تر باشند، ابزاری برای رقابت، برای بالابردن کارآیی نرم افزارها، مورداستفاده قرار می گیرد و در حیطه های سخت افـــزار و نرم افزار رایانه ای اهمیت ویژه ای دارد .
Resources:
http://fa.wikipedia.org
http://www.ncbi.nlm.nih.gov/pmc/articles/PMC122920
http://www.knowclub.com/paper/?p=275
http://www.frg.ir
http://www.acm.uiuc.edu/sigmil/RevEng
http://ieir-reverseeng.persianblog.ir
http://article.oxinads.com