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




تاريخ ايجاد وبلاگ: شنبه 2 آبان 1388
بروز رساني:چهارشنبه 12 خرداد 1389
تعداد نظرات داده شده : 73 نظر
كل مطالب ارسال شده: 791 عدد
در این مثال لیستی از دروس ارائه شده و دانشجو می تواند دروس مورد نظر خود را انتخاب کند.

جلوی هر درس عددی قرار داده شده است ولی بعد از انتخاب برنامه فقط مجموع این اعداد را ذخیره می کند این اعداد به صورتی انتخاب شده اند که مجموع دلخواه هر کدام از آنها یک عدد منحصر به فرد خواهد شد به عنوان مثال اگر مجموع 13 شود خواهیم فهمید که دانشجو دروس فیزیک=8 و ریاضی=4 و زبان فارسی=1 را انتخاب کرده است چرا که تنها مجموع همین اعداد از لیست 13 خواهد شد این مجموع منحصر به فرد برای تمام اعداد وجود دارد اما می دانید این حقه ی ریاضی چطور کار می کند هر عدد از لیست بزرگتر از مجموع تمام اعداد قبلی لیست است مثلا عدد 4 بزرگتر از 1+2 است عدد 8 بزرگتر از 1+2+4 است عدد 16 بزرگتر از 1+2+4+8 است و به همین صورت ادامه می یابد
استفاده از این روش بسیار ساده است مثلا اگر عدد ذخیره شده یا همان عدد مجموع 42 شده است برای اینکه بفهمیم کدام دروس انتخاب شده است فقط کافی است بزرگترین عدد لیست که از مجموع یعنی 42 کوچکتر باشد شروع به کم کردن کنیم
عدد 42 باید با استفاده از عدد 32 که از 42 کوچکتر و از سایر اعداد لیست بزرگتر است درست شده باشد پس
42-32=10
عدد 10 باید از 8 که از 1 کوچکتر و از سایر اعداد لیست بزرگتر است درست شده باشد
برنامه نویسی رخدادگرا یکی از الگو های برنامه نویسی است که جریان برنامه را از طریق رخ داده ا ( event ) کنترل می کند. این رخ داده ا می توانند از سمت دستگاه های ورودی مثل ماوس و کیبورد صادر شوند یا از طریق پیغام های صادر شده یک نخ یا فرآیند باشند. در این مقاله قصد داریم در م ورد رخ داده ا و کنترل آنها در سیستم عامل ویندوز صحبت کنیم.برای روشن تر شدن موضوع بگذارید یک مثال بزنیم: یک برنامه word را باز می کنید و شروع به تایپ می کنید. مطالب تایپ شده همان لحظه نمایش داده می شوند. این عمل چطور اتفاق می افتد؟ وقتی شما کلیدی از صفحه کلید را فشار دهید، از طرف کیبورد یک وقفه صادر می شود که به سیستم عامل می فهماند که فلان کلید زده شده است. سیستم عامل با یک مکانیزم درونی پیغامی به نام wm_keydown را در صف پیغام هاقرار می دهد. حال برنامه ورد این پیغام را دریافت کرده و مقدار کلید زده شده را در صفحه نمایش چاپ می کند. خوب، برنامه ورد این کار را چگونه انجام می دهد؟ وقتی شما یک برنامه ویندوزی می نویسید به یک فراخواننده (callback) برخ ورد می کنید که وقتی پیغامی از طرف سیستم عامل صادر شد، توسط این تابع هندل می شود و عملیات م ورد نظر انجام می شود. پس قبل از این که بحث را دنبال کنیم، بگذارید کمی در م ورد مفهوم فراخواننده صحبت کنیم: فرض کنید شما یک برنامه نوشته اید که قصد دارد یک سری داده را مرتب کند و می خواهید در هر مرحله به یک روش آنها را مرتب کنید. یک راه استفاده از تابع های مختلف برای مرتب کردن آن ها است. این روش ساده و درست است، اما فرض کنید شما کد خود را در یک کتابخانه قرار داده اید و برنامه نویس دیگری که قرار است از کتابخانه شما استفاده کند، نمی خواهد از متدهای مرتب سازی شما استفاده کند. در این جا کتابخانه شما در انجام این عمل ناتوان است ، خب چه کار کنیم که دیگر برنامه نویسان بتوانند برای مرتب سازی از روش های دلخواه خودشان استفاده کنند؟ برای این کار شما نیاز به تعریف یک اشاره گر به تابع (pointer to function) دارید. برنامه نویس های دیگر با مقداردهی آن می توانند روش مرتب سازی خود را استفاده کنند برای تعریف اشاره گر به تابع در c++ به روش زیر عمل می کنیم: مقدار returntype نوع داده برگشتی را مشخص می کند. callbackname نام فراخواننده است و مقدارهای 1param ¢ 2param نشان دهنده متغییرهای ورودی اند. وقتی شما یک تابع را به یک فراخواننده می دهید،
بافر چیست؟ بافر، حافظه موقتی است که به صورت نرم افزاری و سخت افزاری پیاده سازی می شود، در روش سخت افزاری مثل بافر کیبورد، اطلاعات کلیدهایی که شما روی صفحه کلید فشار داده اید در جایی ذخیره می شود و سیستم عامل آنها را می خواند و پردازش می کند. بافر نرم افزاری به دو صورت قابل پیاده سازی است. 1 در سطح سیستم عامل: سیستم عامل مقداری از حافظه را جهت بافرکردن به خود اختصاص می دهد. این حافظه برای یکسان سازی سرعت دیسک سخت و پردازشگر استفاده می شود. 2 در سطح نرم افزار کاربردی: این حافظه را ما به عنوان برنامه نویس تعریف می کنیم تا امور مختلفی را انجام دهیم. قطعه کد زیر را در نظر بگیرید: void overflow_function (char *str){ char buffer[10]; strcpy(buffer, str); } int main(){ char big_string[14]; strcpy(big_string,"bufferoverflow"); overflow_function(big_string); return 0; } از لحاظ قواعد گرامری این قطعه کد درست است و باید بدون اشکال کار کند اما در زمان اجرا، خطای در حال اجرا صادر خواهد شد با این مضمون: stack around the variable ‘buffer’ was corrupted بسیار خب، این خطا به ما می گوید که متغیر بافر خراب شده است. بیایید ببینیم این کد دقیقا چه کار می کند: ابتدا یک متغیر از نوع رشته به طول 14کاراکتر تعریف کرده و مقدار bufferoverflow را با استفاده از دستور strcpy در آن کپی می کنیم. تا اینجا مشکل خاصی نیست و کد درست است. حال مقدار big_string به تابع overflow_function پاس داده می شود. این تابع سعی دارد مقدار big_string که به آن داده شده است را درbuffer کپی کند اما این عمل ناموفق می ماند و در نتیجه برنامه خطا می دهد. چرا خطا می دهد؟ این تابع می خواهد مقدار 14کاراکتر را در یک رشته 10کاراکتری کپی کند، طبیعی است که این کار را نمی تواند درست انجام دهد، برای همین خطا صادر می شود. کمی دقیق تر به مساله نگاه می کنیم: وقتی تابع overflow_function فراخوانی می شود آدرس برگشت به تابع فراخواننده در ثبات sp قرار می گیرد. سپس این تابع سعی می کند مقدار 14کاراکتر را در 10کاراکتر کپی کند و این عمل با موفقیت انجام می شود. فرض کنید بافر در 10خانه اول بعد از آدرس 100h قرار داد و ثبات sp مقدار خانه 10dh را به عنوان آدرس برگشتی تابع overflow_function در خود دارد. حال مقدار 14کاراکتر در متغیر بافر، کپی می شود و در نتیجه خانه های 100h تا 10eh بازنویسی می شوند و سپس کار تابع به پایان می رسد و سیستم عامل قصد دارد با استفاده از آدرس ذخیره شده در sp به فراخواننده تابع overflow_function بر گردد اما از آن جایی که آدرس 10dh بازنویسی شده است، پردازشگر نمی تواند دستوری را اجرا کند و خطای bufferoverflow صادر می شود. خب، هکرها با استفاده از همین خطا به سیستم های دیگران حمله می کنند. آنها یکسری دستورات به زبان اسمبلی می نویسند که در اصطلاح به آنها shellcode یا exploit گفته می شود. به مثال بالا برمی گردیم، فرض کنید به جای مقدار “bufferoverflow” یک شل کد به تابع overflow_function داده شود. وقتی کار تابع تمام شد، پردازشگر به آدرس 10dh می رود. مقدار این آدرس دیگر یک مقدار نامعتبر نیست بلکه به یک قطعه کد اشاره دارد و پردازشگر، آن قطعه کد را اجرا می کند و سبب می شود برنامه اصلی، کار خودش را درست انجام ندهد . این یک روش برای سوءاستفاده از سرریزی است. روش دیگر دسترسی به بخش های محرمانه حافظه است که اطلاعات اساسی سیستم در آن قرار دارد. هکر با تزریق کد خود به برنامه می تواند به بخش های محرمانه حافظه دسترسی پیدا کند و اطلاعات حیاتی سیستم را مورد سو ءاستفاده قرار دهد.
