Advertisement
Guest User

main.cpp

a guest
Sep 5th, 2013
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.77 KB | None | 0 0
  1. #include "resource.h"
  2.  
  3. #include <WS2tcpip.h>
  4. #include <iostream>
  5. #include <stdio.h>
  6. #include <map>
  7. #include <bitset>
  8. #include <vector>
  9.  
  10. #pragma comment(lib, "ws2_32.lib")
  11.  
  12. HWND mainWindow, hwnd;
  13. unsigned long sock;
  14.  
  15. char emailid[256];
  16. char pwd[256];
  17. char to[256];
  18. char subject[256];
  19. char content[1024];
  20. char sendmsg[256];
  21. char recvmsg[256];
  22.  
  23. std::map<int, char> base;
  24. int ret = 0;
  25.  
  26. /*read the Base64 Wikipedia article to understand this.
  27.  
  28.  
  29. Basic concept: Convert each ascii letter into binary. group them into 6's and lookup in base64 table.*/
  30.  
  31. std::vector<int> get_base64_int(char *email)
  32. {
  33.     //char email[] = "Man";
  34.     char buff[32];
  35.     std::vector<std::string> codes;
  36.     std::vector<std::string> broken_codes;
  37.     std::string temp, temp2;   
  38.     std::vector<std::string>::iterator it;
  39.  
  40.     memset(buff, 0, 32);
  41.    
  42.     for(int i = 0; i < strlen(email); i++)
  43.     {
  44.         //itoa((int)email[i], buff, 2);
  45.         std::bitset<sizeof(int) * CHAR_BIT> bits((int)email[i]); //decimal to binary
  46.         temp.assign(bits.to_string());
  47.         codes.push_back(temp.substr(temp.length() - 8, 8)); //this returns 4 bytes. So get the last byte which is our binary code.
  48.     }
  49.  
  50.     ret = codes.size() % 3; //check if it is divisible by 3. This is for adding the padding (read the article seriously).
  51.  
  52.     if(ret != 0)
  53.     {
  54.         if(ret == 1)
  55.         {
  56.             codes.push_back("00000000");
  57.             codes.push_back("00000000");
  58.         }
  59.         else if(ret == 2)
  60.             codes.push_back("00000000");
  61.     }
  62.  
  63.     for(it = codes.begin(); it != codes.end(); it++)
  64.         temp2 += (*it).c_str(); //combine all the binarycodes into one string.
  65.  
  66.     int multiple = 0;
  67.  
  68.     while(multiple < temp2.size())
  69.     {
  70.         broken_codes.push_back(temp2.substr(multiple, 6).data()); //the string needs to be broken into 6 to be converted to decimal.
  71.         multiple += 6;
  72.     }
  73.  
  74.     std::vector<int> full_codes;
  75.  
  76.  
  77.     for(it = broken_codes.begin(); it != broken_codes.end(); it++) //convert each 6 digit binary code to a decimal.
  78.     {
  79.         int x = 0, r = 0, j = 1, d = 0;
  80.         x = atoi((*it).c_str());
  81.         while(x != 0)
  82.         {
  83.             r = x % 10;
  84.             d = d + r * j;
  85.             j = j * 2;
  86.             x = x / 10;
  87.         }
  88.  
  89.         full_codes.push_back(d); //push all the digits.
  90.     }
  91.  
  92.     return full_codes;
  93. }
  94.  
  95. std::string get_encrypted_string(char *str)
  96. {
  97.     std::vector<int> base64_bin = get_base64_int(str);
  98.     std::string encrypted_string;
  99.     for(int i = 0; i < base64_bin.size(); i++)
  100.     {
  101.         encrypted_string += base[base64_bin.at(i)];
  102.     }
  103.  
  104.     encrypted_string = encrypted_string.substr(0, (encrypted_string.size() - (ret == 0 ? 0 : (ret == 1 ? 2 : 1))));
  105.     encrypted_string += std::string((ret == 0 ? 0 : (ret == 1 ? 2 : 1)), '=');
  106.     return encrypted_string;
  107. }
  108.  
  109. void send_msg(char *msg)
  110. {
  111.     memset(&sendmsg, 0, 256);
  112.     strcat(sendmsg, msg);
  113.     if(send(sock, sendmsg, strlen(sendmsg), 0) == SOCKET_ERROR)
  114.         MessageBox(NULL, "send()", "Error", MB_OK | MB_ICONERROR);
  115. }
  116.  
  117. void recv_msg()
  118. {
  119.     memset(&recvmsg, 0, 256);
  120.     if(recv(sock, recvmsg, 256, 0) == SOCKET_ERROR)
  121.         MessageBox(NULL, "recv()", "Error", MB_OK | MB_ICONERROR);
  122.     else
  123.         SetWindowText(hwnd, recvmsg);
  124. }
  125.  
  126. BOOL CALLBACK MainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  127. {
  128.     switch(uMsg)
  129.     {
  130.         case WM_INITDIALOG:
  131.         {
  132.             hwnd = hWnd;
  133.             SetDlgItemText(hWnd, ID_EMAIL, "Your Account EMail");
  134.             SetDlgItemText(hWnd, ID_PWD, "Your Account Password");
  135.             SetDlgItemText(hWnd, ID_TO, "To Email Address");
  136.             SetDlgItemText(hWnd, ID_SUB, "Subject");
  137.             SetDlgItemText(hWnd, ID_DATA, "Your Message");
  138.  
  139.             memset(&emailid, 0, 256);
  140.             memset(&pwd, 0, 256);
  141.             memset(&to, 0, 256);
  142.             memset(&subject, 0, 256);
  143.             memset(&content, 0, 1024);
  144.            
  145.  
  146.             break;
  147.         }
  148.         case WM_COMMAND:
  149.         {
  150.             switch(LOWORD(wParam))
  151.             {
  152.                 case BTN_SEND:
  153.                 {
  154.                     WSADATA wsaData;
  155.                     if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  156.                     {
  157.                         MessageBox(hWnd, "WSAStartup()", "Error", MB_OK | MB_ICONERROR);
  158.                         exit(0);
  159.                     }
  160.                     else
  161.                     {
  162.                         sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  163.                         if(sock == INVALID_SOCKET)
  164.                         {
  165.                             MessageBox(hWnd, "socket()", "Error", MB_OK | MB_ICONERROR);
  166.                             exit(0);
  167.                         }
  168.                         else
  169.                         {
  170.                             sockaddr_in sin;
  171.                             hostent* server = gethostbyname("smtp.gmail.com");
  172.                             memcpy((void*)&sin.sin_addr.S_un.S_addr, (void*)server->h_addr, server->h_length);
  173.                             sin.sin_port = htons(587);
  174.                             sin.sin_family = AF_INET;
  175.                
  176.                             if(connect(sock, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
  177.                             {
  178.                                 MessageBox(hWnd, "connect()", "Error", MB_OK | MB_ICONERROR);
  179.                                 exit(0);
  180.                             }
  181.                             else
  182.                             {
  183.                                 SetWindowText(hWnd, "Connected!");
  184.                                 send_msg("EHLO mail.gmail.com\r\n"); //EHLO comman.d.
  185.                                 recv_msg();
  186.                                 Sleep(1000);
  187.                                 send_msg("AUTH LOGIN\r\n");
  188.                                 recv_msg();
  189.                                 for(int i = 0; i < 26; i++)
  190.                                 base[i] = ((char)i + 65); //A-Z
  191.                                 for(int i = 26; i < 52; i++)
  192.                                     base[i] = ((char)(i + 71)); //a-z
  193.                                 for(int i = 52; i < 61; i++)
  194.                                 {
  195.                                     char c[10];
  196.                                     itoa(i - 52, c, 10);
  197.                                     base[i] = c[0];
  198.                                 }
  199.                                 base[61] = '9';
  200.                                 base[62] = '+';
  201.                                 base[63] = '/';
  202.                                 base[64] = '=';
  203.                             }
  204.  
  205.  
  206.                         }
  207.                     }
  208.                     GetDlgItemText(hWnd, ID_EMAIL, emailid, 256);
  209.                     std::string emailidd = get_encrypted_string(emailid);
  210.                     emailidd += "\r\n";
  211.                     send_msg((char *)emailidd.c_str());
  212.                     recv_msg();
  213.  
  214.                     GetDlgItemText(hWnd, ID_PWD, pwd, 256);
  215.                     std::string pwdd = get_encrypted_string(pwd);
  216.                     pwdd += "\r\n";
  217.                     send_msg((char *)pwdd.c_str());
  218.  
  219.                     memset(pwd, 0, 256);
  220.                     sprintf(pwd, "MAIL FROM: <%s>\r\n", emailid);
  221.                     send_msg(pwd);
  222.                     recv_msg();
  223.  
  224.                     memset(pwd, 0, 256);
  225.                     GetDlgItemText(hWnd, ID_TO, to, 256);
  226.                     sprintf(pwd, "rcpt to: <%s>\r\n", to);
  227.                     send_msg(pwd);
  228.                    
  229.                     recv_msg();
  230.                     send_msg("DATA\r\n");
  231.                     recv_msg();
  232.  
  233.                     memset(pwd, 0, 256);
  234.                     sprintf(pwd, "From: %s\r\n", emailid);
  235.                     send_msg(pwd);
  236.  
  237.                     memset(pwd, 0, 256);
  238.                     sprintf(pwd, "To: %s\r\n", to);
  239.                     send_msg(pwd);
  240.  
  241.  
  242.                     GetDlgItemText(hWnd, ID_SUB, subject, 256);
  243.                     memset(pwd, 0, 256);
  244.                     sprintf(pwd, "Subject: %s\r\n", subject);
  245.                     send_msg(pwd);
  246.  
  247.                     GetDlgItemText(hWnd, ID_DATA, content, 1024); //buffer overflow problem.
  248.  
  249.                     send_msg("\r\n");
  250.                     strcat(content, "\r\n");
  251.                     send_msg(content);
  252.                     send_msg(".\r\n");
  253.                     recv_msg();
  254.                     MessageBox(NULL, "Message has been sent.", "Simple EMailer -Sri Krishna", MB_OK);
  255.                     break;
  256.                 }
  257.             }
  258.             break;
  259.         }
  260.         case WM_CLOSE:
  261.         {
  262.             closesocket(sock);
  263.             EndDialog(hWnd, WM_CLOSE);
  264.             break;
  265.         }
  266.         default:
  267.             return false;
  268.     }
  269.     true;
  270. }
  271.  
  272. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR nCmdLine, int nCmdShow)
  273. {
  274.     return DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(DIALOG_BOX), mainWindow, MainProc);
  275. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement