
فرض کن پلیس مخفی هستی. یک مظنون داری که خیلی باهوش است. از هر دری وارد بشوی، برایت حرف میزند – اما نه حقیقت، بلکه چیزی که تو دوست داری بشنوی.
خسته کننده است، نه؟
بدافزار هم دقیقاً همین است: یک مظنون حرفهای.
وقتی یک بدافزار را باز میکنی، اول با زبانهای سطح بالا مثل C++، پایتون یا
جاوا روبهرو میشوی. این زبانها خیلی خوشگل و مرتب حرف میزنند: «اگر کاربر این دکمه را زد، آن فایل را پاک کن». به نظر درست میآید. اما
بدافزار عاشق این است که پشت این حرفهای قشنگ، چیزهای دیگری قایم کند.
به همین دلیل است که من، به عنوان تحلیلگر بدافزار، حرف آخر را به اسمبلی میزنم. اسمبلی زبانی است که نه «اگر» دارد، نه «اما»، نه «شاید». فقط واقعیت.
بیا خیلی ساده بگویم. کامپیوتر در عمیقترین لایهاش، فقط یک مشت کلید برق است که روشن یا خاموش میشوند. صفر و یک. پردازنده (CPU) هم یک کارگر بیسواد است – فقط چند دستور بسیار ساده را بلد است:
«یک عدد را از جایی به جایی دیگر کپی کن»
«دو عدد را با هم جمع کن»
«اگر این عدد صفر بود، برو به خط ۱۰»
به این دستورهای خیلی ساده میگویند دستورهای اسمبلی.
هر چیز دیگری – مرورگر اینترنت، بازی، ویندوز، حتی همان بدافزار – در نهایت به همین دستورهای ساده تبدیل میشود. مثل این است که تمام کتابهای دنیا با ۲۶ حرف الفبا نوشته شده باشند. اسمبلی همان الفبای کامپیوتر است.
حالا فرقش با زبانهای دیگر (مثل پایتون) چیست؟
زبانهای سطح بالا مثل یک مترجم حرفهای حرف میزنند: «با احترام، جناب پردازنده، خواهشمند است اگر کاربر رمز عبور را درست وارد کرد، سطح دسترسی او را تغییر دهید».
اسمبلی اما خودش فریاد میزند:CMP EAX, 1234 (ببین عدد داخل ثبات EAX برابر 1234 هست؟)JE GrantAccess (اگر آره، بپر به آن بخش)
هیچ ادبیاتی نیست. هیچ تعارفی نیست.
دروغ در دنیای نرمافزار یعنی پنهان کردن قصد واقعی.
یک بدافزار میتواند در کد C خود بنویسد:
if (is_debugger_present()) { printf("Hello World"); } یعنی: «اگر دیباگر (ابزار تحلیل) هست، فقط بنویس سلام».
اما وقتی به اسمبلی این کد نگاه میکنی، میبینی که آن printf("Hello World") در واقع یک تابع دیگر را صدا میزند که سیستم را هک میکند. یا میبینی که قبل از آن if، یک دستور xor eax, eax (صفر کردن EAX) وجود دارد که باعث میشود شرط اصلاً درست از آب درنیاید – یعنی بدافزار به تو میگوید «هیچی نیست»، در حالی که همه چیز هست.
در اسمبلی، هیچ چیز نمیتواند پنهان بماند. نه تابع، نه شرط، نه حتی یک بایت از داده. چون تو مستقیم میبینی که پردازنده دقیقاً چه قرار است بکند.
بگذار یک مثال واقعی بزنم (ساده شده):
فرض کن یک بدافزار میخواهد یک فایل را پاک کند. در زبان C، اینطور نوشته میشود:DeleteFile("C:\important.dat");
اما بدافزار باهوش این خط را طوری مینویسد که در نگاه اول اصلاً معلوم نباشد. مثلاً اسم فایل را تکه تکه میکند، با عملیات ریاضی روی هم سوارش میکند، بعد صدا میزند DeleteFile.
در C، برای فهمیدن این فریب باید چندین خط کد را در ذهنت اجرا کنی. اما در اسمبلی، تو مستقیماً میبینی که دستور push اسم فایل را به پشته میفرستد و بعد call یک تابع خاص. مثل این است که تو در حال تماشای یک جادوگر هستی، اما پشت صحنه را میبینی. دیگر جادویی وجود ندارد.
میدانی چرا به این «قدرت لخت» میگویم؟ چون اسمبلی لباس ندارد. نه کتوشلوار کلاسها میپوشد، نه روسری توابع کتابخانهای. عریان است. درست مثل یک اسکلت که همه استخوانهایش پیدا هستند.
ما تحلیلگرها، وقتی با بدافزار روبهرو میشویم، در واقع میگوییم: «لباسهات رو در بیار. میخوام ببینم واقعاً چی هستی».
بیشتر زبانها به بدافزار اجازه میدهند که دروغ بگوید. مثلاً بگوید «من فقط یک ماشینحساب سادهام» – در حالی که در حافظه، یک Rootkit کامل جاسازی کرده. اسمبلی اما مثل یک آینه تمامقد است. هرچه هست، نشان میدهد.
این صداقت، گاهی زشت است. گاهی میبینی که بدافزار با دستور MOV دارد بایتهای یک رمز عبور را از روی حافظه میدزدد. زشت است. اما راست است. و راستی، در کار من، از زیبایی مهمتر است.
اگر هیچی از برنامهنویسی نمیدانی و خواستی شروع کنی، نرو سراغ اسمبلی اول. برو پایتون ببین. اما بدان که هر چقدر هم در زبانهای سطح بالا ماهر بشوی، هیچکدام به اندازه اسمبلی به تو «حقیقت مطلق» نمیدهند.
یک تحلیلگر بدافزار خوب، مثل یک جراح است. جراح وقتی شکم بیمار را میبُرَد، دیگر به لباسهای قشنگ نگاه نمیکند. او میخواهد قلب را ببیند. اسمبلی همان چاقوی جراحی است.
و جالب است که خود بدافزارها هم همین را میدانند. بدافزارهای حرفهای، بیشتر کد مخرب خود را مستقیماً با اسمبلی مینویسند یا در آخرین مرحله، کد C خود را آنقدر پیچیده میکنند که فقط در سطح اسمبلی قابل خواندن شود. یعنی دشمن هم میداند که حقیقت فقط در این زبان لخت پیدا میشود.
پس اگر روزی خواستی بدانی یک فایل واقعاً چه کاره است، به مترجمهای قشنگ و خوشکلام اعتماد نکن. برو سراغ الفبا.
برو سراغ اسمبلی.
این مقاله را یک تحلیلگر بدافزار نوشته که هزاران ساعت به دستورهایی مثل
MOV،JMPوCMPخیره شده. راستی را ترجیح میدهم، حتی اگر لخت و بیپرده باشد.
لینک دونیت (البته اگه مقدور بود) : https://daramet.com/R3v3rse