创建SvcHost.exe调用的服务原理与实践(2)

创建傀儡进程svchost.exe并注入DLL文件(Shellcode) 本文主要利用 SetThreadContext 修改进程中的线程上下文来实现Dll注入(ShellCode)。 阅读详情
8. 代码

// SvcHostDLL.cpp : Demo for a service dll used by svchost.exe to host it.
//
// for detail comment see articles.
// by bingle_at_email.com.cn
//  www.BingleSite.net
//
/* save following as a .def file to export function, only ServiceMain is needed.
other used to install & uninstall service.
or use /EXPORT: link option to export them.
EXPORTS
 ServiceMain
 InstallService
 UninstallService
 RundllUninstallA
 RundllInstallA
*/
/*
To compile & link:
cl /MD /GX /LD svchostdll.cpp /link
advapi32.lib /DLL /base:0x71000000 /export:ServiceMain
/EXPORT:RundllUninstallA /EXPORT:RundllInstallA
/EXPORT:InstallService /EXPORT:UninstallService
*/
//
// Articles:
// 1. HOWTO Create a service dll used by svchost.exe by bingle, at: http://www.BingleSite.net/article/svchost-dll-service.html
// 2. Inside Win32 Services, Part 2 by: Mark Russinovich, at: http://www.winnetmag.com/Articles/Index.cfm?ArticleID=8943&pg=3
// 3. Platform SDK: Tools - Rundll32, at: http://msdn.microsoft.com/library/en-us/tools/tools/rundll32.asp
#include <stdio.h>
#include <time.h>
#include <assert.h>
#include <windows.h>
#define DEFAULT_SERVICE "IPRIP"
#define MY_EXECUTE_NAME "SvcHostDLL.exe"
//main service process function void __stdcall ServiceMain( int argc, wchar_t* argv[] );
//report service stat to the service control manager int TellSCM( DWORD dwState, DWORD dwExitCode, DWORD dwProgress );
//service control handler, call back by service control manager void __stdcall ServiceHandler( DWORD dwCommand );
//RealService just create a process int RealService(char *cmd, int bInteract);
//Install this dll as a Service host by svchost.exe, service name is given by caller int InstallService(char *name);
//unInstall a Service, be CARE FOR call this to delete a service int UninstallService(char *name);
//Install this dll as a Service host by svchost.exe, used by RUNDLL32.EXE to call void CALLBACK RundllInstallA(HWND hwnd, HINSTANCE hinst, char *param, int nCmdShow);
//unInstall a Service used by RUNDLL32.EXE to call, be CARE FOR call this to delete a service void CALLBACK RundllUninstallA(HWND hwnd, HINSTANCE hinst, char *param, int nCmdShow);
//output the debug infor into log file(or stderr if a console program call me) & DbgPrint void OutputString( char *lpFmt, ... );
//dll module handle used to get dll path in InstallService HANDLE hDll = NULL;
//Service HANDLE & STATUS used to get service state SERVICE_STATUS_HANDLE hSrv;
DWORD dwCurrState;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
  )
{
 switch (ul_reason_for_call)
 {
 case DLL_PROCESS_ATTACH:
hDll = hModule;
#ifdef _DEBUG
AllocConsole();
OutputString("SvcHostDLL: DllMain called DLL_PROCESS_ATTACH");
break;
 case DLL_THREAD_ATTACH:
OutputString("SvcHostDLL: DllMain called DLL_THREAD_ATTACH");
 case DLL_THREAD_DETACH:
OutputString("SvcHostDLL: DllMain called DLL_THREAD_DETACH");
 case DLL_PROCESS_DETACH:
TellSCM( SERVICE_STOP_PENDING, 0, 0 );
Sleep(1500);
TellSCM( SERVICE_STOPPED, 0, 0 );
OutputString("SvcHostDLL: DllMain called DLL_PROCESS_DETACH");
#endif
break;
 }
 return TRUE;
}
void __stdcall ServiceMain( int argc, wchar_t* argv[] )
{
// DebugBreak();
 char svcname[256];
 strncpy(svcname, (char*)argv[0], sizeof svcname); //it's should be unicode, but if it's ansi we do it well
 wcstombs(svcname, argv[0], sizeof svcname);
 OutputString("SvcHostDLL: ServiceMain(%d, %s) called", argc, svcname);
 hSrv = RegisterServiceCtrlHandler( svcname, (LPHANDLER_FUNCTION)ServiceHandler );
 if( hSrv == NULL )
 {
OutputString("SvcHostDLL: RegisterServiceCtrlHandler %S failed", argv[0]);
return;
 }else FreeConsole();
 TellSCM( SERVICE_START_PENDING, 0, 1 );
 TellSCM( SERVICE_RUNNING, 0, 0 );
 // call Real Service function noew
 if(argc > 1)
strncpy(svcname, (char*)argv[1], sizeof svcname),
wcstombs(svcname, argv[1], sizeof svcname);
 RealService(argc > 1 ? svcname : MY_EXECUTE_NAME, argc > 2 ? 1 : 0);
 do{
Sleep(10);//not quit until receive stop command, otherwise the service will stop
 }while(dwCurrState != SERVICE_STOP_PENDING && dwCurrState != SERVICE_STOPPED);
 OutputString("SvcHostDLL: ServiceMain done");
 return;
}
int TellSCM( DWORD dwState, DWORD dwExitCode, DWORD dwProgress )
{
 SERVICE_STATUS srvStatus;
 srvStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
 srvStatus.dwCurrentState = dwCurrState = dwState;
 srvStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_SHUTDOWN;
 srvStatus.dwWin32ExitCode = dwExitCode;
 srvStatus.dwServiceSpecificExitCode = 0;
 srvStatus.dwCheckPoint = dwProgress;
 srvStatus.dwWaitHint = 3000;
 return SetServiceStatus( hSrv, &srvStatus );
}
void __stdcall ServiceHandler( DWORD dwCommand )
{
 // not really necessary because the service stops quickly
 switch( dwCommand )
 {
 case SERVICE_CONTROL_STOP:
TellSCM( SERVICE_STOP_PENDING, 0, 1 );
OutputString("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_STOP");
Sleep(10);
TellSCM( SERVICE_STOPPED, 0, 0 );
break;
 case SERVICE_CONTROL_PAUSE:
TellSCM( SERVICE_PAUSE_PENDING, 0, 1 );
OutputString("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_PAUSE");
TellSCM( SERVICE_PAUSED, 0, 0 );
break;
 case SERVICE_CONTROL_CONTINUE:
TellSCM( SERVICE_CONTINUE_PENDING, 0, 1 );
OutputString("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_CONTINUE");
TellSCM( SERVICE_RUNNING, 0, 0 );
break;
 case SERVICE_CONTROL_INTERROGATE:
OutputString("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_INTERROGATE");
TellSCM( dwCurrState, 0, 0 );
break;
 case SERVICE_CONTROL_SHUTDOWN:
OutputString("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_SHUTDOWN");
TellSCM( SERVICE_STOPPED, 0, 0 );
break;
 }
}
//RealService just create a process
int RealService(char *cmd, int bInteract)
{
 OutputString("SvcHostDLL: RealService called '%s' %s", cmd, bInteract ? "Interact" : "");
 STARTUPINFO si = {0};
 PROCESS_INFORMATION pi;
 si.cb = sizeof si;
 if(bInteract) si.lpDesktop = "WinSta0\\Default";
 if(!CreateProcess(NULL, cmd, NULL, NULL, false, 0, NULL, NULL, &si, &pi))
OutputString("SvcHostDLL: CreateProcess(%s) error:%d", cmd, GetLastError());
 else OutputString("SvcHostDLL: CreateProcess(%s) to %d", cmd, pi.dwProcessId);
 return 0;
}
int InstallService(char *name)
{
 // Open a handle to the SC Manager database.
 int rc = 0;
 HKEY hkRoot = HKEY_LOCAL_MACHINE, hkParam = 0;
 SC_HANDLE hscm = NULL, schService = NULL;
 try{
 char buff[500];
 char *svcname = DEFAULT_SERVICE;
 if(name && name[0]) svcname = name;
 //query svchost setting
 char *ptr, *pSvchost = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost";
 rc = RegOpenKeyEx(hkRoot, pSvchost, 0, KEY_QUERY_VALUE, &hkRoot);
 if(ERROR_SUCCESS != rc)
 {
OutputString("RegOpenKeyEx(%s) KEY_QUERY_VALUE error %d.", pSvchost, rc);
throw "";
 }
 DWORD type, size = sizeof buff;
 rc = RegQueryValueEx(hkRoot, "netsvcs", 0, &type, (unsigned char*)buff, &size);
 RegCloseKey(hkRoot);
 SetLastError(rc);
 if(ERROR_SUCCESS != rc)
throw "RegQueryValueEx(Svchost\\netsvcs)";
 for(ptr = buff; *ptr; ptr = strchr(ptr, 0)+1)
if(stricmp(ptr, svcname) == 0) break;
 if(*ptr == 0)
 {
OutputString("you specify service name not in Svchost\\netsvcs, must be one of following:");
for(ptr = buff; *ptr; ptr = strchr(ptr, 0)+1)
 OutputString(" - %s", ptr);
throw "";
 }
 //install service
 hscm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
 if (hscm == NULL)
throw "OpenSCManager()";
 char *bin = "%SystemRoot%\\System32\\svchost.exe -k netsvcs";
 schService = CreateService(
hscm,// SCManager database
svcname, // name of service
NULL, // service name to display
SERVICE_ALL_ACCESS,// desired access
SERVICE_WIN32_SHARE_PROCESS, // service type
SERVICE_AUTO_START,  // start type
SERVICE_ERROR_NORMAL,  // error control type
bin,// service's binary
NULL,  // no load ordering group
NULL,  // no tag identifier
NULL,  // no dependencies
NULL,  // LocalSystem account
NULL);  // no password
 if (schService == NULL)
 {
OutputString("CreateService(%s) error %d", svcname, rc = GetLastError());
throw "";
 }
 OutputString("CreateService(%s) SUCCESS. Config it", svcname);
 CloseServiceHandle(schService);
 CloseServiceHandle(hscm);
 //config service
 hkRoot = HKEY_LOCAL_MACHINE;
 strncpy(buff, "SYSTEM\\CurrentControlSet\\Services\\", sizeof buff);
 strncat(buff, svcname, 100);
 rc = RegOpenKeyEx(hkRoot, buff, 0, KEY_ALL_ACCESS, &hkRoot);
 if(ERROR_SUCCESS != rc)
 {
OutputString("RegOpenKeyEx(%s) KEY_SET_VALUE error %d.", svcname, rc);
throw "";
 }
 rc = RegCreateKey(hkRoot, "Parameters", &hkParam);
 SetLastError(rc);
 if(ERROR_SUCCESS != rc)
throw "RegCreateKey(Parameters)";
 if(!GetModuleFileName(HMODULE(hDll), buff, sizeof buff))
throw "GetModuleFileName() get dll path";
 rc = RegSetValueEx(hkParam, "ServiceDll", 0, REG_EXPAND_SZ, (unsigned char*)buff, strlen(buff)+1);
 SetLastError(rc);
 if(ERROR_SUCCESS != rc)
throw "RegSetValueEx(ServiceDll)";
 OutputString("Config service %s ok.", svcname);
 }catch(char *str)
 {
if(str && str[0])
{
 rc = GetLastError();
 OutputString("%s error %d", str, rc);
}
 }
 RegCloseKey(hkRoot);
 RegCloseKey(hkParam);
 CloseServiceHandle(schService);
 CloseServiceHandle(hscm);
 return rc;
}
/*
used to install by rundll32.exe
Platform SDK: Tools - Rundll32
The Run DLL utility (Rundll32.exe) included in Windows enables you to call functions exported from a 32-bit DLL. These functions must have the following syntax:
*/
void CALLBACK RundllInstallA(
HWND hwnd,// handle to owner window
HINSTANCE hinst, // instance handle for the DLL
char *param,// string the DLL will parse
int nCmdShow  // show state
)
{
 InstallService(param);
}
int UninstallService(char *name)
{
 int rc = 0;
 SC_HANDLE schService;
 SC_HANDLE hscm;
 __try{
 hscm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
 if (hscm == NULL)
 {
OutputString("OpenSCManager() error %d", rc = GetLastError() );
return rc;
 }
 char *svcname = DEFAULT_SERVICE;
 if(name && name[0]) svcname = name;
 schService = OpenService(hscm, svcname, DELETE);
 if (schService == NULL)
 {
OutputString("OpenService(%s) error %d", svcname, rc = GetLastError() );
return rc;
 }
 if (!DeleteService(schService) )
 {
OutputString("OpenService(%s) error %d", svcname, rc = GetLastError() );
return rc;
 }
 OutputString("DeleteService(%s) SUCCESS.", svcname);
 }__except(1)
 {
OutputString("Exception Catched 0x%X", GetExceptionCode());
 }
 CloseServiceHandle(schService);
 CloseServiceHandle(hscm);
 return rc;
}
/*
used to uninstall by rundll32.exe
Platform SDK: Tools - Rundll32
The Run DLL utility (Rundll32.exe) included in Windows enables you to call functions exported from a 32-bit DLL. These functions must have the following syntax:
*/
void CALLBACK RundllUninstallA(
HWND hwnd,// handle to owner window
HINSTANCE hinst, // instance handle for the DLL
char *param,// string the DLL will parse
int nCmdShow  // show state
)
{
 UninstallService(param);
}
//output the debug infor into log file & DbgPrint
void OutputString( char *lpFmt, ... )
{
 char buff[1024];
 va_list arglist;
 va_start( arglist, lpFmt );
 _vsnprintf( buff, sizeof buff, lpFmt, arglist );
 va_end( arglist );
 DWORD len;
 HANDLE herr = GetStdHandle(STD_OUTPUT_HANDLE);
 if(herr != INVALID_HANDLE_VALUE)
 {
WriteFile(herr, buff, strlen(buff), &len, NULL);
WriteFile(herr, "\r\n", 2, &len, NULL);
 }else
 {
FILE *fp = fopen("SvcHost.DLL.log", "a");
if(fp)
{
 char date[20], time[20];
 fprintf(fp, "%s %s - %s\n", _strdate(date), _strtime(time), buff);
 if(!stderr) fclose(fp);
}
 }
 OutputDebugString(buff);
}

