رفتن به مطلب
لـــرن نــت

انجمن های پشتیبانی

شما می توانید سوالات و مشکلات خود را در انجمن های تخصصی برنامه نویس ایرانی پیگیری کنید.

تــوجــه

این وب سایت تابع قوانین جمهوری اسلامی میباشد و وابسته به هیچ گروه سیاسی و ارگان خاصی نمیباشد.

تــوجــه

این وب سایت تحت نظر پلیس فتا میباشد و تمامی مطالب طبق قوانین ایران میباشد.

  • نام کاربری

    Knight
  • گروه کاربری

    گروه دانشجو
  • تعداد ارسال ها

    43
  • تاریخ عضویت

  • آخرین بازدید

اعتبار در سایت

81

4 دنبال کننده

درباره Knight

  • درجه
    تیم اصلی انجمن

آخرین بازدید کنندگان نمایه

437 بازدید کننده نمایه
  1. کار با تایمر

    سلام این کدهایی که شما گذاشتی همشون از Stopwatch استفاده کرده، شما باید از تایمر استفاده میکنید Stop Watch برای اندازه گیری زمان گذشته بین دو نقطه از برنامه مورد استفاده قرار میگره، بطور مثال در محاسبه و نمایش Progressbar و زمان باقی مونده برای انجام کاری به کاربر کاربرد داره، همونطوری که تو کدهاتون برای این منظور استفاده شده، بطور مثال در کد اولتون میاد حلقه فور رو اجرا میکنه و پس از اتمام حلقه فور بهتون میگه چند میلی ثانیه طول کشیده تا حلقه فورتون اجرا بشه. استفاده از تایمر هم بسیار سادس، اینم یه مثال ساده: (البته من زمان تایمر رو برای اینکه نتیجه رو زودتر ببینید 10 ثانیه در نظر گرفتم، شما میتونید تبدیلش کنید به 60 ثانیه) نکته: دستورات داخل تایمر یک بار اجرا میشه (با توجه به اینکه میخواید Shutdown کنید) اگر میخواید براش Interval مشخص کنید باید آرگمان آخر رو که من صفر در نظر گرفتم رو مقدار دهی کنید. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string pass; Timer t = new Timer(TimerCallback, null,10000,0); Console.Write("Enter Password: "); pass = Console.ReadLine(); if (pass == "11") { t.Dispose(); Console.WriteLine("Success"); } else { Console.WriteLine("Worng Password"); } Console.ReadLine(); } private static void TimerCallback(object o) { Console.WriteLine("Shutdown"); } } } خط اول میاد تردی که اون خط از برنامه داره توش اجرا میشه رو به مدت میلی ثانیه به حالت sleep میبره، یعنی به مدت یک میلی ثانیه اجرای کدها متوقف میشه و پس از گذشت زمانی که مشخصی کردید (در این مثال یک میلی ثانیه) مجدداً اجرای باقی دستورات از سر گرفته میشه. در مورد خط دوم: Stop Watch رو که بهتون گفتم چیکار میکنه، وقتی استپ کردیدش میتونید با استفاده از چند متد مختلف مقدار زمان سپری شده رو مشاهده کنید. Tick کوچکترین واحد زمانی قابل سنجش برای یک Stop Watch هست و ElapsedTicks مقدار تیک های گذشته از در بازه فعالبت Stop Watch ما هست. با استفاده از Frequency و تقسیم اون بر تعداد تیک های سپری شده میتونید عددی بدست بیارید که نمایشگر زمان باشه مقدار فرکانس بستگی به سخت افزار و سیستم عامل و مکانیزم پیاده سازی تایمر داره، بنابراین در سیستم ها و حالات مختلف مقادیر مختلفی رو برمیگردونه، به همین دلیل هست که این فیلد برای استفاده برنامه نویسان در نظر گرفته شده تا بتونن فرکانس تیک های تولید شده رو دریافت کنن. Elapsed هم یکی دیگه از شیوه های دریافت زمان سپری شده در Stopwatch هست که مقداری که بر میگردونه از نوع TimeSpan هست. اگر لازم دارید بدونید چه مدت زمانی در Stopwatch شما گذشته پس قطعاً لازمه که ازش استفاده کنید. نکته: Stopwatch متدی به نام ElapsedMilliseconds هم داره که مقدار زمان سپری شده بر حسب میلی ثانیه رو بهتون نشون میده.
  2. کنسول سی شارپ

    شما خیالتون راحت هر چیزی که در حالت ویندوز فرم بتونید پیاده سازیش کنید با کنسول هم میتونید انجامش بدید CLI (کنسول) هم مثل GUI فقط یه رابط کاربریه و ربطی به قدرت زبان برنامه نویسی نداره در GUI شما عناصر گرافیکی دارید و کاربر با استفاده از اونها میتونه با برنامتون ارتباط برقرار کنه و ورودی بده و خروجی بگیره ولی CLI اینکار با استفاده از خط فرمان انجام میشه. اینکه کدوم رابط رو برای برنامتون انتخاب کنید بستگی به خودتون داره، ولی انتخاب CLI باعث نمیشه قدرتتون در برنامه نویسی کم بشه مطمعناً انتخاب هوشمندانه ای نیست که بیاید مثلاً سیستم انبار یک کارخونه رو با CLI پیاده سازی کنید، چون CLI اکسپرت فرندلی هست و تعامل کاربر با برنامتون با استفاده از خط فرمان بسیار پیچیده و خسته کننده میشه، برای همین انتخاب هوشمندانه استفاده از GUI هست که کاربر بتونه سریعاً به تمام قسمت های برنامه دسترسی داشته باشه. قبلاً هم گفتم خیلی از برنامه ها با استفاده از کنسول گسترش داده میشن، مخصوصاً برنامه هایی که مخاطبشون کارهای تخصصی هست. اکثر ابزارهای لینوکس با رابط کنسول با کاربر ارتباط برقرار میکنن، در همین ویندوز هم خیلی از ابزارهای محلی خود ویندوز مثل ping و fdisk و... از رابط کنسول برای تعامل با کاربر استفاده میکنن. نتیجه نهایی اینکه کنسول هم مثل GUI فقط یک رابط کاربری هست و ربطی به قدرت زبان برنامه نویسی نداره، گرچه اکثر برنامه های تجاری با استفاده از GUI ساخته میشن تا برنامه یوزرفرندلی باشه و به راحتی کاربر بتونه باهاش کار کنه، اما برنامه های تخصصی که مخاطبش گروهی خاص از متخصصین هستن با استفاده از CLI ساخته میشه (معمولاً) خیلی برنامه ها هستن که هم رابط GUI ارائه میدن و هم رابط کنسول و کاربر بنا به تشخیص خودش انتخاب میکنه با کدوم کار کنه. کار با فایل ها در کنسول همونجوری انجام میشه که در Win Form انجام میشه و تفاوتی نداره
  3. دستور جمع دو عدد بصورتی که شما نوشتید یک نمایش سطح بالاست که توسط ما انسان ها قابل درکه و کامپیوتر هیچ درکی از عبارت مثلاً 2 + 2 نداره. دستورات شما در زبان های سطح بالا توسط کامپایلر به دستورات کامپیوتر تبدیل میشه و برای درک این موضوع که چه اتفاقی در سطج پایین داره میافته نیاز دارید تا با معماری کامپیوتر آشنا باشید. چیزی که به عنوان کامپیوتر شما جلوی شماست یک روزه به اینجا نرسیده، حاصل قرن ها تلاش بشره. بنطر میاد شما به زبان بیسیک مسلط هستید، پس به زبان بیسیک مثال میزنم شما تو برنامتون مینوسید a = 2 + 2 که a در واقع یک متغیر هست. حتماً میدونید که متغیرها مکان هایی در حافظه هستن که برای ذخیره مقادیر استفاده میشن تا بتونیم با مراجعه اون خانه از حافظه مقدارشون رو بازیابی کنیم. بیسیک یک زبان سطح بالا هست، انقدر سطح بالا که اصلاً کاری به آدرس های حافظه ندارید و همه این مسائل در پشت پرده توسط خود کامپایلر و به کمک Runtime DLL اون و سیستم عامل مدیریت میشه. (ویژگی زبان های سطح بالا همینه) شما وقتی مینویسید 2 + 2 کامپایلر میاد و اون رو به دستورات ماشین تبدیل میکنه. دستورات ماشین هم تماماً عددی هستن. از اونجایی که شما برنامه نویس سطح بالا هستید من فعلا نمیگم وقتی مینویسید a = 2 + 2 چه کد صفر و یکی تولید میشه، بجاش اول همون یه خط کد رو تبدیل میکنیم به زبون اسمبلی که برای ما انسان ها خوانا تر هست. همین دستور بالا که نوشتیم a = 2 + 2 وقتی توسط کامپیایلر ترجمه میشه تبدیل میشه به این دستور: نکته: عدد 2 در مبنای باینری برابر 10 و در مبنای هگز برابر 02 هست. MOV ESI, a MOV AX, 0002H ADD AX, 0002H MOV word [ESI], AX این دستورات همون یک دستور a = 2 + 2 شما در زبان بیسیکه که بوسیله کامپایلر تبدیل شده به زبون اسمبلی. (با توجه به سینتکس FASM) تو خط اول آدرس متغیر a در رم داخل ثبات ESI قرار میگیره در خط دوم ثبات AX با مقدار 2 مقدار دهی شده در خط سوم با استفاده از دستور ADD از پردازنده خواستیم تا جمع انجام بده. به این صورت که مقدار AX (که در حال حاضر 2 هست) رو با 2 جمع میکنه (با همون مداری که بالا مثال زدم) و نتیجه رو در اپرند اول (یعنی همون AX) میریزه. بنابراین با اجرای این خط از دستور مقدار AX برابر 0004 در مبنای هگز یا 0000000000000000 در مبنای باینری شده. و در انتها درخواست دسترسی به حافظه رو دادیم تا مقدار AX رو در خانه ای که ESI بهش اشاره داره بریزه (ESI به آدرس متغیر a اشاره داشت) نکته: ثبات چیه؟ اینم یکی از مواردیه که باید بلد باشید وگرنه نمیتونید اتفاقاتی که میافته رو درک کنید. ثبات ها مکان های کوچیکی از حافظه در داخل خود CPU هستن که پردازنده بطور مستقیم با اونها سر و کار داره. یکی از فرقاش با رم در اینه که به دلیل اینکه ثبات ها در داخل خود پردازنده هستند و برخلاف رم با استفاده از یک باس به پردازنده متصل نمیشن، سرعت بسیار بسیار بالاتری دارن. وقتی که میگیم یک CPU مثلا 32 بیتی هست، یعنی در واقع داریم میگیم طول ثبات های اون 32 بیت (4 بایت) هست. شما تو زبان های سطح بالا کاملاً از نقش این ثبات ها بی خبرید. حالا اون دستورات بالا تبدیل میشه به کد ماشین یا همون صفر و یک بطور مثال دستور ADD AX, 00002H تبدیل میشه به این: 83 c0 02 تو CPU یه ثباتی داریم به اسم Instruction Pointer که حاوی آدرس دستور عمل بعدی هست که باید انجام شه. وقتی EIP به این دستور میرسه پردازنده شروع میکنه به دیکد کردن این دستور. 83 اینجا آپکد ماست، یعنی میخوایم یک جمع 16 بیتی انجام بدیم. با دیدن این آپکد پردازنده به دنبال دو تا آپکد خودش میگرده که به ترتیب در ادامه اومده یعنی اولی c0 (یعنی عدد اول و مقصد AX هست) و دومی 02 که همون عدد 2 ماست. اینکه چرا 83 یعنی میخوام یه جمع 16 بیتی بین یک ثبات یک immediate انجام بدم برمیگرده به قراردادی که معماران اینتل برای پردازنده های x86 تعریف کردن. تو پردازنده های دیگه عدد 83 میتونه یه معنی دیگه داشته باشه، شما هم اگر روزی پردازنده طراحی کردید میتونید تعریف کنید آپکد 83 بیاد مثلاً ضرب انجام بده، بنابراین اینکه چرا 83 اینکارو انجام میده یه چیز قراردادیه به هر صورت بعد دیکد شد و مشخص شدن آپکد و آپرندها، واحد کنترل میاد دستور رو اجرا میکنه و در اینجا چون داریم عملیات جمع انجام میدیم پردازش رو ارجاع میده به واحد ALU تا این واحد جمع رو انجام بده و نتیجه رو در ثبات AX ذخیره کنه. همه این دستورات توی مستندات سایت اینتل و AMD برای پردازنده های x86 موجوده این ساده ترین چیزی بود که میشد توضیح داد و به هیچوجه روی مسائل پایینتر مثل این موضوع که چرخه دستورات چجوریه و چجوری دستورات دیکد میشن وارد نشدم. برای درک این موضوعات اولاً باید با زبان های سطح پایینتر آشنایی داشته باشید، دوماً در مورد معماری کامپیوتر و پردازنده ها تحقیق کنید، چون این مسائل مربوط میشه به علم سخت افزار، و نه نرم افزار مساله اعداد اعشاری و محاسباتشون مساله پیچیده ای هست، به همین دلیله که من تو پست اولم در موردشون توضیح ندادم. اعداد صحیح توان مثبت دارن و اعداد اعشاری توان منفی و به این شکله که میشه محاسبشون کرد. برای درک نحوه محاسبه وحتی ذخیره اعداد اعشاری در کامپیوترها لازمه که یه استاد مسلط به ریاضی بیاد و بهتون با شکل و مثال توضیح بده بطور کلی دو شیوه برای ذخیره اعداد اعشاری داریم که این دو شیوه توسط موسسه مهندسان برق و الکترونیک (به اختصار IEEE) معرفی شده. بطور مثال در استاندارد IEEE 754 برای ذخیره یک عدد 32 بیتی شناور به این شکله: که برای محاسبه مقدارش از فرمول (-1^S) * Val (F) * 2 ^ Val(E) محاسبه میشه، البته همونطوری که گفتم آموزش دادن این موضوع چیزی نیست که کسی بتونه از راه دور آموزش بده. برای درکش میتونید به ویدیوهای داخل یوتیوب در مورد اعداد اعشاری نگاهی بندازید مقاله زیر هم در مورد محاسبات اعشاری هست که دانشگاه کمبریج منتشر کرده: دانلود مقاله محاسبات اعشاری در مورد معماری کامپیوتر سرچ کن و مقالاتشو بخون سادش اینه که هر کدوم از این دستورات مدارات مربوط به خودشون رو دارن. وقتی آپکد مثلاً 83 وارد میشه، مداری وارد عمل میشه که میاد و جمع 16 بیتی یک ثبات با یک immediate رو انجام میده. پس نحوه شناسوندنشون بصورت سخت افزاری و با توجه به مداراتیه که طراحی شده با استفاده از همون کد هایی که بالا گفتم مثلاً وقتی مینوشتن 83c002 پردازنده میومد ثبات AX رو با عدد 2 جمع میکرد و نتیجه رو در AX ذخیره میکرد. بخاطر اینکه آدما نمیتونن عددا رو حفظ کنن و تعداد این اعداد خیلی زیاده، اومدن و زبان اسمبلی رو اختراع کردن تا بجای عدد بتونیم دستور حفظ کنیم. این دستورات تک تک برای اسمبلر تعیین شده و بهش گفته شده هر جا دید ADD AX,02H بیاد و اونو تبدیل کنه به 83c002. مجدداً میگم که تا وقتی با زبان های سطح پایین کار کنید نمیفهمید داریه چه اتفاقی میافته. شما تو زبان های سطح بالا نه آدرس ها کار دارید، نه کدهاتون به آبجکت تبدیل میشه و نیاز دارید این آبجکت ها رو لینک کنید تا بتونید یه فایل اجرایی بسازید. حتی نمیدونید فرمت PE چی هست، پس اگر علاقه مندید به این مسائل انقدر خودتون رو تو برنامه نویسی قوی کنید که بتونید بیاید سراغ زبان های سطح پایین. هر کدی که شما به هر زبانی مینوسید توسط کامپایلر میاد و تبدیل میشه به همین آپکدها و آپرندها که توسط پردازنده قابل تشخصیه.
  4. دریافت رشته خالی

    احتمالا از دستور cin استفاده کردی که نمیتونه اینتر رو بخونی، علتشم اینه که cin برای دریافت تکست های فرمت شده هست برای اینکه اینتر رو هم دریافت کنی یکی از کارایی که میتونی انجام بدی استفاده از دستور getline هست: string input; getline(cin, input);
  5. شما برای اینکه بهتر بتونید این چیزا رو درک کنید باید با ترانزیستورها آشنا بشید. یکی از کارهایی که ترانزیستورها انجام میدن اینه که مثل یک سوییچ عمل میکنن. خود ترانزیستورها انواع مختلفی دارن که چیزی که ما اینجا ازش استفاده میکنیم ترانزیستورهای اتصال دو قطبی یا BJT ها هستن خود BJT ها هم به دو نوع PNP و NPN تقسیم بندی میشن که برای ساخت مثلاً گیت AND میخوایم از ترانزیستورهای NPN استفاده کنیم. هر BJT نوع NPN دارای سه پایه به نام های امیتر و بیس و کلکتور هست. گفتیم که یکی از کاراهای مهم ترانزیستورها اینه که مثل یک سوییچ عمل میکنه. هر وقت جریان پایه Base به حد مناسبی برسه، جریان از کلکتور به سمت امیتر حرکت میکنه. در واقع بیس مثل کلیدی عمل میکنه اگر بهش جریان برسه اجازه عبور جریان الکتریکی از کلکتور به امیتر رو میده و اگر بهش جریانی وارد نشه ارتباط بین امیتر و کلکتور قطع میشه و برقی عبور داده نمیشه. برای اینکه پایه های یک BJT نوع NPN رو بشناسید شماتیک زیر رو ببینید: حالا از همین خاصیت استفاده میکنیم و طبق منطقی که تعریف کردیم گیت AND رو پیاده سازی میکنیم: ما از بیس ترانزیستورها به عنوان ورودی استفاده میکنیم ولتاژ رو به کلکتور ترانزیستور A وصل مکنیم. اگر ورودی A برابر صفر باشه، صرف نطر از اینکه به B چه مقداری دادیم ولتاژ هرگز به کلکتور ترانزیستور پایینی و در نهایت خروجی نمیرسه، پس جواب صفر میشه اگر ورودی A برابر یک باشه ولی B برابر صفر باشه، ولتاژ از کلکتور ترانزیستور A به کلکتور ترانزیستور B میرسه، اما هرگز از کلکتور ترانزیستور B به امیتر و خروجی نمیرسه، پس جواب باز هم صفره اگر ورودی A برابر یک باشه و B هم برابر یک باشه، ولتاژ از کلکتور A به کلکتور B و سپس به امیتر B (یعنی خروجی) میرسه و جواب یک میشه
  6. سلام موضوعی که شما میخواید در موردش بدونی نیازمند اینه که در مورد یه سری موارد مثل طراحی سخت افزار و بخصوص زبان ماشین اطلاعاتی داشته باشید و همینجوری نمیشه بطور کامل این موضوع رو درک کرد، ضمن اینکه توضیحش بصورت تئوری سخته، دانشجوهای کامپیوتر درسی دارن به اسم کارگاه سخت افزار که در اون مداراتی که در زیر شرح میدم رو خودشون میسازن و تست میکنن و درکش میکنن (البته خیلی هاشونم درک نمیکنن ). با این حال تا جایی که میتونم ساده و بدور از هرگونه پیچیدگی مساله رو براتون سعی میکنم توضیح بدم. اول از همه باید بریم تو سخت افزار و بفهمیم گیت چیه: گیت ها (Gate به معنی دروازه) در مبحث سیگنال های دیجیتال به مدارات الکترونیکی گفته میشه که بر روی یک یا دو ورودی میتونه عملیت منطقی انجام بده (جز یکی از گیت ها که تک ورودیه بقیه دو تا ورودی دارن). عملیات منطقی عبارتند از AND و OR و NOT و XOR و XNOR و NAND و NOR این گیت ها امروزه معمولاً با استفاده از ترانزیستور و دیودها ساخته میشن، در حالی که قدیما با استفاده از لامپ های خلا و حتی اگر در کامپیوترهای اولیه نگاه کنیم با استفاده از رله های مکانیکی پیاده سازی میشدن. هر کدوم از این گیت ها جدول صحت خودشون رو دارن. اینکه جدول صحت چجوری ساخته میشه دست ما انسان هاست، یعنی ما انسان ها در ابتدا توافق کردیم که این گیت ها با این عملکردها ساخته بشه که البته بحثی منطقی هست، اما این منطق رو ما انسان ها برای سیستم های دیجیتال به عنوان قانون مطرح کردیم. بطور مثال: حاصل گیت AND تنها در صورتی یک میشود که هر دو ورودی دارای مقدار یک باشند در غیر اینصورت حاصل صفر است. این جمله یک جمله منطقیه، همونجوری که از اسمش مشخصه (AND = و) یعنی وقتی A و B یک بودن. حالا این منطق رو مهندسین الکترونیک با استفاده از مثلا ترانزیستور پیاده سازی کردن (که پیاده سازیشم خیلی سادست ولی چون بحث ما الکترونیک نیست واردش نمیشم) یا مثلا OR به معنی یا هست و جدول صحتش هم بر اساس منطق یا در مغز ما انسان ها پیاده سازی شده: خروجی گیت OR در صورتی که حداقل یکی از ورودی ها یک باشد برابر یک است، در غیر اینصورت حاصل صفر است. (یا A یک باشه یا B) طبق همین موضوع از جدولی به نام جدول صحت یا جدول درستی برای نمایش عملیات هر کدام از این گیت ها استفاده میکنیم. از اونجایی که امکان قرار دادن تصویر در هر پست محدوده، من جدول صحت تعدادی از این گیت ها رو براتون میذارم: من نمیخوام بیشتر از این در مورد گیت ها توضیح بدم، ولی اگر در درک هر کدوم از گیت ها مشکلی داشتید بفرمایید توضیح بدم. چیزی که بیشتر از مطرح کردن مبحث گیت ها مدنظر داشتم این بود که ببینید جدول صحت چیه و چجوری بوجود میاد بخش محاسبات منطقی در پردازنده: داخل پردازنده یا CPU به بخش های مختلفی تقسیم شده که یکی از این بخش ها «واحد محاسبه و منطق» یا به اختصار ALU هست. این واحد وظیفش انجام عملیات منطقی (مثل گیت ها) و عملیات ریاضی (مثل جمع و تفریق) هست. در واقع جواب سوال شما در این بخش نهفته هست شما در داخل این واحد مداری دارید به اسم Adder که کارش جمع کردن اعداده. مدارات جمع کننده به دو دسته نیم جمع کننده و تمام جمع کننده تقسیم میشن. برای طراحی این مدارات هم اول انسان ها جدول صحت کشیدن و رفتارها رو مشخص کردن، چون کامپیوتر به خودی خود درکی از عملیات ریاضی نداره، بطور مثال: حاصل جمع اعداد 0 و 0 برابر 0 خواهد شد حاصل جمع اعداد 1 و 0 برابر 1 خواهد شد حاصل جمع 0 و 1 برابر 1 خواهد شد حاصل جمع اعداد 1 و 1 برابر 10 خواهد شد این موضوع رو در جدول صحت بصورت زیر ترسیم میکنن: این جدول صحت یک نیم جمع کننده بر اساس گفته های بالا هست. A و B اعداد ورودی و C و S اعداد خروجی هستن، نکته اینکه منظور از C عدد نقلی و منظور از S حاصل جمع هست. همونطور که میبینید حاصل دو عدد 1 و 1 برابر 10 میشه (10 در مبنای باینری برابر 2 در مبنای دهدهی است). بنابراین همونجوری که بر روی کاغذ دو عدد رو حمع میکنیم، صفر رو به عنوان حاصل جمع پایین مینویسیم و 1 رو به عنوان رقم نقلی با دو عدد بعدی جمع میکنیم. مشکل نیم جمع کننده اینه که در جمع دو عدد بعدی رقم نقلی رو حساب نمیکنه و با دو عدد موجود جمع نمیکنه. برای همین بود که تمام جمع کننده بر اساس منطق زیر طراحی شد: حاصل جمع عدد 0 و 0 در صورتی که رقم نقلی 0 باشد برابر صفر است، رقم نقلی تولید نخواهد شد و صفر است حاصل جمع دو عدد 0 و 0 در صورتی که رقم نقلی 1 باشد برابر یک است، رقم نقلی نیز تولید نخواهد شد و صفر است حاصل جمع دو عدد 0 و 1 در صورتی که رقم نقلی 0 باید (رقم نقلی نداشته باشیم) برابر 1 است، عدد نقلی نیز تولید نخواهد شد و صفر است حاصل جمع دو عدد 0 و 1 در صورتی که رقم نقلی 1 باشد (حاصل جمع دو عدد قبلی رقم نقلی آورده باشد) برابر 10 است، یعنی حاصل جمع (S) برابر صفر و رقم نقلی تولید میشود (C برابر یک میشود) .... این منطق به همین شکل تحلیل و در جدول صحت با اعداد جاگذاری میشود، چون سه ورودی داری (A و B و C) بنابراین 3^2=8 -حالت مختلف هم خواهیم داشت که تمامی این حالات را بررسی میکنیم و به جدول زیر میرسیم: در جدول بالا تمامی حالات ممکن رو بررسی و محاسبه کردیم، حالا وقتشه که با استفاده از جدول کارنو اون رو ساده کنیم و تابع این جدول رو بدست بیاریم. پس از حل جدول کارنو به تابع زیر میرسیم: تابع ستون S برابر و تایع ستون Cout برابر است نکته این که Cin به معنی مقدار رقم نقلی ورودی (بدست آمده از جمع دو رقم مرتبه قبل) و Cout به معنی مقدار رقم نقلی تولید شده از حاصل جمع رقم نقلی ورودی (Cin) به همراه A و B است. همانطور که میبینید اگر ما عدد A را با عدد B ایکس اور (XOR) کنیم و حاصل را با Cin ایکس اور کنیم، درواقع عمل جمع را انجام داده ایم (به همین شکلم Cout با توجه به تابعی که بدست آوردیم محاسبه میشه) پس ما تونستیم مداری با استفاده از گیت ها بسازیم که با عملیات منطقی دو عدد رو با هم جمع کنه. واحدهای دیگه ای هم با همین منطق مثل FPU وجود داره که عملیات Float (اعداد اعشاری) رو انجام میده.. در واقع ریاضی دان ها توابع و الگوریتم عملیات مختلف رو با استفاده از گیت های منطقی محاسبه کردن و مهندسین سخت افزار اون توابع رو با استفاده از این گیت ها (که در واقع مجموعه ای از ترانزیستورها هستن) پیاده سازی کردن. نکته اینکه واحدهای دیگه ای مثل واحد اجرا (EU) هم در داخل پردازنده شما وجود داره که کارش اجرای دستورات هست. مثلا شما وقتی میگید 2+3 این واحد دستور شما که ADD باشه رو به همراه دو آپرند اون یعنی 2 و 3 میخونه و میفهمه که شما درخواست عملیات جمع دارید، سپس کار شما رو به واحدهای مربوطه مثل ALU ارجاع میده و عدد شما توسط مدار Full Adder که در بالا توضیح دادم محاسبه میشه و خروجیش جهت استفاده در ثبات های CPU ذخیره میشه. (برای درک این موضوع لازمه که اسمبلی بلد باشید) ---------------------------------------------------------------------------- حالا که فهمیدیم جمع چجوری انجام میشه میتونیم به بررسی تفریق بپردازیم بطور مثال من میخوام این عملیات رو انجام بدم: 8 - 2 جواب این سوال رو ما انسان ها میدونیم که میشه 6. حالا سوالی که مطرحه اینه که آیا میتونم این مساله رو بصورت زیر بنویسم؟ 8 + (-2) بله! یعنی من عملیات تفریق رو به عملیات جمع تبدیل کردم که پاسخ این عملیات هم 6 میشه. بنابراین طبق این قانون در ریاضی: حاصل تفریق دو عدد برابر حاصل جمع عدد اول در معکوس عدد دوم هست. برای محاسبه معکوس هر عدد قبلاً از مکمل اول استفاده میشد که ایراداتی داشت، بطور مثال دو جور صفر در این شیوه داشتیم. امروزه از مکمل دوم استفاده میکنیم که مشکلات مکمل اول رو نداره و شیوه محاسبش هم به این صورته که ابتدا تک تک بیت ها رو NOT میکنیم و سپس به حاصل یک واحد می افزاییم. بطور مثال عدد 28 در مبنای باینری به صورت زیر نمایش داده میشه: 00011100 حالا صفر ها رو به یک، و یک ها رو به صفر تبدیل میکنم: 11100011 و در نهایت عدد حاصل رو با یک جمع میکنیم: 11100011 + 1 => 11100100 که درواقع عدد 11100100 نمایشگر عدد -28 است پس برای محاسبه تفریق ابتدا مکمل دوم عدد دوم رو از شیوه بالا حساب میکنیم و سپس با عدد اول جمع میکنیم. و در انتها جهت اصلاح علامت، پر ارزشترین بیت عدد حاصل را با توجه به عدد بزرگتر اصلاح میکنیم. ---------------------------------------------------------------- عملیات ضرب هم همونجوری که ما تو دبستان یاد گرفتیم توسط کامپیوتر انجام میشه، با این تفاوت که خیلی ساده تره، چون ما فقط یا ضرب در یک داریم (که حاصل میشه خودش) یا ضرب در صفر داریم (که حاصل میشه صفر) بطور مثال میخوایم دو عدد 11 و 14 رو در هم ضرب کنیم: 1011 (عدد 11 دسیمال) x 1110 (عدد 14 دسیمال) ====== 0000 (1011 x 0) 1011 1011 x 1, یک واحد شیفت به چپ) 1011 (1011 x 1, یک واحد شیفت به چپ) + 1011 (1011 x 1, یک واحد شیفت به چپ) ========= 10011010 (عدد 154 دسیمال) همانطور که میبینید در هر مرحله اگر عدد صفر بود حاصل شد صفر و اگر عدد 1 بود حاصل ضرب همون عدد میشد، ضمن اینکه در هر مرحله یه شیفت به سمت چپ انجام دادیم، همونجوری که ما انسان ها بر روی کاغذ در هر مرحله یک صفر اضافه میکنیم و سپس محاسبه میکنیم. در نهایت تمامی این اعداد توسط Full Adder جمع میشن و حاصل بدست اومده حاصل ضرب ماست. پس ضرب بوسیله عملیات شیفت به چپ و جمع انجام گرفت -------------------------------------------------------------------------------- و اما تقسیم: برای انجام عملیات تقسیم الگوریتم های مختلفی وجود داره و نسبت به عملیات جمع و ضرب و تفریق عملیات پیچیده تری برای محاسبه کردنش باید انجام بشه. ساده ترین این الگوریتم ها تفریق های متوالیه، بطور مثال حاصل تقسیم 9 / 2: 1. 9 - 2 = 7 2. 7 - 2 = 5 3. 5 - 2 = 3 4. 3 - 2 = 1 (1 < 2 پس عملیات متوقف میشه) ما چهار بار تفریق انجام دادیم، پس حاصل تقسیم 9 بر دو برابر 4 میشه. در عملیات آخر حاصل یک شد پس باقیمانده این تقسیم برابر 1 هست. این الگوریتم ساده ترین الگوریتم تقسیم هست، روش های خیلی بهتر و سریعتری وجود داره که باعث میشه دیگه از این روش استفاده نشه، مثلاً الگوریتم Goldschmidt که به تقسیم سریع معروفه و میتونید تو اینترنت سرچ کنید و بیشتر باهاش آشنا بشید ولی به هر حال چهار عمل اصلی در کامپیوترها به این شکل محاسبه میشه. در انتها هر جا گنگه و متوجه نمیشید بفرمایید بیشتر در موردش حرف بزنیم
  7. تبدیل md5

    ممنون از لطفتون یه مقداری اشتباه برداشت کردید بروت فروس بصورت رندوم هش تولید نمیکنه، بروت فورس به ترتیب تمامی عباراتی که میشه ساخت رو میسازه و دونه دونه با هش مرجع شما که میخواید هکش کنید طتبیق میده متنی که در مورد لاگین کردن نوشتم هم ربطی به بروت فورس نداره، من تو متنم در مورد حملات آنلاین صحبت نکردم. متنی که در مورد لاگین گفتم مربوط به اون سوالتون بود که پرسیده بودید: اگر رمز هش میشه و مقدارش غیر قابل بازگشته، پس چطور رمز من برای لاگین شدن بررسی میشه؟ که منم گفتم رمز ورودی شما هم در ابتدا هش میشه و سپس توسط سایت با هشی که در داخل دیتابیسه مقایسه میشه و اگر یکی بود لاگین میشه.
  8. تبدیل md5

    من یه موضوعی رو که یادم رفت تو پست بالا دقیق تر توضیح بدم موضوع Salt هست که تو سایت ها برای تضمین امنیت هش ها و رمز کاربرا ازش استفاده میشه. برای اینکه ببینیم دقیقاً تو سایت ها چجوری داره این اتفاق میافته یه مثال ساده میزنم فرض کنید کاربری رمز عبور خودش رو test انتخاب کرده. این رمز از لحاظ امنیتی به دلیل اینکه تعداد کاراکترهاش کمه، تماماً حروف کوچکه و توش از اعداد و کاراکترهای ویژه استفاده نشده بسیار آسیب پذیره و در عرض چند ثانیه میشه هش MD5 اون رو کرک کرد. Salt راهکاریه که داد هش ها میرسه و امنیت اون ها رو تضمین میکنه. به این ترتیب که یک عبارت رندوم از حروف کوچک و بزرگ و اعداد و کاراکترهای ویژه با طول متغیری توسط سیستم تولید میشه و در دیتابیس برای استفاده های بعد در سطر اطلاعات کاربر در کنار پسورد هش شدش ذخیره میشه. بطور مثال سیستم یک Salt به این شکل تولید کرده: aBssGe422%# بعد از تولید Salt نوبت به ذخیره سازی پسورد کاربر در دیتابیس بصورت هش شده میرسه. برای اینکار در قدم اول سیستم پسورد کاربر رو تبدیل به هش مثلاً MD5 میکنه که برای مثال ما هش تولیده شده میشه این عبارت: 098f6bcd4621d373cade4e832627b4f6 این هش بخاطر پسورد ضعیف ما (test) خیلی سریع و در عرض چند ثانیه کرک میشه، پس Salt تولید شده به کمک ما میاد. Salt تولید شده به هشی که در مرحله اول از پسورد کاربر بدست آوردیم اضافه میشه و عبارت زیر رو رو بوجود میاره: MD5 + Salt 098f6bcd4621d373cade4e832627b4f6 + aBssGe422%# = 098f6bcd4621d373cade4e832627b4f6aBssGe422%# بنابراین رشته ای به طول 32 + 11 = 43 کاراکتر بدست اومد. حالا مجدداً این عبارت جدید رو به MD5 تبدیل میکنیم که میشه: 80b12222716bd98fb732c5927ae1d722 و این هش رو در دیتابیس ذخیره میکنیم. چطور این هش با استفاده از Salt ایمن شد؟ خیلی سادست. از پسورد ساده 4 کاراکتری کاربر که چند ثانیه طول میکشید کرک شه عبارتی 32 کاراکتری تولید کردیم. از اینجایی که این عبارت 32 کاراکتری تنها شامل اعداد هگز هست و کاراکترهای ویژه و باقی کاراکترها رو در بر نمیگیره، رشته ای به طول و مقداری رندوم به اون اضافه کردیم و عبارت جدید 43 کاراکتری شامل حروف کوچک، بزرگ، اعداد و کاراکترهای ویژه رو بوجود آوردیم و این عبارت جدید رو تبدیل به Hash کردیم و در دیتابیس ذخیره کردیم. حالا کرکر اگر بخواد پسورد کاربر رو بدست بیاره اول باید یه هش 43 کاراکتری با درجه سختی بسیار بالا رو کرک کنه (میدان حالاتمون یه عدد نجومی میشه) و تازه اگرم بر فرض تقریباً محال کرک شد کرکر مجدداً به یه هش دیگه میرسه و باید دوباره اون هش رو کرک کنه. پس بطور خلاصه از تابع زیر برای ذخیره پسورد کاربر بصورت هش در دیتابیس استفاده شد در این مثال: MD5( MD5(Password) + Salt ) حالا میرسیم به سوال شما که چجوری وارد سایت میشید. شما رمزتون رو بصورت معمولی تو سایت وارد میکنید، مثلاً مینویسید Test و دکمه Login رو میزنید. مقدار Salt مربوط به Username شما از دیتابیس خونده میشه و از طریق تابع بالا هش شده پسوردی که برای لاگین وارد کردید مجاسبه میشه. اگر هش تولید شده از پسورد وارد شده برای لاگین با هش ذخیره شده در دیتابیس برابر باشه اعتبارسنجی با موفقیت انجام میشه و شما وارد سایت میشید، اما اگر این دو هش با هم برابر نباشن یعنی شما پسوردتون رو اشتباه وارد کردید و عبارت ورود ناموفق میشه. پی نوشت 1: علت اینکه تو سایت ها وقتی درخواست «فراموشی رمز» میدید و سایت نمیتونه پسرود قبلیتون رو براتون بفرسته و ازتون میخواد یه رمز جدید انتخاب کنید هم همین موضوع ذخیره سازی پسورد کاربرها بصورت هش هست و درواقع خود سایت هم نمیدونه رمزتون چی بوده. سایت هایی که میتونن رمز شما رو براتون ارسال کنن یعنی از شیوه هش کردن در سیستم ذخیره سازیشون استفاده نکردن و از لحاظ امنیتی ضعف دارن و اگر کسی به دیتابیس دسترسی پیدا کنه میتونه تمام پسوردها رو ببینه. پی نوشت 2: من یادم رفت در مورد Dictionary Attack هم صحبت کنم. این روش هم مثل Brute Force هست با این تفاوت که عباراتی که هششون رو محاسبه میکنیم و با هش اصلی مقایسه میکنیم رو از یک پسورد لیست میخونیم. این روش سرعتش بالاتر از روش Brute Force هست چون فقط عبارات معنا دار مثل اسم و لغات رو بررسی میکنیم و سراغ تمام عبارات ممکن نمیریم. واضحه که ممکنه دیتای اصلی تو پسورد لیست ما نباشه، بنابراین نسبت به Brute Force درصد موفقیتمون پایینتره. همون سورس کد رو میتونی خودت جوری ویرایش کنی که Dictionary Attack انجام بده، اگر اطلاعات بیشتر در مورد این نوع حمله (Dictionary Attack) لازم داشتید بفرمایید تا راهنمایی کنم.
  9. تبدیل md5

    سلام سوالتون اینه که چجوری میشه هش های MD5 رو کرک کرد و دیتای اصلی رو پیدا کرد؟ برای اینکه بتونید کرکش کنید باید اطلاعات کافی در مورد این نوع هش داشته باشید و چون من نمیدونم اطلاعاتتون در چه حده من اول یه سری توضیحات میدم، البته خیلی مختصر و مفید و در حد آشنایی چون اگر بخوایم کامل توضیح بدیم باید چند ده صفحه بنویسم اول میخوایم بدونیم هش چیه؟ خیلی ساده و به دور از هر چیز اضافه ای Hash به تابع ریاضی گفته میشه که میاد یه سری اطلاعات مثل متن یا هر نوع داده دیگه رو میگیره (این دیتا میتونه حتی یک فایل چند ترابایتی باشه!) و اونو به یک عدد تبدیل میکنه. مثلاً ما میخوایم عبارت learn-net.ir رو به هش MD5 تبدیل کنیم که نتیجش میشه این عبارت عدد: 3f8c413f1ce2e625741765fc310b228b ممکنه براتون سوال باشه که الان تو این عبارتی که بالا قرار دادم کاراکترهایی مثل c و f و ... وجود داره، پس چرا دارم بهش میگم عدد؟ جواب اینه که خروجی تابع هش MD5 مقداریست 32 کاراکتری و در مبنای Hex، در سیستم عددی هگزادسیمال (HEX) اعداد ما شامل 0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F-) هست، بنابراین در مبنای هگز C و F و B و E که تو عبارت بالا میبینید یک عدد هستند، مثلاً اگر عدد F رو بخوایم به مبانی دهدهی که مبنای ما انسان هاست برگردونیم مقدارش میشه 15، پس در هر صورت عبارت بالا یک عدده، نه یک رشته! ما دو نوع هش داریم، یکی هش های دو طرفه مثل Base64 و یکی هش های یک طرفه مثل MD5 که تو این پست میخوام فقط در مورد هش های یک طرفه صحبت کنم ویژگی که هش های یکطرفه دارن اینه که برگشت پذیر نیستن، این هش ها با یک تابع فقط ساخته میشن و ما تابعی برای بازگردانی یک عدد هش شده به مقدار اصلی خودش نداریم (نمیتونیم داشته باشیم، غیر ممکنه چون منطق ریاضیش بر این پایست، مثلا مگه اگر بگم عدد 9 از حاصل جمع و تفریق و ضرب و تقسیم چند عدد بدست اومده شما میتونید بگید اون اعداد کدوما بودن؟ به هیچوجه!). اگر بخوایم مقایسه کنیم میتونیم با الگوریتم های رمزنگاری مقایسه کنیم: شما در الگوریتم های رمزنگاری یه تابع Encryption دارید که میاد و اطلاعات شما (مثل رمزعبورتون) رو با استفاده از یه کلید متقارن یا نا متقارن تبدیل به یه عبارت رمز شده میکنه و شما میتونید این عبارت رمز شده رو با استفاده از تابع Decryption خودتون مجدداً رمزگشایی کنید و به حالت اول خودش برگردونید. اما در الگوریتم های هش (درهم سازی) یکطرفه شما فقط یه تابع ریاضی دارید که میتونه اطلاعات شما (مثلاً رمز عبورتون) رو تبدیل به هش کنه، ولی تابعی برای برگشت مقدار هش شده به دیتای اولیه خودش ندارید. ضمن اینکه طول هش های یکطرفه معمولاً در حد چند عدد هست (مثلا در MD5 همیشه طول عدد بازگشتی 32 عدده، حتی اگر یه فایل چند گیگی رو به عنوان ورودی به تابع داده باشیم)، اما در الگوریتم های رمزنگاری یا حتی هش های دوطرفه، هرچقدر اطلاعات ورودیتون بیشتر باشه عبارت خروجیتون هم طولانی تر و طولانی تر میشه، چراکه اطلاعات خروجی حاوی اطلاعات ورودی شماست هش های یکطرفه در کجا بدرد میخورن؟ این ویژگی که قابلیت بازگردانی عبارت هش شده به مقدار اصلی خودش وجود نداره میتونه در خیلی از جاها استفاده بشه، بطور مثال اگر شما یه سایت داشته باشید و بخواید رمز کاربران رو به صورت رمزنگاری نشده در دیتابیس خودتون ذخیره کنید، اگر به هر دلیلی هک بشید هکر میتونه تمامی پسوردها رو به راحتی ببینه و به اکانت تمام کاربرا دسترسی داشته باشه. اگر از الگوریتم های رمزنگاری استفاده کنید، هکر میتونه کلید خصوصی شما رو پیدا کنه و مجدداًرمز تمام کاربرها رو بصورت plaintext ببینه، اما اگر از هش استفاده کنید، هکر با هک کردن دیتابیس شما فقط میتونه هش های بی معنی ببینه و از اونجایی که تابعی برای بازگردانیش به مقدار اصلیش وجود نداره، هکر مجبوره به شیوه Brute Force و با صرف زمان و منابعی بسیار بسیار زیاد اقدام به پیدا کردن مقدار اصلی اون هش کنه و اگر هم موفق به انجام اینکار بشه تنها مقدار پسورد یک کاربر رو پیدا کرده و برای باقی پسوردها نیز باید این زمان بسیار زیادو صرف کنه که اصلاً منطقی نیست (خودتون مثال زدید که یه رمز ترکیبی با گذشت بیش از 16 ساعت مقدارش پیدا نشد) این تنها یک مثال از کاربردهای هش ها بود، هش ها در بررسی صحت سلامت فایل ها، بررسی مخرب بودن یا نبودن آنها توسط آنتی ویروس ها و... کاربردهای زیادی دارن که برای اینکه پستم طولانی نشه به توضیح همون یک مثال بالا بسنده میکنم آیا MD5 شیوه مناسبیه؟ هش های MD5 جز آسیب پذیرترین هش های موجوده، اگر میخواید در برنامتون از هش برای انجام کار مهم و بحرانی استفاده کنید باید MD5 رو بذارید کنار، MD5 زمانی خیلی استفاده داشت اما الان سال هاست که آشکار شده نسبت به تصادم آسیب پذیره، بطور مثال در آنتی ویروس ها از هش ها برای این استفاده میشه که ببینن یه فایل مخرب هست یا نه، به این ترتیب که آنالیزورهای شرکت آنتی ویروس مربوط با شناسایی یک فایل مخرب مقدار Hash اون فایل رو شناسایی میکنه و به دیتابی آنتی ویروس اضافه میکنه. حالا هر وقت آنتی ویروس فایلی رو ببینه که مقدار هش شدش برابر هش فایل مخرب باشه به کاربر اخطار میده که فایل ویروسیه. واضحه که در اینجا ما نباید از هش هایی که نسبت به تصادم آسیب پذیرن استفاده کنیم، چون میخوایم هیچ دو فایلی هش یکسانی نداشته باشن. تصادم در هش ها به این معنیه که ممکنه محاسبه هش دو عبارت متفاوت نتیجه کامل یکسانی داشته باشه که این چیزی نیست که ما از یک هش انتظار داریم. میتونیم از هش های آسیب پذیر مثل MD5 در جاهایی که تصادم مهم نیست به دلیل سریعتر بودن استفاده کنیم اما برای مواقعی که میخواهیم یک فایل را چک کنیم استفاده از هش های آسیب پذیر مثل MD5 کاملاً اشتباهه چجوری MD5 رو کرک کنیم؟ همونطوری که گفتم برای هش های یکطرفه تابعی جهت بازگردانی به مقدار اصلیش وجود نداره. برای همین باید از روش Brute Force استفاده کنیم. در این روش ما تمامی حالات مختلفی که از ترکیب کاراکتر ها بوجود میان رو میسازیم و تک تک مقدار MD5 این مقادیر رو محاسبه میکنیم. اگر مقدار محاسبه شده با مقداری که قصد کرکش رو داریم برابر بود اون موقع مقدار اصلی رو پیدا کردیم، در غیر اینصورت به سراغ محاسبه MD5 حالت بعدی میرویم و مجدداً با مقداری که قصد کرکش رو داریم تطبیق میدیم. انقدر اینکار ادامه پیدا میکنه تا بتونیم عبارتی که قصد کرکش رو داریم برسیم. مثالی از روش Brute Force همون نمونه کدی بود که در اون یکی تاپیک برای کرک کردن پسورد شیت های اکسل قرار داده بودید، تفاوتش در اینه که اینجا میدان احتمالاتمون بسیار بسیار بسیار بسیار بالاتره و ما حتی طول دیتای اصلی رو نمیدونیم. پس باید از رشته هایی به طول 1 تا رشته هایی به طول n رو تک تک بررسی کنیم. مثال: احتمال میدهیم که دیتای اصلی ما ترکیبی از کاراکترهای انگلیسی بزرگ، کوچک و اعداد 0 تا 9 است. پس ما 28*2 حرف انگلیسی + 10 کاراکتر عددی داریم. طول دیتای اصلی رو هم نمیدونیم و فقط حدس میزنیم که ممکنه از 1 تا 32 کاراکتر بوده باشه، پس حالات ما میشه: 28 * 2 + 10 = 66 = کاراکترهای ممکن (66 ^ 1) + (66 ^ 2) + (66 ^ 3) + (66 ^ 4) + (66 ^ 5) + (66 ^ 6) + ... + (66 ^ 30) + (66 ^ 31) + (66 ^ 32) = 1592465140617115710 همونجوری که میبینی باید 1592465140617115710 حالت ممکن رو MD5ش رو محاسبه کنید و با MD5 که میخواید مقایسه کنید، یعنی شما یه پردازش و فضا برای کاراکترهایی مکن نیاز دارید، یه پردازش برای محاسبه MD5 دارید و یه پردازش هم برای مقایسه عبارت دارید که انجامش بسیار زمانبر خواهد بود. تازه من در مثال بالا کاراکترهای ویژه رو در نظر نگرفتم (که باید در نظر میگرفتیم)، ما 33 کاراکتر ویژه هم داریم که در واقع میشه 66 + 33 یعنی 99 کاراکتر و تعداد حالت های ممکنش میشه 922838852049800433 ترکیب مختلف (من که نمیتونم حتی این عدد رو بخونم ) علت اینکه میگم باید کاراکترهای ویژه رو هم در نظر بگیریم (معمولاً) اینه که برای تامین امنیت هش ها از Salt استفاده میشه، یعنی میان و یه رشته چند کاراکتری رندم رو به انتهای رمز هش شده اضافه میکنن تا امنیت اون رمز رو اگر از حروف ترکیبی و اعداد و کاراکترهای ویژه استفاده نکرده بود رو بالا بالا ببرن خلاصه اینکه با کامپیوترهای شخصی حتی اگر از GPU به عنوان پردازشگر استفاده کنیم (سرعت GPU بسیار بالاتر از CPU هست و به همین دلیل کرکرها از GPU برای کرک کردن هش ها استفاده میکنن) باز هم ممکنه محاسبه و مقایسه این مقدار هش ماه ها و سالها به طول بی انجامه، برای همینه که کرکرها برای کرک کردن هش ها از سیستم های توزیع شده و دیتاسنترها استفاده میکنن، البته تکنیک های دیگه ای مثل Dictionary Attack (سریعتره ولی درصد موفقیتش کمتر از Brute Force میتونه باشه) یا جداول Rainbow هم هست که اگر بخوام بهش اشاره کنم صحبتم خیلی طولانی میشه ولی برای آشنایی میتونم بگم که این روش سرعتش خیلی بیشتره (البته ساختن این جدول بیشتر از زمان کرک شدن به شیوه کلاسیک طول میکشه و نیازمند فضای چندین ترابایتی برای ذخیره هست) ولی وقتی ساخته شد میتونه خیلی سریعتر هش مورد نظر رو کرک کنه. لازم به ذکره که سرعت محاسبه هش های MD5 نسبت به خیلی هش های مدرن سریعتر هست، بنابراین میتونیم با انتخاب هش هایی مثل SHA256 یا SHA512 باعث بشیم کرکر برای Brute Force کردن اون نیازمند پردازش و زمانی خیلی بیشتری باشه، اینم یکی از دلایلیه که موقع انتخاب هش برای کارتون باید در نظر بگیرید، همانطوری که در برنامه های رمزنگاری مطرح مثل VeraCrypt اصلاً گزینه MD5 برای انتخاب کاربر وجود نداره. از چه زبانی برای نوشتن کرکر هش استفاده کنیم بهتره؟ از اونجایی که سرعت و مدیریت منابع تو اینجور مسائل خیلی اهمیت داره، زبان هایی مثل سی و سی++ به سادگی زبان های دیگه رو میکنن تو گونی و میندازن تو دریا ولی نوشتنش تو زبان های دیگه به هیچوجه غیرممکن نیست چون الگوریتمش سادست. شما میتونید تو همین سی شارپم کرکر خودتون رو بسازید، اما انتظار نداشته باشید از لحاظ سرعت قدرت رقابت با کرکر نوشته شده به زبان سی یا سی++ رو داشته باشه. برای اهداف آموزش میتونید با سی شارپ و سایر زبان های مدیریت شده کرکرت رو بسازید، ولی اگر واقعاً هدفتون کرک هش هاست، بهتره بجای اینکه وقتتون رو برای توسعه یک کرکر در زبان سی یا سی++ تلف کنید از یک کرکر آماده نوشته شده و تست شده به این زبان ها استفاده کنید که تعدادشون هم خیلی زیاده. علت اینکه میگم خودتون توسعه ندید اینه که نرم افزارهای توسعه داده شده توسط دیگران امتحان خودش رو پس داده و بارها و بارها و بارها توسط توسعه دهندگانش بررسی شده و بهینه سازی شده. مثال: این پروژه یک مثال ساده اما خیلی خوب برای کرک کردن هش های MD5 هست. خوب از این لحاظ که پیچیدگی زیادی نداره و خیلی روون نوشته شده، ضمن اینکه دارای تایمر برای محاسبه زمان تقریبی باقی مانده و تعداد حالات ممکن و... هست که میتونه تو موارد آماری کرک کردن هش ها خیلی براتون آموزنده باشه دانلود پروژه MD5 Cracker به زبان سی شارپ لینک پروژه در گیت هاب نکته: من برنامه نویس این کد نیستم و فقط براتون به اشتراک گذاشتم. این برنامه 7 سال پیش نوشته شده اما به راحتی توسط ویژوال استودیو قابل تبدیل به ورژن مورد استفاده ویژوال استودیو شماست. برای اینکه تستش کنید میتونید با استفاده از MD5 سازهای آنلاین یه عبارت کوتاه رو بهش بدید و پس از مشخص کردن بازه کاراکترهای ممکن درخواست کرک بدید. اینم یه نمونه MD5 ساز آنلاین.
  10. امنیت در کرک

    سلام چون تو اکثر برنامه ها سریال نرم افزار بر اساس یه سری پارامترهای سخت افزاری محاسبه میشه، بنابراین بطور مثال کدی که برای فعالسازی تو سیستم من لازمه با کدی که برای فعالسازی تو سیستم شما لازمه متفاوته نکته دوم اینکه پیدا کردن شماره سریال Valid -حتی اگر الگوریتم برنامه وابسته به پارامترهای سخت افزاری مثل شماره سریال و شماره قطعه نباشه- خیلی سخت تر از Patch کردن اون نرم افزاره! اگر نهایت مهارت موجود در علم مهندسی معکوس رو 10 در نظر بگیریم، یه کرکر با رتبه 1 (مبتدی) ممکنه بتونه نرم افزار X رو کرک کنه، چون تو پچ کردن، کرکر رتبه 1 معمولاً فقط به JUMPها نگاه میکنه و بعد از پیدا کردن پرش شرطی مربوط به مورده قبول واقع شدن یا نشدن سریال ورودی، اقدام به اصلاحش میکنه و در نهایت شما هر چیزی رو به عنوان سریال به برنامه بدید، برنامه رجیستر میشه. مثل این میمونه که شما تو برنامتون نوشتید: if (input == 1) { // سریال ورودی صحیحه } else { // سریال ورودی غلطه } کد بالا به زبان اسمبلی میشه این: ... CMP EAX, 1 JNZ ELSE ; سریال ورودی صحیحه JMP END_IF ELSE: ; سریال ورودی غلطه END_IF: ... حالا کرکر تنها کاری که لازمه بکنه اینه که دستور JNZ ELSE رو تبدیل کنه به NOP تا دیگه هیچوقت پرش به لیبل ELSE انجام نشه و همیشه بخش برقرار بودن شرط اجرا شه کرکر رتبه یک فقط لازم داره دستوراتی مثل NOP و CMP و JMP و JNZ و ... رو بدونه و معمولاً هم اطلاع دقیقی از نحوه کارش نداره ولی قضیه برای ساخت KeyGen یا پیدا کردن شماره سریال فرق داره. برای پیدا کردن شماره سریال لازمه که کرکر اطلاعات و تسلط بالایی در مورد زبان اسمبلی داشته باشه، ضمن اینکه باید خیلی با تجربه باشه تا بتونه با دیدن یه تکه کد بفهمه داره چه اتفاقی میافته. کرکر باید برای اینکار تک تک دستورات رو بررسی کنه، تحلیل کنه و رابطشون رو بدست بیاره و درواقع واقعاً مهندسی معکوس انجام بده، به عبارت دیگه برای انجام اینکار لازمه که کرکر ما از نظر مهارت حداقل مثلاً در رتبه 6 قرار داشته باشه. برای پیدا کردن شماره سریال دیگه مکانیسم چک کردن لایسنس و دستورات شرطی نرم افزار رو دور نمیزنیم، بلکه باید دقیقاً درکش کنیم و بتونیم بازنویسیش کنیم. بخاطر همینم هست که معمولاً Patch میکنن و KeyGen نمیسازن. در ضمن کرکرها هیچوقت نمیان نتیجه ساعت ها و هفته ها و شاید ماه ها تلاش خودشون رو بدون نام و نشون منتشر کنن، بلکه میان کار خودشون رو در قالب یه برنامه ارائه میدن تا بقیه بدونن کی بوده اینکارو انجام داده. هدف عمده کرکرها از کرک کردن نرم افزارها اکثراً به رخ کشیدن توانایی ها و استعدادهاشونه، پس انتظار نداشته باش طرف بیاد شماره سریالی که کلی براش وقت گذاشته رو بدون نام و نشون بذاره تو اینترنت، اگرم طرف Patch کرده باشه نرم افزارو که اصلاً شماره سریالی نداره و چاره ای جز ارائه فایل اجرایی برای اصلاح برنامه اصلی نداره. کلاً مبحثی که شما مطرح کردید خیلی مبحث تکنیکال و پیچیده ای هست و این مثال هایی که زدم ساده ترین مثال هایی بود که میشد زد، در عمل خیلی مسائل دیگه ای مطرحه، ولی کلاً اینو بدونید که ساختن Patch معمولاً خیلی ساده تر از پیدا کردن سریال و ساخت KeyGen هست. فایل های کرکتون رو از سایت های معتبر بگیرید، اگر شک دارید که چرا این پورت رو باز کرده میتونید دیتای رد و بدل شده رو بررسی و آنالیز کنید. ممکمه بقول شما اون فایل واقعاً Trojan باشه و در خودش کیلاگری چیزی داشته باشه، ممکنم هست برنامه نویس فقط برای اهداف Analytic خودش و برنامش اطلاعاتی رو ارسال کنه بعضی آنتی ویروس ها به فایل های کرک برنامه های مختلف به چند دلیل حتی اگر حاوی کد مخربی هم نباشن گیر میدن، یکی بخاطر غیر قانونی بودنش که البته معمولاً هم عنوان خطر رو با پسوند not-a-virus به کاربر نشون میدن تا کاربر بدونه ویروس نیست و فقط یه نرم افزار غیر قانونیه. اگر کرکتون رو از یه سایت معتبر دریافت کرده باشید نیازی به نگرانی نیست، ضمن اینکه اخیراً دیگه آنتی ویروس های خوب به اینجور فایل ها گیر نمیدن. دوم اینکه عملیات جایگزینی و بازنویسی فایل های دیگه رفتاری هست که توسط برنامه های مخرب انجام میشه و چون فایل کرکتون هم برای پچ کردن مجبوره این عملیات رو انجام بده (البته به منظور پچ کردن نرم افزار، نه کار مخرب دیگه ای) آنتی ویروس با توجه به الگوریتم Heuristic اون فایل رو به عنوان ویروس قلمداد میکنه. من خودم هیچوقت آنتی ویروسم رو غیر فعال نمیکنم، اگر فایل های دریافتیم مشکلی داشته باشن از روی پیغامی که خود آنتی ویروس میده میشه به راحتی فهمید فایل واقعاً مخرب هست یا نه، فقط نیاز به یه مقدار تجربه و اطلاعات داره سوم اینکه کرکرها فایل های پچ یا کیجن خودشون رو اصتلاحاً پک میکنن تا کرکرها و افراد دیگه نتونن متد یا الگوریتم پیدا شده و پیاده سازی شده اونها رو پیدا کنن و به اصتلاح ریپ کنن. همین عملیات پک کردن و پروتکت کردن فایل ها ممکنه باعث شه بعضی آنتی ویروس ها در الگوریتم Heuristic به عنوان بدافزار شناسایی کنن و بهش گیر بدن به عنوان یه توصیه فقط میشه گفت که فایل های کرکتون رو از سایت های معتبر دانلود کنید و همیشه یه آنتی ویروس خوب آپدیت شده رو سیستم خودتون داشته باشید. بله امکانش هست و خیلی هم اتفاق افتاده و میافته و خواهد افتاد. Trojan همینه دیگه، شما یه فایل رو به عنوان فایلی سالم و کاربردی نشون میدید، ولی در پس زمینه کد مخرب خودتون هم قرار دادید و بدون اینکه کاربر بفهمه دارید سوء استفاده خودتون رو انجام میدید این کاربره که باید انقدر هوشیار باشه که درگیر اینجوری مسائل نشه گروه های مهندسی معکوس زیادی هستن تو دنیا که بخاطر تعداد کارهاییی که انجام دادن اعتبار بالایی در بین کاربران دارن، تقریباً میشه مطمعن بود که کارهای منتشر شده توسط اینجور گروها کاملاً امن و غیر مخرب هستن، چون هیچوقت حاضر نمیشن اعتبار و آبروی چند ساله گروهشون رو بخاطر کارها و اهداف ساده ای مثل آلوده کردن سیستم دیگران خراب کنن.
  11. سلام خسته نباشید، کارتون قابل تقدیره من یه سری موارد رو میگم که البته همگی نظر شخصیمه و چون نظر خواستید دارم میگم به لحاظ طراحی نرم افزارتون ضعف هایی داره (از نظر من و با توجه به یه سری استانداردا)، بطور مثال سایز پنجره قابل تغییر نیست، وقتی میخوای از برنامه خارج شی بجای مسیج باکس سوال، مسیج باکس ارور نشون میده، دیالوگ تنظیمات قفل موقع باز شدن در وسط پرنت خودش باز نمیشه یه سری ریزه کاری ها رو هم میتونید انجام بدید که برنامتون کارآمدتر بشه، مثلاً موقع وارد کردن رمز وقتی پسورد رو نوشتیم و اینتر رو زدیم خودش وارد برنامه بشه و نیازی به کلیک کردن بر روی دکمه ورود نباشه، یا وقتی رمز رو تعریف کردیم و دکمه ثبت رو زدیم پنجره مربوط به تنظیم قفل خود به خود بسته شه اما چیزی که خیلی دوست دارم بگم اینه که بیشتر روی قفل نرم افزارتون کار کنید. یوزرنیم و پسورد بصورت رمزنگاری نشده در فایل user.ngr دخیره میشه که هر کسی میتونه بخونه استفاده از login.ngr هم برای بررسی باز بودن قفل کار درستی نیست و به راحتی باعث bypass شدن مکانیزم دفاعی برنامتون میشه، بطور مثال رو برنامتون رمز بذارید و برنامه رو بطور کامل ببندید. حالا خودتون فایل login.ngr رو ایجاد کنید و داخلش عدد 1 رو سیو کنید. بعد از اینکار اگر برنامتون رو باز کنید میبینید که ازتون هیچ پسوردی نمیخواد و برنامه باز میشه. یه مقدار هم کداتون باگ داره، من وقتی رفتار برنامتون رو دنبال میکردم دیدم فایل های login.ngr و user.ngr در محل هایی غیر عادی دارن ایجاد میشن و خونده میشن که وقتی کدهای برنامتون رو بررسی کردم متوجه ایرادتون شدم، بطور مثال نوشتید: string[] strArray = File.ReadAllLines("user.ngr"); if ((this.textBox1.Text == strArray[0]) && (this.textBox2.Text == strArray[1])) { File.WriteAllText("login.ngr", "1"); base.Hide(); new Form1().ShowDialog(); } else { MessageBox.Show("اطلاعات وارد شده اشتباه است.", "خطا", MessageBoxButtons.OK, MessageBoxIcon.Hand); } که مسیر login.ngr و user.ngr رو مشخص نکردید و به نظر من این کار غلطه و آدرس باید بطور کامل به عنوان ورودی متد Read و Write قرار بگیره که عملکردش تو همه سیستم ها قابل پیشبینی باشه. این مشکل توی بخش های دیگه کدتون هم مشهوده، مثلاً در پنجره ثبت رمز هم نوشتید File.WriteAllText("user.ngr", this.textBox1.Text + Environment.NewLine + this.textBox2.Text); که باز هم به دلیل مشخص نکردن مسیر ذخیره اطلاعات کار صحیحی نیست
  12. vb6- یا بیسیک دات نت یا سی شارپ

    سلام این دو تا زبون خیلی هم با هم تفاوت دارن. vb6 یه زبان Object Base هست و الان بیشتر از ده ساله که دیگه ازش پشتیابی نمیشه، حتی قرار بود Runtime DLLهاش در ویندوز 7 هم بطور پیشفرض قرار داده نشه که در نهایت مایکروسافت برای پشتیبانی از برنامه های قدیمی مجبور شد قرار بده، اما شما اگر ورژن اصلیشو نصب کنید بدون تغییرات و تنظیمات سازگاری نمیتونید حتی از IDE اون استفاده کنید. واسه همینم استفاده کننده هاش دارن از نسخه هایی که از قبل پچ شدن استفاده میکنن ولی زبون VB.Net یه زبان مدرن و Object Oriented هست که به عنوان جایگزینی برای vb6 معرفی شد و بواسطه فریمورک دات نت و همین شیء گرا بودنش قدرت خیلی زیادی داره. سینتکس vb6 و vb.net تا حد زیادی به هم شبیهه ولی تفاوت هایی هم بخاطر ذات شیء گرای خودش داره و کسی که با vb6 کار کرده نمیتونه بدون یادگیری مسائل جدیدی که در vb.net مطرح شده بطور کامل و با تسلط کافی کار کنه. اینم اضافه کنم که به دلیل استفاده از فریمورک مشترک قدرت زبان VB.NET و #C با هم کاملاً برابره. در ضمن قدرت VB.NET قطعاً از VB6 بیشتره. خیلی مسائل هم بدلیل قدیمی بودن و منسوخ شدنش در سیستم عامل های جدید توسط VB6 قابل پیاده سازی نیست. پس دور VB6 برای یادگیری رو یه خط گنده قرمز بکشید و سمتش نرید. اگر به سینتکس بیسیک علاقه دارید VB.NET رو یاد بگیرید که خیلی هم قوی و کارآمده، گرچه این زبون جایی در شرکت های برنامه نویسی نداره و شرکت ها دنبال برنامه نویس های سی شارپ هستن یه عده بخاطر اینکه درست راهنمایی نشدن و تحقیق نکردن میرن سمتش حتی شنیدم هنوزم تو هنرستان های کامپیوتر این زبون آموزش داده میشه (اگر کسی اطلاعات دقیقی داره بگه)، نظام آموزش ما هم همیشه عقب مونده و ضعیف بوده، واضحه دانش آموز و دانشجویی که بهش برنامه نویسی رو با وی بی 6 یاد میدن میافته دنبال یادگیری وی بی 6 یه عده هم بخاطر اینکه مفاهیم سنگین شیء گرایی کلاً در این زبون وجود نداره و باعث یادگیری راحتش شده میرن سمتش ولی دیر یا زود همه این افراد متوجه میشن که این زبون دیگه کارایی لازم رو نداره و میرن سمت زبان های دیگه (احتمالاً وی بی دات نت) اون زمانی که من برنامه نویسی رو شروع کردم زبان هایی مثل #C و VB.NET معرفی نشده بود و دلفی و VB6 خیلی رو بورس بود، به عنوان کسی که روزگاری به VB6 کاملاً مسلط بود و سیر تکاملی این زبون رو کاملاً دیده بهت توصیه میکنم سمتش نری و اگر به این زبون علاقه داری بجاش VB.NET رو یاد بگیر. چرا دودل داری میشی؟ تونستی این کد رو تحلیل کنی؟ این کد خیلی ساده هست و اصلاً جادویی در اون استفاده نشده شما خیالت راحت باشه که هر چیزی که در VB6 قابل پیاده سازی باشه در سی شارپ و VB.NET به شکلی خیلی بهتر و ساده تر و سریعتر و قوی تر قابل پیاده سازی، قدرت سی شارپ و VB.NET خیلی خیلی بالاتر از زبان منسوخ شده ای مثل VB6 هست. این کدی هم که شما قرار دادی یه کد خیلی سادست که داره به روش Brute Force اقدام به حذف پسورد میکنه. طبق همین کد بهتون میگم داره چه اتفاقی میافته: وقتی شما روی سند اکسلی رمز میذارید، رمز شما تبدیل به رمزی 12 کاراکتری به شکل زیر میشه: AAABABBABABX کاراکتر 1 الی 11 این رمز همیشه A (کد اسکی 64) و یا B (کد اسکی 65) هست و کاراکتر 12 این رمز از کاراکتر اسکی 32 (یعنی اسپیس) تا کاراکتر اسکی شماره 126 (یعنی ~) میتونه باشه. پس خیلی راحت 12 تا حلقه FOR تو در تو مینویسیم که 11 حلقه اول تا یازدهم از 64 تا 65 (یعنی کاراکتر A یا B) و حلقه دوازدهم از 32 تا 126 (از اسپیس و a و b و ... A و B و ... گرفته تا کاراکترهای ویژه مثل * و ^ و ~) میشماره. عددی که حلقه های تولید میکنن با استفاده از تابع Chr تبدیل به کاراکتر مورد نظر میشن، بطور مثال خروجی تابع Chr (65) برابر کاراکتر B خواهد بود. این 12 کاراکتر که توسط 12 حلقه فور تولید شدن کنار همدیگه قرار میگیرن و تشکیل یه رمز 12 کاراکتری میدن که با استفاده از متد Unprotect و این رمز در خواست حذف حفاظت رو میدیم. اگر رمز درست بود شیت ما رمزش حذف میشه و از حلقه ها خاریج میشیم و کار تمومه، ولی اگر رمز حذف نشد یعنی ترکیب ما درست نبوده، پس حلقه های FOR مجدداً شروع به حرکت میکنن و پسورد بعدی رو میسازن این روند انقدر ادامه پیدا میکنه تا پسورد مورد نظر کشف بشه و چون میدان کاراکترهای ما کوچیکه انجام اینکار زیاد طول نمیکشه به عبارت دیگه: 2 ^ 11 * 95 = 194560 یعنی فقط 194560 ترکیب ممکن وجود داره و برنامه ما تمام این ترکیب ها که خیلی خیلی خیلی کم هستن رو میتونه در چند ثانیه محاسبه و تست کنه. پس زبان VB6 هیچ قدرتی از خودش نشون نداد، همه چیز در الگوریتم و ضعف امنیتی رمزگذاری اکسل خلاصه شده این کدی که شما دادید فققط یه الگوریتم سادس، معلومه که میشه تو سی شارپ پیاده سازیش کرد مشکل شما اینه که عملکرد کد رو متوجه نشدید و فکر کردید داره بطور جادویی کاری رو انجام میده، در صورتی که چیزی جز چند تا دستور و منطق ساده نبود و قدرتش در الگوریتمش بود. برای هک و اینطور موارد هم فعلاً اول بچسبید به یادگیری سی شارپ، همونجوری که قبلاً هم گفتم vb6 منسوخ شدس، وقتتون رو تلف نکنید و هک ویروس نویسی و اینجور چیزا هم مسائلی نیستن که اول کاری بتونید باهاش دست و پنچه نرم کنید. همون سی شارپ رو فعلاً یاد بگیرید و مجدداً توصیه اکید میکنم که تمرین کنید، نحوه تمرین هم بهتون تو اون یکی تاپیک گفتم با سی شارپ هم میتونی اون کدی که دادی رو بسازی هم میتونی نرم افزار ویندوز بسازی و هم میتونی نرم افزار موبایل بسازی گرچه هر زبونی رو بهر کاری ساختن، انتظار نداشته باش با یادگیری یه زبون همه چیز رو به بهترین شکل ممکن انجام بدی. با اینکه سی شارپ زبونه اصتلاحاً Multi Purposeی هست و میتونید باهاش همه اینکارا رو انجام بدید ولی شخصاً و به دلایل شخصی ترجیح میدن برنامه های اندرویدی رو تو اندروید استودیو توسعه بدم، نه چیز دیگه ای مثل زامارین و بیسیک فور اندروید و هر چیز دیگه ای
  13. مشکل ویندوز 10

    WiDi تکنولوژی بود اینتل برای استریم کردن عکس و فیلم و موزیک به HDTVهای سازگار با این استاندارد از بستر WiFi معرفی کرده بود که الان یکی دوسالی میشه این تکنولوژی از رده خارج شده، چون خود اتحادیه WiFi تکنولوژی جدیدی به اسم Miracast رو معرفی کرده. نصب نبودنشم خللی در کارهای شما ایجاد نمیکنه و در واقع کلیدی نیست، فقط یه قابلیت منسوخ شدس چون این تکنولوژی از رده خارج شده دیگه اینتل هیچ ساپورتی ازش نمیکنه و اگر تو سایت اینتل دنبال درایور جدید برای این نسخه از ویندوز باشی با پیام زیر مواجه میشی:
  14. مشکل ویندوز 10

    سلام اول اینکه از سایت ایسوس دانلود نکنید، از خود سایت اینتل دانلود کنید، مگر اینکه مطمعن باشید نسخه ای که قرار دادن جدیدترین نسخه موجود هست.شرکت های سازنده لپ تاپ همیشه آخرین و جدیدترین درایورها رو توی سایتشون قرار نمیدن بعد هم اینکه منظورتون رو از در منیجر نشون نمیده نفهمیدم، منظورتون همین پنجره ASUS Installation Wizard هست؟ اگر منظورتون همین پنجرس که نباید هم نشون بده، این ابزار کارایی دیگه ای داره و هدفش نمایش درایورها جدیدی که دانلود کردید نیست. شما درایوری که دانلود میکنید رو اگر exe هست باید مستقیماً بازش کنید و نصبش کنید و اگر ZIP هست باید آنزیپ کنید و از طریق Computer < Device Manager و انتخاب گرافیک اینتل نصبش کنید. در مورد نصب نشدن Intel Wireless Driver هم باید اطلاعات بیشتری بدید و اینکه فقط بگید فلان چیز نصب نمیشه اطلاعات کافی برای راهنمایی کردن شما در اختیار بنده و بقیه قرار نمیده ولی معمولاً علت نصب نشدنش اینه که برای نصب Intel WiDi اول باید درایور WiFi Adapter رو نصب کنید. اگر مشکلتون حل نشد اول بگید دستگاهتون چه مدلیه، الان چه سیستم عاملی روش نصب شده (و چند بیتی هست) و همچنین ورژن دقیق WiDi و Wireless LAN خودتون رو ذکر کنید (خلاصه یه شرح حال کامل از لپ تاپتون باید بدید) تا دوستانی که تجربه کار با دستگاه شما رو دارن بتونن راهنماییتون کنن
  15. مشکل ویندوز 10

    مشکل در فایل igdkmd.dll رخ داده که مربوط به گرافیک اینتل هست و چون این درایور Kernel Mode هست، بروز اکسپشن های هندل نشده (همین اتفاقی که تو سیستم شما افتاده) بی برو برگرد باعث نمایش BSOD میشه. شما از سایت اینتل جدیدترین درایور موجود برای سیستم خودت رو بگیر و نصب کن و ببین مشکل حل میشه یا نه
×