روابط عمومی شرکت ایدکو (توزیع کننده محصولات کسپرسکی در ایران)؛ هر چند وقت یکبار درخواستی دریافت میکنیم که ما را به فکر فرو میدارد. ابزارهای موجود معمولاً کفاف این نوع درخواستها را نمیدهد و درست در همین نقطه است که باید برای حل این «مشکل» ابزارهای سفارشی و مخصوص به خود را بسازیم. یکی از همین درخواستهایی که خدمتتان گفتیم برایمان اوایل سال 2018 پیش آمد، وقتی که یکی از مشتریانمان –یک مؤسسهی مالی- از ما خواست تا برایش نمونهای را تحلیل کنیم. این مسئله به خودیِ خود چیز نامعمولی نیست- ما همیشه درخواستهایی از این قِسم دریافت میکنیم- اما آنچه در مورد این درخواستِ بخصوص عجیب بود این بود که نمونهی مذکور مبتنی بر هاربر[1] (Harbour) نوشته شده بود.
هاربر در حقیقت یک زبان برنامهنویسی طراحیشده توسط آنتونیو لینارز است که اولین بار در سال 1999 عرضه شد. این زبان برنامهنویسی بر اساس سیستم قدیمی Clipper بوده و در اصل به منظور ساخت برنامههای پایگاه اطلاعاتی مورد استفاده قرار میگیرد.
درک داخلیهای هاربر
بگذارید از تستهای مخزن هاربر عبارت «سلام، دنیا» یا همان Hello, world را به عنوان نمونهای مد نظر قرار دهیم- hello.prg.
هاربر، پیام Hello, world را به داخلی پرینت میکند. برای انجام این کار شما میبایست جهت اجرای کد یک باینری هاربر بسازید (همچنین راههای دیگری هم برای اجرای آن بدون ساخت باینری وجود دارد اما ما این روش را از این جهت برگزیریم چون نمونهی دریافتشدهی یک فایل قابلاجرا بود).
کامپایل کردن درست مثل تماس گرفتن آسان است:
hbmk2.exe hello.prg
این فرمان کد C را تولید و کد C را در فایل قابلاجرای نهایی کامپایل خواهد کرد. کد C تولید شده برای hello.prg را میتوان در شکل 2 یافت.
شما میتوانید مشاهده کنید که تابع MAIN تابع ماشین مجازی هاربر (HVM) را با این پارامترها شروع کرده است: یکی pcode، دیگری کد از پیش کامپایلشدهی هاربر و در ادامه نمادها که توسط ماکرویی متفاوت بالای تابع MAIN تعریف شدهاند. همانطور که میتوانید تصور کنید، pcode (کد پرتابل) حاوی دستوراتی است که HVM تفسیرشان میکند. شما میتوانید در لینک زیر توضیح رسمی این pcode را پیدا کنید.
https://github.com/harbour/core/blob/master/doc/pcode.txt
بعد از اینکه برنامهی C کامپایل شد (در اینجا این برنامه توسط MINGW انجام شده است)، ما تقریباً همان ساختارها را در داخلش نیز پیدا میکنیم: جدول نماد و pcode (شکل 3 و 4 به ترتیب).
پروسهی دیکامپایل[2]
بیایید برگردیم به نمونهمان. اکنون میدانیم که باید در فایل قابلاجرا به دنبال pcodeها و نمادها باشیم و ببینیم کدام opcodeها به کدام دستور تعلق دارد. اگر این کار را انجام دهیم، میتوانیم تا حدی ساز و کار این برنامه را درک کنیم. همانطور که ممکن است حدسش را زده باشید تا به حال ابزاری با چنین کارایی به این راحتیها قابلدسترسی نبوده است. بنابراین، ما خود برای ساخت آن آستین بالا زدیم.
هدف دیکامپایلرِ ما این است که bytecode بتواند به دست انسان خوانده شود. ما انتخابمان این بود که شبهکدِ حاصله را در همگذار[3] با C ترکیب شود (هنوز این خوانش در بعضیجاها سخت میشود اما برای مقاصدی که مدنظر داشتیم قابلخواندن بود).
شکل شماره 5 هم نشان میدهد هاربری کامپایلر مبتنی بر ماشین پشتهای[4] است.
اولین آرگومان فشار[5]، نام تابع است که بعدِ آن متغیرها با فشار جاگذاری شده و به تعاقبشان نیز فرمان call 1 میآید. درست در همینجاست که 1 میشود عددِ تابع پارامترهایی که قرار است پاپآپ شوند.
بنابراین خطوط فوق میتوانند در شبهکد C اینچنین تفسیر شوند:
QOUT("Hello, world!");
امیدواریم این دیکامپایلر تحلیل نمونههایی که به زبان هاربر نوشته شدهاند را کمی آسانتر کرده باشد.
[1] هاربر در واقع یک نرمافزار رایگان و باز چند پلتفرمه، چند رشتهای، اوبژه-محور و یک زبان برنامهنویسیِ قابل اسکریپت کردن است که به طور وارونهای با زبانهای xBase سازگاری دارد. هاربر شامل یک کامپایلر و آرشیوهای رانتایم (زمان اجرا) به همراه رابط کاربری چندگانه، پایگاه اطلاعات و یکاندهای I/O، سیستم سازهای خودش و نیز مجموعهای از آرشیوها و بایندینگها (برای APIهای محبوب) میشود.
[2] Decompiler، کد برنامه را که در سطح پایینی از انتزاع قرار دارد (معمولاً طراحی شدهاند که رایانه آن را بخواند) را به شکلی تبدیل میکند تا سطح بالایی از انتزاع داشته باشد (معمولاً طراحی شدهاند که انسان آن را بخواند).
[3] assembler
[4] Stack machine، یک کامپیوتر واقعی یا شبیهسازی شدهاست که به جای استفاده از ثباتهای تکی، از یک پشته برای ارزیابی زیردستورها در برنامه استفاده میکند.
[5] push argument
منبع: کسپرسکی آنلاین (ایدکو)
کسپرسکی اسم یکی از بزرگترین شرکتهای امنیتی و سازنده آنتی ویروس است که برخی از کاربران اشتباهاً این شرکت و محصولات آنتی ویروس آن را با عناوینی نظیر کسپرسکای،کاسپرسکی، کسپراسکای، کسپراسکای، و یا کاسپراسکای نیز میشناسد. همچنین لازم به ذکر است مدیرعامل این شرکت نیز یوجین کسپرسکي نام دارد.