不关注《一碳科技》?那么,你会错过很多编程教学哦!

教学又来啦

这篇文章是上一篇文章《一篇短文教会你!C语言远控木马:被控端制作,附送源码!》的补充,上一篇文章呢,我们给大家讲了C语言远控木马的“被控端”制作方法,而这篇文章呢,《一碳科技》会教大家制作C语言远控木马的“控制端”,并且这篇文章将上一篇文章的“被控端”代码进行重新整理,以便大家能够直观的看到代码的实现过程。

制作控制端其实不难,《一碳科技》发布过的文章《5分钟学会scoket编程!使用SMTP协议发邮件:附送源码+教学!》中就曾教大家如何使用socket通过smtp协议发送邮件,对比之下,控制端就相当于“smtp服务器”,被控端相当于给我们发送“邮件”的用户。

第一步

首先和往常一样,引用我们需要的头文件,这里我们需要4个头文件:stdio.h、string.h、WinSock2.h、windows.h,除此之外,我们还要加入ws2_32.lib链接库。

在这个程序里,我们需要三个函数,他们分别要实现:接受客户端连接、返回客户端数据、绑定本地端口并开始监听的功能,小编分别给他们取名为:accept_client()、recv_updata()、bind_server(),这里可能有人会有一文:“recv()不是可以接收客户端数据吗?为什么还要重新构造一个recv_updata()函数呢?”,别急,下面会讲到。除此之外,我们还要申请一个存放客户端返回数据的变量——char word[BUFSIZ]。

第一步源码

第二步

​我们现在要开始分别构造我们需要的函数了,首先从bind_server()(绑定本地端口并开始监听的功能)开始,这个函数跟往常一样:初始化、创建套接字、服务器信息存入、将套接字与本地端口绑定(这点与之前不同)、开始监听。这里我们讲一下“服务器信息存入”所要用到的两个函数:inet_addr()、htons()。

inet_addr()的作用是将点分十进制转换成长整型,什么是点分十进制?IP地址是由四字节的十进制数表示的,每字节的十进制数表示范围为0~255,所以,我们平常看到的IP地址的格式都是:255.255.255.255,而这种格式就叫做点分十进制。那么为什么要将这个点分十进制转换成长整型,而不是其他数据类型呢?我们来看一下server_addr结构体中的S_addr成员,这个成员的数据类型为ULONG,而我们的IP地址信息就存放在S_addr成员中,调用inet_addr()函数的原因就是在这里。

htons()在这里的作用是,将主机字节序转换成网络字节序,一般来说网络字节序(大部分)都是指大端传输,目前,使用小端储存方式的CPU有Intel x86、ARM,而小编所使用的计算机CPU是intel的,所以这里要用htonl()函数,把主机字节序的“小端”转换成网络字节序的“大端”。

什么大端、小端?

“大端”、“小端”指的是计算机存放数据的方式。大端指的是:将高位字节储存在内存的低地址,而小端指的是,将高位字节储存在内存的高地址,如果看不明白这里,建议大家去看一下:计算机内存顺序、高字节与低字节。

inet_addr()函数与htons()函数,是这里比较容易“迷糊”的地方,剩下的函数就不多讲了,因为它们在《一碳科技》之前的文章就曾讲解过。

到这里,bind_server()函数就写好了,接下来给大家讲一下recv_updata(),这里为什么要重新写一个recv()函数呢?因为recv()函数接收的数据,要经过处理才能使用printf()函数打印出来,否则printf()函数打印出来的数据将不是我们想要的数据,例如它会打印出:“烫烫烫烫烫烫烫烫烫烫烫”。

而我们这里用strnest()函数对word变量(第一步声明的变量)进行“加工”,将word数组成员全部用“\0”代替(相当于初始化),然后recv()开始接收客户端数据,word数组的“\0”就会按顺序替换成客户端数据,而printf()函数读取到“\0”就会停止打印。

原先申请的word数组并没有初始化,所以里面会自动填充0xCCCC↓

运行结果

第三步

第三步是制作accept_client()函数,这一步没有特别难理解的地方,这里就不多讲了,各位看官根据源代码进行理解就可以了。

这是程序运行结果

先开启控制端,然后开启客户端,客户端连接控制端,控制端显示客户端IP地址,之后控制端就可以向客户端发送CMD命令,图中,小编使用write命令打开了客户端的写字板。

查看原文 >>
相关文章