PDA

View Full Version : Process Injection و دلفی ( چند سوال )



Mahsa Amiri
شنبه 19 دی 1383, 15:36 عصر
سلام دوستان

ما میخایم یه برنامه جامع امنیتی بنویسیم ( با دلفی ) و چند تا مشکل داریم که امیدوارم بتونین کمکمون کنین :D

اول = اگر ممکنه در مورد Process injection توضیح بدین و اینکه چه کاربردهای مختلفی داره

دوم = این مساله در زبان دلفی چطور قابل حله ؟ کد یا component احتیاج ندارم میخام مفهومشو یاد بگیرم

ممنون که وقت میگذارید و مفصل توضیح میدید :)

Inprise
شنبه 19 دی 1383, 17:08 عصر
میخایم یه برنامه جامع امنیتی بنویسیم


اگر ممکنه در مورد 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 اون رو معرفی کنی . ممکنه بتونی با جستجو ، کدهای آماده که دیگران - احتمالا" - برای چنین مقاصدی نوشته اند رو هم پیدا کنی و لزومی به توضیح دادن نباشه . چویز ایز یورز

Mahsa Amiri
شنبه 19 دی 1383, 18:56 عصر
you are an amazing expert :D

خیلی ممنون از جوابتون.. ما برای مرکز فناوریهای پیشرفته شریف کار میکنیم http://www.aictc.com/index.htm و میخواهیم یه برنامه آنتی تروجاان بنویسیم..خیلی خوشحال میشم اگر بفرمائید کجا مشغول هستین و آیا فرصت تدریس یا همکاری با ما رو دارین یا نه..چون میدونین که تو ایران کسانی که هم در زمینه برنامه نویسی و هم امنیت حرفه ایی باشن نداریم یا خیلی کمن..در مورد جوابتون حتما جستجو میکنم و اگر بازم سوالی بود مزاحم میشم..از سایت برنامه نویس و مسئولینش بخاطر مهمان نوازی خیلی ممنونم :) فقط یه سوال دیگه استاد :oops: گفتین که process به راحتی میتوننن به هم دسترسی داشته باشن..آیا این بزرگترین نقطه ضعف ویندوز در مقابل لینوکس نیست ؟ پس اجازه دسترسی و پرمیشنها به چه دردی میخورن ؟ :sorry:

خیلی خیلی مرسی :flower: :flower:

Inprise
شنبه 19 دی 1383, 19:42 عصر
گفتین که process به راحتی میتوننن به هم دسترسی داشته باشن..آیا این بزرگترین نقطه ضعف ویندوز در مقابل لینوکس نیست ؟

خیر . Process Injection روی لینوکس به مراتب ساده تر و کم دردسر تر از ویندوز انجام میشه . ضمنا" باید مجددا" تذکر بدم این یک قابلیت است نه یک نقیصه . یک پنجره میتونه ابزار خوبی برای تهویه باشه ، میتونی نقطه ورودی مناسبی برای دزد هم باشه . بهر ترتیب ، پنجره به عنوان یکی از ابزارهای کاربردی دزدها شناخته نمیشه .


پس اجازه دسترسی و پرمیشنها به چه دردی میخورن ؟

برای استفاده از هر کدام از توابع مذکور یا معادل اونا روی لینوکس باید مجوز کافی داشته باشی . یک کاربر محدود ، به احتمال قریب به یقین نمیتونه کدی به یکی از پروسه های مدیر سیستم اضافه کنه .

موفق باشی

Mahsa Amiri
دوشنبه 21 دی 1383, 09:23 صبح
بازم ممنونم :flower:

اگر ممکنه جواب بقیه سوالاتمو بدین ..
گفتین که استفاده از توابع لازم به مجوز نیاز داره..این مجوزها رو کجا میشه ارائه کرد یا از کسی گرفت ؟ مثلا چطور میشه یه ادمین یا یه یوزر با اختیارات بالا داشته باشیم که اجازه استفاده از این توابع رو نداشته باشه ؟..
از من خواستن کامپوننتی بنویسم که جلوی پروسس اینجکشن و بگیره..

مرسی :thnx:

Inprise
دوشنبه 21 دی 1383, 13:44 عصر
این مجوزها رو کجا میشه ارائه کرد یا از کسی گرفت ؟

کنترل موجود روی پالیسی های ویندوز ، در واقع به نوعی تغییر محدودهء مجاز دسترسی به توابع سیستم است . به عنوان مثال وقتی به کاربری اجازهء نصب یا استفاده از Service Object رو نمیدی ، یعنی او و برنامه های اجرا شده توسط او ، مجاز به استفاده از توابع مربوطه نیستند . در مجموع API های حیاتی سیستم رو میشه به پنج دسته تقسیم کرد :


