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.安装依赖包(进入到命令行) # 安装依赖包 $ ...
随机推荐
- pytorch(15)损失函数
损失函数 1. 损失函数概念 损失函数:衡量模型输出与真实标签的差异 \[损失函数(Loss Function): Loss = f(\hat y,y) \] \[代价函数(Cost Function ...
- 理解函数式编程中的函数组合--Monoids(二)
使用函数式语言来建立领域模型--类型组合 理解函数式编程语言中的组合--前言(一) 理解函数式编程中的函数组合--Monoids(二) 继上篇文章引出<范畴论>之后,我准备通过几篇文章,来 ...
- 安全计算环境之剩余信息保护-windows
参考https://blog.csdn.net/ubjewen/article/details/107587951 应保证鉴别信息所在的存储空间被释放或重新分配前得到完全清除 交互式登录: 之前登录到 ...
- JVM之调优及常见场景分析
JVM调优 GC调优是最后要做的工作,GC调优的目的可以总结为下面两点: 减少对象晋升到老年代的数量 减少FullGC的执行时间 通过监控排查问题及验证优化结果,可以分为: 命令监控:jps.jinf ...
- Python 随笔2-0319
一 数据类型 1.整型-int 类型 存年龄.工资.成绩等这样的数据类型可以用int类型 2.浮点型-小数类型(float),带小数点的 3.布尔类型-非真即假 只有这二种:True和Flase, ...
- 浅析MyBatis(四):全自动写代码的MyBatis逆向工程
在前面几篇文章中,笔者介绍了 MyBatis 的运行流程,在此基础上简单介绍了手写 MyBatis 简易框架与自定义 MyBatis 插件的步骤,相信大家对于 MyBatis 框架的使用流程已经游刃有 ...
- 封装一个postMessage库,进行iframe跨域交互
这是近期个人在开发chrome插件时的其中一个小总结.还有很多没有总结出来.因为目前插件还在迭代中,(herry菌插件,用于B站C站),属于个人业余的一个小项目.还有很多功能没有实现,以及还需要再看能 ...
- JAVA题目:小芳的妈妈每天给她2.5元,她都会存起来,但是,每当这一天是存钱的第五题或者5的倍数的话,她都会去用掉6块钱。 问:至少经过多少天可以存到100块?
1 /*题目:小芳的妈妈每天给她2.5元,她都会存起来, 2 但是,每当这一天是存钱的第五题或者5的倍数的话, 3 她都会去用掉6块钱. 4 问:至少经过多少天可以存到100块? 5 */ 6 /*分 ...
- 开源一个比雪花算法更好用的ID生成算法(雪花漂移)
比雪花算法更好用的ID生成算法(单机或分布式唯一ID) 转载及版权声明 本人从未在博客园之外的网站,发表过本算法长文,其它网站所现文章,均属他人拷贝之作. 所有拷贝之作,均须保留项目开源链接,否则禁止 ...
- 手机浏览器通过Scheme跳转APP,兼容各种手机浏览器
一个比较完整的产品线,必定有APP和网站,另外还有微信公众号网页和小程序.那么有一个比较常见的需求就是在手机浏览器内打开APP,实现起来也比较简单,只要APP配置的有URLScheme即可. 但是因为 ...