صفحه 2 از 2 اولاول 12
نمایش نتایج 41 تا 55 از 55

نام تاپیک: در مورد پروسس اينجكشن و كدهاي تزريقي

  1. #41

    نقل قول: در مورد پروسس اينجكشن و كدهاي تزريقي

    کماکان بی ادبی‌ها و مطالب نامربوطت رو که احتمالا اقتضای سنت هست نادیده میگیرم .
    دوست عزيز حرفهاي من آينه تمام نماي حرفهاي خودته اگه توش بي ادبي ميبيني دليلش رو در حرفاي خودت بايد جستجو كني نه در سنت من! اينم درس بعدي...

    WriteProcessMemory باید کد مورد نظر تو رو روی استک بنویسه ، در واقع استک تنها مسئله ای هست که به این قضیه مربوطه .
    اين حرفت رو به عنوان يك جك در دفترچه خاطراتم ثبت ميكنم.

    متاسفانه در اثر خواندن مقالات پراكنده بدجوري خودت رو گيج كردي! هيچ قانوني وجود نداره كه بگه من حتما بايد در پشته كدهامو بنويسم ! ديدي كه عملا با يك برنامه ساده بهت نشون دادم و اين برنامه ميتونه كاملتر شه و حتي اگر در داخل كد از ديتاسكشن هم استفاده شده باشه خودش به صورت خودكار ديتاسكشن رو هم با پروسيجر تزريق كنه...

    بعد از اینکه با مفهوم استک آشنا شدی و مشخص شد که چرا باید ابتدا با تابع VirtualAllocEx ضمن تخصیص ، مجوز Page هائی که Allocate میشن رو به EXECUTE_READWRITE تغییر بدی متوجه میشی که چرا نمیتونی بین Page هات Far Jump کنی . در مقاله ای که لینکش رو دادم اگر به قسمت Why can my ThreadFunc have only 4k of local variables? مراجعه کنی به وضوح این مسئله "بدیهی" رو توضیح داده که چرا نمیتونی از 4k تجاوز کنی و اگر هم بکنی با Access Violation مواجه میشه .
    الان متوجه شدم !

    متاسفانه اصلا متوجه نميشي چي دارم ميگم و منظورم چيه. ترجيح ميدم با آدمي كه حتي با تجربه عملي چيزي رو قبول نميكنه و ميگه مرغ يك پا داره بحث نكنم!

  2. #42
    کاربر دائمی آواتار saeedIRHA
    تاریخ عضویت
    بهمن 1383
    محل زندگی
    Eclipse
    سن
    38
    پست
    605

    نقل قول: در مورد پروسس اينجكشن و كدهاي تزريقي

    با سلام
    يک سؤالی برای من پيش آمد،آيا ميشه با تزريق کردن process به برنامه اي که
    سطح دسترسی Admin داره سطح دسترسی خودمون رو ارتقا بديم و کدی رو با
    permission admin اجرا کنيم؟
    (من در اين ضمينه تجربه زيادی ندارم ، عذر ميخوام اگر سؤالم مبتدی هست)

  3. #43

    نقل قول: در مورد پروسس اينجكشن و كدهاي تزريقي

    مطمئنم در این تاپیک بیش از اینکه هدف طرفداری از کسی باشه , به اشتراک گذاشتن یافته ها مد نظر می باشد تا با استفاده از این مطالب به نتایج جدید تری برسیم و یا سعی در یافتن راه حل هایی برای رفع نیازهای نرم افزاری باشیم.
    از همه عزیزان هم استدعا دارم در این راستا تلاش کنند.
    من بعد از خواند پست های قبلی کماکان با نظر جناب illegalyasync موافق هستم چون این تجربه را 4 سال پیش داشتم و به عینه نتیجه را مشاهده کرده ام.
    در مورد سطوح دسترسی (بر خلاف مطالب قبل این مورد نظر شخصی است و ادله کافی برای آن ندارم) :
    در صورت inject شدن به process دیگر برنامه سطوح دسترسی target process را بدست می آورد بدین شکل براحتی می توانید سطوح دسترسی مانند system را بدست بیاورید ولی دسترسی admin بستگی به کاربر login شده دارد.
    امیدوارم اگر دوستان پاسخی به این پست در جهت تایید و یا رد آن دارند مطالب خود را بطور مستدل ارایه نمایند تا مطالب ارسال شده مفید و قابل استفاده جمع باشد و از غرض ورزی های بی مورد که در شان چنین forum هایی نیست بپرهیزند.

  4. #44

    نقل قول: در مورد پروسس اينجكشن و كدهاي تزريقي

    با سلام
    يک سؤالی برای من پيش آمد،آيا ميشه با تزريق کردن process به برنامه اي که
    سطح دسترسی Admin داره سطح دسترسی خودمون رو ارتقا بديم و کدی رو با
    permission admin اجرا کنيم؟
    (من در اين ضمينه تجربه زيادی ندارم ، عذر ميخوام اگر سؤالم مبتدی هست)
    بله مسلما همين اتفاق ميوفته ولي در صورتي كه بتوني عمل تزريق رو انجام بدي چون در پرميشني غير از مدير به شما اجازه تزريق كد به پروسه هاي سيستمي داده نميشه مگه اينكه مدير سيستم باشيد با پرميشن كامل.

    من بعد از خواند پست های قبلی کماکان با نظر جناب illegalyasync موافق هستم چون این تجربه را 4 سال پیش داشتم و به عینه نتیجه را مشاهده کرده ام.
    ممكنه در مورد اون لينكها و مقالاتي كه اكثرا قديمي هم هستن اين اتفاق افتاده باشه در اثر استفاده نادرست از توابع و كد نويسي ها ولي اين دليل نميشه كه اينكار نشدني باشه ديدي كه ثابت كردم ميشه.

    مطمئنم در این تاپیک بیش از اینکه هدف طرفداری از کسی باشه , به اشتراک گذاشتن یافته ها مد نظر می باشد تا با استفاده از این مطالب به نتایج جدید تری برسیم و یا سعی در یافتن راه حل هایی برای رفع نیازهای نرم افزاری باشیم.
    كاملا موافقم.

    در مورد پست دنياي دلفي : بهتره زودتر از 48 ساعت پاكش كني چون فكر كنم اشتباه اومدي

  5. #45

    نقل قول: در مورد پروسس اينجكشن و كدهاي تزريقي

    چون این تجربه را 4 سال پیش داشتم و به عینه نتیجه را مشاهده کرده ام
    مسئله ای که ما در موردش صحبت کردیم اونقدر بدیهی و ابتدائی بود که هیچ ضرورتی به ادامه نداشت . بالاخره برخی از امور رو میشه با مطالعه و بررسی متوجه شد و مجادله در موردشون لااقل در شان ما که نیست . البته میشه در یه فرصت دیگه در مورد معنی تغییر مجوز Page ها و اجرا کردن کد بوسیلهء اونها ( که در Code Injection از طریق CreateRemoteThread ازش استفاده میشه ) توضیح بدیم که برای کسانی که دنبال مطلب هستن مفید باشه .

    يک سؤالی برای من پيش آمد،آيا ميشه با تزريق کردن process به برنامه اي که
    سطح دسترسی Admin داره سطح دسترسی خودمون رو ارتقا بديم و کدی رو با
    permission admin اجرا کنيم؟
    فرض میکنم در مورد ویندوز سوال کردی . کسانی که مجوز SeDebugPrivilege رو ندارن نمیتونن چنین کاری رو انجام بدن . کسانی که دارن میتونن . قبلترها یه سری حمله بنام Shatter Attack معروف بودن سعی میکردن از نقائص امنیتی استفاده کنن و با سوء استفاده از Messageهای ویندوز و تزریق کد به برنامه یا جلسه با مجوز بالاتر دسترسیشون رو افزایش بدن . اون وقتها که وضع امنیتی IE افتضاح بود اکثر Malwareهائی IE از این روش استفاده میکردن . اگر منظورت لینوکس باشه فقط root و فقط به شرطی که به dtrace دسترسی داشته باشه میتونه چنین کاری رو انجام بده .

  6. #46

    نقل قول: در مورد پروسس اينجكشن و كدهاي تزريقي

    دوستان،
    میشه درباره اختلاف نظرهای فنی بصورت علمی، و با لحن مناسب بحث کرد، نیازی نیست که برای اثبات نظر خودمان از توهین و متلک پراکنی به این و آن استفاده کنیم!
    اگر لحن صحبت دوستان، که پست به پست بدتر و شدید الحن تر میشه، اصلاح نشه؛ این تاپیک و تاپیک های مشابه آن را قفل خواهم کرد، پس لطف کنید و مراعات کنید.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  7. #47

    نقل قول: در مورد پروسس اينجكشن و كدهاي تزريقي

    نقل قول نوشته شده توسط illegalyasync مشاهده تاپیک
    البته میشه در یه فرصت دیگه در مورد معنی تغییر مجوز Page ها در استك و اجرا کردن کد بوسیلهء اونها ( که در Code Injection از طریق CreateRemoteThread ازش استفاده میشه ) توضیح بدیم که برای کسانی که دنبال مطلب هستن مفید باشه .
    مشكلت اينه كه فكر ميكني در process injection حتما بايد كدها در پشته كپي شن كه دچار محدوديت ميشه و من سعي كردم خلاف اينو بهت ثابت كنم اميدوارم در آينده خودت با آزمايشات بيشتر منظور من رو بهتر درك كني...

  8. #48

    نقل قول: در مورد پروسس اينجكشن و كدهاي تزريقي

    اخه دوستان چرا بحث در مورد اين مسائل رو اينقدر طولاني ميكنيد ؟

    ببينيد Fh_prg راست ميگه .

    درسته كه در ارسال مقادير به پشته ما با محدوديت 4 كيلوبايتي رو به رو هستيم ولي كدي كه ما ميخواييم تزريق كنيم ربطي به پشته نداره . چون ما يك فضا در حافظه براش گرفتيم و اون رو در اون فضا با توابع مربوطه مينويسيم . پس در نتيجه در امر تزريق با محدوديت حجم كدهاي ماشين رو به رو نميشيم .

    ولي يك نكته هست . طبيعتا ممكن هست تابع ما داراي يك پارامتر هم باشه . اين پارامتر چه جوري بايد بهش رسونده بشه ؟ خب معلومه خود CreateRemoteThread اين پارامتر رو برامون قبل از پرش به مكان شروع كدهاي تابع ميريزه توي پشته تا تابع بتونه اون رو از پشته بخونه . حالا اينجا با محدوديت 4 كيلوبايتي رو به رو ميشيم . پس در نتيجه پارامتري كه تابع ما ميگيره نبايد حجمش بيشتر از 4 كيلوبايت باشه . در صورتي كه بيشتر بود بايد از DLL injection استفاده كنيم كه معقولانه ترين راه هست .

    خب به نظرتون مسئله به اين سادگي ارزش اين همه بحث رو داشت ؟؟!!!!

  9. #49
    VIP آواتار دنیای دلفی
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    یک جایی توی جنوب ایران
    پست
    1,298

    نقل قول: در مورد پروسس اينجكشن و كدهاي تزريقي

    Fh_prg جان لطف كن در خصوص اين Push ها يك توضيحي بده :

    push    1097F71Ch
    push 0F71C6780h
    push 17389718h
    push 101CB718h
    push 17302C17h
    push 18173017h
    push 0F715F547h
    push 4C103748h
    push 272CE7F7h
    push 0F7AC6087h
    push 1C121C52h
    push 7C10871Ch
    push 201C701Ch
    push 4767602Bh
    push 20211011h
    push 40121625h
    push 82872022h
    push 47201220h
    push 13101419h
    push 18271013h
    push 28858260h
    push 15124045h
    push 5016A0C7h
    push 28191812h
    push 0F2401812h
    push 19154127h
    push 50F0F011h
    mov ecx, 15124710h
    push ecx
    push 11151247h
    push 10111512h
    push 47101115h


    ممنون مي شوم

  10. #50

    نقل قول: در مورد پروسس اينجكشن و كدهاي تزريقي

    نقل قول نوشته شده توسط .::Mehran::. مشاهده تاپیک
    ولي يك نكته هست . طبيعتا ممكن هست تابع ما داراي يك پارامتر هم باشه . اين پارامتر چه جوري بايد بهش رسونده بشه ؟ خب معلومه خود CreateRemoteThread اين پارامتر رو برامون قبل از پرش به مكان شروع كدهاي تابع ميريزه توي پشته تا تابع بتونه اون رو از پشته بخونه . حالا اينجا با محدوديت 4 كيلوبايتي رو به رو ميشيم . پس در نتيجه پارامتري كه تابع ما ميگيره نبايد حجمش بيشتر از 4 كيلوبايت باشه . در صورتي كه بيشتر بود بايد از DLL injection استفاده كنيم كه معقولانه ترين راه هست .
    !!!!
    اتفاقا من دارم ثابت ميكنم كه حتي در پاس دادن پارامترها از طريق پشته هيچ محدوديتي وجود نداره و فقط استفاده ناشيانه از پشته باعث ايجا مشكلات فوق ميشه.
    من در برنامه خودم حدود 20 كيلو بايت اطلاعات رو از طريق پشته پاس دادم و ديدين كه هيچ اتفاقي نيفتاد و اين دليل داره كه مفصلا برنامه و طرز كارش رو توضيح خواهم داد البته به دليل كمبود وقت در چند قسمت اينكارو خواهم كرد.

    من در برنامه از دو روش استفاده كردم:
    1.پاس دادن پارامترها از طريق پشته
    2.استفاده از روش Relocation براي بازسازي آدرس String Table ها

    كه هر دو روش رو با جزيياتش كامل توضيح ميدم و ميگم چه محدوديتهايي در اين روشها و كلا كد اينجكشن وجود داره.


    قسمت اول :


    function OpCodeLength(Address:DWORD):DWORD; cdecl; assembler;

    اين فانكشن همونطور كه از اسمش پيداست يك Length DisAssembler هست
    Length DisAssembler در واقع يك ديس اسمبلره كه با گرفتن يك آدرس شروع كه مكان قرار گرفتن آپكدهاست طول اولين دستور ماشيني كه در اون آدرس وجود داره به شما ميده
    اين نوع ديس اسمبلر ها انواع زيادي دارن و با روشها و زبانهاي مختلف پياده سازي شدن و با جستجو در اينترنت ميتونيد انواع مختلفش رو پيدا كنين
    ولي اين ديس اسمبلر به دليل سرعت بالا و حجم كم مورد علاقه من هست اون PUSH xxxx ها كه تو كدهاش ميبينين چيز عجيبي نيست فقط يك آرايه از DWORD هاست كه روي پشته ذخيره ميشن و شما ميتونين اين آرايه رو با خود دلفي پياده كنين
    چجوري كار ميكنه؟
    فرض كنيد من اين تابع رو با اين آدرس فراخواني كردم:

    OpCodeLength($401000)

    و فرض كنيد كه در آدرس 401000 اين كدها قرار داشته باشن :

    401000 : 68 01 00 00 00 ‍‍C3

    حالا خروجي تابع عدد 5 خواهد بود چرا؟ چون اولين دستور ماشين در آدرس فوق معادل Push 01 ميباشد كه طول آن 5 بايته حالا كافيه براي شناسايي طول دستور بعدي عدد بدست آمده در تابع رو با آدرس شروع جمع كنيم
    و تابع رو با اون عدد دوباره فراخواني كنيم :

    OpCodeLength($401005)

    كه اينبار عدد 1 برميگرده كه همون C3 هست كه آپكد دستور RET در زبان ماشينه
    در ادامه ميگم كه ما از اين تابع براي كجاي برنامه استفاده ميكنيم...
    آخرین ویرایش به وسیله Fh_prg : شنبه 30 آذر 1387 در 17:02 عصر

  11. #51
    کاربر دائمی آواتار HadiDelphi
    تاریخ عضویت
    مرداد 1385
    محل زندگی
    تبریز
    سن
    34
    پست
    238

    نقل قول: در مورد پروسس اينجكشن و كدهاي تزريقي

    درسته من هم حرف آقای FH_Prg رو تایید میکنم
    در Process Injection الزاما کد های اینجکت شده رو پشته قرار نمیگیره و هیچ نوع محدودیت حجمی وجود نداره.

  12. #52

    نقل قول: در مورد پروسس اينجكشن و كدهاي تزريقي

    FH_Prg عزيز ميشه لطف كني و كتابخانه اي كه تابع

    function OpCodeLength(Address:DWORD):DWORD; cdecl; assembler;


    توش هست بزاري ... ميتونه با توجه به سرعتي كه بيان كرديد مفيد واقع بشه ...

  13. #53
    کاربر دائمی آواتار FiACKER
    تاریخ عضویت
    آبان 1387
    محل زندگی
    روي صندلي ديگه
    پست
    222

    نقل قول: در مورد پروسس اينجكشن و كدهاي تزريقي

    سلام
    مچكرم كه به اين موضوع پرداختيد :)

    اگه دقت کنید میبینید هنگام برنامه نویسی و ساخت DLL دقیقا مثل برنامه کنسول یه تابع اصلی وجود داره که DLL بعد از لود شدن به طور اتوماتیک اون تابع رو اجرا میکنه
    حالا شما میتونی تمام توابع خودت رو تو اون تابع اصلی فراخوانی بکنی
    به همین سادگی
    مطمئن باش هیچکسی سورس کدی که یه DLL رو اینجکت کنه , بهت نمیده البته مفد
    چون یه کار پیچیده ای هست
    البته یه راهی هم هست
    برو سراغ ویروس های Open Source


    بلخره سخت و پيچيده هست يا آسون ؟

    اين دوستمون كه گفتند :
    بهتره به جای کد , Dll به پروسه مورد نظر طزریق کنی کارش تا یه حدی راحت تر
    ؟؟؟

    حالا يه چيزي !

    ايا طريقه ي كار كردن اين روش اينجور هستش :
    خودمون يه dll مي سازيم (به دلخواه ، هر كدي خواستيم مي تونيم بهش اضاف كنيم) كه به پروسه مورد نظر اتچ مي كنيم و برنامه مورد اينجكشن (يا هوك) رو كنترل مي كنيم ... يا يه سري دستور رو به دلخواه اجرا مي كنيم !

    يه برنامه هست به نام Anvir كه برايه اينكه كليه پروسه هاي ويندوز رو چك كنه از يه چيزي مثله اين استفاده مي كنه ! يعني يه dll به نام AnvirHook.dll به هر پروسه اضاف مي كنه و پروسه ها رو كنترل مي كنه.
    اين برنامه يه startup manager و process manager و service manager خوب هست .
    و در بعضي مواقع مي تونه از يه سري قضايا شما رو مطلع كنه.

    اين امتحانايه لعنتي هم كه شروع شد... 21 واحد ؟ داغونم :-) .
    با تشكر

  14. #54

    نقل قول: در مورد پروسس اينجكشن و كدهاي تزريقي

    از خصوصیات ایرانی جماعت اینه که هموشن فکر میکنن علامۀ دهرن!!

    مسالۀ محدودیت 4K هم شده داستان "فیل" مولوی (شنیدید؟)
    4 روز از فوروم این میگه هست اون میگه نیست.
    -- با این مقدمه خواستم بگم هر دو تون درست میگین:-)
    اگر برنامه رو با vc کامپایل کنید محدودیت 4K دارید. علتش هم اینه که vc برای روتینهایی که داده های محلی بیش از 4K دارند، تابعی موسوم به stack prob رو فراخوانی میکنه (در واقع اتوماتیک به ابتدای روتین شما یک call اضافه میکنه) در نتیجه وقتی شما کد رو تزریق میکنید، این فراخوانی اضافه شده، باعث access violation می شه.
    من ابداً با دلفی کار نکردم (علاقه ای هم بهش ندارم! فقط از پاسکال یه چیزایی یادمه). برنامۀ exe که Fh_prg پیوست کرده بودند رو دیس-اسمبل کردم و: فکر میکنم دلفی داده های محلی بزرگ رو در پایان بدنۀ تابع قرار میده و زمان استفاده، با یک آدرس دهی مطلق، به این داده ها دسترسی پیدا میکنه.
    کار قشنگی که برنامۀ مذکور انجام میده، تصحیح این آدرس است (از خط 261 تا 269):
    روتین OpCodeLength سایز دستور اسمبلی بعدی رو برمی گردونه؛ اگر 5 باشه و دستور PUSH باشه (4 تا آدرس + 1 بایت دستور 68h)، آدرس جدید رو محاسبه و جایگزین میکنه، این کار رو با تمام روتین انجام میشه.
    پس با این "روش" مشکل 4K حل می شه، نه این که کلاً وجود نداره.
    وسلام.

    Mehran عزیز، این تابع، کلش همینجاست، دیگه کتابخانه نداره (مثلاً خودمون نوشتیمش!).

    پاورقی: کل تحلیل و تایپ این متن کمتر از نیم ساعت طول کشید؛
    نتیجه: اگه روتین OpCodeLength کار خودی بود(!) اینقدرها وقت نمی خواست که Fh_prg واسه توضیحش لازم داشتن..
    آخرین ویرایش به وسیله man_56 : جمعه 13 دی 1387 در 02:18 صبح دلیل: تکمیل

  15. #55
    کاربر دائمی آواتار FiACKER
    تاریخ عضویت
    آبان 1387
    محل زندگی
    روي صندلي ديگه
    پست
    222

    نقل قول: در مورد پروسس اينجكشن و كدهاي تزريقي

    نقل قول نوشته شده توسط larry-ellison مشاهده تاپیک
    خواهش می کنم . اگه بتونم کمک کوچکی بکنم خوشحال می شم.
    در مورد kaspersky باید بگم که قویترین ابزاریه که باهاش سر و کله زدم مخصوصا نسخه های آخرش که دیگه محشره . ولی هر چیزی راهی داره . kasper امکان inject کردن رو نمیده چون تمام API های مورد نیاز رو hook کرده و تا بخواهید کاری بکنید متوجه می شه . مگر اینکه نذارید یعنی API ها را از کنترلش خارج کنید . این کار با استفاده از SDT unhooking امکان پذیر می باشد . ولی خود unhooking هم معمولا با API ها انجام می گیره که اونها هم دست kasper هستند . تنها راه حل ممکن دستکاری آدرس ها بدون استفاده از API ها است و این کار هم فقط با دسترسی به دستورات cmos امکان پذیر است
    سلام

    با شما موافقم !
    كسپر در اين زمينه فوق العاده هست !
    ولي مثله اينكه نظارتي بر روي كد هاي اينجكت شده نداره !
    فقط وقتي يه برنامه مي خواد اينجكت كنه ، به كاربر پيغامي مي ده كه برنامه ي مورد نظر شما در حاله اينجكت كردنه !

    خوب من كسپر رو ديسيبل مي كنم‌! دوباره برنامه ي مورد نظرم رو كه كد اينجكت مي كنه اجرا مي كنم ! كار برنامه چيه :
    اين برنامه كه ويروس ij.bat هست ، كدهايي رو به اكسپلورر اينجكت مي كنه ! بعد خودشو مي بنده . كدهايه اينجكتي هر چند ثانيه يك سري فايل رو كپي مي كنه ! (فكر كنم هر چند ثانيه استات اپه خودش رو هم بروز مي كرد).

    همه ي اين كدها داخله پروسه ي اكسپلورر اجرا مي شند ! اينها از نظر هر انتي ويروسي مشكوك به نظر مي رسه ! پس چرا كسپر هيچ كاري نكرد ؟؟؟؟؟؟؟



    از دوسته عزيز Fh_Prg هم ممنون كه اون نمونه سورس رو گذاشتن و راهنمايي كردن.

    اما دوست عزيز اقايه Fh_Prg مي شه بگيد چرا هر كدي رو نمي شه درونه تابع RemoteThread گذاشت ؟

    من برايه تست تابع Api اي رو درون همين تابع RemoteThread قرار دادم ولي برنامه با خطا روبرو شد !
    تابع مورد نظر CopyFile بود.
    از توابعي مثله FindWindow يا SendMessage هم نتونستم درش استفاده كنم
    لطف مي كنيد كه به اين موضوع بپردازيد...
    آخرین ویرایش به وسیله FiACKER : شنبه 14 دی 1387 در 06:22 صبح

صفحه 2 از 2 اولاول 12

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

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