File and directory objects
User objects
Kernel objects
Service objects
Private objects

اولی : فایل سیستم ؛ دومی : رابط کاربری ؛ سومی : کرنل ماژولها ؛ چهارمی سرویسها و پنجمی رابطهائی برای دسترسی به ACL مانند رجیستری . پالیسی ها امنیتی ویندوز هم حول این پنج محور متمرکز شدن . در واقع تنظیم صحیح پالیسیهای امنیتی ویندوز به معنای مدیریت صحیح ویژگیهای امنیتی پنج عنصر اصلی ویندوز هست که اون بالا ذکر شده .



چطور میشه یه ادمین یا یه یوزر با اختیارات بالا داشته باشیم که اجازه استفاده از این توابع رو نداشته باشه ؟..

بخشی از جواب رو تو پاراگراف بالا خوندی . اما به عنوان توضیح اضافه : بجای استفاده از پالیسیها و لغو یا اعطای "مطلق" مجوزهای دسترسی ، اغلب برنامه های امنیتی از API Monitoring برای حفاظت از اون پنج حوزه استفاده میکنن . چرا ؟ به عنوان یک مثال اگر دسترسی یک Super User به بخشی از اون پنج بخش محدود بشه ، ممکنه بعضی از برنامه هائی که اون انتظارداره تحت Context سوپر یوزر بودن اون قابل اجرا باشن ، با مشکل مواجه بشن . در عوض اگر با تکیه بر یک Knowledge base و با استفاده از API Monitorng رفتارهای مخرب از رفتارهای عادی تمیز داده بشن ، میشه گفت ما یه راه حل خوب امنیتی داریم . به عنوان یک مثال : زون آلارم که علاوه بر یک Firewall شخصی ، حالا یک Host based IDS هم هست ، دقیقا" از همین تکنیک برای حفاظت سیستم استفاده میکنه . با وجود زون آلارم ، Process Injection با روشهای متداول غیر ممکنه . هر چند دائما" روشهای متفاوتی تو مجامع زیر زمینی منتشر میشه ، بلافاصله توسط نفوذگران استفاده میشه و چند روز بعد ، زون آلارم تو یه به روز رسانی اونم بر طرف میکنه و ...الی آخر .

بصورت خلاصه : در مورد Security Policy های ویندوز مطالعه کن ( با نیم نگاهی به gpedit.msc ) ایضا" در مورد API Monitoring . قبلا" تو همین بخش در موردش نوشتم و لینک دادم .

موفق باشی :wink:

Inpy against Facts

Mahsa Amiri
پنج شنبه 24 دی 1383, 18:03 عصر
:thnx:

من خیلی در این مورد مطالعه کردم و چند تا تستم انجام دادم و موفق یت آمیز بودن :)
اما به نظرم میاد نوشتن یه کد کامل وقت زیادی بگیره و از پس من بر نیاد توی فرصت کوتاهی که دارم.....
میشه در مورد کدهای آماده یا کامپوننت راهنمائیم کنین ؟
اگر کسی در این زمینه کار کرده یا کد به درد بخوری میشناسه و معرفی کنه یه دنیا ممنون میشم :flower:

:reading:

Inprise
جمعه 25 دی 1383, 02:00 صبح
ر-ک : آخرین پاراگراف اولین جواب من در همین تاپیک . غیر از این کتابخانهء تقریبا" رایگان Madshi هم ممکنه کمکت کنه .

شب خوش

ICEMAN
پنج شنبه 06 اسفند 1383, 22:37 عصر
به کجا رسیدی

ravanfar
شنبه 08 اسفند 1383, 07:51 صبح
سلام
با اینکه در قد و قواره من نیست ولی بحث جالبه
از اینپرایز متشکرم
روانفر

ICEMAN
جمعه 09 اردیبهشت 1384, 20:12 عصر
به کجا رسید
امیدوارم بتونید :mrgreen:

من یکی نوشتم یه Port Controler قبل از هر اتصال سوال میکنه و از User اجازه میگیره :flower:

ebnsina
دوشنبه 19 اردیبهشت 1384, 08:44 صبح
آقای اینپرایز واقعا از راهنماییهای حرفه ای تون ممنون
:flower: :flower:

لطفا اگر میشه حداقل پایه های این مباحث رو برای تازه کارایی مثل ما بیان کنید.
مطمن باشید که برای اهداف منفی استفاده نمیشه
:موفق:

