بررسی قرارداد فراخوانی توابع در برنامههای ۳۲بیتی
در این ویدئو که بخشی از یکی از کلاسهایم است، در مورد قراردادهای مختلف فراخوانی توابع در برنامههای ۳۲بیتی صحبت کرده و در یک برنامهی ساده شیوهی انجام آنها را نمایش میدهم.
این فراخوانیها عبارتند از: STDCALL، CDECL و FASTCALL
مدل STDCALL از stack برای انتقال پارامترهای تابع استفاده کرده و در آن تابعی که فراخوانی شده است(Callee) پس از اتمام، پارامترها را از روی stack حذف میکند. این مدل در اکثر توابع WinAPI مورد استفاده قرار میگیرد.
مدل CDECL مشابه STDCALL است ولی در آن تابعی که فراخوانی را انجام میدهد(Caller) پاکسازی stack را بر عهده دارد. این مدل در توابع C/C++ پیشفرض بوده و در لینوکس نیز از آن استفاده میشود.
مدل FASTCALL همانطور که از نامش پیداست، با استفاده از رجیسترها برای انتقال آرگومانهای تابع «البته فقط دو پارامتر اول با رجیستر ارسال شده و مابقی از طریق stackارسال میشوند» سعی در سرعت بخشیدن به اجرا دارد. پاکسازی stack در صورت نیاز، مشابه STDCALL توسط تابع فراخوانی شده(Callee) انجام میشود.
درک جزئیات اجرای توابع در وظایف مختلفی از برنامه نویسی تا تحلیلهای امنیتی میتواند مفید باشد که امیدوارم پس از مشاهدهی این ویدئو بخشی از این امر حاصل شود.
لینک ویدئو در یوتیوب:
https://youtu.be/DnsXPahdI4c
لینک ویدئو در آپارات:
https://aparat.com/v/D5hB8
#ShortWinInternals #windows #internals #CallingConventions #x86 #stdcall #cdecl #fastcall #programming #cpp
Post #108
4.1K