رمزنگاری و تولید چکیده (hash) پیام 128 بیتی با کلاس MHR1

شروع موضوع توسط Mohammad_Shams ‏13 سپتامبر 2010 در انجمن Action Script 3

  1. Mohammad_Shams

    Mohammad_Shams Member

    ارسال‌ها:
    68
    تشکر شده:
    155
    امتیاز دستاورد:
    6
    سلام

    این کلاس را مدتی پیش در AS3، برای تولید چکیده پیام طراحی کردم.

    کلاس MHR1 یک روتین رمزنگاری 128 بیتی (خروجی 32 کاراکتری در مبنای 16) است که به صورت open source در این فروم منتشر میشود.
    اگر با توابع hash آشنا نیستید، این مطلب را مطالعه کنید: مقاله md5

    هدف توابع hash، رمزنگاری و تولید چکیده با طول یکسان از هر نوع رشته ورودی است، که کاربرد آنها موارد زیر هستند:

    - ذخیره کلمات عبور به صورت چکیده در دیتابیس
    - تولید امضای دیجیتال
    - تشخیص صحت یا تغییر محتوای فایلها
    - ایجاد امضا در ارسال پارامترهای url برای بررسی صحت آنها
    و غیره


    تفاوت این الگوریتم با روشهای مرسومی مانند md4 , md5، در سرعت بیشتر و سادگی آن است. البته کاملا روشن است که به دلیل دست‌ساز بودن الگوریتم آن، به اندازه الگوریتمهای استاندارد، ایمن نیست، اما لااقل امنیت آن برای طراحان فلش کافی است.

    مثال چگونگی کار به همره خود کلاس در فایل ضمیمه قرار دارند.

    [​IMG]

    مثال:

    کد (Text):
     import classes.mshams.MHR1;
    trace(new MHR1("Your String1 Here..."));
    trace(new MHR1("Your String2 Here..."));
     
    var myHash: MHR1 = new MHR1();
    trace(myHash.getHash("Your String1 Here..."));
        trace(myHash.getHash("Your String2 Here..."));
     
     

    پیوست ها:

    • test.PNG
      test.PNG
      اندازه فایل:
      کیلوبایت 5
      نمایش ها:
      170
    • MHR1_class.zip
      اندازه فایل:
      کیلوبایت 1.6
      نمایش ها:
      62
    • MHR1_test.zip
      اندازه فایل:
      کیلوبایت 473.2
      نمایش ها:
      121
    آخرین ویرایش: ‏14 سپتامبر 2010
    نوشته شده توسط Mohammad_Shams در ‏13 سپتامبر 2010
    Saeed2vfx، ameir-hg، rubies و 7 نفر دیگر از این ارسال تشکر کرده اند.
  2. ++Hadi++

    ++Hadi++ Active Member

    ارسال‌ها:
    3,529
    تشکر شده:
    5,801
    امتیاز دستاورد:
    36
    خیلی ممنون محمد عزیز ...
    مبحث مهم بود ، از نظر تایپیکی هم مهم شد ...
     
    نوشته شده توسط ++Hadi++ در ‏13 سپتامبر 2010
  3. amin.flash

    amin.flash Member

    ارسال‌ها:
    63
    تشکر شده:
    41
    امتیاز دستاورد:
    6
    سلام محمد جان مقالت رو تو سایت خوندم عالی بود و گفته بودی این فرایند یکطرفه هست
    اقا یه زحمت دارم نمیدنم ممکنه معکوس این کدینک رو بنویسی
    در کل میخواستم اگه ممکنه 2 تا کلاس بینویسی واسه ایجاد کد و یکی دیگه واسه چک کردن کد (برا ایحاد رمز)
     
    نوشته شده توسط amin.flash در ‏14 سپتامبر 2010
  4. Mohammad_Shams

    Mohammad_Shams Member

    ارسال‌ها:
    68
    تشکر شده:
    155
    امتیاز دستاورد:
    6

    از آنجا که کدهای HASH، کاملا یکطرفه هستند، پس هیچ روش معکوسی برای آنها وجود ندارد. تنها راه Crack کردن آنها به روش bruteforce است.


    روش استفاده از hash در ایجاد password به این صورت است که شما پس از دریافت رمز، Hash آن را محاسبه کرده و در دیتابیس ذخیره میکنید. خود پسورد را هم دور می اندازید چون با وجود hash ، به آن نیازی نیست.

    برای مقایسه رمز دریافتی از کاربر با پسورد موجود در دیتابیس هم، پس از دریافت رمز، hash آن را محاسبه کرده و با hash موجود در دیتابیس مقایسه میکنید.
    اگر hash ها با هم برابر بودند، یعنی پسوردهای اصلی هم با هم برابر بودند.
     
    نوشته شده توسط Mohammad_Shams در ‏14 سپتامبر 2010
    Saeed2vfx و amin.flash از این پست تشکر کرده اند.
  5. amin.flash

    amin.flash Member

    ارسال‌ها:
    63
    تشکر شده:
    41
    امتیاز دستاورد:
    6
    ممنون از توضیحت ولی من میخوام خودم مثلا 8000 پسورد ایجاد کنم و این رو در اختیار کاربرانی که میخوام بدارم و چون برنامه نصب نمیشه دیتابیسی هم وجود نداره پس نیاز به یک فرایند مکمل برای چک کردن کدی هست که از سمت کاربر وارد میشه
     
    نوشته شده توسط amin.flash در ‏14 سپتامبر 2010
  6. BehrouzPc

    BehrouzPc پــــادشــاه فــلــــش

    ارسال‌ها:
    1,909
    تشکر شده:
    3,510
    امتیاز دستاورد:
    113
    بسیار سپاسگزارم برای کلاس Hash ، محمد شمس عزیز :rose:

    این مورد ها را برای ورودی input string تست نمایید

    PHP:
    2222222222222222222222222222222222222222222222222222222222222222222222
    یا
    PHP:
    11111111111111111111111111111111111111111111111111111111111111111
    یا
    PHP:
    3333333333333333333333333333333333333333333333333333333333333
    یا
    PHP:
    44444444444444444444444444444444444444444444444444444444
    یا
    PHP:
    555555555555555555555555555555555555555555555555555555
    یا
    PHP:
    be222222222222222222222222222222222222222222222222222222222222222222222222
    و...

    Generated Hash
    PHP:
    itititititititititititititititit


    موفق و پیروز باشید
     
    آخرین ویرایش: ‏14 سپتامبر 2010
    نوشته شده توسط BehrouzPc در ‏14 سپتامبر 2010
    DaDaDooDoo، Mohammad_Shams و JavidFlasher از این ارسال تشکر کرده اند.
  7. Mohammad_Shams

    Mohammad_Shams Member

    ارسال‌ها:
    68
    تشکر شده:
    155
    امتیاز دستاورد:
    6
    سلام

    جالبه، چون با رشته‌های طولانی تستش نکرده بودم، نمیدونستم یه جای کار Overflow میشه.
    ممنون که تست کردید.

    سریعا این ایراد را برطرف میکنم
     
    نوشته شده توسط Mohammad_Shams در ‏14 سپتامبر 2010
    BehrouzPc از این پست تشکر کرده است.
  8. arjmand200

    arjmand200 Member

    ارسال‌ها:
    235
    تشکر شده:
    311
    امتیاز دستاورد:
    16
    جالب بود ، ولی اگه قبل از نوشتن کلاس یه بار as3corelib رو چک میکردی (crypto/MD5) خیلی کمکت میکرد
     
    نوشته شده توسط arjmand200 در ‏14 سپتامبر 2010
  9. Mohammad_Shams

    Mohammad_Shams Member

    ارسال‌ها:
    68
    تشکر شده:
    155
    امتیاز دستاورد:
    6
    سلام

    مشکل حل شد. محدودیت کلاس Number را درست حساب نکرده بودم.


    بله قبلا با as3corelib کار کرده‌ام. همچنین کلاسهای متعدد دیگری برای الگوریتهای DES, AES و غیره هم موجود است.
    اما هدف من از ارائه این کلاس، طراحی ساده‌ترین روش برای ایجاد Hash بود. در واقع این یک کلاس آموزشی برای فهم نحوه عملکرد و ساختمان الگوریتمهای رمزنگاری یکطرفه بود و نمی‌خواستم الگوریتمهای موجود را در as3 پیاده سازی کنم.

    در هر صورت کلای opensource است و خوشحال میشوم اگر بقیه دوستان هم آن را تکمیل و update کنند. (البته قبلش خوب تستش کنن که مثل الان مشکل پیش نیاد)
     
    نوشته شده توسط Mohammad_Shams در ‏14 سپتامبر 2010
    Saeed2vfx، Avang2005، ++Hadi++ و 2 نفر دیگر از این ارسال تشکر کرده اند.
  10. BehrouzPc

    BehrouzPc پــــادشــاه فــلــــش

    ارسال‌ها:
    1,909
    تشکر شده:
    3,510
    امتیاز دستاورد:
    113
    ممنون محمد شمس عزیز ، بنده تست کردم و مساله ای مشاهده نکردم :rose:
    موفق و پیروز باشید
     
    نوشته شده توسط BehrouzPc در ‏15 سپتامبر 2010
    ++Hadi++ از این پست تشکر کرده است.
  11. ++Hadi++

    ++Hadi++ Active Member

    ارسال‌ها:
    3,529
    تشکر شده:
    5,801
    امتیاز دستاورد:
    36
    sسلام محمد جان
    کاری که شما انجام دادید خیلی ارزنده هست .
    یه پیشنهاد :
    اگه کاربری که می خواد مثلا یه ایکسملو به رمز تبدیل کنه ، بیاد و از کلاس شما استفاده کنه می تونه ... ولی شاید افراد دیگه ای که از جریان کار و اینکه مثلا من دارم از کلاس شما استفاده می کنم ، خبر دار بشن ، به راحتی بتونن سو استفاده کنن . من تو این فکر هستم که یه قابلیتی رو به کلاس شما اضافه کنم که رمز رو به نسبت یه رشته دیگه که اون فقط تو ذهن مثلا من باشه ، بیرون بده و خوبی این کار اینه که مثلا برای یه رشته خاص مثل "flashcs5" می تونین به نسبت رشته کلیدی که به این کلاس پاس می دین ، رمزی متفاوت رو دریافت کنین ... نظر شما چی هست ؟
     
    نوشته شده توسط ++Hadi++ در ‏29 سپتامبر 2010
  12. Mohammad_Shams

    Mohammad_Shams Member

    ارسال‌ها:
    68
    تشکر شده:
    155
    امتیاز دستاورد:
    6
    سلام

    ممنون

    از این کلاس فقط برای ایجاد hash استفاده میشود و یک روش کدگذاری داده (Generic encryption) نیست. در نتیجه اگر کسی از دیتای خود، با این کلاس یک چکیده (Message Digest ) تولید کرده و در جایی ذخیره نمود، دیگر نمیتواند دیتای اولیه خود را از روی آن بازیابی کند.

    در نتیجه داده ای که از روی آن Hash ایجاد شده، خودش نوعی کلید غیر قابل بازیابی است.

    همونطور که گفتم نمیشه از روی Hash، داده اولیه را حساب کرد.

    این کار میشه تقریبا نوعی Salted Hash.
    اما نیازی نیست قابلیت جدیدی به کلاس استفاده کنید. برای اینکه از بیشترین امنیت ممکن بهره‌مند بشوید، میتونید رشته مورد نظرتون را چند بار متوالی Hash کنید.

    به فرض اینکه کسی بدونه شما از کلاس استفاده کرده‌اید، شما می‌تونید مثلا از رشته خودتون دوبار Hash بگیرید و اونها را به هم متصل کرده و یکبار هم از اتصال اونها Hash بگیرید.
    اینطوری هیچ کس نمیتواند حدس بزند شما دقیقا از چه چیزی Hash ایجاد کرده اید.
     
    نوشته شده توسط Mohammad_Shams در ‏29 سپتامبر 2010
    Saeed2vfx و ++Hadi++ از این پست تشکر کرده اند.
  13. ++Hadi++

    ++Hadi++ Active Member

    ارسال‌ها:
    3,529
    تشکر شده:
    5,801
    امتیاز دستاورد:
    36
    از شما دوست عزیزم متشکرم .
    من این قابلیت رو (افزودن رشته ثانویه ) اضافه کردم و خوبیش فقط به اینه که می تونیم برا n کار مختلف که قراره مثلا از یه ساختار ایکسمل یا از کلمات شبیه به هم استفاده کنند ، با تغییر کلمه دوم ، n جور کلمه رمز hash مختلف داشته باشیم .
    البته در مورد ایکسمل بیان شما کاملا متین . ولی من برا اینکه حجم پردازشی کار خیلی بالا نره اومدم و مثلا هر 200 کاراکتر ایکسمل یکی رو انتخاب و در یه رشته concat کردم و در نهایت اینو با رشته پسورد دوم وارد کلاس شما کردم .
    در کل خیلی ممنونم ...
    در مورد کلاس ویرایشی هم مطمئن باشید که محفوظ برا شما می مونه و جایی آپ نمی شه ...
    موفق باشید و خیلی ممنون ...
     
    نوشته شده توسط ++Hadi++ در ‏2 اکتبر 2010
    DaDaDooDoo از این پست تشکر کرده است.
  14. Mohammad_Shams

    Mohammad_Shams Member

    ارسال‌ها:
    68
    تشکر شده:
    155
    امتیاز دستاورد:
    6
    سلام

    اتفاقا خیلی خوشحال می‌شوم، اگر قابلیت جدید یا ایده‌ای برای تکمیل یا افزایش امکانات این کلاس اجرا کرده و نتیجه را در همین جا اضافه کنید.

    اگر دقت کرده باشید در سورس کلاس، بخشی به نام LICENSE BLOCK تعبیه کردم که به این معناست که هر گونه استفاده و تغییر در کلاس آزاد است. معمولا در عرف پروژه‌های open source (البته این کلاس خیلی کوچکتر از این حرفهاست که پروژه محسوب شود) به این صورت است که با توجه به نوع مجوز (که در اینجا MPL است) هر توسعه گر دیگری که امکانات جدیدی به آن اضافه میکند، اطلاعاتی مانند (Date, Author, Version, Update , ...) را در انتهای بخش UPDATES (بعد از END LICENSE BLOCK) اضافه میکند.

    به این ترتیب کسی که یک فایل open source را دریافت میکند، با مطالعه آن بخش متوجه میشود که نویسندگان یا توسعه دهنگان آن پروژه چه کسانی بوده و هر کدام در چه تاریخی چه قابلیتی به آن اضافه کرده‌اند.
     
    نوشته شده توسط Mohammad_Shams در ‏3 اکتبر 2010
    ++Hadi++ و BehrouzPc از این پست تشکر کرده اند.
  15. ++Hadi++

    ++Hadi++ Active Member

    ارسال‌ها:
    3,529
    تشکر شده:
    5,801
    امتیاز دستاورد:
    36
    محمد جان بینهایت از لطفت سپاسگزارم ...
    والا خیلی حرفه ای پیش نبردم باز به روی چشم به زودی یه سمپل واستون می زارم .
    البته کاری که من کردم خیلی سخت نیست چون هر تغییری که در جفت کاراکتر های 16 رقمی بدیم ، با متد substr فقط دو رقم اولش در رمز اصلی قرار می گیره ... من خیلی کار ساده ای کردم .
    در نهایت به لطف خدا و با یازی شما ، دیگه امکان سو استفاده از ایکسمل پروژه ام نیست چرا که از تگ های داخلی ایکسمل رمز خاصی بوجود می یاد که این رمز رو یه برنامه exe (با قرار دادن ایکسمل کنارش) به نمایش می زاره و کافیه اون رمز رو در فیلد attribute با عنوان مثلا key قرار بدیم تا خروجی اصلی بتونه اونو تایید کنه وگرنه ایکسمل تایید نمی شه ...
    موفق باشید ...
     
    نوشته شده توسط ++Hadi++ در ‏4 اکتبر 2010
    Mohammad_Shams و BehrouzPc از این پست تشکر کرده اند.
  16. BehrouzPc

    BehrouzPc پــــادشــاه فــلــــش

    ارسال‌ها:
    1,909
    تشکر شده:
    3,510
    امتیاز دستاورد:
    113
    هادی عزیز با md5 هم فکر کنم بشه همین کار رو انجام داد فایل نهایی xml ما به کد md5 دارد که درون برنامه ابتدا چک می شود و بعد استفاده

    در مورد xml محمد شمس عزیز توی یکی از پروژه هاش از روش تبدیل به فایل باینری استفاده کرده بود که به نظرم برای این کار اون روش هم خوب هست

    ///

    بنده هم با محمد در مورد این نوع ارتقاع کد ها موافق هستم.
     
    نوشته شده توسط BehrouzPc در ‏4 اکتبر 2010
    Mohammad_Shams و ++Hadi++ از این پست تشکر کرده اند.
  17. ++Hadi++

    ++Hadi++ Active Member

    ارسال‌ها:
    3,529
    تشکر شده:
    5,801
    امتیاز دستاورد:
    36
    کلاس mhr آپدیت شد - ورژن 1.2

    سلام
    توجه : ورژن 1.3 کلاس محمد عزیز آپدیت شد .
    من تو این فکر بودم که چطور می شه راهی پیدا کرد که بتونیم از یه رشته خاص ، چند رمز رو بیرون بکشیم . خوب به این فکر افتادم که رشته دیگه ای رو به عنوان کد واژه به این کلاس خوبی که محمد عزیز زحمتشو کشیدند ، اضافه کنیم تا رشته ورودی اصلی با این رشته کد واژه ترکیب شه تا بتونیم از یه رشته ، رمز های مختلفی رو داشته باشیم . پس این کلاس رو ویرایش کردم تا به این هدف برسم و اینو برای عموم آپ کردم . زحمت اصلی این کلاس رو دوست عزیزم محمد شمس کشیده اند و ما هم به قدری ولو نا چیز ، اونو بهبود بخشیدیم ، مثالی رو آپ کردم که در اون ، ایکسملی خونده می شه و بعد کاراکتر های خاصی از تگ های خاص اون خونده می شه و در فایل exe نمایش رمز ، این کاراکتر ها در یه رشته به همراه کد واژه به این کلاس پاس داده می شه و بعد شما شاهد این هستین که رمز نهایی از فایل exe قفل ساز ، به نمایش در می یاد . سپس با همین الگریتم ، این ایکسمل در فایل اصلی خونده می شه و فایل اصلی چک می کنه که آیا پسوورد صادر شده از کلاس محمد عزیز ، با کد فیلد key که در روت اصلی ایکسمل هست ، برابر هست یا نه ، اگه بله ، پس سورس اجرا می شه و در صورت عدم سازگاری و تساوی ، سورس اعلام میکنه که ایکسمل سازگار نیست و اجرا نمی شه . این می تونه روشی نسبتا خوب برای محافظت از استفاده دوباره از مولتی مدیایی بشه که قراره برای کسی بنویسین . اگر هم کارفرمای شما اجازه اینو داشته باشه که ایکسمل رو دستکاری کنه ، فایل exe نمایش رمز جدید رو بهش می دین تا کنار ایکسمل قرار بده و بتونه ایکسمل رو عوض کنه . از خوبی های کد واژه که من به این کلاس اضافه کردم اینه که شما ، می تونین برای یه پروژه که مثلا برای 100 نفر قرار هست بفروشین ، 100 کد واژه مختلف رو تعریف میکنین و به نسبت ساختار جدید ایکسمل ها ، 100 جور پسورد مختلف برای 100 مشتری صادر شه ، چرا که این 100 مشتری ایکسمل هاشون در یک ساختار هست و نمی خوان که مشتری شماره 1 به محصولی که مشتری شماره 2 برای خودش درست کرده ، دسترسی ویرایشی داشته باشه . فرض کنین که مشتری شماره 1 ، یه بانک نرم افزاری می خواد ، خوب این مشتری نمی خواد که 99 مشتری دیگه ، بانک نرم افزاری ایشون رو دستکاری کنه ، فرض کنین که کمی سورس ها رو برای هر مشتری عوض کردین ، مثلا ساختار ایکسمل ها رو یه کم بهم ریختین ، در کل می خواهین خروجی پسوورد شما به نسبت کد واژه ای باشه که شما به سورس اصلی می دین ، درکل این روش یه روش خوبی هست تا کنترل همه چیز بیشتر به دست شما باشه ...
    من کد های این پروژه رو در اینجا قرار ندادم ولی با دانلود این فایل های rar ، می تونین به همه اونها دست پیدا کنین و باید با فلش cs5 باز کنین .

    توجه کنین که اگر این 100 خروجی رو به 100 مشتری دقیقا با یه ساختار ایکسمل بفروشین ، اونا می تونن از ایکسمل بقیه مشتری ها استفاده کنن و فقط پسوورد رو از فایل exe نمایش پسوورد خودشون در بیارن ولی باید ترتیبی رو ارائه بدین تا ساختار کمی پیچیده تر باشه . در ضمن این کار از این بابت به نفع شماست چرا که هر کدوم از مشتری ها به خاطر عدم دستکاری و سو استفاده محصول اصلی خودشون ، نمی یان تا خروجی exe شما همراه با فایل نمایش پسوورد رو به افراد دیگه هم بفروشن ...
    در واقع تقریبا می شه گفت برای محصولاتتون ، کد لایسنس بوجود می یارین ...
    درمثال گفته شده :
    1- اگه بعد از ویرایش فردی که اجازه ویرایش رو نداره ، حتی یه حرف از ایکسمل نهایی کم یا زیاد بشه ، پسوورد به هم می ریزه .
    2- اگه به فرض محال تعداد حروف ایکسمل ویرایش شده توسط فردی که اجازه ویرایش نداره ، با ایکسمل اصلی یکی باشه ، باید ببینیم که آیا حروفی که ویرایش شده جزو یکی از رشته هایی هست که در حلقه رشته ورودی به این کلاس وارد می شه یا نه ، پس هر چی تعداد بیشتری از کاراکتر های یه ایکسمل رو وارد این کلاس کنیم و دایره ورودی ها رو تنگ تر کنیم تا تعداد بیشتری وارد بشن ، تعداد عملیات کامپیوتری رو بالاتر بردیم ولی شانس دستکاری وموفقیت افراد اهل سو استفاده رو پایین تر بردیم .
    3-(*جدید*) این دقیقا ساختاری هست که محمد عزیز زحمتشو کشیده و من هیچ دستی تو کد های ایشون نبردم فقط یه تابع دیگه ای به اسم getKeyHash اضافه شده که فقط یه کد کلید یا KeyWord رو اضافه می گیره و به نسبت اون ، hash و نتیجه اونو عوض می کنه و ساختارش هم بر این اساسه که اون keyWord وارد رشته اصلی می شه و به اول اون اضافه می شه و الباقیش می شه همون سیستم معمول hash MD5 که آقا محمد ترتیبشو داده . این موارد به درخواست محمد جان انجام شده و خود بنده هم دیگه نخواستم تو این سیستم دستی ببرم.
    موفق باشید ...
     

    پیوست ها:

    نوشته شده توسط ++Hadi++ در ‏9 اکتبر 2010
    Saeed2vfx، hosein_mirian، splinter cell و 7 نفر دیگر از این ارسال تشکر کرده اند.
  18. Mr. LonelY

    Mr. LonelY کاربر فعال

    ارسال‌ها:
    876
    تشکر شده:
    1,207
    امتیاز دستاورد:
    93
    اینجوری نمیشه!
    باید ی تیریپ رمز نگاری برم!!!:sad:
     
    نوشته شده توسط Mr. LonelY در ‏9 اکتبر 2010
    ++Hadi++ از این پست تشکر کرده است.
  19. BehrouzPc

    BehrouzPc پــــادشــاه فــلــــش

    ارسال‌ها:
    1,909
    تشکر شده:
    3,510
    امتیاز دستاورد:
    113
    توی XML ها با حجم کمی بالا توی رمز ایجاد شده Key Generator نمونه ای شبیه به OverFlow دیده میشه البته به دلیل این که ادامه و ابتدا این مشکل رو ندارد شاید نشه بهش گفت باگ ولی ، اگه itititititit هم به رشته ای نا منظم تبدیل بشه بهتر می باشد
    مثلا دو نمونه
    3fa2225227a2ititititititd78ea69e
    3c5720662ddaititititititdb539d97

    در ضمن از هادی عزیز برای این کار تشکر ویژه ای می کنم ، موفق و پیروز باشید :rose:
     
    نوشته شده توسط BehrouzPc در ‏9 اکتبر 2010
    Mohammad_Shams و ++Hadi++ از این پست تشکر کرده اند.
  20. ++Hadi++

    ++Hadi++ Active Member

    ارسال‌ها:
    3,529
    تشکر شده:
    5,801
    امتیاز دستاورد:
    36
    کلاس آپدیت شد ...در پست 17 ...
    فکر کنم یه کم مشکلاتش حل شده . چون کاری که قبلا می کردم ، احتمال زیادی رو واسه OverFlow داشته ولی الان کمتر شده ...
    موفق باشید ...
     
    نوشته شده توسط ++Hadi++ در ‏13 اکتبر 2010
    Mohammad_Shams، FlashBank و BehrouzPc از این ارسال تشکر کرده اند.

به اشتراک بگذارید