本文转载自: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启动服务实战的更多相关文章

  1. springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin

    相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展.会提供一个小案例: 服务提供者和服务消费者 ,消费者会调用提供者的服务,新 ...

  2. springcloud微服务实战:Eureka+Zuul+Ribbon+Hystrix+SpringConfig

    原文地址:http://blog.csdn.net/yp090416/article/details/78017552 springcloud微服务实战:Eureka+Zuul+Ribbon+Hyst ...

  3. Netty源码剖析-启动服务

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! --1主线分两步: 一:首先在our thread里,如果写在mai ...

  4. 小D课堂 - 新版本微服务springcloud+Docker教程_3-06 服务注册和发现之Eureka Client搭建商品服务实战

    笔记 6.服务注册和发现之Eureka Client搭建商品服务实战     简介:搭建用商品服务,并将服务注册到注册中心 1.创建一个SpirngBoot应用,增加服务注册和发现依赖     2.模 ...

  5. SSH远程管理服务实战

    目录 SSH远程管理服务实战 1.SSH基本概述 2.SSH相关命令 3.Xshell连接不上虚拟机 4.scp命令 5.sftp命令 6.SSH验证方式 7.SSH场景实践 8.SH安全优化 9.交 ...

  6. Rsync备份服务实战

    目录 Rsync备份服务实战 一.Rsync 二.rsync的应用场景 1.Rync的数据同步模式 2.rsync的三种模式 三.rsync配置服务端客户端 四.rsync实战 实战一 报错解决方法: ...

  7. 【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发

    <ASP.NET Core 微服务实战>译者序:https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-tr ...

  8. Go+gRPC-Gateway(V2) 微服务实战,小程序登录鉴权服务(五):鉴权 gRPC-Interceptor 拦截器实战

    拦截器(gRPC-Interceptor)类似于 Gin 中间件(Middleware),让你在真正调用 RPC 服务前,进行身份认证.参数校验.限流等通用操作. 系列 云原生 API 网关,gRPC ...

  9. git克隆项目到本地&&全局安装依赖项目&&安装依赖包&&启动服务

     一.安装本地开发环境 1.安装本项目 在需要保存到本地的项目的文件夹,进入到文件夹里点击右键,bash here,出现下图: 2.安装依赖项目  3.安装依赖包(进入到命令行) # 安装依赖包 $ ...

随机推荐

  1. 【HTB系列】 靶机Swagshop的渗透测试详解

    出品|MS08067实验室(www.ms08067.com) 本文作者:是大方子(Ms08067实验室核心成员) 总结与反思 使用vi提权 magento漏洞的利用 magescan 工具的使用 靶机 ...

  2. nignx的location正则匹配

    原文链接:http://nginx.org/en/docs/http/ngx_http_core_module.html Syntax: location [ = | ~ | ~* | ^~ ] ur ...

  3. AJAX 加载效果(遮盖层)

    //创建遮罩层函数体 function createMask(){ var node=document.createElement('div'); node.setAttribute('id','ba ...

  4. uwsgi+nginx+virtualenv+supervisor

    一.linux安装Python 1.依赖 `yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl ...

  5. 什么是ETL?

    一.ETL概念之背景 随着企业的发展,目前的业务线越来越复杂,各个业务系统独立运营.例如:CRM系统只会生产CRM的 数据:Billing只会生产Billing的数据.各业务系统之间只关心自己的数据, ...

  6. k8s 日志收集之 EFK

    如今越来越多的应用部署在容器之中,如何收集日志也是一个很重要的问题.服务出问题了,排查问题需要给开发看日志.服务一般会在多个不同的 pod 中,一个一个的登进去看也的确不方便.业务数据统计也需要日志. ...

  7. Codeforces Round #533 C. Ayoub and Lost Array

    题面: 传送门 题目描述: 题意很简单:1.数组中的所有整数都在区间[l, r],2.所有元素之和能被3整除.现在知道这个数组的大小,l和r,问:按照题目的要求组成的数组一共有多少种可能.   题目分 ...

  8. 使用 DD 命令制作 USB 启动盘

    Windows 下有很多很好用的 USB 启动盘制作工具,比如 Rufus,但是 MacOS 下这个类型的工具就少了很多,这里记录下在 MacOS 中用 DD 命令制作 Linux USB 启动盘的操 ...

  9. Elasticsearch 结构化搜索、keyword、Term查询

    前言 Elasticsearch 中的结构化搜索,即面向数值.日期.时间.布尔等类型数据的搜索,这些数据类型格式精确,通常使用基于词项的term精确匹配或者prefix前缀匹配.本文还将新版本的&qu ...

  10. 习题3_08循环小数(JAVA语言)

    package 第三章习题; import java.util.Arrays; import java.util.Scanner; /*  * 输入整数a和b(0<=a<=3000,1&l ...