svchost服务dll源码 svchost 服务 dll 源码, dll写的服务,使用svchost机制调用 原理介绍。 立即下载

相关推荐

一个可以由SVCHost.exe服务调用的dll模块

替换由svchost.exe启动的某个系统服务,具体服务由全局变量 ServiceName 决定.

【转】VC中如何启动其它程序,并且获得启动程序的PID 创建进程CreateProcess函数

【转】VC中如何启动其它程序,并且获得启动程序的PID 创建进程CreateProcess函数 这样就可以执行c:\test.exe 如果你要的PID是进程ID那么这个 piProcInfoGPS.dwProcessId就是PID。 当一个线程调用CreateProcess时,系统就会创建一个进程内核对象,其初始使用计数是1。   该进程内核对象不是进程本身,而是操作系统管理

linshixina的专栏 2620

易语言svchost 服务安装代码, dll代码

本源码是一个完整的可被svchost.exe启动的DLL服务源码,同时包含了穿透Session0隔离来与桌面交互的源码(在Vista以上,如果你想在服务程序中创建窗体,目前是不可能直接显示到你的桌面的,而且在服务中是无法访问桌面任何窗口句柄的,因为服务和你使用的桌面不是同一个桌面,而是隔离开的)。

创建傀儡进程代码

相比传统的创建傀儡进程的方法,更简单粗暴一些,不用卸载目标进程空间内存。直接利用现有内存进行覆盖写入即可。 减少了一些步骤。 具体步骤: 1.挂起模式创建svchost.exe 2.获取进程入口点 3.将shellcode写到入口点 4.恢复线程执行 #include "stdafx.h" #include <windows.h> #include <Winternl.h>...

Sven的忘却日记 2169

从零搭建自动驾驶仿真环境:我的Nuplan-devkit实战笔记(含PyCharm配置技巧)

本文详细记录了从零搭建Nuplan-devkit自动驾驶仿真环境的完整流程,包括conda环境配置、pip版本控制、PyCharm专业版集成等关键步骤。特别针对Ubuntu系统下的依赖管理、数据目录优化和性能调优提供了实用技巧,帮助开发者高效构建稳定的自动驾驶仿真开发环境。

weixin_30505225的博客 480

WSL2部署Cadence Virtuoso IC25.1:Ubuntu 26.04排障实录

WSL2以轻量虚拟机结合完整Linux内核,为Windows桌面环境提供了原生级Linux运行能力,解决了传统虚拟机资源开销大、双系统切换低效的问题。对于依赖X11图形协议、FlexNet许可服务和特定动态库的EDA工具链而言,利用WSL2部署Linux发行版需要关注系统集成、显示通路与许可连通性。从技术原理看,图形层X Server的配置、动态库依赖的补齐以及license服务的主机名解析,共同构成EDA工具在WSL2中稳定运行的关键环节。在芯片设计场景中,设计工程师常需在Windows办公机与Linux

weixin_29597551的博客 211

创建SvcHost.exe调用的服务原理与实践

创建SvcHost.exe调用的服务原理与实践创建时间:2003-08-27 更新时间:2003-08-27文章属性:原创文章提交:bingle (bingle_at_email.com.cn)创建SvcHost.exe调用的服务原理与实践   by bingle_at_email.com.cn      www.BingleSite.net1. 多个服务共享一个Svchost.exe进程利与弊w

endword的专栏 1045

鸿蒙进阶——HDI及IDL硬件接口IPC框架小结

HDI(Hardware Device Interface):OpenHarmony硬件设备接口,定义系统中跨进程通信的接口,实现服务间的跨进程通信

最美不过,心中有梦,身旁有你! 3905

创建SvcHost.exe调用的服务原理与实践 (引用)

 创建SvcHost.exe调用的服务原理与实践    by bingle_at_email.com.cn       www.BingleSite.net作者:bingl      1. 多个服务共享一个Svchost.exe进程利与弊    windows 系统服务分为独立进程和共享进程两种,在windows NT时只有服务器管理器SCM(Services.exe)有多个共享服务,随着系统内置

minierp.cn 1704

运动想象 (MI) 分类学习系列 (19) : EEG-TransNet

本文提出了一种基于注意力机制的卷积神经网络(EEG-TransNet),用于运动想象脑电图(MI-EEG)解码。该方法创新性地通过平均池化和方差池化提取多模态时间信息,并结合自注意力模块捕获长期依赖关系。消融实验表明,方差池化比最大池化更有效(p<0.05),且注意力模块和卷积编码器对特征判别性至关重要。可视化分析验证了该方法能学习到更具判别性的紧凑特征。该工作为MI-EEG解码提供了新的多尺度时间信息融合视角,代码已开源。

