تحلیل بد افزار با استفاده از نرم افزار Ida Pro

۱‌     مقدمه

تحلیل بدافزار معمولا به دو روش ایستا و پویا انجام می شود. در روش پویا، بدافزار اجرا شده و رفتارش تحلیل می ­شود. اما در روش ایستا، تحلیلگر فایل اجرایی بدافزار را با استفاده از تکنیک های مهندسی معکوس نرم افزار و بدون اجرای برنامه، تحلیل می کند. تمرکز این مقاله آموزشی صرفا بر روی روش ایستا و معرفی مهم ­ترین ابزار مورد استفاده در آن، یعنی نرم ­افزار Ida Pro است. در ادامه به صورت مختصر به معرفی این برنامه و امکانات مفید آن در تحلیل بد­افزار می­ پردازیم.

۲‌     تحلیل ایستای بدافزار

در روش ایستای تحلیل بدافزار، تحلیلگر فقط کد برنامه را بررسی می­ کند و به هیچ وجه فایل مخرب را اجرا نمی­ کند. حال این سوال پیش می­ آید که آیا کد منبع (source code) برنامه­ ی مخرب همیشه در دسترس است؟ پاسخ این سوال منفی است. بدافزار­هایی که شناسایی می­ شوند، غالبا به صورت فایل اجرایی بوده و دسترسی ­ای به کد آنها وجود ندارد. فلذا تحلیلگر ناچار است برای فهمیدن ساختار و نحوه­ ی کارکرد بد­افزار، فایل اجرایی آن را تحلیل کند. از آن­جایی که این فایل به زبان ماشین است و برای انسان قابل فهم نیست، لازم است از تکنیک ­هایی برای رسیدن به ساختار و کد اصلی برنامه استفاده شود. یکی از این تکنیک­ ها استفاده از برنامه هایی است که اطلاعاتی را در مورد ساختار فایل اجرایی برای ما فراهم می­ کنند. برای مثال نرم افزار Peid در مورد فایل­ های اجرایی ویندوز با فرمت (PE (Portable Executable اطلاعات خوبی فراهم می­ کند که دانستن آنها قبل از تحلیل کد برنامه بسیار مفید است. اینجا به جزییات بیشتری در این مورد نمی ­پردازیم، اما یک تحلیلگر بدافزار لازم است که ساختار فایل­ های PE را به خوبی بشناسد.

بعد از شناسایی اولیه ی فایل، نوبت به تحلیل کد برنامه می رسد. همانطور که می ­دانیم، وقتی برنامه ­ای با یکی از زبان­ های سطح بالا نوشته می ­شود، برای اجرا روی کامپیوتر، لازم است توسط کامپایلر یا مفسر به زبان ماشین ترجمه شود و در واقع به دستورالعمل­ های ساده ­ای که برای cpu قابل فهم باشند، تبدیل شود. این دستورالعمل ­ها (upcode) معادل دستورات زبان اسمبلی هستند. به این معنا که می توان به راحتی آن­ها را به دستورات معادل اسمبلی­ برگرداند. به این کار دیس اسمبل کردن می ­گویند که باعث می­ شود کد پیچیده­ ی زبان ماشین برای انسان قابل فهم (human readable) شود و بتوان آن را تحلیل کرد. برای این کار ابزارهای مختلفی وجود دارد. حتی ویندوز هم این امکان را فراهم می کند. برای دیس اسمبل کردن یک برنامه در ویندوز می توان از دستور dumpbin  در خط فرمان ویندوز استفاده کرد. جزییات دقیق تر در این باره را می­ توانید در MSDN مشاهده کنید.

۳ Ida Pro

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

  • داشتن رابط گرافیکی قدرتمند با امکانات بی شمار نظیر چندین پنجره که اطلاعات مفیدی فراهم می کنند.
  • نمایش گرافیکی جریان برنامه با ابزار­هایی مثل گراف و فلوجارت
  • شناسایی بسیاری از کتابخانه ­های فراخوانی شده و نوع داده ها
  • راحت تر کردن تحلیل با امکاناتی نظیر اضافه کردن کامنت، تغییر نام متغیر­ها و توابع و ...
  • جدا کردنsection  های برنامه از هم و همین طور تشخیص کد کاربر از سایر کدهای اضافه شده به برنامه
  • امکان دیباگ برنامه و تحلیل پویای بدافزار به همراه نمایش محتوای سگمنت ها، پشته و ...
  • امکان پرش(jump) در بین کدها و جستجوی قدرتمند
  • پشتیبانی از ۶۴ بیت
  • امکان افزوردن پلاگین به برنامه

در ادامه برای آشنایی با امکانات و نحوه ­ی کار با این نرم ­افزار، از یک مثال ساده استفاده کرده و برخی از ابزار­های مفید Ida را معرفی می­ کنیم.

کد زیر یک رشته را از کاربر دریافت می ­کند. آن را با کلمه­ ی عبور مقایسه کرده و به کاربر پاسخ می دهد:

int _tmain(int argc, _TCHAR* argv[]‎)

{

#define password ‪"ApaRazi"‬

int aa=11;‎

char pwd[100]‎;‎

printf(‪"Please enter the password:\n"‬);‎

scanf("%s", pwd);‎

if ( strcmp‪(pwd, password)‬ == 0 )

printf(‪"Congratulation!‎\n"‬);‎

else

printf(‪"Wrong password"‬);‎

return ۰;

}

 

این برنامه را با visual studio MS کامپایل کرده و سپس فایل اجرایی (.exe) آن راIda Pro  دیس اسمبل کرده ­ایم که در تصویر۱ قابل مشاهده است. این تصویر پنجره ­ی IDA View را نشان می­ دهد که شامل کد­های اسمبلی است. پنجره­ ی دیگری هم به نامHEX View  وجود دارد که کد­ها را به زبان ماشین و به صورت هگز نمایش می ­دهد.

سمت چپ تصویر، section برنامه و آدرس حافظه را نشان می ­دهد. سمت راست هم کد اسمبلی برنامه است. در ابتدای باز کردن فایل اجرایی، Ida نقطه­ ی ورود برنامه (entry point) را به ما نشان می­ دهد که همانطور که در تصویر پیداست، تابع main نیست. بلکه رویه­ ی start است که قبل ازmain  اجرا می ­شود.

شکل ۱ رویه ی start در پنجره ی IDA view

تصویر۲ بخشی از تابع main برنامه را نشان می دهد. Ida Pro نمی تواند نام توابع را برگرداند اما این امکان را به ما می دهد که بعد از شناسایی تابع، نام دلخواهمان را روی آن بگذاریم. در این مثال با شناسایی main نام آن را تغییر داده ایم (با کلیدn).

شکل ۲ تابع main در پنجره ی IDA view

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

۱.۳   نوار راهنمای رنگی
برای تشخیص نوع کدها می توان از نوار راهنمای Ida استفاده کرد. در هر کجای برنامه که باشیم، این نوار رنگی به ما کمک می کند نوع کدها را از هم تشخیص دهیم. همانطور که در تصویر۳ مشاهده می شود، با رفتن به قسمت های مختلف کد، فلش زرد رنگ روی نوار راهنما حرکت کرده و رنگ متناظر با آن را نشان می دهد. هر کدام از رنگ ها معرف کد خاصی است:
    آبی روشن : توابع کتابخانه¬ای
    قرمز: کدهای ایجاد شده توسط کامپایر
    آبی تیره : کدهای کاربر
    صورتی : کدهای وارد شده به برنامه (imported)
    خاکستری : داده های تعریف شده
    قهوه ای : داده های تعریف نشده

شکل ۳ نوار راهنمای رنگی

این رنگ بندی ها در آدرس دهی سمت چپ دستورات هم قابل مشاهده است. برای مثال در تصویر ۴ زیر از رنگ قهوه ای برای نمایش داده های تعریف نشده و رنگ خاکستری برای داده های تعریف شده استفاده شده است.

شکل ۴ رنگ بندی آدرس های حافظه

 

۲.۳    نمایش گرافیکی جریان برنامه
یکی دیگر از امکانات مفید Ida، نمایش گرافیکی جریان برنامه است. همانطور که در تصویر۵ قابل مشاهده است، از منوی view می توان به این ابزار دسترسی داشت.

شکل ۵ دسترسی به ابزارهای گرافیکی از طریق منوی view

 

تصویر۶ فلوچارت تابع main را نشان می دهد. این ابزار خوانایی و درک کدها را بسیار بالا می برد.

شکل ۶ فلوچارت تابع main برنامه

تصویر۷ گراف فراخوانی های توابع را نشان می دهد. همانطور که در تصویر پیداست، با این ابزار به راحتی می توان توابع برنامه و فراخوانی های سیستمی را شناسایی کرد. هم چنین می توان تابع main را در برنامه پیدا کرد. در این مثال، main توابعی مثل printf یا scanf را فراخوانی کرده است.

 

شکل ۷ گراف فراخوانی های توابع

۳.۳ پنجره های راهنما

یکی دیگر از امکانات مهم Ida Pro، پنجره های مفید آن است که اطلاعات بسیار خوبی برای تحلیلگر فراهم می کند. در ادامه تعدادی از آنها را معرفی می کنیم.

·         پنجره رشته­ ها

این پنجره تمام رشته­ های به ­کار­ رفته در برنامه را نمایش می­ دهد. همانطور که در تصویر۸ پیداست، حتی پسورد برنامه را هم می ­توان مشاهده کرد.

 

شکل ۸ پنجره ی رشته ها

·         پنجره نام ها

این پنجره نام ­های موجود در برنامه و آدرس آن­ها را نمایش می ­دهد. در تصویر۹ تعدادی از این نام­ ها قابل مشاهده است. علائمی که کنار نام ­ها وجود دارد، نشان دهنده­ ی نوع آن­ها هستند. برای مثال، f نشانگر توابع (functionA رشته ­ها و D داده­ های تعریف شده ­است.

شکل ۹ پنجره ی نام ها

·         پنجره توابع

این پنجره، نام توابع به­ کار­ رفته در برنامه دیس ­اسمبل شده را لیست کرده و اطلاعاتی در مورد آدرس شروع، طول و آرگومان­ های آنها فراهم می­ کند. در تصویر۱۰ نام برخی از توابع موجود در برنامه قابل مشاهده است.

شکل ۱۰ پنجره ی توابع

دریافت نسخه PDF: