利用Socket实现远程DOS控制

来源:互联网 发布:怎么看淘宝注册日期 编辑:程序博客网 时间:2024/06/05 20:51

利用Socket实现远程DOS控制


最近在鼓捣树莓派开发板,想实现自动升级的功能,就想着先在windows下实现,然后移植到树莓派上,结果做到一半时,发现可以通过此,远程控制别人电脑dos,于是自己就跑偏了,自动升级功能到现在还没实现,哈哈。


一、编程语言

因为之前接触过一段时间的C#,而且感觉使用它做一些桌面小程序还是挺方便的,所以这次就选择使用C#来完成此功能。

二、创建工程

因为是Socket通信,所以需要创建两个windows窗体应用程序:Server和Client。然后根据需要,在窗体上放一些控件,如下图:

这里写图片描述

三、代码实现

首先双击Server界面上的“启动“按钮进入按钮点击代码编写。1、得到界面上输入的IP和端口号;2、建立Socket连接;3、监听客户端的连接;4、等待客户端信息。

static Socket socket;private void button1_Click(object sender, EventArgs e){    int port = int.Parse(textBox2.Text.ToString());    IPAddress ip = IPAddress.Parse(textBox1.Text.Trim());//记得要引用System.Diagnostics命名空间    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);    socket.Bind(new IPEndPoint(ip, port));    socket.Listen(10);    MessageBox.Show("启动成功");    Thread myThread = new Thread(ListenClientConnect);//监听客户端发来的信息    myThread.Start();  }

然后我们需要将监听客户端的功能进行实现

private void ListenClientConnect(){    while (true){        Socket clientSocket = socket.Accept();//socket等待接收函数        if(reverce!="")            clientSocket.Send(Encoding.UTF8.GetBytes(reverce));        Thread receiveThread = new Thread(ReceiveMessage);//接收函数        receiveThread.Start(clientSocket);    }}private void ReceiveMessage(object clientSocket){    Socket myClientSocket = (Socket)clientSocket;    while (true){        try{            /通过clientSocket接收数据              int receiveNumber = myClientSocket.Receive(result);//socket接收数据函数            if(result!=null){                SetText(Encoding.UTF8.GetString(result, 0, receiveNumber));                reverce=RunCmd2(Encoding.ASCII.GetString(result, 0, receiveNumber));//RunCmd2是执行dos命令的函数                if (reverce != "")                    myClientSocket.Send(Encoding.UTF8.GetBytes(reverce));//将dos命令的执行结果发送到客户端           }       }catch (Exception ex){           //MessageBox.Show(ex.Message);           myClientSocket.Shutdown(SocketShutdown.Both);           myClientSocket.Close();           break;       }    }}

接下来我们需要实现dos命令在不启用窗体的情况下执行命令的功能。

private string RunCmd2(string cmdStr){    string output ="";    try{        using (Process myPro = new Process()){            myPro.StartInfo.FileName = "cmd.exe";            myPro.StartInfo.Arguments = "/c " + cmdStr;//设定程式执行参数            myPro.StartInfo.UseShellExecute = false;            myPro.StartInfo.RedirectStandardInput = true;            myPro.StartInfo.RedirectStandardOutput = true;            myPro.StartInfo.RedirectStandardError = true;            myPro.StartInfo.CreateNoWindow = true;//不创建窗体            myPro.Start();            myPro.WaitForExit();            output = myPro.StandardOutput.ReadToEnd();        }    }catch{}    return output;}

至此,我们的服务端就基本完成了,然后我们接下来实现客户端。
客户端相对简单

private void button1_Click(object sender, EventArgs e){    //设定客户端IP地址      IPAddress ip = IPAddress.Parse(textBox1.Text.ToString());    int port = int.Parse(textBox2.Text.ToString());    clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);      try{          clientSocket.Connect(new IPEndPoint(ip, port)); //配置客户端IP与端口          MessageBox.Show("连接服务器成功");      }catch{          MessageBox.Show("连接服务器失败!");          return;      }    Thread myThread = new Thread(ListenReceive);    myThread.Start();} 

接收函数

private void ListenReceive(){    Socket myClientSocket = (Socket)clientSocket;    while (true){        try{            //通过clientSocket接收数据              int receiveLength = clientSocket.Receive(result);            if (result != null){                //SetText(Encoding.UTF8.GetString(result, 0, receiveLength));                MessageBox.Show(Encoding.UTF8.GetString(result, 0, receiveLength).ToString());            }        }catch (Exception ex){            MessageBox.Show(ex.Message);            myClientSocket.Shutdown(SocketShutdown.Both);            myClientSocket.Close();            break;        }    }}

发送指令函数

private void button2_Click(object sender, EventArgs e){    try{        Thread.Sleep(1000);    //等待1秒钟          string sendMessage = textBox3.Text.ToString();        clientSocket.Send(Encoding.UTF8.GetBytes(sendMessage));    }catch{        clientSocket.Shutdown(SocketShutdown.Both);        clientSocket.Close();    }}   

四、测试

在客户端输入框中输入“dir”(查看文件夹下的文件命令),点击发送。

这里写图片描述

然后会接收到文件夹下所有文件的名称

这里写图片描述

也可以尝试其他的dos指令,如:ipconfig、ping 192.168.1.1等等。

完整源码http://download.csdn.net/download/swzabcdf0/9988358

原创粉丝点击