走在深度学习前沿的小宋 358

独家改进|基于YOLO26的轻量级检测网络:参数量减半,精度不降反升

不要全层替换深度可分离卷积:P5深层对语义特征要求高,用标准卷积效果更好,只在P2、P3浅层用DWConv性价比最高注意力不是越多越好:每个阶段加一个就够,加在模块输出端,不要插在模块中间,否则部署容易出现算子不兼容问题轻量模型训练别贪快:初始学习率一定要调低,不然很容易前期震荡,后期收敛不上,精度卡在瓶颈小目标场景优先保留P2分支:如果对速度要求不是极致,保留P2检测头,小目标收益远大于速度损失。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 222

创建SvcHost.exe调用的服务原理与实践收藏

function StorePage(){d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(keyit=window.open(http://www.365key.com/storei

testalllife的专栏 992

从零到一构建一个智能爬虫 Agent 完整教程

本文将打造一个具备自主决策、动态解析、反反爬、持久化能力的智能爬虫 Agent

数据知道的博客 4798

svchost与服务进程共享

svchost与服务进程共享

Han的小站 1721

调整开关频率处理传导骚扰超标的系统方法

针对某产品在传导骚扰测试中660kHz频点超标问题,分析发现与DC-DC模块开关频率直接相关。通过调整模块开关频率至500kHz,使其避开标准限值严苛频段(0.53-1.8MHz),在不改变硬件设计的情况下实现测试通过。该案例表明,利用EMC标准的频率特性进行"频谱设计"比传统滤波手段更高效,建议在多模块系统中采用1:2:4等频率规划策略,从源头降低噪声耦合风险。这一频率迁移思路为EMC优化提供了新范式。

硬核科技 333

CloudCompare 二次开发(41)——点云重建三维凸包并计算体积

本文介绍了如何结合PCL与CloudCompare实现点云三维凸包的构建与可视化。通过代码集成,在CloudCompare界面添加功能按钮,实现点云数据转换、凸包构建、体积计算以及可视化显示。具体步骤包括:1) 在UI中添加功能按钮;2) 将点云数据转换为PCL格式;3) 使用PCL的ConvexHull算法构建三维凸包;4) 计算并显示凸包体积;5) 将结果以点云和网格形式可视化显示。最终实现了点云凸包的自动构建与体积计算功能,为点云处理提供了实用工具。

点云侠的博客 193

那是什么进程 —— svchost.exe是什么? 它为何运行?

        你几乎毫不犹豫的来阅读这篇文章是因为你也觉得奇怪, 究竟为什么那里有一打正在运行的进程都叫做 svchost.exe. 你不能终止它们运行, 你也不记得什么时候开始运行它们的...那么它们究竟是什么呢?         我们写了一系列的文章用来解释在任务管理器里发现的各种进程, 这篇文章是其中的一个部分, 这个系列包括: jusched.exe, dwm.exe, ctfm...

weixin_34367257的博客 4万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 创建SvcHost.exe调用的服务原理与实践(1)
下一篇: 编写进程/线程监视器
Just4life
博客等级 码龄20年 340粉丝 188原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值