میخایم یه برنامه جامع امنیتی بنویسیم- تو ادبیات امنیت نرم افزار ، Process Injection به تزریق کد باینری به فضای آدرسی پروسه های دیگه گفته میشه . سیستمهای عامل مدرنی که از مدل Protected Mode استفاده میکنن ، برای هر پروسه با استفاده از ترکیب حافظه حقیقی و مجازی ، فضای آدرسی مستقلی رو تعریف میکنن که اجزاء یک پروسه ( توابع ، متغیرها ، اشاره گر ها ، رفرنسها ، کتابخانه های اشتراکی و ... ) داخل اون فضا آدرس دهی میشن . پردازنده ، به نوبت ، کد ماشین رو بصورت جداگانه از هر فضای آدرسی دریافت و پردازش میکنه . اگر تو کد ماشین یا متغیر یا سایر موجودیتهای باینری مورد نظرت رو ، بدون اینکه بطور مستقیم متعلق به یک پروسه باشن ، به فضای آدرسی اون پروسه تزریق کنی ، یک Process Injection انجام دادی .اگر ممکنه در مورد 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 اون رو معرفی کنی . ممکنه بتونی با جستجو ، کدهای آماده که دیگران - احتمالا" - برای چنین مقاصدی نوشته اند رو هم پیدا کنی و لزومی به توضیح دادن نباشه . چویز ایز یورز