آموزش نرم افزار IDA Pro و همه نکات کاربردی
IDA Pro بهترین دی اسمبلر یا ابزار مهندسی معکوس تجاری است. با این که تهیه آن هزینه زیادی به همراه دارد، اما هنوز نسخه رایگانش موجود است. من IDA Pro 6.2 نسخه محدود را دانلود کردم که رایگان است؛ اما فقط از دی اسمبلر x86 و ARM پشتیبانی می کند. نسخه های دیگر آن از پلتفرم های بی شمار دیگری پشتیبانی می کند که در اینجا به آن ها نیازی نخواهیم داشت.
هنگامی که IDA Pro برای اولین بار بارگذاری می شود، یک کادر محاوره ای ظاهر شده که از شما می خواهد تا یک فایل جدید را جدا یا Disassemble کنید. بدون بارگیری فایل وارد برنامه شوید یا فایل بارگذاری شده قبلی را بارگیری کنید. مثل چیزی شبیه این:
باید گزینه Disassemble a new file را انتخاب کنیم. ما فایل اجرایی معکوس Meterpreter را که قبلا با چارچوب Metasploit ایجاد کرده بودیم، انتخاب می کنیم. همچنین میتوانیم تیک کنار گزینه Display at startup را در پایین پنجره ای که در تصویر می بینید؛ برداریم تا IDA Pro فقط زمانی اجرا شود که می خواهیم از آن استفاده کنیم. هر وقت خواستیم روی فایلی که قبلا روی آن کار می کرده ایم، مجددا کار کنیم بهتر است روی دکمه Previous کلیک کنیم تا باز شود.
بعد از باز کردن فایل اجرایی، IDA Pro به طور خودکار فرمت فایل اجرایی را تشخیص می دهد. در مقاله ما، این فایل اجرایی PE Windows است. همچنین معماری ای که فایل اجرایی بر اساس آن کامپایل شده است را تشخیص می دهد. این نکته را می توان در تصویر زیر که Processor Type یا نوع پردازنده Intel 80*86 processor: metapc شناخته شده؛ به عینه دید. نوع پردازنده ماژول پردازنده ای را مشخص می کند که برای جدا سازی فایل اجرایی استفاده می شود. ماژول های پردازنده در زیر دایرکتوری Procs برنامه IDA Pro قرار دارند. در مثال ما، ماژول های زیر در دسترس هستند: arm.ilx وpc.ilx . معمولا معماری اجرایی و نوع پردازنده با موفقیت شناسایی می شوند و نیازی به تغییر آن در پنجره ارائه شده نخواهیم داشت.
لیست انواع فایل های تولید شده از لیست انواع فایل های ممکن در دایرکتوری Loaders برنامه IDA Pro قرار دارد. به طور خودکار انواع فایل هایی که می توان برای کار با فایل بارگذاری شده استفاده کرد، نشان داده می شود. هر File loader که بتواند فایل تجزیه و تحلیل شده را تشخیص دهد ارائه می شود و ما می توانیم یکی از آن ها را انتخاب کنیم. در نسخه IDA Pro من، دایرکتوری loaders حاوی فایل های زیر است: dbg.llx، elf.llx، macho.llx،pe.llx . در مثال ما، این pe.llx بود که توانست فایل تجزیه و تحلیل شده را تشخیص و خودش را به صورت “Portable executable for 80386 ” نمایش دهد.
حتما دانلود کنید: مهندسی معکوس چیست؟ آموزش با 7 ویدیوی رایگان
بعد از کلیک بر روی دکمه OK، IDA Pro یک فایل را بارگذاری می کند انگار که توسط خود سیستم عامل بارگذاری شده است.
فایل های پایگاه داده
بعد از باز کردن یک فایل جدید برای تجزیه و تحلیل باIDA Pro ، کل فایل اجرایی تجزیه و تحلیل و بایگانی پایگاه داده an.idb ایجاد می شود . آرشیو idb. چهار فایل دارد:
- name.id0 : حاوی محتویات پایگاه داده سبک درختی B است.
- name.id1 : حاوی Flag یا نشان هایی است که هر بایت برنامه را توصیف می کند.
- name.nam : حاوی فهرست راهنمای اطلاعات مربوط به مکان های برنامه نام گذاری شده است.
- name.til : حاوی اطلاعاتی در مورد عبارات نوع محلی است.
همه این فرمت های فایل اختصاصی و فقط در IDA قابل استفاده هستند. هنگامی که پایگاه داده .idb برای یک فایل اجرایی خاص ایجاد شد، وقتی بعدا آن را بارگذاری کنیم، IDA نیازی به تجزیه و تحلیل مجدد برنامه نخواهد داشت. علاوه بر این، IDA حتی دیگر به فایل اجرایی نیاز ندارد. حالا می توانیم فقط با فایل idb. کار کنیم. این یک مزیت است که میتوان از آن برای ارسال فایل های .idb به سایر افراد بدون این که فایل اجرایی مخربی وجود داشته باشد، استفاده کرد. بنابراین IDA می تواند فایل اجرایی را بدون فایل اجرایی واقعی و فقط با فایل آرشیو پایگاه داده تحلیل کند.
دانلود رایگان: آموزش صفر تا صد پایگاه داده
هر زمان که می خواهیم پایگاه داده open.idb فعلی را ببندیم (یعنی فایل قابل اجرایی تحلیل شده فعلی)، IDA از ما می پرسد که آیا می خواهیم تغییرات را در دیسک ذخیره کنیم یا خیر. ما می توانیم از بین گزینه های زیر یکی را انتخاب کنیم:
- پایگاه داده را جمع نکنید (Don’t pack database): تغییرات را در پایگاه داده های.id0 ، id1، nam و til flush خالی کنید و فایل idb. نسازید.
- پایگاه داده را ذخیره کنید (Pack database):id0 ،id1 ، nam و til را در بایگانی .idb آرشیو می کند. توجه داشته باشید که idb نشست قبل جایگزین شده است.
- پایگاه داده را خالی کنید (Pack database): مثل گزینه قبلی است با این تفاوت که فایل های پایگاه داده در آرشیو idb. فشرده شده اند .
- جمع آوری زباله (Collect garbage) : هر صفحه حافظه استفاده نشده را از پایگاه داده حذف می کند. این کار ؛ زمانی که بخواهیم یک فایل idb. دیتابیس کوچکتر ایجاد کنیم؛ واقعا عالی است.
- پایگاه داده ذخیره نشود (Don’t save the database) : اگر نمی خواهیم تغییراتی که ایجاد کرده ایم را ذخیره کنیم، می توانیم این گزینه را انتخاب کنیم.
اگر از نسخه آزمایشی IDA استفاده می کنیم، نمی توانیم کارمان را ذخیره کنیم، زیرا این قابلیت غیرفعال است. اگر می خواهیم از آن گزینه استفاده کنیم، می توانیم IDA Pro 5.0 که رایگان اما قدیمی است را دانلود کنیم یا برای نسخه IDA Pro هزینه بپردازیم.
اگر پروژه مان را ذخیره کنیم، بعدا می توانیم پایگاه داده را باز کنیم که خیلی هم سریع بارگذاری خواهد شد، زیرا نیازی به انجام کل تجزیه و تحلیل فایل اجرایی مثل بار اول نیست . این کار باعث صرفه جویی در وقت و هزینه ما هنگام تجزیه و تحلیل فایل های مخرب می شود.
در کنار این مطلب دانلود کنید: آموزش صفر تا صد مهندسی نرم افزار
باید در نظر داشته باشیم که هر وقت IDA فایل اجرایی را تجزیه و تحلیل می کند، باید کار های بسیار زیادی انجام بدهد. برای مثال سرصفحه فایل اجرایی (در مثال ما، PE سرصفحه فایل اجرایی است) را تجزیه کند، بخش های مختلف فایل اجرایی که ممکن است، باشد (.data،.code و غیره) را تجزیه و ایجاد کند، نقطه ورود فایل اجرایی که در صورت اجرای دستور Run از طرف ما باعث اجرا شدن کد می شود را شناسایی کند.
در طی این مدت، IDA دستورالعمل های کد فعلی فایل اجرایی را در دستورالعمل های اسمبلی ماژول پردازنده انتخابی بارگیری و تجزیه می کند. بعد آن دستورالعمل های مونتاژ برای تجزیه و تحلیل به کاربر نشان داده می شود. اما کار IDA به همین جا ختم نمی شود. این برنامه علاوه بر این ها می تواند دستورالعمل های اسمبلی تولید شده را اسکن کند تا اطلاعات بیشتری در مورد فایل اجرایی مثل کامپایلری که برای کامپایل فایل اجرایی، آرگومان های تابع، متغیر های محلی تابع و غیره استفاده می شود را کشف کند.
در مجموع، IDA می تواند با ارائه اطلاعات مختلفی که معمولا باید خودمان می دانستیم، در تجزیه و تحلیل یک فایل اجرایی مفید باشد.
رابط کاربر گرافیکی
مهم ترین و اساسی ترین بخش IDA Pro که باید بدانیم رابط کاربری گرافیکی آن است، زیرا احتمالا از آن زیاد استفاده خواهیم کرد. تا به حال، بعد از بارگذاری فایل اجرایی meterpreter.exe، برنامه IDA چیزی مثل تصویر زیر نشانمان خواهد داد:
می توانیم ناحیه مربوط به منو که حاوی آیتم های منوFile ، Edit و غیره است را ببینیم. از این منو می توان برای انجام هر کاری در IDA استفاده کرد و فقط مسئله ، پیدا کردن گزینه مناسب برای کاری است که می خواهیم انجام بدهیم. یک میانبر برای انجام کار های مختلف، ناحیه نوار ابزار است که میانبر هایی را برای همان توابعی که می توانیم در خود منو پیدا کنیم، در اختیارمان قرار می دهد. با استفاده از گزینه منوی View – Toolbars می توانیم نوار ابزار را اضافه و حذف کنیم. مورد بعدی یک پنجره راهنمای نمای کلی است که در تصویر زیر نشان داده شده است:
این کادر کل فضای حافظه مورد استفاده توسط برنامه تحلیل شده را نشان می دهد. اگر روی آن راست کلیک کنیم، می توانیم بزرگ یا کوچکش کنیم تا تکه های کوچک تری از حافظه را نشان دهیم. همچنین می بینیم که از رنگ های مختلف برای قسمت های مختلف حافظه استفاده می شود. این رنگ بستگی به نوع داده یا کدی دارد که در آن ناحیه بارگذاری می شود. در همان ابتدای پنجره راهنما، می توانیم یک فلش زرد بسیار کوچک را ببینیم که به مکانی که در حال حاضر در پنجره disassembly در آن هستیم، اشاره می کند.
در تصویر زیر، از زاویه های متفاوتی به داده های جمع آوری شده نگاه می کنیم. داده ها بر اساس تحلیل اولیه فایل اجرایی جمع آوری شده اند و حالا ما فقط از IDA می خواهیم تا نوع خاصی از داده ها را در نمای داده ای یا Data view خودش برگرداند.
می بینیم که تعداد زیادی پنجره داده در دسترس هستند و همه آن ها یک یا چند داده خاص دارند که از فایل اجرایی بارگذاری شده جمع آوری شده است. برای باز کردن یک پنجره داده خاص، می توانیم با رفتن از مسیر View > Open Subviews نمای مناسبی که می خواهیم نشان بدهیم را انتخاب کنیم. همچنین می توانیم با کلیک بر روی Windows >Reset desktop به نمای پیش فرض برگردیم.
نمای اصلی پنجره disassembly است که در آن می توانیم کد جدا شده فعلی فایل اجرایی تجزیه و تحلیل شده را ببینیم. می توانیم بین نمای نمودار و نمای فهرست که در واقع همان برنامه را نشان می دهد سوئیچ کنیم. اگر بخواهیم روند اجرای تابع فعلی را سریع تر بفهمیم، می توانیم از نمای نمودار و وقتی بخواهیم دستورالعمل های اسمبلی واقعی را ببینیم، می توانیم از نمای فهرست استفاده کنیم.
نمای کلی نمودار فایل اجرایی Meterpreter به این صورت است:
این فقط یک نمای کلی از برنامه برای پیمایش آسان تر قطعه کدی است که مایلیم آن را تجزیه و تحلیل کنیم. در تصویر بالا روی شروع برنامه کلیک کردیم ( به مربع مستطیلی نقطه چین توجه کنید ). اما همان طور که در نمای کلی نمودار مشخص است، نمی توانیم کد واقعی که جدا می شود را ببینیم. یک پنجره دیگر یا همان پنجره نمای نمودار هم هست که در کنار پنجره پیش نمایش نمودار که در آن می توانیم کد جدا شده را مشاهده کنیم قرار گرفته و به این صورت است:
در سمت چپ پنجره ای وجود دارد که کد واقعی جدا شده ابتدای برنامه را نشان می دهد. در سمت راست، می توانیم نمودار نمای کلی را ببینیم که همان ابتدای برنامه را نشان می دهد. در نمای نمودار، برنامه به بلوک های منطقی تقسیم می شود، یعنی هر بلوک یک هدف پرش را ارائه می کند (همان طور که در کد اسمبلی تعریف شده است). از نمای کلی نمودار می توانیم متوجه منطقی که برنامه در حین اجرا استفاده می کند، بشویم. همان طور که در مثال می بینیم؛ هیچ انشعابی برای تصمیم گیری وجود ندارد و برنامه از اول تا آخر بدون هیچ تصمیمی اجرا می شود.
فلش های بین بلوک ها می توانند سبز ، قرمز یا آبی باشند. در مثال ما، تمام فلش ها آبی هستند زیرا هیچ شاخه ای در حال انجام نیست. اگر برنامه در جایی در حال تصمیم گیری برای چیزی باشد و دو شاخه احتمالی وجود داشته باشد، یکی از این دو اجرا می شوند. ما یک فلش سبز برای یادداشت تصمیمی که به طور پیش فرض گرفته می شود و یک فلش قرمز برای تصمیمی که به طور پیش فرض گرفته نمی شوند، خواهیم داشت .
حتما دانلود کنید: آموزش صفر تا صد MySQL
نمای کلی نمودار همیشه کل عملکرد فعلی برنامه را نشان می دهد تا اگر برنامه بیش از حد پیچیده و پیمایش در نمای لیست ها دشوار بود، رفتن به هر جایی از برنامه راحت باشد.
نمای فهرستی فایل اجرایی Meterpreter به این صورت است:
بیایید یک پنجره فهرست دیگر را هم نشان تان بدهیم که بیشتر وارد جزئیات لیست شده است:
ما می توانیم بین مکان های مختلف در نمای لیست یا در نمای نمودار سوئیچ کنیم . هر دو نما در هر زمان مشخص کد یکسانی را نشان خواهند داد. اگر به نمودار و نمای لیست ها با دقت بیشتری نگاه کنیم، می بینیم که نمای لیست ها آدرس های مجازی که دستورالعمل های خاصی در آن قرار دارند را نشان می دهد، در حالی که نمای نمودار آن ها را پنهان می کند. علت این است که نمای نمودار با اطلاعات کم تر، بیشتر برایمان شفاف سازی می کند، بنابراین آدرس های مجازی پنهان می شوند. با این وجود، اگر بخواهیم آن آدرس ها را نشان دهیم، می توانیم آن ها را با رفتن از مسیر Options > General >Disassembly و انتخاب گزینه “Line prefixes” فعال کنیم. این تنظیمات را می توان در تصویری که در ادامه آمده؛ مشاهده کرد.
در سمت چپ پنجره لیست، فلش های مختلفی را می بینیم که انشعاباتی در برنامه تحلیل شده را به ما نشان می دهد . در خط 0x0040134B می بینیم که برنامه به مکان 0x00401337 می پرد و از آنجا به اجرا ادامه می دهد.
دانلود رایگان: آموزش همه زبانهای برنامه نویسی رایج
آرایه ها رنگ های مختلفی دارند و می توانند به صورت یک دست یا خط چین باشند. خطوط توپر نشان دهنده پرش های بدون قید و شرط هستند، در حالی که خطوط نقطه چین نشان دهنده پرش های شرطی هستند. در مثال ما، خط قرمز یکدست است ، زیرا دستورالعملی که در آن آدرس قرار دارد از دستور بدون قید و شرط jmp استفاده می کند.
IDA Pro همچنین می تواند آرگومان های تابع مورد نظر را کشف کند. ما نمی توانیم هیچ پارامتر تابعی را در تصویر بالا ببینیم، اما می توانیم توضیحاتی که با علامت “;” مشخص شده اند، را ببینیم. در پایان برخی از خطوط هر یک از توضیحات به ما می گویند که دستورالعمل دیگری به آن مکان در کد اشاره می کند. در تصویر بالا ، می توانیم این توضیح ارجاع درون متنی یا متقابل را ببینیم “; CODE XREF: .text:0040134B، که به ما می گوید دستورالعمل در آدرس 0x0040134B به آدرس فعلی اشاره می کند. بنابراین با این که ما از قبل می دانیم که برنامه از مکان 0x0040134B به 0x00401337 می پرد، اما معمولا نمی توانیم به این راحتی تشخیص بدهیم، به همین دلیل است که ارجاعات درون متنی می توانند بسیار مفید باشند.
بعد از مشاهده دستورالعمل ها در حالت نمودار، آدرس های مجازی فعال خواهند شد. این را می توان در تصویر زیر دید. تنها تفاوتش با شکلی که قبلا نشان دادیم؛ این است که آدرس های مجازی هم فعال هستند:
در پنجره پیش فرض IDA، یک پنجره اضافی وجود دارد که برای نمایش پیام های مختلف تولید شده توسط IDA استفاده می شود . از آن پیام ها می توان توسط هر نوع پلاگینی در IDA یا خود IDA خروجی گرفت. این پیام ها برای آگاه کردن ما نسبت به چیز های مختلف در مورد تجزیه و تحلیل نمونه اجرایی وجود دارند. برای درک بهتر، پنجره نمای پیام را ببینید:
سایر نما ها
اگر به داخل View > Open Subviews برویم، می توانیم پنجره های زیادی را ببینیم که می توانند نشان داده یا پنهان شوند و قابلیت های زیادی را در اختیارمان قرار دهند. این ها را می توان در تصویر زیر مشاهده کرد:
اگر به داخل گزینه منوی Windows برویم، می توانیم پنجره هایی که در حال حاضر باز هستند را ببینیم و می توانیم با استفاده از میانبر Alt+Num که Num یک عدد است، به سرعت آن ها را به جلو بیاوریم. در تصویر زیر پنجره های باز فعلی را می توان با میانبر های مناسب شان مشاهده کرد:
IDA View-A
ما قبلا هم در مورد IDA View-A توضیح دادیم که برای جداسازی کد برنامه است.
Hex View-A
پنجره نمای هگزا نمایش هگزی برنامه را نشان می دهد. اولین پنجره هگزا همیشه با نمای دی اسمبلی هماهنگ می شود، بنابراین همیشه همان آدرس های مجازی را ارائه می دهد . اگر برخی از بایت ها در یکی از پنجره ها هایلایت شده باشند، در پنجره دیگر هم هایلایت می شوند.
اجازه بدهید که اول متنی را در IDA View-A انتخاب کنیم. در تصویر زیر ، متن “Send request failed!” را انتخاب کردیم:
Hex View – A مربوطه باید همان متنی را داشته باشد که در تصویر زیر مشاهده می کنید:
اگر روی Hex View-A راست کلیک کنیم، می توانیم حالت همگام سازی نمای hex را با نمای disassembly غیرفعال کنیم، مثل تصویر زیر:
خروجی ها (Exports)
پنجره Exports تابع صادر شده ای را لیست می کند که فایل های خارجی می توانند از آن استفاده کنند. توابع صادر شده بیشتر در کتابخانه های مشترک وجود دارند زیرا در آن جا رابط های برنامه نویسی اجزا سازنده اولیه ای ارائه می شوند که می توانند توسط برنامه های در حال اجرای روی سیستم برای انجام عملیات اصلی استفاده شوند. در مثال ما ، فقط یک تابع صادراتی به نام start وجود دارد که نقطه ورودی فایل اجرایی است.
ورودی ها (Imports)
پنجره Imports تمام توابعی که فایل اجرایی فراخوانی میکند و در خود فایل اجرایی وجود ندارد، را فهرست بندی میکند. این امر وقتی فایل اجرایی از کتابخانه های DLL مشترک برای انجام کارش استفاده می کند، عادی است. فایل اجرایی Meterpreter شامل توابع وارد شده زیر است:
پنجره imports آدرس مجازی تابع ، نام آن و DLL که به آن تعلق دارد را فهرست بندی می کند.
ما باید در نظر داشته باشیم که پنجره imports فقط توابع مشترکی را فهرست میکند که توسط یک بارگذار (Loader) پویا در زمان اجرا بارگذاری می شوند، اما فایل اجرایی می تواند به تنهایی با استفاده از فراخوانی تابعی مثل LoadLibrary، توابع پویا را بارگیری کند.
پنجره Names
پنجره Names تمام نام های موجود در برنامه اجرایی را نمایش می دهد. یک نام صرفا نام مستعار یک آدرس مجازی خاص است. معمولا هر مکان ارجاع شده در فایل اجرایی یک نام دارد. مکان های ارجاع داده شده مکان های نام گذاری شده ای هستند که ما اجرا را در زمان پرش یا فراخوانی به آنجا هدایت می کنیم و همین طور متغیر هایی هستند که داده ها را از آنجا می خوانیم یا داده ها را در آنجا می نویسیم. اگر نماد های موجود در جدول نماد های اجرایی وجود داشته باشد، آن ها به لیست در پنجره Names اضافه می شوند.
در کل کد دی اسمبل شده، متوجه نام هایی می شویم که در پنجره Names ظاهر نمی شوند. آن ها به طور خودکار توسط خود IDA تولید می شوند. این اتفاق به این دلیل می افتد که جدول نماد در فایل اجرایی نماد مربوطه که می تواند به ارث برده شود را ندارد. نام هایی که به طور خودکار تولید می شوند؛ معمولا یکی از پیشوند های زیر را دارند که قبل از آدرس مجازی متناظر با آن ها می آیند: sub_، loc_، byte_، word_، dword_ وunk_ .
ما می توانیم از نام ها برای پرش سریع به مکان های مختلف در داخل برنامه اجرایی بدون نیاز به یادآوری آدرس های مجازی مربوطه استفاده کنیم. Names window برای فایل اجرایی Meterpreter در تصویر زیر قابل مشاهده است:
بیایید نگاهی به نام Start بیندازیم که به محل آدرس مجازی 0x004012A7 اشاره می کند . همان مکان حافظه در نمای دی اسمبل را هم ببینید. همان طور که در تصویر زیر قابل مشاهده است، می بینیم که نام Start در واقع در مکان مشخص شده قرار دارد:
لازم است معنای رنگ ها و حروف مختلف موجود در هر خط از پنجره Names را هم مشخص کنیم. معنای حروف مختلف به این شرح است:
- F (Function) : تابع عادی که تابع کتابخانه نیست.
- L (Library) : تابع کتابخانه ای که با علائم یا Signature متفاوت که بخشی از IDA هستند ؛ قابل تشخیص است. اگر علامت متناظر پیدا نشد، نام به عنوان یک تابع عادی برچسب گذاری می شود.
- I (Imported) : نام وارد شده از کتابخانه مشترک. از آن جایی که تابع کتابخانه در فایل اجرایی قرار داده شده، کدی از این تابع در فایل اجرایی ظاهر نمی شود و در زمان اجرا در دسترس قرار می گیرد.
- C (Code) : کد نام گذاری شده ای که مکان های برنامه که بخشی از هیچ تابعی نیستند را نشان می دهد و اگر نام بخشی از جدول نماد باشد، ممکن است فراخوانی شود، اما فایل اجرایی هیچ وقت این تابع را فراخوانی نمی کند.
- D (Data) : مکان های داده نام گذاری شده که معمولا متغیر های سراسری هستند.
- A (Ascii) : داده های رشته ای اسکی که رشته ای را نشان می دهد که با یک بایت تهی در فایل اجرایی به پایان رسیده است.
در فایل اجرایی Meterpreter، می توانیم ببینیم که نام Start یک تابع معمولی است، به این معنا که یک تابع واقعی در فایل اجرایی است. همچنین تعداد زیادی رشته ASCII وجود دارد که با حرف A نشان داده می شود. این مورد معمولا برای هر فایل اجرایی است، زیرا هر فایل اجرایی باید سهمی از رشته ها داشته باشد . اما فایل اجرایی Meterpreter همچنین از ورودی های ایمپورت شده ای که با توابع کتابخانه وارداتی مطابقت دارند، استفاده می کند که اگر بخواهیم توابعی خارج از فایل اجرایی (واقع در کتابخانه های مشترک) را فراخوانی کنیم، به آن ها هم نیاز خواهد شد.
پنجره Functions
پنجره Functions تمام توابع موجود در فایل اجرایی حتی اگر نام آن ها به طور خودکار توسط خود IDA گذاشته شده باشد را لیست می کند. پنجره names به طور پیش فرض این کار را انجام نمی دهد و نام های دیگر را هم نمایش می دهد . پنجره توابع صرفا برای نمایش نام توابع استفاده می شود. در تصویر زیر، می توانیم تمام توابع مورد استفاده در فایل اجرایی معکوس Meterpreter را مشاهده کنیم:
می توانیم ببینیم تابع start که در قسمت .txt فایل اجرایی قرار دارد، از آدرس مجازی 0x004012A7 شروع می شود، طول آن 0x9D است و به فراخواننده برمی گردد (پرچم R). اگر روی تابع در پنجره Function راست کلیک کرده و Edit function را انتخاب کنیم ، توضیح همه پرچم یا Flagها را می توان در آنجا پیدا کرد. پنجره ای مثل تصویر زیر ظاهر می شود که توضیح پرچم ها را نشان می دهد:
توضیح هر پرچم ها به این صورت است:
-R : آیا تابع به فراخواننده برمی گردد یا خیر.
-F : آیا تابع دور است یا خیر.
-L: آیا این یک تابع کتابخانه است یا خیر.
-S : آیا این یک تابع استاتیک است یا خیر.
پنجره Strings
پنجره Stings رشته هایی که توسط فایل اجرایی پیدا شده است را نشان می دهد. یادتان باشد که هر بار که پنجره رشته ها را باز می کنیم، IDA کل مقدار باینری را دوباره اسکن می کند و آن ها را نمایش می دهد. در واقع آن ها را در یکی از بایگانی های پایگاه داده ذخیره نمی کند. ما می توانیم پنجره رشته ها را با رشته های موجود در فایل اجرایی Meterpreter در تصویر زیر ببینیم:
ما می توانیم با کلیک راست روی Strings window و انتخاب Setup، این که کدام رشته ها به ما نشان داده شوند را کنترل کنیم. در واقع از این جا می توانیم تنظیمات مختلفی که مستقیما با نحوه جستجوی رشته ها توسط IDA مطابقت دارد را تغییر دهیم. پنجره تنظیمات به این صورت است:
می ببینیم که IDA می تواند هر نوع رشته ای را اسکن کند، اما به طور پیش فرض رشته های ۷ بیتی نوع C را اسکن می کند. در تصویر بالا هم می بینیم که حداقل طول رشته برای نمایش در پنجره Strings 5 کاراکتر است . ما معمولا Allowed string types را تغییر می دهیم تا رشته های دیگر را هم اسکن کنیم، اگر این طور فرض کنیم که فایل اجرایی از همه انواع رشته ها استفاده می کند، بهتر هم هست.
گزینه ” display only defined strings ” باعث می شود که IDA فقط رشته های نام گذاری شده را نمایش دهد و بقیه رشته ها را پنهان کند . اگر گزینه “Ignore instructions / data definitions ” را فعال کنیم، IDA رشته ها را در کد و بخش داده های فایل اجرایی هم اسکن می کند. اگر بخواهیم بفهمیم رشته ای در کد واقعی فایل اجرایی وجود دارد یا خیر، این گزینه کمک مان می کند.
پنجره Srtuctures
پنجره Structures، ساختار های داده ای که می توان به صورت با باینری پیدا کرد را فهرست می کند. IDA از توابع و آرگومان های شناخته شده آن ها استفاده می کند تا بفهمد آیا ساختار داده ای در فایل اجرایی وجود دارد یا خیر . در مورد فایل اجرایی معکوس Meterpreter، IDA هیچ ساختاری را در فایل اجرایی پیدا نکرد که می توانید در تصویر زیر ببینید:
هر وقت که IDA ساختاری را پیدا کرد، می توانیم با دو بار کلیک کردن روی آن بررسی اش کنیم . البته، می توانیم ساختار داده ها را در اینترنت هم بررسی کنیم، اما اگر IDA از قبل اطلاعات مورد نیاز را در اختیار ما قرار می دهد، چرا این کار را انجام دهیم!
پنجره Enums
پنجره Enums تمام انواع داده های شمارشی موجود در فایل اجرایی را فهرست می کند . در مورد فایل اجرایی معکوسMeterpreter ، برنامهIDA هیچ نوع داده شمارشی را پیدا نکرد که در تصویر زیر می بینید:
پنجره Segments
پنجره Segments تمام بخش های باینری را فهرست می کند . در مورد Meterpreter معکوس، بخش ها این صورت نمایش داده می شوند:
ما می توانیم چهار بخش را.text ،.idata ، .rdataو .data. در اینجا ببینیم . بخش .data. از آدرس مجازی 0x00401000 شروع می شود و به آدرس مجازی 0x0040C000 ختم می شود. ستون های R/W/X پرچم هایی هستند که معنای شان این است:Read / Write / Execute . بخش متن مجموعه پرچم های Read و Execute را دارد که برای اجرای فایل الزامی است . اگر قسمت .text پرچم Write هم داشته باشد، نگرانکننده خواهد بود؛ زیرا این یعنی احتمالا کد به وسیله ویروس ها و کرم ها تغییر داده شده است.
کد های شناسایی یا Signatures
از این علامت های ویژه برای تعیین کامپایلر مورد استفاده برای فایل اجرایی از طریق مقایسه تعداد زیادی از علامت های خاص کامپایلر شناخته شده با فایل اجرایی فعلی استفاده می شود . IDA سعی می کند تا همه علائم گرفته شده از یکی از فایل های دایرکتوری sigs را استفاده و آن ها را روی فایل اجرایی پیاده سازی کند. نکته مفید در مورد این علائم این است که توابع از قبل شناسایی خواهند شد و ما نیازی به مهندسی معکوس توابع استانداردی که قبلا شناخته شده اند نخواهیم داشت، بنابراین می توانیم بیشتر روی معکوس کردن واقعی خود برنامه تمرکز کنیم . در مورد اجرایی معکوسMeterpreter ، IDA قادر به تعیین کامپایلر مورد استفاده برای کامپایل فایل اجرایی نیست ، بنابراین پیام هشدار زیر نمایش داده می شود:
ما می توانیم روی دکمه Add Signature Now کلیک کنیم تا علائمی که می خواهیم به زور روی فایل اجرایی اعمال شوند را انتخاب کنیم . لیستی از ماژول های کتابخانه موجود را می شود در تصویر زیر مشاهده کرد:
حتما دانلود کنید: آموزش سی پلاس پلاس
کلام آخر
IDA Pro یک دی اسمبلر بسیار خوب است که باید در هر سناریوی مهندسی معکوسی استفاده شود . ما با پنجره های اصلی که IDA Pro استفاده می کند آشنا شدیم و آن ها را روی فایل اجرایی معکوس Meterpreter معرفی کرده ایم. اگر می خواهید که به IDA Pro مسلط شوید، بهتر است قبل از رفتن به مراحل پیشرفته تر، مطالب ارائه شده در این مقاله را کاملا درک کنید.