امنیت

معرفی و شرح فرآیند مهندسی معکوس در نرم افزار

واژه مهندسی معکوس علاوه بر  کاربرد های مختلفی که دارد  هنگامی که در نرم افزار و علوم نرم افزاری بکار گرفته می شود نیز میتواند معانی مختلفی را برای افراد مختلف تداعی نماید و همانطور که  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 را وارد بازار نماید که فروشی بالغ بر ۵۳۰۰۰ عدد در آن زمان داشت.

مهندسی معکوس به صورت کلی شامل موارد زیر است :

  • آنالیز برنامه هدف
  • ساخته شدن سطح میانی و تشریح و تجزیه و تحلیل آن
  • آنالیز کد های ساخته شده و بررسی جزییات بیشتر
  • ساخت محصول جدید با استفاده از تجزیه و تحلیل های مراحل قبلی

در اینجا لازم است که شرحی مختصر از مهندسی رو به جلو یا Forward Engineering بیان شود و آن عبارت است از فعالیت های مهندسی که در آن محصولات استنتاج شده توسط ارث بری منجر به تولید یک نرم افزار و در تجهیزات جدید  بکار گرفته می شوند.

مهندسی معکوس در نرم افزار های دودویی :

این فرآیند گاها مهندسی کد معکوس یا 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 که در ابتدا ذکر گردید.

 

عکس۱ – نمایی از محیط نرم افزار Numega SoftICE

  • استفاده از دی اسمبل یا Disassembler

یکی از روش های رایج جهت مهندسی معکوس نرم افزار است ، که در آن از یک Disassembler استفاده میشود . Disassembler ها برای اولین بار توسط رخنه کننده های نرم افزاری یا Cracker ها نوشته شد و هدف اصلی آنها تبدیل ساختار کد ماشین به زبان سطح بالاتر (کد اسمبلی ) و ترجمه آن است که در این صورت شما شاهد میلیون ها خط کد اسمبلی بوده که شاید برای بسیاری قابل فهم و درک نباشد در واقع این کار عکس Assembler کردن و به نوعی مهندسی معکوس بحساب می آید .امروزه دی اسمبلر های مختلفی اعم از Shareware یا freeware وجود دارند اما میتوان در این عرصه از بزرگ ترین Disassembler حال حاضر نام برد که شاید هیچ دی اسمبلر دیگری را نمیوان از نظر امکانات با آن مقایسه کرد و آن محصولی تجاری با نام IDA Pro است که به طرزی ماهرانه به استفاده از پایگاه داده برنامه و API های آن قابلیت تحلیل سفارشی را برای کاربر محیا می سازد.

 

عکس ۲ – نمایی از نرم افزار IDA Pro

 

  • استفاده از یک Decompiler

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

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

REC نام نرم افزاری است که عمل Decompile کردن به طور وسیع در سطوح پایین را انجام می دهد.

 

عکس ۳ – نمایی از نرم افزار RECStudio یکی از Decompiler های قوی در عرصه RE

راههای جلوگیری از مهندسی معکوس نرم افزاری :

ابتدا بد نیست که  به عنوان نویسنده این مطلب در بلاگ ایران هاست خدمت شما خواننده گرامی عرض کنم که تقریبا میتوان گفت در این زیمنه هیچ راهکاری مطمئن و تضمین شده وجود ندارد و همانطور که همواره 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 پروسه مهندسی معکوس خود را کمی پیچیده تر نمایید ولی توجه نمایید که تقریبا همه ی نرم افزار های بالا از قبل توسط گروه ها و کرکر های قوی کرک شده اند پس فقط وقت خود را بیهوده  تلف ننمایید.
  • هرگز  نرم افزار خود را به صورت trial عرضه ننمایید که این روش بسیار آسان توسط کرکر ها ، کرک خواهد شد.                                                                                      cmp eax, 1E jg retrial
  • از Encryption های خاص در برنامه خود استفاده نمایید ، مثلا XOR و فراموش نکنید هر XOR میتواند ۵ الی ۱۰ دقیقه پروسه مهندسی معکوس نرم افزار شما را به تاخییر بیاندازد و الگوریتم های  RSA/SHA/ECC میتواند حتی ساعت ها این پروسه ها دچار اختلال نماید.
  • از الگوریتم های خاص مانند  CRC check های مختلف جهت چک کردن کد بلاک مربوط به امنیت نرم افزار خود استفاده نمایید تا مطمئن شوید دستکاری نشده اند.
  • حتما از Packer های جدید مانند UPX استفاده نمایید و برنامه خود را pack نمایید که خیلی ها با unpack کردن دستی دچار مشکل شده و شاید خیلی از unpacker های بروز نیز قادر به unpack کردن برنامه مورد نظر نباشند.

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

 :Sources

Secrets Of Reverse Engineering – Eldad Eilam Foreword by Elliot Chikofsky

An approach for Reverse Engineering(Cracking) Softwares by Shahram SaebNejad – ParaNULL.com

با کارت بانکی باشگاه ایران هاست پولتان به حسابتان باز می گردد.

همین حالا رایگان عضو شوید

مدیر بلاگ

مشخصات مدیر

نوشته های مشابه

‫۲ نظرها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا
بستن
بستن