تحلیل بد افزار با استفاده از نرم افزار 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 نشانگر توابع (function)، A رشته ها و D داده های تعریف شده است.
شکل ۹ پنجره ی نام ها
· پنجره توابع
این پنجره، نام توابع به کار رفته در برنامه دیس اسمبل شده را لیست کرده و اطلاعاتی در مورد آدرس شروع، طول و آرگومان های آنها فراهم می کند. در تصویر۱۰ نام برخی از توابع موجود در برنامه قابل مشاهده است.
شکل ۱۰ پنجره ی توابع