میخایم یه برنامه جامع امنیتی بنویسیم
اگر ممکنه در مورد Process injection توضیح بدین
- تو ادبیات امنیت نرم افزار ، Process Injection به تزریق کد باینری به فضای آدرسی پروسه های دیگه گفته میشه . سیستمهای عامل مدرنی که از مدل Protected Mode استفاده میکنن ، برای هر پروسه با استفاده از ترکیب حافظه حقیقی و مجازی ، فضای آدرسی مستقلی رو تعریف میکنن که اجزاء یک پروسه ( توابع ، متغیرها ، اشاره گر ها ، رفرنسها ، کتابخانه های اشتراکی و ... ) داخل اون فضا آدرس دهی میشن . پردازنده ، به نوبت ، کد ماشین رو بصورت جداگانه از هر فضای آدرسی دریافت و پردازش میکنه . اگر تو کد ماشین یا متغیر یا سایر موجودیتهای باینری مورد نظرت رو ، بدون اینکه بطور مستقیم متعلق به یک پروسه باشن ، به فضای آدرسی اون پروسه تزریق کنی ، یک Process Injection انجام دادی .

مثال : تو برنامه A.exe رو نوشتی . یک برنامه به نام explorer.exe هم روی ویندوز وجود داره . تو به هر دلیل مایلی یکی از عناصر موجود در فضای آدرسی explorer.exe رو توسط A.exe تغییر بدی . Process Injection یعنی تزریق کد مورد نظرت از فضای A.exe به فضای explorer.exe .


چه کاربردهای مختلفی داره
ما میخایم یه برنامه جامع امنیتی بنویسیم
!!

کاربرد اصلی و عام Process Injection ، توسعهء برنامه های مرتبط با Access Control است . برنامه های مثبت ، با استفاده از این تکنیک و با تزریق یک کد محافظ به فضای آدرسی پروسه های سرور یا سرویس ( inetinfo.exe یا svchost.exe و ... ) سعی میکنن این پروسه ها رو از گزند تلاشهای مخرب و کدهای مخرب ( Exploit ) ایمن نگه دارن . برنامه های منفی با استفاده از Process Injection به مقاصد شومی مثل عبور از فایروالهای شخصی و فریب دادن آنتی ویروسها خواهند رسید .

مثال مثبت : زون آلارم ، با تزریق کد که اجرای کد باینری از طریق بخش Data ی Stack رو ممنوع میکنه ، به داخل فضای پروسه هائی مثل Services.exe از اونها نگهداری میکنه . این یه نمونه کاربرد مثبت Process Injection است .

مثال منفی : اغلب فایروالهای شخصی ، Access Control رو مبتنی بر پروسهء فراخوان ِ کد انجام میدن . یعنی اگر فراخوانی کدی از طریق پروسهء قابل اعتماد IExplorer.exe ( مرورگر ویندوز ) انجام شده باشه ، فایروال اجازه ایجاد اتصال شبکه رو میده و اگر نه ، خیر . یک تروجان ، برای اتصال به شبکه ، با وجود یک فایروال شخصی توفیق چندانی نخواهد داشت ، اما با استفاده از یک Process Injection ساده و تزریق کد باینری مورد نظر برای ایجاد اتصال شبکه ای ، به فضای پروسهء IExplorer.exe میتونه فایروال رو دور بزنه .


این مساله در زبان دلفی چطور قابل حله ؟
این مساله بطور مستقیم به هیچ زبان برنامه نویسی مربوط /محدود نیست . تا وقتی کدهات رو برای Userland توسعه میدی ، به چیزی بیشتر از Win32 API دسترسی نداری . توابع مختلفی در ویندوز وجود دارن که به یک پروسه اجازه میدن به فضای آدرسی سایر پروسه ها دسترسی داشته باشه ، یا اونها رو با شرایطی ، تغییر بده . در مجموع ، اگر قرار باشه از Trick خاصی استفاده نکنی ، سه راه برای Process Injection وجود داره :

  • الف- Remote Hooks :
    MSDN رو برای Remote Hooks و SetWindowsHookEx بگرد .

    ب- Remote Thread :
    MSDN رو برای CreateRemoteThread و WriteProcessMemory بگرد .

    ج- Remote Thread 2 :
    MSDN رو برای CreateRemoteThread و LoadLibrary بگرد .


توابع OpenProcess برای ایجاد کنترل روی پروسه مقصد ، VirtualAllocEx برای تخصیص حافظه جدید در پروسه مقصد هم جزو ابزارهای لازم هستن .

- برای کسانی که میخان بیشتر بدونن :

توضیح بدین و اینکه چه کاربردهای مختلفی داره
ویندوز 2003 سرور به عنوان یکی از معدود سیستمهای عاملی که روی IA32 میتونه تا حدود 4 گیگ آدرس دهی بکنه ، هم از Process Injection برای افزایش کیفیت و کارائی اش استفاده کرده . ویژگی HotPatch موجود در ویندوز 2003 دقیقا" از همین قابلیت استفاده میکنه . با تشکر از این تکنیک ، در صورت کشف یک نقطه ضعف امنیتی روی یک سرویس خاص ( مثلا" IIS 6 ) شما برای نصب Patch اون لازم نیست سرویس رو متوقف کنین . Patch با استفاده از سرویس HotPatch یک نسخه از خودش رو روی Image سرویس در هارد دیسک بازنویسی میکنه و یک نسخه از تصحیحات لازم رو بصورت زنده ( Process Injection ) روی سرویس در حال اجرا و سرویسدهی اعمال میکنه . به این ترتیب دفعه بعدی که سرویس اجرا میشه ، از یک نسخه امن استفاده میکنه مضاف بر اینکه ، همین حالا هم با اعمال زندهء تغییرات روی نسخهء در حال اجرای سرویس در فضای آدرسی مخصوص به خودش ، نقطه ضعف امنیتی بر طرف شده :)

مایکروسافت برای کسانی که میخوان از این ویژگی بصورت جدی استفاده کنن یک Calss Library مبتنی بر COM به رایگان منتشر کرده که با جستجو روی سایت مایکروسافت پیداش میکنی . ( CPP ) . اگر اصرار داری که برنامه ات رو با دلفی بنویسی ، و اگر بتونی منو متقاعد کنی که دنبال توسعه موجود خطرناکی نیستی ، ممکنه کلاس دلفی که برای پوشش چنین مقاصدی خیلی وقت پیش نوشتم بهت بدم . برای متقاعد کردن من باید تلاش کنی ، جزئیات فنی پروژه ات و StakeHolder اون رو معرفی کنی . ممکنه بتونی با جستجو ، کدهای آماده که دیگران - احتمالا" - برای چنین مقاصدی نوشته اند رو هم پیدا کنی و لزومی به توضیح دادن نباشه . چویز ایز یورز