نمایش نتایج: از شماره 1 تا 2 از مجموع 2

موضوع: حملات Buffer Overflow را طراحي كرده و بنويسيم ؟

  
  1. #1


    عضو غیر فعال شناسه تصویری subzero_icecity
    تاریخ عضویت
    Jul 2006
    نوشته
    133
    سپاسگزاری شده
    16
    سپاسگزاری کرده
    30

    حملات Buffer Overflow را طراحي كرده و بنويسيم ؟

    وب وارد بحث برنامه نويسي C ميشيم براي سوکت ها . ...
    اين رو دوست خوب و نازنينم آقاي فرهادنيا (يادش بخير و روانش شاد ) 2 سال پيش تو سيمرغ گذاشت ...

    --------------
    به نام خدا

    برنامه نويسي و كنترل پشته TCP IP با زبان C :


    در ابتداي بحث لازمه كه خوانندگان محترم توجه داشته باشند كه براي درك بهتر مفاهيم اين سلسله از مقالات لازمه كه آشنايي در حد مطلوب با مفاهيم برنامه نويسي و شبكه و خصوصا TCPIP Protocol داشته باشند در غير اين صورت مطالعه اين سلسله از مقالات براي عزيزان بي ثمر خواهد بود.
    اين سلسله از مقالات شامل :
    معرفي توابع مورد استفاده در برنامه نويسي TCPIP.
    نحوه ساخت يك برنامه Client.
    نحوه ساخت يك برنامه سرويس دهنده (Server ).
    نحوه ساخت برنامه هاي كاربردي شبكه .
    نحوه ساخت برنامه هاي نفوذ به سيستم ( ها Trojan )
    و توضيحات متفرقه و سوال و جواب ها مي باشد.

    قسمت اول اين سري از مقالات به صورت مجاني در سايت simorgh-ev.com انتشار مي يابد و قسمت هاي ديگر كه به صورت نيمه مجاني مي باشد به وسيله پست الكترونيكي به فروش مي رسد.
    براي اطلاعات بيشتر و نحوه خريد مقالات از طريق پست الكترونيكي با من تماس بگيريد.
    پرسش و پاسخ هاي اين بحث نيز در انجمن امنيتي سيمرغ صورت مي پذيرد.
    يونس فرهادنيا.



    معرفي توابع مهم مورد استفاده در برنامه نويسي TCPIP با زبان C :

    مقدمه:
    براي برنامه نويسي شبكه به زبان سي ما نيازمند يك سري ملزومات هستيم از جمله اين ملزومات مي توان به يك كامپايلر مناسب ، هدر مربوط به برنامه نويسي شبكه (or Other Header Winsock.h) و همچنين سيستم عاملي كه از سوكت هاي شبكه پشتيباني كند را مي توان نام برد.
    همان طور كه مي دانيد زبان سي يك زبان قابل حمل مي باشد يعني مي توان برنامه هاي نوشته شده به اين زبان را روي سيستم هاي مختلف كامپايل و اجرا كرد منظور از سيستم هاي مختلف كامپيوتر هايي با معماري هاي گوناگون مي باشد البته اين امر به شرطي ميسر است كه ما به شيوه اي هوشمندانه كد برنامه خود را تنظيم كنيم كه وابسته گي به سيستم خاصي نداشته باشد به عنوان مثال هنگام تخصيص حافظه پويا نبايد طبق مشخصات سيستم خود اقدام به گرفتن يا آزاد كردن حافظه نمائيم و اقدامات ديگري نظير اين موضوع كه باعث مي شود برنامه اي كه ما نوشته ايم بخوبي كه روي سيستم خود اجرا مي شود بر روي ديگر PlateForm نيز اجرا شود.
    در نتيجه در برنامه نويسي شبكه نيز اين امر بايد به خوبي مد نظر واقع شود به عنوان مثال هدر كار با سوكت ها در سي مي تواند از سيستم عاملي به سيستم عامل ديگر متفاوت باشد همينطور از سخت افزاري به سخت افزار ديگر به عنوان مثال براي برنامه نويسي شبكه در سيستم عامل ويندوز ما از هدر Winsock.h استفاده مي كنيم كه خود نگارش هاي مختلفي دارد و براي برنامه نويسي شبكه در سيستم عامل هاي خانواده *NIX از هدر sys/socket.h و هدر هاي ديگر استفاده مي كنيم كه البته مي توان با اقدامي هوشمندانه توسط راهنماهاي كامپاير (Compiler Directive ) نوع سيستم عامل را تشخيص داد و بعد هدر هاي مربوط به هر سيستم عامل را مورد استفاده قرار داد. بدين ترتيب برنامه ما در هر سيستم عاملي و با هر كامپايلر ( البته نه همه نوع كامپايلري) قابل ترجمه به زبان ماشين و اجرا مي باشد.
    در اين سلسله از مقالات براي سهولت آموزش از سيستم عامل ويندوز و هدر winsock2.h به همراه كامايلر VC++ استفاده مي شود. و هر كجا كه نياز بود مثال هايي از سيستم هاي ديگر آورده خواهد شد.
    البته بايد دانست كه توابع مورد استفاده در همه انواع هدر ها يكسان مي باشند مگر در معدود مواردي كه هر كجا كه احساس نياز شود ذكر خواهند شد.

    شرح توابع مهم موجود در هدر winsock2.h:

    كد: SOCKET socket(
    int af,
    int type,
    int protocol
    );
    <font size="2">

    اين تابع براي تعريف و ايجاد يك پورت به %u



    موضوعات مشابه:
    ویرایش توسط subzero_icecity : 2006-09-27 در ساعت 10:03 AM

  2. #2


    عضو غیر فعال شناسه تصویری subzero_icecity
    تاریخ عضویت
    Jul 2006
    نوشته
    133
    سپاسگزاری شده
    16
    سپاسگزاری کرده
    30
    وب اينم بخش بعدي مقالات ..
    ايشالا مفيد باشه .
    تو بحث بعدي وارد مود برنامه نويسي Socket با پرل ميشم و در اونجا يه حمله BOF هم مثال ميزنم .
    --------------------


    به نام خدا

    برنامه نويسي و كنترل پشته TCP IP با زبان C :
    نويسنده : يونس فرهادنيا
    E.Mail:farhadnia_p@yahoo.com
    بخش دوم / آخر


    نحوه ساخت يك برنامه Client:

    مقدمه:
    بعد از مطالعه قسمت اول مقالات (معرفي توابع مهم مورد استفاده در برنامه نويسي TCPIP با زبان C) در اين قسمت ما آمادگي داريم كه رسما شروع به برنامه نويسي شبكه وكنترل پشته TCPIP به زبان سي بنمائيم.
    در اين مرحله ما فرا مي گيريم كه چگونه كد يك برنامه مشتري (Client) را تنظيم كنيم و برنامه را به بهربرداري برسانيم براي اين منظور ما ابتدا يك پروژه تعريف كرده و بعد شروع به ساخت برنامه مورد نظر مي كنيم و در هر قسمت به صورت مرحله به مرحله توضيحات را ارائه مي نمائيم.
    تعريف پروژه:
    در اين قسمت ما قصد داريم برنامه اي را كه مي خواهيم به اتفاق هم بنويسيم شرح دهيم و مشخص كنيم كه برنامه دقيقا قرار است چه كاري انجام دهد و چه امكاناتي براي ما محيا مي كند.
    شرح برنامه:
    برنامه ما يك برنامه client است يعني با گرفتن مشخصات سرور براي انجام كاري خاص به سرور متصل مي شود.
    چون برنامه ما جنبه آموزشي دارد پس بهتر است برنامه را به گونه اي بنويسيم كه قابليت اتصال و ارتباط با هر پورتي را داشته باشد و همچنين آدرس سرور را هم از كاربر دريافت كند پس تا به اينجا مشخص است كه برنامه مدنظر ما دو ورودي دارد و كار اصلي اين برنامه هم اين باشد كه به سرور متصل شود و پيامي را به سرور ارسال كند و همچنين منتظر گرفتن پيامي از سرور نيز باشد .
    به نظر مي رسد نوشتن قدم به قدم اين برنامه در يادگيري نحوه نوشتن برنامه هاي مشتري (client ) مسمر ثمر باشد.
    در خلال نوشتن برنامه كد هاي خاص و همچنين تكنيك هاي بكار رفته توضيح داده مي شود.
    كد برنامه:
    خوب براي شروع نوشتن اين برنامه ابتدا بايد هدر winsock2.h را كه توابع مورد نظر ما براي كنترل سوكت هاي شبكه در آن قرار دارند را به برنامه اضافه كنيد همچنين هدر stdio.h كه توابع مهمي براي كار با صفحه كليد و مانيتور در ان قرار دارند و دو هدر مهم ديگر به نام هاي stdlib.h و string.h كه در خلال برنامه از توابعي كه در اين هدر ها نيز هستند استفاده مي كنيم (در جاي خود توابعي را كه از اين هدر ها استخراج كرده اينم را توضيح خواهم داد)خوب با اين تفاصير چند خط اول كد برنامه ما از اين قرار هستند:

    كد: #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <winsock2.h>


    بعد از تعريف هدر هاي مورد استفاده در برنامه نوبت به تعريف تابع اصلي لرنامه يعني تابع main() مي رسد به صورت زير عمل كنيد:

    كد: void main(int argc,char **argv){

    }

    خوب تابع اصلي برنامه ما كه main() نام دارد مقدار بازگشتي ندارد اما آرگومان هاي اين تابع كه از خط فرمان به تابع ارسال مي شوند (argv و argc) براي گرفتن ورودي هاي برنامه ما يعني آي پي آدرس ماشين سرور و شماره پورت ارتباطي كاربرد دارند حتما مي دانيد كه در آرگومان argc تعداد رشته هايي كه از ورودي دريافت شده اند قرار دارند و در argv كه يك ارايه دو بعدي از نوع كاراكتري است رشته هاي ورودي نگهداري مي شوند يعني اگر ما در خط فرمان تايپ كنيم:

    Argc برابر 3 مي شود ( يكي براي نام خود برنامه و دو تاي ديگر هم براي آرگومان هاي ورودي) و argv هم بدين صورت مي شود:

    C:\>client.exe 66.33.96.2 45 نقل قول: 6 6 . 3 3 . 9 6 . 2 Null
    4 5 NULL


    خوب تا به اين جا مقدمات آماده شده اما براي كامپايل برنامه با كامپاير vc++ يك چيز ديگر هم نياز است!
    كتابخانه WS_32.lib كه براي اضافه كردن آن به پروژه خو بايد بدين صورت عمل كنيد:
    ابتدا منوي Project زير منوي add to Project را انتخاب كرده و گزينه Files را كليك كنيد بعد نوع فايل انتخابي را lib قرار دهيد و بعد دكمه open را كليك كرده و به ادرسي كه ويژوال استديو را نصب كرده ايد برويد و در انجا پوشه vc6 را باز كرده و بعد پوشه Lib را باز كنيد و در فايل هاي ظاهر شده فايل WS_32.lib را برگزينيد و ok كنيد كتابخانه مورد نظر به برنامه شما اضافه شده است حالا بايد به سراغ مرحله بعد يعني تعريف متغير ها رفت.
    در اين مرحله ما شروع به تعريف متغير هاي مورد استفاده در برنامه خود مي كنيم ابتدا بايد دانست كه براي بارگزاري و آماده سازي مقدماتي ما بايد از تابع WSAStartup(); استفاده كنيم كه اين تابع دو آرگومان دارد اولي يك عدد كه معرف نگارش هدر مورد استفاده (winsock2.h) است و ديگري يك ساختمان داده از نوع WSADATA است كه در ان اطلاعات مهمي ذخيره مي شود براي آشنايي با ساختار اين نوع داده اي عينا اعضاي موجود در اين ساختار داده اي را براي شما نمايش مي دهم:

    كد: typedef struct WSAData {
    WORD wVersion;
    WORD wHighVersion;
    char szDescription[WSADESCRIPTION_LEN+1];
    char szSystemStatus[WSASYS_STATUS_LEN+1];
    unsigned short iMaxSockets;
    unsigned short iMaxUdpDg;
    char FAR * lpVendorInfo;
    } WSADATA, *LPWSADATA;


    در مورد جزئيات بيشتر مي توانيد به مراجعي كه در انتهاي مقاله اورده مي شود رجوع كنيد.
    خوب پس تا به اينجا ما بايد دو متغير تعريف كنيم :

    كد: WORD wVersionRequested;
    WSADATA wsaData;


    اين دو متغير هر دو در تابع WSAStartup به كار مي روند اولي كه لز نوع WORD است براي نگهداري شماره نگارش هدر و دومي براي نگهداري اطلاعات مهمي كه مورد استفاده براي اماده سازي سيستم عاما است.
    ما براي ساخت يك سوكت نياز به يك متغير از نوع SOCKET داريم كه اين نوع كه همسان با نوع داده اي int است براي نگهداري توصيفات مربوط به پورت ما مي باشد كه در توابع گوناگوني مورد استفاده قرار مي گيرد شايان ذكر است كه نوع SOCKET يك نوع داده اي استانداد نيست و در هدر winsock.h تعريف شده است:

    براي نگهداري شماره پورت ارتباطي مورد نظر ما همچنين آي پي آدرس ماشين سرور و نوع پروتكل ارتباطي نياز به يك ساختار داده اي به نام sockaddr_in است در نتيجه يك متغير از اين نوع بايد در برنامه تعريف شود:

    SOCKET intSocket; كد: struct sockaddr_in recSin;

    ما به يك بافر براي نگهداري اطلاعات دريافتي و همچنين ذخيره موقت اطلاعات ارسالي قبل از انجام عمليات ارسال نيازمنديم در نتيجه يك بافر بنا به نياز خود تعريف مي كنيم توجه داشته باشيد چون اطلاعات ارسالي و دريافتي به صورت رشته اي از كاراكتر ها مي باشد ما نيز بايد اين بافر را از نوع كاراكتري در نظر بگيريم يعني آرايه اي از كاراكتر ها كه طول آن هم بنا به نياز ما مي تواند متغير باشد.

    نقل قول: char * pchrBuffer;

    براي تست صحت درستي كار توابع يك متغير ديگر براي نگهداري مقدار بازگشتي توابع نيز تعريف مي كنيم.

    كد: int intErr;

    خوب تا به اينجا متغير هاي مورد نياز برنامه ما تعريف شدند در مرحله بعد ما بايد براي برنامه خود آي پي آدرس ماشين ميزبان و همچنين پورت مورد نظر ما براي تبادل اطلاعات و نوع ارتباط را مشخص كنيم كه اين سلسله از كار ها به سادگي با مقدار دهي به اعضاي ساختمان داده اي wsaData صورت مي پذيرد اما قبل از هر كاري بايد كنترل شود كه آيا كاربري كه برنامه را اجرا كرده آرگومان هاي تابع اصلي برنامه ( main) را نيز وارد كرده يا خير و در صورت بروز هر اشكالي به كاربر اطلاع داده شود.
    پس بدين گونه عمل مي كنيم:

    كد: if(argc<=2){
    printf("::Error on The call Program::\n");
    printf("%s RemoteIPAddress RemotePort",argv[0]);
    exit(1);
    }


    تابع exit() هم كه در هدر stdlib.h قرار دارد وظيفه اش اتمام برنامه است كه آرگومان اين تابع عينا به سيستم عامل داده مي شود (مي توان از ان براي تشخيص خطاي رخ داده استفاده كرد).
    بعد از اجراي كد بالا مي توانيم مطمئن شويم كه كاربر اطلاعات ورودي مورد نظر ما را وارد كرده پس كد زير را در برنامه درج مي كنيم:

    كد: recSin.sin_addr.S_un.S_addr=inet_addr(argv[1]);
    recSin.sin_family=AF_INET;
    recSin.sin_port=htons(atoi(argv[2]));


    شرح اعضاي ساختار WSADATA در قسمت قبلي مقاله آورده شده است براي توضيحات بيشتر مي توانيد به آن مراجعه كنيد فقط تابع atoi() است كه در مورد آن بايد گفت كه اين تابع كه در هدر stdlib.h قرار دارد مقدار رشته اي را به مقدار عددي تبديل مي كنيد يعني ارزش عددي آرگومان خود را كه از نوع يك رشته كاراكتري است برمي گرداند.
    حالا بايد مرحله آماده سازي (initiates) سيستم عامل را صورت دهيم كه اين تابع ترتيبي مي دهد كه ما بتوانيم از Ws2_32.dll استفاده كنيم پس كد ما در مرحله بعد از تعريف متغير ها به صورت زير است:

    كد: wVersionRequested=MAKEWORD(2,0);
    if(WSAStartup(wVersionRequested,&wsaData)){
    printf("\n::Error On init Socket::\n");
    exit(1);
    }


    خوب در اين كد از ماكرو makeword() استفاده شده است كه وظيفه آن اين است كه اعداد موجود در آرگومانش را كه بيانگر نگارش هدر winsock.h ما هست را به نوعي قابل فهم (WORD ) توسط تابع WSAStartup() تبديل كند و ما چون از نگارش 2 هدر استفاده كرديم آرگومان ها به ترتيب 2 و0 خواهند بود (MAKEWORD(2,0) ) .

    چون تابع WSAStarup وظيفه اش قرار دادن مقادير در ساختمان wsaData هست ما اين آرگومان را با نوع فراخاني با ارجاع ( call by reference ) براي تابع مشخص كرده ايم. يعني به جاي جايگزاري مقدار در آرگومان تابع (call by value ) ادرس محلي كه متغير ساختماني ما (wsaData) در ان قرار دارد را براي تابع ارسال كرده ايم.
    در صورت بروز خطا تابه WSAStartup مقداري غير صفر بر مي گرداند كه ما مقدار برگشتي تابع را با دستور if كنترل كرده ايم و در صورت بروز اشكال به برنامه با چاپ يك پيغام خاتمه مي دهيم.
    در اينجا به مرحله اي رسيده ايم كه مي توانيم سوكت خود را با استفاده از تابع socket() تعريف كنيم:

    كد: intSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(intSocket = = INVALID_SOCKET){
    printf("\n::Error On Create Socket::\n");
    WSACleanup();
    exit(1);
    }


    خوب تابع سوكت اگر كار خود را با موفقيت انجام دهد مقدار برگشتيش توصيف كننده سوكت مورد نظر ماست و در غير اين صورت ثابتي برابر INVALID_SOCKET را برمي گرداند كه ما براي تست صحت درستي انجام تابع اين مقدار را با مقدار بازگشتي تابع مقايسه مي كنيم. در آرگومان دوم نيز مشخص شده است كه ارتباط ما از نوع TCP است و اگر مي خواستيم كه از نوع UDP باشد كافي بود كه مقدار ثابت SOCK_DGRAM قرار بدهيم.

    تابع WSACleanup() نيز براي اتمام بارگزاري سيستم عامل و خالي كردن حافظه مي باشد ( عكس تابع WSAStartup() عمل مي كند).

    حالا همه چيز اماده است كه ما با استفاده از تابع connect() به سرور متصل شويم:

    كد: intErr=connect(intSocket,&recSin,sizeof(recSin));
    if(intErr==INVALID_SOCKET){
    printf("\n::Error On Connect to Socket::\n");
    WSACleanup();
    exit(1);
    }


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

    كد: pchrBuffer="Salam\0";
    intErr=send(intSocket,pchrBuffer,strlen(pchrBuffer ),0);
    if(intErr==SOCKET_ERROR){
    printf("\n::Error On Send Data::\n");
    printf("Error Code:%d",WSAGetLastError());
    WSACleanup();
    exit(1);
    }


    در اين حالت مقدار رشته Salam به طرف سرور ارسال مي سود توجه داشته باشيد كه علامت \0 براي مشخص كردن انتهاي رشته است آرگومان سوم هم كه تعداد كاركاتر هاي ارسالي را مشخص مي كند كه در اينجا ما با استفاده از تابه strlen() كه در هدر string.h تعريف شده است طول رشته ارسالي خود را براي تابع send مشخص مي كنيم.
    بعد از مرحله ارسال اطلاعات نوبت به دريافت اطلاعات از سرور است كه در اينجا به شرح آن مي پردازيم:
    با استفاده از تابع recv() شما قادر خواهيد بود كه اطلاعاتي از ديگر كامپيوتر موجود در شبكه دريافت كنيد در اين مثال كد مربوط به دريافت بدين صورت است:

    كد: memset(pchrBuffer,’\0’,strlen(pchrBuffer));
    intErr=recv(intSocket,pchrBuffer,strlen(pchrBuffer ),0);
    if(intErr==SOCKET_ERROR){
    printf("\n::Error On Recev Data::\n");
    printf("Error Code:%d",WSAGetLastError());
    exit(1);
    }
    printf("%s",pchrBuffer);



    با استفاده از تابع memset() كه در هدر string.h مشخص شده است ما بافر خود را از وجود اطلاعات قبلي پاك مي كنيم تا اطلاعات دريافت شده را در آن ذخيره كنيم.
    تابه memset() بدين صورت عمل مي كند كه ارگومان اول اين تابع آدرس بافر ما خواهد بود آرگومان دوم مقداري ايت كه در هر يك از خانه هاي بافر ما قرار است جايگزين مقدار قبلي آن خانه از بافر ما شود و آرگومان سوم تعداد خانه هايي از بافر را مشخص مي كند كه ما مي خواهيم مقدار جديد را در آن جايگزين كنيم. مقدار برگشتي اين تابع بافر تغيير يافته خواهد بود.
    در تابع recv كه آرگومان هايش دقيقا شبيه آرگومان هاي تابع send است مقدار رشته كاراكتري كه از كامپيوتر ديگر دريافت مي شود در بافر ما ذخيره مي شوند و ما مي توانيم در مرحله بعد از آن استفاده كنيم.
    كه ما در اينجا عينا خود عبارت دريافتي را با دستور printf() در خرئجي نمايش داده ايم.
    خوب كار برنامه ما در اينجا به پايان رسيده است و ما بايد در اين مرحله socket خود را ببنديم و حافظه را آزاد كنيم كه اين كار با دو تابع زير صورت مي پزيرد:

    كد: closesocket(intSocket);
    WSACleanup();
    getch();
    }


    در نهايت كل كد برنامه ما به صورت زير خواهد بود:

    كد: #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <winsock2.h>
    //define main function:
    void main(int argc,char **argv){
    WSADATA wsaData;
    WORD wVersionRequested;
    SOCKET intSocket;
    struct sockaddr_in recSin;
    int intErr;
    char *pchrBuffer;
    if(argc<=2){
    printf("::Error on The call Program::\n");
    printf("%s RemoteIPAddress RemotePort",argv[0]);
    exit(1);
    }
    recSin.sin_addr.S_un.S_addr=inet_addr(argv[1]);
    recSin.sin_family=AF_INET;
    recSin.sin_port=htons(atoi(argv[2]));
    wVersionRequested=MAKEWORD(2,0);
    if(WSAStartup(wVersionRequested,&wsaData)){
    printf("\n::Error On init Socket::\n");
    exit(1);
    }
    intSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(intSocket==INVALID_SOCKET){
    printf("\n::Error On Create Socket::\n");
    WSACleanup();
    exit(1);
    }
    intErr=connect(intSocket,&recSin,sizeof(recSin));
    if(intErr==INVALID_SOCKET){
    printf("\n::Error On Connect to Socket::\n");
    WSACleanup();
    exit(1);
    }
    pchrBuffer="Salam\0";
    intErr=send(intSocket,pchrBuffer,strlen(pchrBuffer ),0);
    if(intErr==SOCKET_ERROR){
    printf("\n::Error On Send Data::\n");
    printf("Error Code:%d",WSAGetLastError());
    WSACleanup();
    exit(1);
    }
    memset(pchrBuffer,’\0’,strlen(pchrBuffer));
    intErr=recv(intSocket,pchrBuffer,strlen(pchrBuffer ),0);
    if(intErr==SOCKET_ERROR){
    printf("\n::Error On Recev Data::\n");
    printf("Error Code:%d",WSAGetLastError());
    exit(1);
    }
    printf(“\nRecived Data:%s\n”,pchrBuffer);
    closesocket(intSocket);
    WSACleanup();
    getch();
    }


    خوب تا بدين جا شما نحوه ساخت يك برنامه كلاينت با زبان سي را فراگرفته ايد اين برنامه تحت TCP كار مي كند يعني يك ارتباط اتصال گرا ( Connection Orinted) برقرار مي كند براي ساخت يك برنامه تحت UDP يعني غير اتصال گرا (Connection Less ) مسقيما شروع به ارسال و دريافت داده كنيد البته به شرطي كه سرور شما از پورت هاي UDP استفاده كند به عنوان تمرين تجزيه و تحليل برنامه زير كه يك برنامه بر مبناي ارتباط UDP را به خود شما واگزار مي كنم:

    كد: #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <winsock2.h>
    //define main function:
    void main(int argc,char **argv){
    WSADATA wsaData;
    WORD wVersionRequested;
    SOCKET intSocket;
    struct sockaddr_in recSin;
    int intErr;
    char *pchrBuffer;
    if(argc<=2){
    printf("::Error on The call Program::\n");
    printf("%s RemoteIPAddress RemotePort",argv[0]);
    exit(1);
    }
    recSin.sin_addr.S_un.S_addr=inet_addr(argv[1]);
    recSin.sin_family=AF_INET;
    recSin.sin_port=htons(atoi(argv[2]));
    wVersionRequested=MAKEWORD(2,0);
    if(WSAStartup(wVersionRequested,&wsaData)){
    printf("\n::Error On init Socket::\n");
    exit(1);
    }
    intSocket=socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP);
    if(intSocket==INVALID_SOCKET){
    printf("\n::Error On Create Socket::\n");
    WSACleanup();
    exit(1);
    }
    intErr=connect(intSocket,&recSin,sizeof(recSin));
    if(intErr==INVALID_SOCKET){
    printf("\n::Error On Connect to Socket::\n");
    WSACleanup();
    exit(1);
    }
    pchrBuffer="Salam\0";
    intErr=send(intSocket,pchrBuffer,strlen(pchrBuffer ),0);
    if(intErr==SOCKET_ERROR){
    printf("\n::Error On Send Data::\n");
    printf("Error Code:%d",WSAGetLastError());
    WSACleanup();
    exit(1);
    }
    memset(pchrBuffer,’\0’,strlen(pchrBuffer));
    intErr=recv(intSocket,pchrBuffer,strlen(pchrBuffer ),0);
    if(intErr==SOCKET_ERROR){
    printf("\n::Error On Recev Data::\n");
    printf("Error Code:%d",WSAGetLastError());
    exit(1);
    }
    printf(“\nRecived Data:%s\n”,pchrBuffer);
    closesocket(intSocket);
    WSACleanup();
    getch();
    }


    توجه داشته باشيد كه در تابه socket از دو ثابت SOCK_DGRAM و IPPROTO_UDP به جاي آرگومان دو م و سوم استفاده كرديم كه مشخص كننده نوع ارتباط UDP است.
    در اينجا ديگر مي توانيد با كمي خلاقيت برنامه هاي كلاينت مد نظر خود را براي كاربرد هاي گوناگون بسازيد.




کلمات کلیدی در جستجوها:

حملات buffer overflow

ارسال هدر با winsock

برای جلوگیری از سریز بافر در سوکت پروگرمینگ چه باید کرد؟

کانفیگ مودم d link

Buffer OverFlow آموزش

چگونه از حملات ذbuffer over flow جلوگیری کنیم

work flowمعناي

کامپایلر مناسب برای اجرای سوکت پروگرمینگ سی

حملات buffer over flow

يونس فرهادنيا

c#دربرنامه نویسی به زبان overflow

يافتن overflowجلوگيري ازآن

حمله bufer over

buffer overflows یعنی چه؟

ابرنامه نويسي udp vc6

حمله Buffer Overflow

winsock2.h مقاله

over flowمفهوم

ارگومان های exit

call by value یعنی چه

call by reference a call by value توضیح دهید

overflow نوشتن

توابع موجود در تابع string.h

تعریف Buffer overflow

ارگومان هاي خط فرمان ارسال c

برچسب برای این موضوع

مجوز های ارسال و ویرایش

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