حمیدرضاصادقیان
شنبه 07 خرداد 1384, 09:27 صبح
استاد اگر براتون امکان داره یک توضیح مختصری در مورد کدی که تو بخش دلفی نوشتین میدین.؟
که در رابطه با notepad بود؟که دقیقا چه کاری انجام میده. :flower:
چون اجراش کردم ولی دقیقا چیزی دستگیرم نشد. :cry:

Inprise
دوشنبه 09 خرداد 1384, 02:38 صبح
اجراش کردم ولی دقیقا چیزی دستگیرم نشد.

قاعدتا" تا وقتی مفهوم درک نشه ، کد و اجرای اون اهمیت خاصی ندارند . برای درک عملکرد مطالب صفحه قبل رو بخونید صرفا" در مورد کد چند خطی توضیح میدم :


{
Process Injection by Inpy - Soul
inprise@gmail-dot-com
Greets to soul for giving me the imagebase idea.
}

program Project1;

{$IMAGEBASE $13140000}

uses
Windows;
//Injected entrypoint
function Main(dwEntryPoint: Pointer): longword; stdcall;
begin
{now we are in notepad}
LoadLibrary('kernel32.dll');
LoadLibrary('user32.dll');
MessageBox(0, 'Hello, now I am in the memory of another process!', 'Hijacked Process', 0);
MessageBox(0, 'Now we can do anything we want. :)', 'Hijacked Process', 0);
MessageBox(0, 'You can even delete the original exe and these message boxes will still be here.', 'Hijacked Process', 0);
MessageBox(0, 'See?', 'Hijacked Process', 0);
MessageBox(0, 'Told you.', 'Hijacked Process', 0);
MessageBox(0, 'Ok, bye.', 'Hijacked Process', 0);
MessageBox(0, 'Hails to Barnamenevis.org fellas ', 'Hijacked Process', 0);
MessageBox(0, 'I''ll close notepad for you ;)', 'Hijacked Process', 0);
ExitProcess(0);
Result := 0;
end;
//Injection
procedure Inject(ProcessHandle: longword; EntryPoint: pointer);
var
Module, NewModule: Pointer;
Size, BytesWritten, TID: longword;
begin
Module := Pointer(GetModuleHandle(nil));
Size := PImageOptionalHeader(Pointer(integer(Module) + PImageDosHeader(Module)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;
VirtualFreeEx(ProcessHandle, Module, 0, MEM_RELEASE);
NewModule := VirtualAllocEx(ProcessHandle, Module, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessHandle, NewModule, Module, Size, BytesWritten);
CreateRemoteThread(ProcessHandle, nil, 0, EntryPoint, Module, 0, TID);
end;

var
ProcessHandle, PID: longword;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;

begin
{lets make a new process}
CreateProcess(nil, 'notepad', nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);
{give it some time to wake up}
Sleep(500);
{and hijack it!}
GetWindowThreadProcessId(FindWindow('Notepad', nil), @PID);
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
Inject(ProcessHandle, @Main);
CloseHandle(ProcessHandle);
{we have a copy of ourself running in notepad so we can exit}
end.
//go home kid :-)

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

حمیدرضاصادقیان
سه شنبه 24 خرداد 1384, 20:07 عصر
استاد دستتون درد نکنه به خاطرتوضیحات کاملی که دادین.
یک سوال داشتم.
تا اینجا که متوجه شدم هر نرم افزار در یک فضای خاصی اجرا میشود
حالا به چه صورت میشه متوجه شد نرم افزاری که اجرا نشده در چه فضایی اجرا میشه.
مثلا همین notepad که شما انجام دادین به چه صورت فضای مخصوص به اون رو دریافت کردید.؟

Inprise
چهارشنبه 25 خرداد 1384, 02:10 صبح
اگر به توضیحاتم دقت کنی میبینی که ابتدا هندل پروسه مورد نظرم - اینجا Notepad - رو بدست آوردم بعد فضای مورد نظرم رو اختصاص دادم نهایتا" یک Remote Thread برای اجرای کد مطلوب ایجاد شده است . برای مطالعه بیشتر در مورد جزئیات و الفبای کارکرد عناصر ویندوز خصوصا" با دید توسعه کاربردهای سیستمی و امنیتی کتاب Windows Internals مارک راشنوویچ از M$ Press رو بخون . قیمت نسخهء چاپی اش که تهیه اون رو شدیدا" توصیه میکنم حدود 50 دلار است و نسخه الکترونیکی ش هم بصورت Warez منتشر شده است .

موفق باشی