راههایی برای شناسایی دیباگرها



  • راههایی برای شناسایی دیباگرها


  • در ادبیات مرسوم مباحث مرتبط با امنیت نرم افزار ، دیباگر ، نرم افزاری است که امکان بررسی دقیق روند اجرای یک برنامه اجرائی یا کتابخانه (Dll) یا درایور را فراهم میکند و در این روند ، کنترل کامل و جزئی حافظه ، متغیرها و توابع ، تراکنشهای پردازنده و حافظه و دیسک و ... و ارتباط با کتابخانه های اشتراکی در اختیار دیباگر میباشد .

    دیباگر برنامه اجرائی یا کتابخانه یا درایور را با ترتیباتی قابل پیکره بندی فراخوانی میکند ، به توسعه گر یا آزمایش کننده این امکان را میدهد که در مواقع به خصوصی روند اجرا را متوقف یا منوط به وقوع اتفاق خاصی نماید ، یا حافظه را برای کشف مقدار یا مقادیر به خصوصی جستجو کند یا تراکنشهای برنامه با کتابخانه های همراه ، کتابخانه های سیستم عامل ، سخت افزارهای همراه و ...را کنترل نماید . در واقع وظیفهء اصلی یک دیباگر کنترل کامل فرآیند اجرا شدن یا فراخوانی شدن یک برنامه یا کتابخانه اشتراکی است . اطلاعاتی که میتوان با استفاده از دیباگرها بصورت معمول بدست آورد :
    • هر آنچه بین نرم افزار و حافظه اتفاق می افتد . آدرس دهی متغیرها و توابع ، جایگزینی مقادیر ، تخصیص حافظه و آزاد سازی ، محل دستورات زبان ماشین در حافظه ، داده های در حال ارسال به پردازنده و ...
    • وضعیت لحظه به لحظهء پردازنده ؛ محتویات رجیسترها و ...
    • هر آنچه بین نرم افزار و کتابخانه هائی که از آن تغذیه میکند واقع میگردد . فراخوانی توابع ، کلاسها یا اشیاء ؛ آدرس کتابخانه ها و توابع مربوطه در حافظه و ...


  • عموم دیباگرهای متداول غیر از موارد فوق اطلاعات متنوع دیگری را نیز فراهم میکنند که بسته به مورد و نوع کاربرد متفاوت هستند .

    انواع دیباگر ها از دید لایهء کاربرد :
    • Application Mode

    • Kernel Mode

  • دیباگرهای Source Code Level با استفاده از سورس کد برنامه ، وظایف مذکور رو کنترل و بررسی میکنند و عموما" هنگام توسعهء یک نرم افزار ، به خطا یابی یا ایجاد روندهای کنترل خطای منطقی کمک بسیاری میکنند . مثل دیباگر ویژوال بیسیک

    اما دیباگرهای Assembler Level بدون استفاده یا نیاز به سورس کد و صرفا" با داشتن نسخهء باینری ، وظایفشون رو انجام میدهند . امکان کنترل کد ، در سطح Assembler وجود دارد یعنی فرضا" میتوانید روی دستوری مانند Call یا Test یا Mov برنامه مورد نظر یک BreakPoint بگذارید .

    دیباگرها اولین وسیله مورد استفاده نفوذگران نرم افزاری (کرکرها) است فلذا روتین های آنتی دیباگ همیشه یکی از عناوین مطرح در روشها و ابزارهای حفاظت از نرم افزار هستند . این روتینها عموما" از این روشها برای شناسائی دیباگر استفاده میکنند :
    • استفاده از مشخصات فردی دیباگر : نام پرسه ، مشخصات ثبت شده در رجیستری ، مولفه های هدر و ...

    • بررسی حافظه مجازی اختصاص یافته به برنامه و تست وجود دیباگر( Hook آدرس یا Hook آدرس توابع دیباگ ویندوز و بررسی وجود پوینتر به آنها یا عدم وجود آن)

    • بررسی پردازنده ( مخصوص روتین های Ring0 )

  • اما برای تمامی این Trick ها و روشهائی که از هر کدام منشعب میشود ، نیز ، بالتبع روشهای متقابلی وجود دارد ؛ در مجموع چیزی به عنوان متوقف کردن قطعی همه دیباگر ها منطقا" غیر ممکن است ؛ بهترین روتینهای موجود که هر کدوم با مدتها تحقیق و بررسی ارائه شده اند در کمترین زمان ممکن by Pass شده اند . استفاده از روتین های آنتی دیباگ برای حفاظت از نرم افزار روش مناسبی برای "کند تر کردن" فعالیت نفوذگران تازه کار تر است ، نه چیزی بیشتر .

    همانطور که گفته شد ، یکی از راههای Crack یک نرم افزار استفاده از ابزارهای Debugger برای دسترسی به نحوه اجرای یک exe و احیانا تغییر روند اجرای exe می باشد که برای جلوگیری از این کار لازم است که کدهای Anti Debug را به کد برنامه اضافه کرد. این کار معمولا توسط یک پروتکتور مناسب به فایل (exe یا dll) شما اضافه می شود.

    کاری که یک پروتکتور می تواند با فایل شما انجام دهد، Compress کردن، Pack کردن و Encrypt کردن فایل می باشد.

    یک پروتکتور علاوه بر اضافه کردن کدهای آنتی دیباگ که نقش خیلی مهمی برای جلوگیری از کار کرکر دارد، فایل شما را با الگوریتم های خاصی encrypt هم می کند به گونه ای که به راحتی و مخصوصا توسط ابزارهای رایج کرک، قابل فهم نباشد. و همچنین compress کردن و فشرده نمودن فایل هم می تواند از کارهایی باشد که پروتکتور بر روی فایل شما انجام می دهد.

    Compressor یا فشرده ساز ، ابزاری برای کاهش حجم فایلهای [عموما"] اجرائی است که کمک میکند سایز و اندازهء فایل ، روی دیسک یا اصطلاحا" Disk Image کوچکتر بماند ؛ کمپرسور مشخصا" یک ابزار امنیتی نیست . اغلب توسعه گران از کمپرسورها برای کاهش حجم فایلهای اجرائی غول پیکر برنامه هایشان استفاده میکنند

    کمپرسورها منطق ساده ای دارند . یک برنامهء فوق العاده کوچک که برنامهء اصلی را [ که قبلا" فشرده شده و فرضا" بصورت یک ریسورس به آن لینک شده] مجددا" به یک فایل باینری/اجرائی "روی حافظه" مبدل می کند و شاید در نگاه اول بسیاری از مشخصه های برنامه اصلی رو به نوعی از دید بررسی کنندگان مخفی می کند ؛ اما در واقع ، آنچه اجرا می شود ، نسخهء کامل برنامهء اصلی ، روی حافظه است ؛ شاید کمپرسور بتواند یک برنامهء حجیم را کوچکتر کند و کمی از هارد دیسک چهل گیگابایتی شما را نجات دهد ، اما یقینا" یک برنامهء بزرگ ، کماکان خرخرهء حافظه رو خواهد جوید و عموم کمپرسورها کمک قابل ذکری در این زمینه نمیکنند ؛

    بسیاری از توسعه گران مبتدی از کمپرسورها به عنوان یک ابزار حفاظتی استفاده میکنند به این خیالات واهی :
    • کد قابل مطالعه نیست ؛ چون حالا من روی دیسک چیزی از کد اصلی نمیبینم .

    • چیزی از برنامه اصلی روی دیسک کپی نمیشه پس کسی نمی تواند برنامه رو دستکاری کند.

    • نوع کامپایلر و کتابخانه های مورد استفاده ام لو نمی رود .


  • اما در واقع :
    • با یک Memory Dump ساده ، کد باینری برنامهء اصلی به دست می آید و می شود براحتی با آن PEی اصلی رو بازسازی کرد

    • می شود متن کد برنامه را روی حافظه دستکاری کرد و نهایتا" برای تثبیت اون از یک Loader استفاده کرد

    • با مطالعه نسخهء روی حافظهء برنامه هم می شود براحتی عناصر برنامه را آنالیز کرد


  • کمپرسورها ، نه کمک مفیدی به حفاظت از امنیت نرم افزار میکنند ، نه فایدهء چندانی به حال برنامه های عصر حجری حجیم و Single Module خواهند داشت ؛ برنامه نویسهای با تجربه ، برای رفع مشکل حجم کد ، از تقسیم کد به عناصر کوچکتر ، و برای حفاظت از امنیت کد از Packer ها و Encryptor ها استفاده میکنند ، که در مورد نحوهء عملکرد آنها نیز در ادامه مطالبی ارائه نموده ایم .
  • Copyright © 2013 Manshoor-e simin
    Designed by Amir pourkohan