واژه مهندسی معکوس علاوه بر کاربرد های مختلفی که دارد، هنگامی که در نرم افزار و علوم نرم افزاری بکار گرفته می شود نیز میتواند معانی مختلفی را برای افراد مختلف تداعی نماید. در این مقاله به بررسی مهندسی معکوس نرم افزار می پردازیم و با دلایل استفاده و تکنیک های آن آشنا می شویم.
مهندسی معکوس چیست؟
مهندسی معکوس یا Reverse Engineering به زبان ساده فرایند حل مسئله است از پاسخی که وجود دارد به جای اینکه از پرسش سوال آغاز شود. مهندسی معکوس بیشتر زمانی استفاده می شود که به دنبال استخراج دانش یا روش طراحی یک خدمات، کالا و یا … هستید.
در نرم افزار مهندسی معکوس چیست ؟
chikofsky یکی از پیشگامان این عرصه در مقاله ای با نام Reverse engineering and design recovery: a taxonomy بیان کرده است می توان معنی مهندسی معکوس نرم افزار را اینگونه بیان داشت که ” مهندسی معکوس، پروسه آنالیز و بررسی موضوعی از سیستم است که امکان ساخت و نمایش آن سیستم را در سطوح انتزاعی بالاتر فراهم می آورد. یا میتوان به نوعی اینطور بیان کرد که مهندسی معکوس نرم افزار در واقع طی کردن مسیر به صورت معکوس در چرخه تولید نرم افزار است.”
در مدل مهندسی معکوس نرم افزار در واقع خروجی فاز پیاده سازی، مهندسی معکوس شده و در حقیقت کد منبع آن (Source Code) به فاز آنالیز و طراحی برگشت داده می شود و از این نوع مهندسی معکوس با نام مهندسی مجدد یا Re-Engineering یاد می شود.
دلایل استفاده از مهندسی معکوس نرم افزار
در حقیقت امروزه دلایل مختلفی برای استفاده از مهندسی معکوس در جهان پدیدار شده است که در ادامه شرح مختصری بر وجود این دلایل آمده است:
- کد منبع برای نرم افزار در دسترس است ولی در سطوح بالاتر اسناد و مدارک ضعیفی از عملکرد سیستم نرم افزاری مورد نظر در دسترس است یا کلا در دسترس نیست که میتوان در این موارد از مهندسی معکوس به نحو شایسته برای آنالیز سیستم نرم افزاری استفاده کرد.(مهندسی مجدد)
- هیچ Source Code از نرم افزار موجود نیست که در این صورت هر گونه تلاشی برای تشخیص Source code سیستم نرم افزاری ، مهندسی معکوس نام دارد.
- تست جعبه سیاه نرم افزار ، که یکی از تست های رایج در مهندسی نرم افزار بوده به این صورت که تست کننده API را در اختیار دارد و سعی دارد نرم افزار را از بعد خارجی آن مورد تحلیل و بررسی قرار دهد.
- و آخرین و شاید سیاه ترین کاربرد مهندسی معکوس را در عرصه نرم افزار بتوان بررسی امنیتی یک نرم افزار یا از بین بردن حقوق کپی رایت آن نرم افزار بیان داشت .(این فرآیند مهندسی معکوس در اصطلاح Cracking نرم افزار نامیده می شود)
در واقع مورد دوم ذکر شده در استفاده از مهندسی های معکوس، موردی است که بیشتر افراد با آن آشنا هستند و در واقع آنرا فرآیند بازخوانی یک بخش یا زیرمجموعه سیستم نرم افزاری بدون کمک گرفتن از طرح ها و اسناد و مدل های کامپیوتری آنان است.
تاریخچه مهندسی معکوس نرم افزار
در دهه ۱۹۸۰ شرکت کامپیوتری IBM (international business machines) کامپیوتر های شخصی را برای کاربران خانگی و غیره معرفی کرد و توانست در آن زمان بازار را در اختیار خود نگه دارد و تا چندین سال حاکم بلافصل بازار کامپیوتر های شخصی بود و رمز همه ی موارد ذکر شده تنها در Bios این کامپیوتر ها که رابط بخش سخت افزاری و نرم افزاری این کامپیوتر ها بود.در این حین شرکت Compaq که بزرگترین شرکت تولید کننده PC در ایالت تگزاس آمریکا بود هزینه ای بالغ بر ۱۰۰۰۰۰۰ دلار در آن زمان را به طرح مهندسی معکوس بر روی Bios کامپیوتر های شرکت IBM اختصاص داد و موفق شد توسط شبیه سازی اولین کامپیوتر های شخصی سازگار با IBM را وارد بازار نماید که فروشی بالغ بر ۵۳۰۰۰ عدد در آن زمان داشت.
مهندسی معکوس به صورت کلی شامل موارد زیر است :
- آنالیز برنامه هدف
- ساخته شدن سطح میانی و تشریح و تجزیه و تحلیل آن
- آنالیز کد های ساخته شده و بررسی جزییات بیشتر
- ساخت محصول جدید با استفاده از تجزیه و تحلیل های مراحل قبلی
مهندسی معکوس نرم افزار دودویی چیست ؟
تحلیل و طراحی سیستم ها در مهندسی نرم افزار این فرآیند گاها مهندسی کد معکوس یا Reverse Code Engineering نامیده می شود (RCE) .به عنوان مثال Decompile کردن یک نرم افزار دودیی نوشته شده تحت Platform جاوا را میتوان با نرم افزاری با عنوان Jad انجام داد و یکی از معروف ترین موارد استفاده شده از این مهندسی معکوس را می توان همان مهندسی معکوس بیان شده در تاریخچه مهندسی معکوس نرم افزار دانست که در آن شرکت Comapq موفق به ساخت کامپیوتر های شخصی سازگار با IBM PC شد.
امروزه در عرصه مهندسی معکوس نرم افزار گروه های بیشماری وجود دارند که این کار را به عنوان تفریح انجام داده و کرک های نرم افزاری را گسترش میدهند که به عنوان نمونه یکی از معروف ترین این گروه ها میتوان گروه CORE یا Challenge Of Reverse Engineering را نام برد .
از پروژه های نرم افزاری که مهندسی معکوس نرم افزار در آنها نقش بسزایی داشته است میتوان به پروژه Samba Software و یا Wine اشاره کرد که در آن Windows API مهندسی معکوس شده و به عنوان مثال فایلهای MS Office به راحتی در آن اجرا می شوند.
تکنیک و روش مهندسی معکوس نرم افزار
مهندسی معکوس نرم افزار می تواند توسط متد های مختلفی صورت پذیرد و ۳ متد به همراه نرم افزار ها یا ابزار اصلی مهندسی معکوس عبارتند از :
- آنالیز مشاهدات
- تبادل اطلاعات
- استفاده از اشکال زدا ها یا Debuggers
در واقع شایع ترین نوع ابزار مهندسی معکوس را تشکیل می دهند که شامل استفاده از آنالیز کنند های Bus و Packet Sniffer ها می شوند که این روش بیشتر برای کرک کردن درایور های سیستمی کاربرد دارد. در برنامه های تحت ویندوز معمولا معمولا از اشکال زدا های سطح پایین مانند Numega SoftICE استفاده می شود.
۱-اشکال زدا ها(Debuggers)
در واقع برنامه های نرم افزاری هستند که قادر هستند برنامه های دیگر را خط به خط اجرا کرده و خطاهای موجود در نرم افزار را ردیابی نمایند . نحوه عملکرد آنها هم بدین صورت است که ابتدا نقطه توقفی (BreakPoint) در برنامه ایجاد و سپس آنرا اجرا می نمایند و هنگامی که برنامه به این نقطه رسید متوقف شده و کاربر میتواند ارزش یا عبارت متغییر های را در هنگام اجرا مشاهده نماید.
Debugger های به دو دسته مد کاربر( User ) و مد هسته ( kernel ) تقسیم می شوند. و میتوان اینطور بین نمود که مد هسته بخشی از سیستم عامل است که میتواند برنامه های راه انداز سیستم را مهندسی معکوس نماید مانند نرم افزار Numega SoftICE که در ابتدا ذکر گردید.
۲-استفاده از دی اسمبل یا Disassembler
یکی از روش های رایج جهت مهندسی معکوس نرم افزار است ، که در آن از یک Disassembler استفاده میشود . Disassembler ها برای اولین بار توسط رخنه کننده های نرم افزاری یا Cracker ها نوشته شد و هدف اصلی آنها تبدیل ساختار کد ماشین به زبان سطح بالاتر (کد اسمبلی ) و ترجمه آن است که در این صورت شما شاهد میلیون ها خط کد اسمبلی بوده که شاید برای بسیاری قابل فهم و درک نباشد در واقع این کار عکس Assembler کردن و به نوعی مهندسی معکوس بحساب می آید .امروزه دی اسمبلر های مختلفی اعم از Shareware یا freeware وجود دارند اما میتوان در این عرصه از بزرگ ترین Disassembler حال حاضر نام برد که شاید هیچ دی اسمبلر دیگری را نمیوان از نظر امکانات با آن مقایسه کرد و آن محصولی تجاری با نام IDA Pro است که به طرزی ماهرانه به استفاده از پایگاه داده برنامه و API های آن قابلیت تحلیل سفارشی را برای کاربر محیا می سازد.
۳-استفاده از یک Decompiler
در واقع Decompiler ها برنامه هایی هستند که عمل معکوس کامپایلر ها را انجام میدهند و کد ماشین یا کد اسمبلی میانی را به کد سطح بالا تبدیل می نمایند و هدف انها ایجاد فایلی حاوی اطلاعاتی است که توسط کامپیوتر قابل خواندن و در محله بعدی ترجمه این فایل به زبان قابل فهم توسط انسان است.
هدف از عمل Decompile به میزبان دسترسی اطلاعات در کد عرضه شده که در حال Decompile شدن است بستگی دارد و پیچیدگی در تحلیل کارایی آن وابسته به عواملی چون کد بایت به کار رفته در ماشین های مجازی شامل metadata با سطح بالایی از خصیصه ها است.
REC نام نرم افزاری است که عمل Decompile کردن به طور وسیع در سطوح پایین را انجام می دهد.
راههای جلوگیری از مهندسی معکوس نرم افزار چیست ؟
ابتدا بد نیست که به عنوان نویسنده این مطلب در بلاگ ایران هاست خدمت شما خواننده گرامی عرض کنم که تقریبا میتوان گفت در این زمینه هیچ راهکاری مطمئن و تضمین شده وجود ندارد و همانطور که همواره cracker های بزرگ و گروه های بزرگ به عنوان شعار خود بیان داشته اند:
“Nothing is uncrackable” یا هیچ چیز (سیستم نرم افزاری) غیرقابل کرک کردن نیست
در اینجا فقط برای آشنایی شما چندین روش که میتواند پروسه مهندسی معکوس نرم افزار شما را کمی به تاخییر بیاندازد و یا فهم آنرا برای کرکر های تازه کار کمی مشکل سازد را بیان خواهم کرد:
استفاده از روش های Anti-Debugging
همواره از debugg کردن برنامه خود که حالا در اینجا SoftICE مثال زده شده جلوگیری بعمل آورید و یا حداقل این پروسس را کمی به تاخییر بیاندازید.
به عنوان مثال میتوان نصب بودن Display Driver های SoftICE را توسط API Function ها چک کرده و بدین صورت debugg کردن برنامه خود و تحلیل و آنالیز آنرا دچار اختلال سازید.
لازم به ذکر است امروزه debugger های دیگری و روش های مقابله گوناگون برای با آنها در این عرصه معرفی شده است. مانند ollydbg و روش Buffer overflows در مقابل این Debugger
- عدم استفاده از نام های رایج برای متودها و توابع امنیتی و حفاظتی خود مانند Auth_Check(), FindDK47(), IsValidSerialNumber()
- عدم استفاده از messagebox ها با متن های رایج مانند “thanks for registration” یا امثال آن…
- میتوانید با استفاده از packer ها و Crypter های معروف مانند ShareLock, CrypKey, FLEXlm پروسه مهندسی معکوس خود را کمی پیچیده تر نمایید ولی توجه نمایید که تقریبا همه ی نرم افزار های بالا از قبل توسط گروه ها و کرکر های قوی کرک شده اند پس فقط وقت خود را بیهوده تلف ننمایید.
- از Encryption های خاص در برنامه خود استفاده نمایید ، مثلا XOR و فراموش نکنید هر XOR میتواند ۵ الی ۱۰ دقیقه پروسه مهندسی معکوس نرم افزار شما را به تاخییر بیاندازد و الگوریتم های RSA/SHA/ECC میتواند حتی ساعت ها این پروسه ها دچار اختلال نماید.
- از الگوریتم های خاص مانند CRC check های مختلف جهت چک کردن کد بلاک مربوط به امنیت نرم افزار خود استفاده نمایید تا مطمئن شوید دستکاری نشده اند.
- حتما از Packer های جدید مانند UPX استفاده نمایید و برنامه خود را pack نمایید که خیلی ها با unpack کردن دستی دچار مشکل شده و شاید خیلی از unpacker های بروز نیز قادر به unpack کردن برنامه مورد نظر نباشند.
در آخر باید توجه داشته باشید که میتوانید از همه ی روش های گفته شده در مهندسی معکوس استفاده کرده و برنامه خود را به چالش بکشید و فراموش نکنید هر چقدر که شما برای ایمن تر کردن نرم افزار خود تلاش نمایید ، کار را برای کرکر ها سخت تر خواهید کرد. امیدواریم با خواندن این مقاله با مفهوم مهندسی معکوس نرم افزار و در برنامه نویسی آشنا شده باشید.