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