مهندسی معکوس یا Reverse Engineering به علمی گفته میشود که از پاسخ به سؤال میرسند و در واقع فرایند کشف اصول تکنولوژیکی یک دستگاه، شیء یا یک سیستم میباشد که از طریق تجزیه و تحلیل ساختار و عملکرد آن حاصل میشود. در اکثر مواقع موضوع مورد بررسی یک دستگاه مکانیکی، الکتریکی، برنامه نرمافزاری یا یک ماده بیولوژیکی یا شیمیایی میباشد که بدون داشتن دانش قبلی و تنها با جداسازی اجزا و تجزیه و تحلیل شیوه عملکرد آن، سعی در ایجاد یک نمونه جدید از آن میگردد. مهندسی معکوس بهطور عمده در استفادههای تجاری و نظامی به کار میرود و هدف آن استنباط پارامترهای طراحی یک محصول موجود بدون داشتن دانش کافی در زمینه تولید آن محصول و فقط با پیمودن فرایند معکوس و بهکارگیری تکنیکهای مشابه میباشد.
تعریف مهندسی نرم افزار :
خود مهندسی نرمافزار Software engineering یعنی استفاده از اصول مهندسی بجا و مناسب برای تولید و ارائه محصول نرمافزاری با کیفیت که قابل اطمینان و با صرفه بوده و بر روی ماشینهای واقعی بهطور کارآمدی عمل کند. مهندسی نرمافزار یک روش سیستماتیک، منظم و دقیق برای ساخت و ارائه محصولی نرمافزاری با کیفیت است. مهندسی نرمافزار اغلب شامل فرایند خطی تحلیل، طراحی، پیادهسازی و آزمون است؛ که با بهکارگیری روشهای فنی و علمی از علوم مهندسی موجب تولید نرمافزاری با کیفیت مطلوب در طول یک فرایند انتخابی مناسب پروژه میشود. کاربردهای مهندسی نرمافزار دارای ارزشهای اجتماعی و اقتصادی هستند، زیرا بهرهوری مردم را بالا برده، چند و چون زندگی آنان را بهتر میکنند. مردم با بهرهگیری از نرمافزار، توانایی انجام کارهایی را دارند که قبل از آن برایشان شدنی نبود. نمونههایی از این دست نرمافزارها عبارتاند از: سامانههای توکار، نرمافزار اداری، بازیهای رایانهای و اینترنت. فناوریها و خدمات مهندسی نرمافزار به کاربران برای بهبود بهرهوری و کیفیت یاری میرساند. نمونههایی از زمینههای بهبود: پایگاه دادهها، زبانها، کتابخانهها، الگوها، فرایندها و ابزار. مهندسی نرمافزار عبارت است از کاربرد مهندسی برای طراحی نرمافزار، توسعه، پیادهسازی و نگهداری از نرمافزار در یک روش سیستماتیک.
مهندسی معکوس در حوزه نرمافزار Software Reverse Engineering و تکنولوژی های فیزیکی : یکی از کاربردهای مهم روش مهندسی معکوس، تولید یا ساختن یک دستگاه، قطعه یا محصول از روی نمونه مشابه است. در این روش با استفاده از عکس، فیلم یا نمونه موجود، یک دستگاه یا محصول را تولید میکنند. روش مهندسی معکوس ماشین آلات و قطعات با استفاده از نرمافزارهای کد مثل سالیدورک، یا کتیا سرعت بسیار بیشتری پیدا میکند و دقت آن بیشتر میشود. این نرمافزارها، به کاربران کمک میکند که مدل سه بعدی قطعات را به صورت مجزا یا در یک اسمبلی مشاهده کنند و قبل از شروع فرایند ساخت، بتوانند ایرادها و اشکالات احتمالی را رفع کنند. البته بین مهندسی معکوس و کپی کردن دستگاه، تفاوت زیادی است. در این حالت (مهندسی معکوس در مهندسی مکانیک) به علم و تکنولوژی عملکرد یا سیستم پی میبریم. روش کپی کردن کاملاً سنتی است و تولیدکننده به دانش و علم طراحی پی نمیبرد. اما در روش مهندسی معکوس، تمام قطعات و اجزای یک مجموعه مورد بررسی دقیق قرار میگیرند و علاوه بر ابعاد و اندازه، جنس و متریال، کاربرد و شرایط ظاهری تمام اجزا هم مورد بررسی قرار خواهد گرفت. مراحل انجام مهندسی معکوس دستگاه عبارت است از: - دمونتاژ کامل - اندازه برداری قطعات و مدلسازی - آنالیز متریال - شناسایی مکانیزمها - تغییرات و اصلاحات - آمادهسازی اطلاعات فنی برای تولید محصول جدید و مشابه.
در عمل دو نوع عمده از مهندسی معکوس وجود دارد. در حالت اول، سورس کد برای برنامه وجود دارد، اما سطوح بالاتری از جنبههای این برنامه، شاید مستندات ضعیف یا مستنداتی که دیگر اعتبار ندارد، مشاهده میشوند. در حالت دوم، سورس کدی برای برنامه موجود نیست و هرگونه تلاشی در جهت استخراج یک سورس کد ممکن برای نرمافزار به عنوان مهندسی معکوس در نظر گرفته شدهاست. بسیاری از مردم با استفاده دوم از این اصطلاح آشنا هستند. مهندسی معکوس نرمافزار برای جلوگیری از نقض کپی رایت میتواند از تکنیک طراحی اتاق پاک استفاده کند.
مهندسی معکوس کد Reverse Code Engineering
این فرایند برخی مواقع مهندسی معکوس کد یا Reverse Code Engineering نامیده میشود. به عنوان یک مثال، دیکامپایل کردن باینری برای پلتفرم جاوا از طریق برنامه JAD میتواند انجام شود. یک مثال از گروهی که مهندسی معکوس نرمافزار را برای لذت بردن (و انتشار کدهای ثبت) انجام میدهند CORE هست که مخفف «چالش مهندسی معکوس» است. مهندسی معکوس نرمافزار در قانون کپی رایت ایالات متحده در صورت استفاده منصفانه محافظت میشود. برنامه Samba که به سیستمهای غیر مایکروسافت ویندوز اجازه میدهد به اشتراک فایل با سیستمهای ویندوزی بپردازند یک مثال کلاسیک از مهندسی معکوس نرمافزار هست. به این خاطر پروژه Samba باید به مهندسی معکوس اطلاعات منتشر نشده در مورد چگونگی به اشتراکگذاری فایل ویندوز میپرداخت، تا که کامپیوترهای غیر ویندوزی بتوانند آن را شبیهسازی کنند. پروژه Wine همین کار را برای API ویندوز و OpenOffice.org این کار را برای فرمت فایلهای مایکروسافت آفیس انجام میدهد.
تکنیکهای مهندسی معکوس نرمافزار
مهندسی معکوس نرمافزار از روشهای گوناگونی میتواند بدست آید. سه گروه اصلی مهندسی معکوس نرمافزار عبارتند از:
تجزیه و تحلیل از طریق مشاهده تبادل اطلاعات - شایعترین پروتکل در مهندسی معکوس - که شامل استفاده از آنالیزورهای درگاه باس و اطلاعات انتقالی شبکه است. الگوی رفتاری درگاه باس یا شبکه بعداً میتواند مورد تجزیه و تحلیل قرار گیرد. به منظور تولید یک اجرای مستقل که آن رفتار را تقلید میکند. این امر به ویژه برای مهندسی معکوس درایورهای دستگاه مفید است. برخی مواقع مهندسی معکوس بر روی سیستمهای بسته به وسیله ابزارهایی که عمداً توسط تولیدکننده معرفی شده بسیار کمککننده است. در مایکروسافت ویندوز دیباگر سطح پایین مانند SoftICE طرفداران بسیاری دارند. تولید فایل اسمبل برنامه به وسیله دیس اسمبلر: به معنی خواندن کدهای خام زبان ماشین و درک این اطلاعات با اصطلاحات خواص دیس اسمبلر. این عمل بر روی تمام برنامههای کامپیوتری میتواند اعمال شود اما درک آن ممکن است مدتی زمان بر باشد، مخصوصاً برای کسانی که با زبان ماشین آشنا نیستند. دستیابی به سورس کد با استفاده از یک دیکامپایلکننده، فرایندی که تلاش میکند سورس کد را در بعضی زبانهای سطح بالا برای برنامهای که فقط در حالت بایت کد یا کدهای ماشین است فراهم کند. تکنیکهای حذف لایسنس نرمافزار شامل: سریال فیشینگ، پچ یا وصله زدن، keygen یا تولیدکننده کلید، unpacking (برداشتن لایه امنیتی نرمافزار که توسط پروتکتور یا محافظ محافظت شده)
طراحی اتاق پاک
طراحی اتاق پاک (همچنین به عنوان روش دیوار چینی شناخته میشود) روش کپی کردن یک طراحی به کمک مهندسی معکوس و سپس بازآفرینی آن بدون نقض کپی رایت و اسرار تجاری در ارتباط با طرح اصلی است. طراحی اتاق پاک به عنوان دفاع در برابر نقض قوانین کپی رایت و اسرار تجاری مفید است به این دلیل که به اختراع مستقل متکی است. بهطور معمول، طراحی اتاق پاک با داشتن شخصی که سیستم را برای طراحی دوباره بررسی میکند، انجام میگیرد و آن شخص مشخصات و خصوصیات سیستم مد نظر را مینویسد. این خصوصیات سپس به کمک یک وکیل بررسی میشود تا اطمینان حاصل شود که هیچ مورد کپی رایت را شامل نمیشود. این خصوصیات سپس توسط یک تیم بدون هیچ ارتباطی با تحلیلگر اصلی اجرا میشود. یک مثال معروف این است که محصولات داده کلمبیا برای اولین بار یک کپی از کامپیوترهای IBM را از طریق اجرای اتاق پاک BIOS آن ساخت.ReactOS یک سیستم عامل منبع باز است که از اتاق پاک مهندسی معکوس اجزای ویندوز ساخته شدهاست.
از دلایل استفاده از مهندسی معکوس در حوزه نرمافزار این موارد رو میشه نام برد :
نوسازی نرمافزار : مهندسی معکوس به صورت کلی برای درک وضعیت موجود برنامه مورد نیاز است. این عمل به منظور برآورد درست کوششهای مورد نیاز برای مهاجرت اطلاعات سیستم به یک وضعیت دلخواه است.
نگهداری نرمافزار : مهندسی معکوس نرمافزار میتواند مستندات لازم را برای درک وضعیت فعلی نرمافزار سیستم فراهم کند.
آنالیز محصول : برای بررسی اینکه یک محصول چه گونه کار میکند، از چه اجزایی تشکیل شده، برآورد هزینهها و مشخص کردن حقوق مالکیت بالقوه.
بازبینی امنیتی
بدست آوردن اطلاعات حساس به کمک دیس اسمبل و تجزیه و تحلیل طراحی اجزای سیستم
حذف محافظ کپی، دور زدن محدودیتهای دسترسی.
ایجاد کپیهای بدون مجوز / تأیید نشده.
اهداف علمی / آموزشی.
اولیدیبیجی
OllyDbg (برگرفته از نام نویسنده ی آن اوهوش یوشچک) یک اشکال زدای(دیباگر) x86 است که تاکید بر تحلیل کد باینری دارد که زمانی که کد اصلی در دسترس نیست، مفید است. این نرمافزار رجیسترها را ردیابی میکند و تابع ها ،فراخوانی های ای پی آی ، دستورهای سوئیچ ، جداول ، مقادیر ثابت و رشته ها را تشخیص می دهد و همچنین مکان روال ها در آبجکت فایل ها و کتابخانه ها را مشخص می کند. این نرمافزار رابط کاربر پسند دارد و قابلیت های آن می تواند توسط پلاگین های شخص ثالث گسترش یابد. نسخه ۱.۱۰ آخرین انتشار ۱.x است. نسخه ۲.۰ در ژوئن ۲۰۱۰ منتشر شد و OllyDbg در این نسخه از بالا تا پایین بازنویسی شده است. این نرمافزار رایگان است، اما مجوز اشتراک افزار(shareware) باعث می شود تا کاربران با بانی ثبت نام کنند. اگر چه نسخه فعلی OllyDbg نمیتواند باینری های کامپایل شده برای پردازنده های 64 بیتی را دیس اسمبل (واگرایی) کند، یک نسخه 64 بیتی از این اشکال زدا(دیباگر) وعده داده شده است.
استفاده در فرآیند مهندسی معکوس
OllyDbg اغلب برای مهندسی معکوس برنامه ها استفاده می شود. آن اغلب توسط کرک کننده ها برای کرک کردن نرم افزار ساخته شده توسط سایر توسعه دهندگان استفاده می شود. برای کرک کردن و مهندسی معکوس، اغلب به دلیل سهولت استفاده و در دسترس بودن آن ابزار اصلی است. هر فایل اجرایی 32 بیتی می تواند توسط اشکال یاب (دیباگر) مورد استفاده قرار گیرد و در سطح دسترسی بی درنگ(realtime) در بیت کد / اسمبلی ویرایش شود. همچنین این نرمافزار برای برنامه نویسان، برای اطمینان حاصل کردن از این که برنامه آنها همان طور که مورد نظر است، در حال اجرا است و برای آنالیز اهداف بدافزار مفید است.
نرمافزار مرتبط
مجزاکننده تعاملی (IDA Pro)
رادار 2
چیت انجین
دیباگر های برای نرمافزار مهندسی معکوس
x64dbg
دیباگر Syser
کرک کردن نرم افزار :
کِرَک کردن نرمافزار یعنی تغییر دادن نرمافزار به منظور حذف کردن روشهای حفاظتی آن نرمافزار؛ از جمله این روشهای حفاظتی میتوان به موارد زیر اشاره کرد:
ممانعت از کپی، نسخه نمایشی
آزمایشی
شماره سریال
از بین بردن واتر مارک
قفل سختافزار و …
تا بتوان از آن بر خلاف خواستهٔ سازندگان یا روشی که سازندگان در نظر گرفتهاند استفاده کرد. همچنین نام دیگر کرک، دزدی است . به افرادی که کرک میکنند کرکر گفته میشود. کرکرها با استفاده از دیباگرها و دیس اسمبلرها برنامهها را کرک میکنند. به عنوان مثال در کشور ایران به علت نبود قانون حق کپی یا کپی رایت انبوهی از نرمافزارهای کرک شده در دسترس کاربران هستند مانند نرمافزار فتوشاپ که در ایران بسیار ارزان فروخته میشود. نرمافزار کرک شده دارای اعتباری برای شرکت سازنده آن نمیباشد و معمولاً قابلیت به روز رسانی را نیز دارا نیست.
تاریخچه : اولین نرمافزار محافظ کپی برای نرمافزار اپل ۲، آتاری ۸۰۰ و کومودور ۶۴ به کار گرفته شد. ناشران نرمافزار بهطور فزایندهای روشهای پیچیده را در تلاش برای متوقفکردن کپی غیرمجاز نرمافزار اجرا کردهاند. در اپل II، برخلاف کامپیوترهای مدرن که از درایورهای ابزار استاندارد برای مدیریت ارتباطات وسیله استفاده میکنند، سیستمعامل بهطور مستقیم موتور مرحلهای را کنترل میکند که حرکت دیسک نرم را هدایت میکند، و همچنین دادههای خام را به نام nibbles تفسیر میکند، از هر شیار برای شناسایی بخشهای دادهها استفاده میکند. این اجازه داده شد که نرمافزار با ذخیرهسازی دادهها روی نیمی از خط (۰، ۱، ۲٫۵، ۳٫۵، ۵، ۶، ۶، ۶، ۶، ۶، ۶ …)و هر ترکیبی از آن را ذخیره کند. علاوه بر آن، ریلها نیازی به حلقههای کامل نداشتند، اما ممکن است به این ترتیب مورد برش و برش قرار گیرد تا بخشها بتوانند در طول خطوط خنثی با هم تداخل پیدا کنند. آخرین نسخه از آن به عنوان ردگیری مارپیچی شناخته میشود.
همچنین کشف شد که بسیاری از درایوهای دیسک یک حد بالایی ثابت به جنبش دارند، و گاهی ممکن است که یک شیار ۳۶ ۳۶ اضافی بالاتر از ۳۵ خط طبیعی داشته باشد. برنامههای کپی اپل II استاندارد نتوانست چنین floppy حفاظتشده را بخواند، چون داس استاندارد فرض کرد که تمام دیسکها یک چیدمان ۳۵ - track، ۱۳ - یا ۱۶ بخش داشته باشند. برنامههای ویژه Nibble- کپی مانند کلیدساز و نسخهبرداری II به علاوه میتوانند با استفاده از یک کتابخانه مرجع از روشهای حفاظت شناختهشده، این دیسکها را تکثیر کنند. زمانی که برنامههای حفاظتی شکسته شد، آنها بهطور کامل از سیستم حفاظت کپی جدا شده و به یک دیسک قالبی استاندارد انتقال داده شدند که هر برنامه کپی اپل II میتوانست آن را بخواند. یکی از مسیرهای اولیه برای هک کردن این حمایتهای کپی اولیه، اجرای برنامهای است که عملیات عادی CPU را شبیهسازی میکند. شبیهساز CPU تعدادی از ویژگیهای اضافی را برای هکرها فراهم میکند، مانند توانایی یک مرحلهای از طریق هر دستورالعمل پردازنده و بررسی دفاتر CPU و حافظه تغییر یافته به عنوان اجرا (هر گونه disassembler / debugger مدرن میتواند این کار را انجام دهد). اپل II یک سیستم ساختهشده در opcode disassembler را فراهم کرد که به حافظه خام اجازه رمزگشایی به opcodes CPU را میدهد، و این میتواند برای بررسی این که چه چیزی در مرحله بعدی انجام خواهد شد، مورد استفاده قرار گیرد. بهطور کلی، هیچ دفاعی برای سیستم حفاظت از کپی وجود ندارد، زیرا همه اسرار آن از طریق شبیهسازی دیده میشوند. با این حال، به دلیل اینکه خود شبیهسازی باید بر روی CPU اصلی اجرا شود، علاوه بر اینکه نرمافزار مورد شنود قرار میگیرد، شبیهسازی اغلب بسیار آهسته و حتی با حداکثر سرعت اجرا خواهد شد.
در آتاری ۸ - بیتی، رایجترین روش حفاظت از طریق «بخشهای بد» بود. اینها بخشهایی از دیسک بودند که به عمد توسط درایو دیسک غیرقابل خواندن بودند. نرمافزار زمانی که برنامه بارگیری میشد به دنبال این بخشها خواهد بود اگر یک کد خطا هنگام دسترسی به این بخشها مسترد نشود. برنامههای کپی ویژه در دسترس بودند که دیسک را کپی کرده و هر بخش بد را به خاطر داشته باشند. سپس کاربر میتواند از برنامهای برای چرخاندن درایو با خواندن پیوسته یک بخش استفاده کرده و RPM را نمایش دهد. با بالا بردن هارد دیسک، پیچگوشتی کوچک را میتوان برای کند کردن RPM در زیر یک نقطه مشخص استفاده کرد. زمانی که درایو کاهش یافت، برنامه میتواند برود و «بخشهای بد» را که مورد نیاز است بنویسد. پس از انجام این کار، RPM با سرعت به حالت عادی برگشت و یک کپی از آن ایجاد شد. البته شکستن نرمافزار به منظور پیشبینی بخشهای خوب برای کپی کردن دیسکها بدون نیاز به دخالت در دیسک درایو. همانطور که زمان به روشهای پیچیدهتر توسعه داده شد، اما تقریباً همه انواع داده دیسک ناقص، مانند یک بخش که ممکن است دادههای متفاوتی در دسترسی جداگانه به علت هم تراز دادههای بد داشته باشند، وجود داشت. محصولات در دسترس (از شرکتهایی مانند کامپیوترهای شاد) که جایگزین BIOS controller در محرک «هوشمند» آتاری شدند، در دسترس قرار گرفتند. این درایوهای با ارتقا به کاربر این امکان را داد تا نسخههای دقیقی از برنامه اصلی را با حمایتهای کپی از روی دیسک جدید تهیه کند.
در کمودور ۶۴، چندین روش برای حفاظت از نرمافزار استفاده شدهاست. برای نرمافزاری که بر روی گردان cartridges توزیع شدهاست، از subroutines استفاده شدهاست که سعی در نوشتن بر روی کد برنامه دارند. اگر نرمافزار در حافظه فقطخواندنی، هیچ اتفاقی نمیافتاد، اما اگر نرمافزار به رم منتقل میشد، نرمافزار از کار افتاده میشد. به دلیل عملکرد of Commodore، یک طرح حفاظت نگاشت، باعث میشود که هد دیسک نرم در برابر انتهای ریل قرار گیرد، که میتواند باعث شود که حرکت منجر به misaligned شود. در برخی موارد، نسخههای ترک کننده نرمافزار برای اجتناب از این نتیجه مطلوب بودند. یک سر محرک misaligned معمولاً با کوبیدن بر روی ریل قطار کم میشد. یک طرح حفاظت وحشیانه دیگر از مسیر ۱ تا ۴۰ و پس از چند بار اجرا شد.
بسیاری از شیرینیهای نرمافزار اولیه، دوستداران کامپیوتر بودند که اغلب گروههایی تشکیل میدادند که در ایجاد شکاف و گسترش نرمافزار با یکدیگر رقابت میکردند. شکستن یک طرح حفاظت کپی جدید تا جایی که ممکن است به عنوان فرصتی برای نشان دادن برتری فنی فرد به جای امکان تصمیمگیری در نظر گرفته میشود. برخی از دوستداران بسیار ماهر در حال حاضر نرمافزار را ترک میکنند و رشتههای رمزنگاری نشده مختلفی را در آن ویرایش میکنند تا پیامها را تغییر دهند و به بازیکن بازی بگویند که اغلب چیزی مبتذل محسوب میشود. Uploading نسخههای تغییر یافته در شبکههای به اشتراک گذاری فایل منبعی از خنده برای کاربران بالغ را ارایه میدهد. گروههای کراکر در دهه ۱۹۸۰ شروع به تبلیغ خود و مهارتهای آنها از طریق اتصال تلویزیونهای animated معروف به intros ترک در برنامههای نرمافزاری که ترک کرده و رها کردند. هنگامی که رقابت فنی از چالشهای ایجاد شکاف به چالشهای ایجاد intros بصری چشمگیر گسترش یافت، پایههای یک خردهفرهنگ جدید به نام demoscene تأسیس شد. Demoscene شروع به جدا کردن خود از صحنه غیرقانونی "warez" در دهه ۱۹۹۰ کرد و اکنون به عنوان یک خردهفرهنگ کاملاً متفاوت تلقی میشود. بسیاری از کرکر نرمافزاری بعدها تبدیل به مهندسی معکوس نرمافزار کارآمد شد؛ دانش عمیق مونتاژ مورد نیاز برای جلوگیری از حمایت، آنها را قادر به معکوس کردن رانندگان مهندسی معکوس کرد تا آنها را از محرکهای دوگانه برای ویندوز به رانندگان با کد مبدأ برای لینوکس و دیگر سیستمهای عملیاتی آزاد تبدیل کند. همچنین، چون موسیقی و بازی، بخش جداییناپذیر از بازی کردن فرمت موسیقی بود و گرافیک زمانی بسیار محبوب شد که سختافزار برای کاربر خانگی مقرونبهصرفه شد.
با ظهور اینترنت، کراکر نرمافزارها سازمانهای آنلاین مخفی را توسعه داد. در نیمه دوم دهه نود، یکی از معتبرترین منابع اطلاعاتی در مورد «معکوس کردن محافظت از نرمافزار» وب سایت Fravia بود. بسیاری از گروههای شناختهشده یا «نخبه» بهطور کامل شکافهای نرمافزاری را برای احترام به صحنه «صحنه» و نه سود، ایجاد میکنند. از آنجا، شکافها کمکم بر روی سایتهای اینترنتی عمومی توسط افراد یا کرکرها که از آرشیو انتشار FTP محافظت میکنند و به صورت غیرقانونی توسط احزاب دیگر فروخته میشوند، به سایتهای اینترنتی عمومی نشت کردهاست. صحنهای که امروز بازی میشود متشکل از گروههای کوچکی از افراد ماهر است که بهطور غیررسمی برای داشتن بهترین ترقه، روشهای ترک و مهندسی معکوس رقابت میکنند.
انواع دیگر کرک نرمافزار : کرک نوع Keygen
Keygen بر خلاف کرک که کلا قفل نرمافزار را میشکند، برای شما یک کد سریال میسازد. در اکثر فایلهای Keygen ابتدا لیستی از نرمافزارهای پشتیبانی شده توسط ان keygen نمایش داده میشود که باید یکی از انها را انتخاب کنید سپس برای شما یک کد سریال یا Licence میسازد.
Patch
Patch نوع دیگر کرک است که شما باید ان را در پوشه نرمافزار مورد نظر قرار دهید و سپس ان را باز کنید. با این کار فایل Patch فایلهای لایسنس نرمافزار را میسازد و در جای مناسب قرار میدهد.
رادار۲ :
رادار ۲ (Radare 2) (همچنین به عنوان R2 شناخته میشود) یک چارچوب کامل برای مهندسی معکوس و تجزیه و تحلیل دوتایی است؛ متشکل از مجموعه ای از امکانات کوچک است که میتواند با هم یا بهطور مستقل از خط فرمان استفاده شود. ساخته شده در اطراف دیساسمبلر برای نرمافزارهای کامپیوتری که کد منبع زبان مونتاژ را از کد ماشین قابل اجرا تولید میکند، آن از انواع فرمتهای اجرایی برای پردازندههای مختلف و سیستم عاملها پشتیبانی میکند. این در فوریه ۲۰۰۶ با هدف ارائه یک رابط خط فرمان آزاد و ساده برای یک ویرایشگر هگزا دسیمال با پشتیبانی ۶۴ بیتی برای ایجاد جستجوها و بازیابی اطلاعات از هارد دیسکها، برای اهداف قانونی ایجاد شد. از آن زمان، این پروژه با تغییر هدف به سمت ارائه یک چارچوب کامل برای تجزیه و تحلیل دوتاییها در حالی که به اصول مختلف فلسفه یونیکس پایبند باشد، رشد کردهاست.
در سال ۲۰۰۹ تصمیم این شد تا آن را بهطور کامل بازنویسی کند، تا محدودیتهای طراحی اولیه را از بین ببرد. از آن زمان، پروژه همچنان به رشد خود ادامه داد، و چندین توسعه دهنده محلی را جذب کرد. در سال ۲۰۱۶، اولین کنفرانس R2con با جمعآوری بیش از ۱۰۰ شرکت کننده، شامل گفتگوهای مختلف در مورد ویژگیهای مختلف و بهبود چارچوب در بارسلونا برگزار شد.
ویژگیها و استفادهها
از آنجا که در ابتدا رابط کاربری گرافیکی (GUI) نداشت، آن دارای منحنی یادگیریی با شیب تند است. در اصل بر اساس ویرایشگر هگزا دسیمال ساخته شدهاست، در حال حاضر بسیاری از ابزارها و ویژگیها، و همچنین اتصال به چندین زبان را داراست. در همین حال، در آن یک WebUI و رابط کاربری گرافیکی خارجی Qt به نام کاتر (Cutter) (که قبلاً نام آن Iaito بود) وجود دارد.
تجزیه و تحلیل استاتیک
رادار۲(Radare2) قادر به جمعآوری و جداسازی بسیاری از چیزها میباشد، اما آن همچنین میتواند با استفاده از نمودارها تفاوت دوتایی را انجام دهد، اطلاعاتی مانند نمادهای انتقال و انواع دیگر داده را استخراج کند. در داخل، از پایگاه داده NoSQL به نام sdb استفاده میکند تا اطلاعات تجزیه و تحلیل را که میتواند توسط رادار۲ (radare2) نتیجهگیری شود یا توسط کاربر به صورت دستی اضافه میشود، پیگیری کند. از آنجایی که قادر به مقابله با نرمافزارهای ناقص است، از سوی محققان امنیتی نرمافزاری نیز برای اهداف تحلیلی استفاده شدهاست.
تجزیه و تحلیل پویا
رادار۲ (Radare2) دارای یک خطایاب داخلی است که آن سطح پایینتر از خطایاب گنو (GDB)کلاسیک است. با این حال، همچنین میتواند خود را با خطایاب گنو یا حتی WineDBG برای خطایابی دوتاییهای ویندوز در سایر سیستمها متصل کند. حتی با استفاده از VMWare می توان آن را به عنوان یک خطایاب هسته ای استفاده کرد. همچنین پشتیبانی از پروتکل WinDBG وجود دارد.
بهرهبرداری از نرمافزار
از آنجایی که دارای یک دیساسمبلر (disassembler) و یک خطایاب سطح پایین است، رادار۲(radare2) میتواند برای توسعه دهندگان سوء استفاده مفید باشد. این نرمافزار دارای ویژگیهایی است که در توسعه سوء استفاده میشود، مانند موتور جستجوگر ابزار ROP و تشخیص رفع خستگی. به خاطر انعطافپذیری نرمافزار و پشتیبانی از بسیاری از فرمتهای فایل، اغلب برای ضبط تیمهای پرچم و دیگر پرسنل امنیتی به کار گرفته میشود. رادار۲(radare2) همچنین میتواند در ایجاد شل کد با ابزار "ragg2"، شبیه به metasploit باشد.
برش (کاتر-cutter)
کاتر (Cutter) اولین رابط کاربر گرافیکی (GUI) رسمی برای رادار۲(radare2) است. این هنوز یک پروژهٔ جوان است که عمدتاً بر کسانی است که به علت منحنی یادگیری هنوز کاربر رادار۲ (radare2) نیستند، زیرا آنها برنامههای CLI را دوست ندارند یا به دلیل سختی / بیثباتی رادار۲(radare2). این، جانشین پروژه قبلاً شناخته شده Iaito است که پس از آنکه در گیتهاب (Github)، به صورت منبع باز شد از آن خیلی کم نگه داری شد. بعدها، یک نسخه از Iaito گرفته شد و به شدت بازنویسی شد، دوباره بر پایه C++ و Qt. این گزینههای طراحی باعث میشود که آن یک برنامه کاربردی چند سکویی برای لینوکس، مک او اس و همچنین ویندوز باشد. در همان زمان آن به کاتر (Cutter) تغییر نام پیدا کرد. هدف کاتر (Cutter) این است که قابلیتهای گستردهای از رادار۲ (radare2) را استخراج و به رابط کاربر گرافیکی (GUI) کاربر پسند و جدید تبدیل کند که میتواند با سایر چارچوبهای اصلی تجزیه و تحلیلهای استاتیک و پویا مانند Hex-Rays Interactive Disassembler یا BinaryNinja رقابت کند.
دیکامپایلر
دیکامپایلر Decompiler ها برنامههایی هستند که کدهای اجرایی (فایل با پسوند هایی مانند exe) را به عنوان وردودی دریافت میکنند و آن را به سورسکد برنامه تبدیل میکنند، بهطوری که این کد قابلیت کامپایل شدن را داشتهباشد. عملکرد دیکامپایلرها دقیقاً برعکس کامپایلرها میباشد. کامپالرها سورسکد را به فایل اجرایی تبدیل میکنند ولی دیکامپایلرها برعکس. به طور کلی کامپایلرها قادر به بازگرداندن یک فایل اجرایی به سورس کد آن به شکل دقیق و بینقص نیستند و در اکثر مواقع کدهایی مبهم (obfuscated code) میسازند. با این حال دیکامپایلرها هنوز ابزاری بسیار مهم در مهندسی معکوس به شمار میروند.
دیکامپایلر(مترجموارون) معمولاً کد اجرایی را به کد منبع در زبان برنامهنویسی سطح بالا ترجمه میکند به طوری که اگر کد جدید دوباره ترجمه گشت در اجرا مانند کد اجرایی اصلی عمل کند. از دیکامپایلر برای مباحث امنیت کامپیوتر ، تصحیح خطاها و... استفاده می شود. زبان های کامپایلری مفسری که از کد میانی و ماشین مجازی استفاده می کنند معمولاً به صورت کامل قابل برگشت هستند ، یعنی حتی شماره ی خطوط و نام متغییرهای کد اصلی هم قابل برگشت است.از این دست زبانها می توان به جاوا و .net اشاره کرد. به عنوان مثال دیکامپایلر jd-gui برای جاوا وجود دارد که کد را به صورت کامل برمی گرداند. برای جلوگیری از دیکامپایل برنامه ها ابزاری با عنوان مبهم کننده ی کد( obfuscated code) وجود دارد که عملیات مهندسی معکوس را مشکل تر می کند.
طراحی
دیکامپایلرها در پروسه تبدیل یک فایل اجرایی به سورس کد فاز های مختلفی را طی میکنند که در ادامه فازهای مختلف آن را بررسی میکنیم.
بارکننده(loader)
اولین فاز در دیکامپایل عمل بارگزاری و تجزیه کد ورودی که به زبان ماشین است را انجام میدهد. این مرحله باید قسمت های مختلفی را مشخص کند. از جمله معماری و همچنین کد معادل تابع main در زبان c که در واقع شروع کدیست که توسط برنامه نویس ها نوشته شده است.
جداسازی قطعات(disassembly)
فاز منطقی بعدی در عملیات دیکامپایل کردن عبارت است از جداسازی قطعات(disassembling) کد ماشین و تبدیل آن به یک کد machine independent intermediate representation (IR) به طور مثال دستورالعمل ماشین پنتیوم را در قسمت زیر مشاهده میکنید.
mov eax, [ebx+0x04]
به کد زیر ترجمه خواهد شد.
eax := m[ebx+4];
بعد از این مراحل به ترتیب idioms, program analyses, dataflow analyses, type analyses, structuring و در نهایت code generation انجام میشود که توضیحات کامل تر آن ها را به همراه مثال میتوانید در لینک مربوط به مقاله اصلی مشاهده نمایید.
ابزارها
دیکامپایلر ها معمولا یک فرمت به خصوص از باینری ها را مورد هدف قرار میدهند. برخی مانند Intel x86, ARM, MIPS از دستورالعمل های معمولی استفاده میکنند و برخی دیگر نیز بایت کدهایی مانند(Dalvik, Java class files, WebAssembly, Ethereum) مخصوص به ماشین های مجازی میباشد. اخیرا برنامه گیدرا(ghidra) نیز توسط سازمان اطلاعات آمریکا به شکل open-source در آمده و یک ابزار بسیار قدرتمند و پیشرفته محسوب میشود.
دیساسمبلر
دیس اسمبلر Disassembler برنامهای کامپیوتری است که زبان ماشین را به زبان اسمبلی ترجمه میکند، عملیات معکوس آن از یک اسمبلر است. یک دیس اسمبلر با دی کامپایلر تفاوتهایی دارد؛ که هدف یک زبان سطح بالا به جای زبان اسمبلی است. جداسازی قطعات، خروجی از یک اسمبلر اغلب برای انسان فرمت بندی شدهاست_قابلیت خواندن به جای مناسب بودن برای ورودی به اسمبلر، آن را عمدتاً یک ابزار مهندسی معکوس میسازد.
کد منبع زبان اسمبلی بهطور کلی مجاز به استفاده از ثابتها و نظرات برنامهنویس است؛ که اینها معمولاً از کد زبان ماشین گردآوری شده توسط اسمبلر حذف میشود. در این صورت، عامل دیس اسمبلر در کد ماشین، قطعات جداسازی تولید شده فاقد این ثباتها و نظرات میشود؛ خروجی دیس اسمبل شده جدا دشوارتر میشود برای انسان که آن را به کد منبع تفسیر شده اصل ترجمه کند. برخی دیس اسمبلرها امکان استفاده از اطلاعات اشکال زدایی نمادین را در فایلهای شی(object file) مانندELF را میدهد. محاوره اسمبلر اجازه میدهد به کاربر انسان تا کاراکتر حافظهای برای ارزشها یا مناطقی از کد در یک قسمت تعاملی تشکیل دهد. بینش انسان اعمال شده به فرایند جداسازی قطعات، اغلب به موازات خلاقیت انسان در روند نوشتن کد است. جداسازی قطعات یک علم دقیق نیست:در سیستم عامل هایCISC با دستورالعمل متغیر عرض، ویا در صورت وجود کد خود متغیر، ممکن است برای یک برنامه واحد به دو یا تعداد بیشتری جداسازی قطعات معقول تر نیاز پیدا کنیم. تعیین دستورالعمل که در واقع مواجه شدهاست در طی یک اجرا از این برنامه ثبات قابل حل را به مشکل توقف شده کاهش میدهد.
مشکلات جداسازی قطعهها
نوشتن یک دی اسمبلر که به تولید کد که زمانی که جمع شدهاست تولید دقیق باینری اصلی را امکانپذیر میکند؛ با این حال، اغلب تفاوت وجود دارد. این امر خواستههای در بازنمونگری از اسمبلر است. به عنوان مثال در اسمبلرهای x۸۶ یک انتخاب دلخواه بین دو کد دودویی برای چیزی به عنوان مثال "AX MOV, BX" طول میکشد. اگر کد اصلی از انتخابهای دیگر استفاده کند، کد اصلی به سادگی نمیتواند در هر نقطه داده شده در زمان تکثیر شود. با این حال، حتی زمانی که جداسازی قطعات کاملاً درست است تولید میشود، مشکلات باقی میماند در صورتی که برنامه نیاز به اصلاح داشته باشد. به عنوان مثال همان دستور پرش زبان ماشین را میتوان با کد اسمبلی تولید کرد برای پرش به یک محل مشخص (برای مثال برای اجرای کد خاص)، یا برای مثال به جست و خیز یا پرش بر روی یک شاخه ناخواسته یعنی بدون شرط. دی اسمبلر نمیتواند بفهمد که چه چیزی در نظر گرفته شدهاست و ممکن است از سینتکس استفاده کند، و ایجاد کند یک جداسازی قطعات یعنی دیس اسمبلی که باینری اصلی را بازتولید کند. با این حال، اگر یک برنامهنویس میخواهد برای اضافه کردن دستورات بین دستور پرش و مقصد آن، لازم است به درک عملیات این برنامه برای تعیین اینکه آیا پرش باید مطلق یا نسبی، یعنی، چه آن قسمت را باید در یک مکان ثابت باقی میماند، یا میشود است نقل مکان کرد تا به عنوان پرش به هر دو دستورالعمل اصلی و اضافه شدهاست.
دیوار چینی
دیوار چینی Chinese wall یا دیوار اخلاقی یک پروتکل مانع اطلاعاتی در یک سازمان است که برای جلوگیری از تبادل اطلاعات یا ارتباطاتی که میتواند منجر به تضاد منافع شود، طراحی شده است. دیوار چینی افرادی را که سرمایه گذاری می کنند از کسانی که اطلاعات محرمانه ای را که می تواند به طور نامناسبی بر تصمیمات سرمایه گذار تأثیر می گذارد، جدا می کند. شرکت ها معمولاً طبق قانون موظف هستند از اطلاعات خودی محافظت کنند و اطمینان حاصل کنند که تجارت بر اصول راستینی استوار است. در فرهنگ لغت حقوقی مدرن برایان گارنر آمده است که این عنوان استعاره ای است که از دیوار بزرگ چین نشأت میگیرد , هرچند برخی نویسندگان این اصطلاح را با معماری سنتی چینی مرتبط می دانند. این اصطلاح در ایالات متحده پس از سقوط ۱۹۲۹بورس رایج شد،در این زمان دولت ایالات متحده قانون جداسازی اطلاعات بین بانک سرمایهگذاری و شرکت کارگزاری را تصویب کرد. این اصطلاح در روزنامه نگاری برای توصیف جدایی بین بازوهای سرمقاله و تبلیغات و در علوم مرتبط با رایانه، مفهوم دیوار چینی هم توسط سیستم عامل در مباحث مطروحه پیرامون امنیت رایانه و هم توسط نظام قضایی (در ایالات متحده) برای محافظت در برابر نقض حق مولف استفاده می شود.
اعتراض به کاربرد دیوار چینی
چند دهه است که در مورد استفاده از این اصطلاح به ویژه در بخش های حقوقی و بانکی اختلاف نظر وجود داشته است. در دعوی پیت، مارویک و میچل علیه دادگاه عالی (۱۹۸۸)، رئیس دادگاه قاضی هری دبلیو. در این زمینه اظهار نظر جالبی داشت او این اصطلاح را «اصطلاحی حقوقی که باید قاطعانه کنار گذاشته شود» دانست و «دیوار اخلاق» را به عنوان جایگزین مناسب تری پیشنهاد کرد. او اظهار داشت که "ادامه استفاده از این اصطلاح باعث بی توجهی نسبت به هویت قومی بسیاری از افراد چینی تبار می شود.
و در ادامه : نیاز به مهندسی نرمافزار
نرمافزار عموماً از محصولات و موقعیتهایی شناخته میشود که قابلیت اطمینان زیادی از آن انتظار میرود، حتی در شرایط طاقت فرسا، مانند نظارت و کنترل نیروگاههای انرژی هستهای، یا هدایت یک هواپیمای مسافربری در هوا، چنین برنامههایی شامل هزاران خط کد هستند، که از نظر پیچیدگی با پیچیدهترین ماشینهای نوین قابل مقایسه هستند. بهعنوان مثال، یک هواپیمای مسافربری چند میلیون قطعه فیزیکی دارد (و یک شاتل فضایی حدود ده میلیون بخش دارد)، در حالی که نرمافزارِ هدایت چنین هواپیمایی میتواند تا ۴ میلیون خط کد داشته باشد. با توجه به گسترش روزافزون دنیای رایانه امروزه بیش از هر زمان دیگری نیاز به متخصصان رایانه احساس میشود. متأسفانه این رشته در ایران بازار کار خوبی ندارد طبق آمارها ۶۳٫۲۷ درصد از فارغالتحصیلان در سال ۹۰ مشغول به کار در سایر مشاغل هستند. اما برای مهندسان سختافزار هم امکان کار در شرکتهای تولیدکننده قطعات و دستگاهها و مراکز صنعتی – تولیدی بسیار فراهم است و از نظر سطح درآمدی هم با توجه به دانش و پشتکار شخصی در حد متوسط قرار دارند. بهطور کلی این رشته در ایران با استقبال چندانی رو به رو نیست؛ این نیز حاکی از نبود برخی از زیرساختها در ایران هست.
تکنولوژیها و روشهای عملی
مهندسان نرمافزار طرفدار تکنولوژیها و روشهای عملی بسیار متفاوت و مختلفی هستند، که با هم ناسازگار هستند. این بحث در سالهای دهه ۶۰ میلادی شروع شد و ممکن است برای همیشه ادامه پیدا کند. مهندسان نرمافزار از تکنولوژیها و روشهای عملی بسیار متنوعی استفاده میکنند. کسانی که کار عملی میکنند از تکنولوژیهای متنوعی استفاده میکنند: کامپایلرها، منابع کد، پردازشگرهای متن. کسانی که کار عملی میکنند از روشهای عملی بسیار متنوعی استفاده میکنند تا تلاشهایشان را اجرا و هماهنگ کنند: برنامهنویسی در دستههای دونفری، بازبینی کد، و جلسات روزانه. هدف هر مهندس نرمافزار بایستی رسیدن به ایدههای جدید خارج از الگوهای طراحی شده قبلی باشد، که باید شفاف بوده و بهخوبی مستند شده باشد. با وجود رشد فزاینده اقتصادی و قابلیت تولید فزایندهای که توسط نرمافزار ایجاد شده، هنوز هم بحث و جدلهای ماندگار دربارهٔ کیفیت نرمافزار ادامه دارند.
ماهیت مهندسی نرمافزار
دیوید پارناس گفتهاست که مهندسی نرمافزار یک شکل از مهندسی است. استیو مککانل گفتهاست که هنوز اینطور نیست، ولی مهندسی نرمافزار باید یک شکل از مهندسی شود. دونالد کنوت گفتهاست که برنامهنویسی یک هنر است. دیوان فعالیتهای آماری آمریکا مهندسان نرمافزار را به عنوان زیرگروهی از «متخصصان رایانه»، با فرصتهای شغلیای مانند «دانشمند رایانه»، «برنامهنویس» و «مدیر شبکه» دستهبندی کردهاست. BLS تمام مهندسان دیگر این شاخه علمی، که شامل مهندسان سختافزار رایانه نیز هست، را بهعنوان «مهندسان» دستهبندی میکند.
زیر شاخههای مهندسی نرمافزار : مهندسی نرمافزار را میتوان به ۱۵ زیر رشته تقسیم کرد:
شناخت: بررسی و استخراج نیازمندیهای نرمافزار که شامل استخراج، تحلیل و اعتبارسنجی خواستهها و تهیه مستندات مربوط جهت طراحی نرمافزار میباشد.
طراحی نرمافزار: فرایند تعریف معماری، اجزا، واسط و دیگر مشخصههای سیستم یا اجزا را گویند. همچنین این زیر بخش به عنوان خروجی فرایند نیز تعریف میشود.
طراحی نرمافزار # توجهات طراحی:سازگاری، توسعه پذیری، تحمل خطا، قابلیت نگهداری، ماژولار بودن، قابلیت اطمینان، قابلیت استفاده مجدد، استحکام، امنیت، قابلیت استفاده، کارایی، قابلیت حمل، مقیاس پذیری.
ساخت نرمافزار:جزئیات مربوط به ایجاد کار با معنی برای نرمافزار از طریق برنامهنویسی، بازنویسی و تأیید، تست واحدها و اجزا، تست یکپارچگی، و اشکال یابی.
تست نرمافزار: بررسی فنی -تجربی، برای ارائه به سهامداران و ذی نفعان که اطلاعاتی در مورد کیفیت محصول یا خدمات تحت تست بیا ن میکند.
تعمیر و نگهداری نرمافزار: کلیه فعالیتهای مورد نیاز برای ارائه پشتیبانی مقرون به صرفه در نرمافزار است.
مدیریت پیکربندی نرمافزار:شناسایی پیکربندی یک سیستم در نقاط مشخصی از زمان به منظور کنترل سیستماتیک تغییرات پیکربندی و حفظ و نگهداری یکپارچگی برنامه و ردیابی پیکربندی در طول چرخه عمر سیستم را گویند.
مدیریت نرمافزارهای مهندسی: نرمافزار مدیریت فعالیتها و برنامهریزی، هماهنگی، اندازهگیری، نظارت، کنترل و گزارشگیری به منظور حصول اطمینان از توسعه و نگهداری سیستماتیک، منضبط و اندازهگیری شونده نرمافزار است.
فرایند نرمافزار: تعریف، اجرا و پیادهسازی، ارزیابی، اندازهگیری، مدیریت، ایجاد تغییر و بهبود فرایند چرخه حیات خود نرمافزار را گویند.
روشهای مهندسی نرمافزار و مدلهای تحمیل ساختار در مهندسی نرمافزار با هدف سیستماتیک و منظم کردن فعالیت، قابل تکرار بودن و در نهایت افزایش کیفیت نرمافزار و موفقیت امیزتر بودن ان ایجاد میشود.
تمرین مهندسی نرمافزار حرفهای دربارهٔ دانش، مهارت و نگرشهای مهندسی نرمافزار است که مهندسان نرمافزار باید تمرین مهندسی نرمافزار را به صورت حرفهای، مسئولانه و اخلاقی بکنند.
اقتصاد مهندسی نرمافزار در مورد تصمیمگیری در زمینه کسب و کار تجاری مهندسی نرمافزار است.
مبانی ریاضی و محاسباتی
مبانی مهندسی
ابزار مهندسی نرمافزار و روشها: ابزارهایی مبتنی بر کامپیوتر برای مهندسی نرمافزار ایجاد شدهاند تا به فرایندهای چرخه حیات نرمافزار و روشهایی که ساختاری را بر فعالیتهای مهندسی نرمافزار اعمال میکنند کمک کند تا به هدف ساخت فعالیتهای سیستماتیک و در نهایت به موفقیت بتوان رسید.