استفاده از یک تکنیک آنتی دیباگ و شیوه دور زدن آن

پس از مدت ها مجددا مشغول شدم به نوشتن امیدوارم این سلسله مقالات برای مبحث آنتی دیباگ رو ادامه بدم این مباحث بیشتر بدرد رد تیمر ها و افرادی که تحلیل بدافزار و همینطور برای برنامه نویسان هم مفید خواهد بود بنظرم چون احتمالا برنامه نویس ها و افرادی که شناختی از اینجور مباحث ندارند هم بخونن یک توضیح کلی بدم در مورد اهمیت آنتی دیباگ و مهندسی معکوس بگم :دوستان وقتی شما یک برنامه مینویسید و بعنوان مثال اون برنامه یک لایسنس داره افرادی که مهندسی معکوس کار میکنن در تلاش هستن اون لایسنس رو بدون اینکه تهیه کنند، اون مکانیزم رو چک کردن لایسنس رو دور بزنند یا بدست بیارند یا حتی تولید کنند :)و (همیشه هم به این اسونی ها نیست این مراحل بگذریم...). حالا بستگی به هدف اون شخصی که داره فرایند مهندسی معکوس رو انجام میده داره بعنوان مثال ممکنه برنامه شما رو کرک کنه و اون بخش چک کردن لایسنس رو دور بزنه یا بیاد برنامه شمارو با استفاده از دیباگر بررسی کنه و اون مکانیزم تولید لایسنس رو متوجه بشه و بینهایت سریال درست کنه که صد البته این فرایند به این اسونی ها نخواهد بود و لازم به ذکره بگم مهندسی معکوس در کرک خلاصه نمیشه و شاخه های مفید تر نسبت به کرک وجود داره مثل تحلیل بدافزار یا امنیت نرم افزار و توسعه اکسپلویت و... که این مثالی برای برنامه نویسان نرم افزار هست که به راحتی متوجه مهم بودن این مباحث بشوند و لازم به ذکره در همه جای دنیای (بجز ایران ) اینکار جرم محسوب میشه و بنظرم خودمم هر وقت این همه شاخه خوب و لذت بخش هست چرا کرک ؟؟؟ بگذریم! .همین مباحث و تکنیک هارو توسعه دهندگان بدافزار استفاده میکنند در بدافزار هایی که مینویسند برای اینکه فرایند مهندسی معکوس رو دشوار کنند برای تحلیل گران بدافزار (البته این تکنیکی که دارم در موردش مینویسم تکنیک ابتدایی هست )بعنوان مثال ممکنه توسعه دهنده بدافزار خودشون از مجموعه تکنیک های آنتی دیباگینگ استفاده کنند یا یک پکر رو کاستوم میکنند و به آن پکر مکانیزم هایی مانند آنتی دیباگ و آنتی VMو... اضافه میکنند. فکر میکنم همینقدر کافی باشهاولین روش برای شناسایی دیباگر استفاده از تابع IsDebuggerPresenthttps://learn.microsoft.com/en-us/windows/win32/api/debugapi/nf-debugapi-isdebuggerpresent(نمیدونم چرا هر وقت دارم مقاله مینویسم یک مشکل برای سیستم پیش میاد با تشکر از امیر دوست عزیز برای کامپایل کردن فایل? )دوستان منو میشناسن خیلی به زبان Cو اسمبلی ارادت دارم برای همین من با سی مینویسم این برنامه کوچک رو ،در مقاله بعدی احتمالا رو سی شارپ هم پیاده سازی کنیم :) بستگی به بازخورد شما داره?این تابع در هدر debugapi.h هست و مقداری که این تابع بر میگردونه (ریترن ولیو)از نوع boolهست مثلا اگه 1 رو برگردونه یعنی برنامه با استفاده از یک دیباگر در حال اجرا هست اگه 0 باشه یعنی برنامه در حالت عادی داره اجرا میشه و بعدش اومدیم یک شرط گذاشتیم، اگه متغییر check_debug مقدارش trueبود چاپ کنه "دیباگر شناسایی شد" و برنامه متوقف میشه در غیر این صورت چاپ میکنه "دیباگر شناسایی نشد" خب این شیوه پیاده سازیش بود حالا بریم سراغ نحوه دور زدنش?من اینجا از ابزار idaاستفاده میکنم برای دیس اسمبل کردن ولی خب شما میتونید از ابزار دیگه ایی هم استفاده کنید(من یک idaفن هستم?)خب ببینید بعد اینکه اینکه تابع IsDebuggerPresent فراخوانی میشه مقدار برگشتی داخل EAXیا RAXقرار میگیره و بعدش test eax,eaxکه خلاصه بگم یعنی Logical AND این instruction بر روی فلگ ZFتاثیر میزاره (روی فلگ های دیگه ایی هم تاثیر میزاره ولی من نمیگم تا گیج نشید)و بعدش jzرو میبینیم که به معنای این هست اگه ZFست شد بپر اگه ست نشده بود که هیچی نپر(اینجا من قصد ندارم اسمبلی یاد بدم)میبنید که در حالت عادی برنامه شناسایی کرد که ما داریم دیباگش میکنیمخب خب بریم حالا بایپسش کنیم،چند راه داره برای دور زدنش ولی خب ساده ترینش اینه پرش کنه در هر حالتی بپریم(از اینستراکشن jmp استفاده کنیم) یا میتونیم ZFرو دستی ست کنیم و...من اومدم اون jzرو تبدیل به jmpکردم بایپس کردیم و برنامه تشخیص نداد نکته: پلاگین هایی هستن که اینکار هارو بصورت اتومات انجام میدن خواستید میتونید سرچ بزنید.سخن پایانی : تکنیک های زیادی برای مبحث شناسایی دیباگر وجود داره که من اگه عمری بود انشا الله در آینده مقالات بیشتر در زمینه REو.. مینویسم و شیوه پیاده سازی و همینطوری شیوه دور زدنش.کانال من در تلگرام : @cafe_security