SVCHOST启动服务实战
本文转载自:https://blog.csdn.net/huanglong8/article/details/70666987
转载出处:
https://sanwen8.cn/p/2cenbHs.html
最近在做小项目,用到了一些此类技术,觉得文章很细,手把手教的,粘在这里备忘下。。。望原作者海涵。
svchost.exe是一个属于微软Windows操作系统的系统程序,微软官方对它的解释是:Svchost.exe 是从动态链接库 (DLL) 中运行的服务的通用主机进程名称。这个程序对系统的正常运行是非常重要。又因为svchost进程用来启动各种服务,所以病毒、木马也想尽办法来利用它,企图利用它的特性来迷惑用户,达到感染、入侵、破坏的目的(如冲击波变种病毒“w32.welchia.worm”)。下面我们来用手动修改注册表并编写我们自己的测试dll来实例解析运用svchost.exe的过程。
测试所用的操作系统环境: Windows XP
测试所用的编程环境: VS2010和VC++6.0都可以
一、首先我们来手动在注册表注册一个服务
开始->运行 输入regedit 找到如下子健
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
1. 在Services子健下新建一个子健TestSvchost。
2. 在子健TestSvchost新建所需子健项,子健项说明如下:
(1) Description 服务描述
(2) DisplayName 服务显示名
(3) ErrorControl 当该启动服务失败时产生错误的严重程度以及采取的保护措施 这里我们填 1 表示服务启动程序将把该错误记录到事件日志中并返回继续执行
(4) ImagePath 程序的路径 我们要启动的是svchost.exe所以填入
%systemRoot%\system32\svchost.exe -k netsvcs-k netsvcs表示这个服务是属于netsvcs服务组
(5) ObjectName 指定服务帐号 LocalSystem表示本地登录
(6)Start 服务启动选项
填入2表示系统启动时由服务控制管理器自动启动该服务程序
(7)Type 服务类型
填入0x10表示运行于独立进程的服务程序
3. 在子健TestSvchost下再建一个子健Parameters。
4. 在子健Parameters新建子健项ServiceDll
ServiceDll表示服务所对应dll所在的全路径
二、将我们在注册表写入服务加入Svchost的服务组netsvcs中
1.找到注册表子健HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost 并打开子健项netsvcs。netsvcs里面的值就是svchost的服务组netsvcs所启动的所有服务
2.打开netsvcs键值项 添加数值数据TestSvchost(服务名)
我们打开PCHunter可以看到该服务的相关情况:
可看到这个时候该服务已经注册,但由于缺少Dll文件,服务是无法启动的
三 编写正确的Dll文件
Svchost每次启动一个服务时,SCM都会调用Dll导出的ServiceMain函数来启动服务,这就需要在ServiceMain函数里调用RegisterServiceCtrlHandler来注册相应的控制请求的函数。我们打开vs新建一个动态dll工程写入下面代码并编译成Dll文件:
#include "stdafx.h"
#include <stdlib.h>
DWORD g_dwServiceType;
SERVICE_STATUS_HANDLE g_hServiceStatus;
DWORD g_dwCurrState;
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
int TellSCM(DWORD dwState, DWORD dwExitCode, DWORD dwProgress)
{
SERVICE_STATUS srvStatus;
srvStatus.dwServiceType = SERVICE_WIN32_SHARE_PROCESS;
srvStatus.dwCurrentState = g_dwCurrState = dwState;
srvStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
srvStatus.dwWin32ExitCode = dwExitCode;
srvStatus.dwServiceSpecificExitCode = 0;
srvStatus.dwCheckPoint = dwProgress;
srvStatus.dwWaitHint = 1000;
return SetServiceStatus(g_hServiceStatus, &srvStatus);
}
void __stdcall ServiceHandler(DWORD dwControl)
{
switch (dwControl)
{
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(g_dwCurrState, 0, 0);
break;
}
}
extern "C" __declspec(dllexport) void ServiceMain(int argc, wchar_t* argv[])
{
char szSvcName[MAX_PATH];
wcstombs(szSvcName, argv[0], sizeof szSvcName);
// 注册一个服务控制程序
g_hServiceStatus = RegisterServiceCtrlHandler(szSvcName, (LPHANDLER_FUNCTION)ServiceHandler);
if (g_hServiceStatus == NULL)
{
return;
} else FreeConsole();
TellSCM(SERVICE_START_PENDING, 0, 1); // 通知服务控制管理器该服务开始
TellSCM(SERVICE_RUNNING, 0, 0); // 通知服务控制管理器该服务运行
// 在D盘创建一个txt创建并写入服务名作为测试
HANDLE hFile = CreateFile("D:\\TestSvchost.txt", GENERIC_WRITE,FILE_SHARE_WRITE | FILE_SHARE_READ,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
DWORD nTemp = 0;
WriteFile(hFile, szSvcName, strlen(szSvcName), &nTemp, NULL);
CloseHandle(hFile);
}
do {
Sleep(100);
} while (g_dwCurrState != SERVICE_STOP_PENDING && g_dwCurrState != SERVICE_STOPPED);
return;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
四 将Dll放入合适的位置并重启
将TestSvchostDll.dll放入C:\WINDOWS\system32目录下并重启电脑。重启后,点击开始->运行 输入services.msc 可以查看到该服务处于已启动状态。
打开D盘,可以看到我们在dll中创建的文件和写入的服务名
至此,文章就结尾了,可以查看原文地址 有百度云盘,我是没去下啦。你们可以看看,贵在理解与实践。
再次感谢作者分享这么优质的文章。
SVCHOST启动服务实战的更多相关文章
- springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin
相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展.会提供一个小案例: 服务提供者和服务消费者 ,消费者会调用提供者的服务,新 ...
- springcloud微服务实战:Eureka+Zuul+Ribbon+Hystrix+SpringConfig
原文地址:http://blog.csdn.net/yp090416/article/details/78017552 springcloud微服务实战:Eureka+Zuul+Ribbon+Hyst ...
- Netty源码剖析-启动服务
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! --1主线分两步: 一:首先在our thread里,如果写在mai ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_3-06 服务注册和发现之Eureka Client搭建商品服务实战
笔记 6.服务注册和发现之Eureka Client搭建商品服务实战 简介:搭建用商品服务,并将服务注册到注册中心 1.创建一个SpirngBoot应用,增加服务注册和发现依赖 2.模 ...
- SSH远程管理服务实战
目录 SSH远程管理服务实战 1.SSH基本概述 2.SSH相关命令 3.Xshell连接不上虚拟机 4.scp命令 5.sftp命令 6.SSH验证方式 7.SSH场景实践 8.SH安全优化 9.交 ...
- Rsync备份服务实战
目录 Rsync备份服务实战 一.Rsync 二.rsync的应用场景 1.Rync的数据同步模式 2.rsync的三种模式 三.rsync配置服务端客户端 四.rsync实战 实战一 报错解决方法: ...
- 【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发
<ASP.NET Core 微服务实战>译者序:https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-tr ...
- Go+gRPC-Gateway(V2) 微服务实战,小程序登录鉴权服务(五):鉴权 gRPC-Interceptor 拦截器实战
拦截器(gRPC-Interceptor)类似于 Gin 中间件(Middleware),让你在真正调用 RPC 服务前,进行身份认证.参数校验.限流等通用操作. 系列 云原生 API 网关,gRPC ...
- git克隆项目到本地&&全局安装依赖项目&&安装依赖包&&启动服务
一.安装本地开发环境 1.安装本项目 在需要保存到本地的项目的文件夹,进入到文件夹里点击右键,bash here,出现下图: 2.安装依赖项目 3.安装依赖包(进入到命令行) # 安装依赖包 $ ...
随机推荐
- js浅拷贝(地址引用)和深拷贝(克隆)
浅拷贝和深拷贝相对于引用类型而言的. js有两大类型值类型(基本数据类型)和引用类型(object,function,array): 值类型保存在栈上,引用类型保存在堆上. 浅拷贝只是单纯的拷贝对象的 ...
- js mysql 时间日期比较
js代码 1 var date1 = '2017/2/13'; 2 //var date1 = new Date().toLocaleDateString(); 3 var date2 = '2017 ...
- pytorch(07)数据模型的读取
DataLoader与Dataset pytorch中的数据读取机制 graph TB DataLoader --> DataLoaderIter DataLoaderIter --> S ...
- malloc和free解析
malloc和free都是库函数,调用系统函数sbrk()来分配内存.除了分配可使用的内存以外,还分配了"控制"信息,这有点像内存池常用的手段.并且,分配的内存是连续的. 1. m ...
- java IO流文件拷贝文件(字符流标准写法)
public static void copyFile2(String path1, String path2) { Reader reader = null; Writer writer = nul ...
- socket 之send和recv原理剖析
认识TCP socket的发送缓冲区和接收缓冲区 当创建一个TCP socket对象的时候会有一个发送缓冲区和一个接收缓冲区,相当与内存中的一片空间 send原理剖析 send是不是直接把数据发送给服 ...
- C# 获取Word文本高亮和背景(附vb.net代码)
Word中的文本高亮和背景是通过不同方法来设置的.文本高亮(Text Highlight Color)是通过[字体]中的快速工具栏设置:文本背景(Text Background/Shading)是通过 ...
- 模拟实现AMD模块化规范
目录 引子 再谈什么是闭包(闭包的产生)? 词法作用域 回到闭包 利用闭包编写模块 实现AMD模块化规范 写在最后 引子 本文最后的目的是模拟实现AMD模块化规范,而写下本文的原因是今天阅读到了< ...
- Elasticsearch优化 & filebeat配置文件优化 & logstash格式配置 & grok实践
Elasticsearch优化 & filebeat配置文件优化 & logstash格式配置 & grok实践 编码转换问题(主要就是中文乱码) (1)input 中的cod ...
- [Azure Devops] 使用 Azure Pipelines 实现 CI
1. 什么是 Azure Pipelines Azure Pipelines 会自动构建和测试代码项目,以将其提供给其他人.它适用于任何语言或项目类型.Azure Pipelines 结合了持续集成 ...