利用Socket实现远程DOS控制

1 篇文章 0 订阅

利用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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值