我正在尝试弄清楚 Windows 进程如何启动并保持与services.exe
. 这是在 Windows 8 x64 上,但如果您有 Windows 7 的提示也很好。
到目前为止,我发现services.exe
做的事情大约是这样的:
PROCESS_INFORMATION pi;
TCHAR szExe[] = _T("C:\\Program Files\\TestProgram\\myWindowsService.exe");
PROCESS_INFORMATION process_information = {0};
HKEY hOpen;
DWORD dwNumber = 0;
DWORD dwType = REG_DWORD;
DWORD dwSize = sizeof(DWORD);
STARTUPINFOEX startup_info;
SIZE_T attribute_list_size = 0;
ZeroMemory(&startup_info, sizeof(STARTUPINFOEX));
// can see EXTENDED_STARTUPINFO_PRESENT is used, but couldn't figure out if any/what attributes are added
BOOL status = InitializeProcThreadAttributeList(nullptr, 0, 0, &attribute_list_size);
PPROC_THREAD_ATTRIBUTE_LIST attribute_list = (PPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, attribute_list_size);
startup_info.StartupInfo.cb = sizeof(STARTUPINFOEX);
startup_info.lpAttributeList = attribute_list;
startup_info.StartupInfo.dwFlags = STARTF_FORCEOFFFEEDBACK;
startup_info.StartupInfo.wShowWindow= SW_HIDE;
if(CreateProcess(
NULL,
szExe,
NULL,
NULL,
FALSE,
CREATE_SUSPENDED |
CREATE_UNICODE_ENVIRONMENT |
DETACHED_PROCESS |
EXTENDED_STARTUPINFO_PRESENT,
NULL,
NULL,
&startup_info.StartupInfo,
&pi))
{
HANDLE hEvent;
hEvent=CreateEvent(NULL,FALSE,FALSE,NULL); // I traced this call during service sstartup; no idea what purpose it serves?
ResumeThread(pi.hThread);
现在我的问题是,如何将实际的“开始”传达给服务?我知道服务本身会做这样的事情:
- 主入口点(如控制台程序)
- 称呼
advapi!StartServiceCtrlDispatcher
- 去
sechost!StartServiceCtrlDispatcher
- 这跳入
sechost!QueryServiceDynamicInformation
我试图弄清楚services.exe
使用什么方法来连接到这个启动过程。理想情况下,我希望能够编写一个 PoC 代码,该代码可以“启动”一个简单的 Windows 服务并使其启动,而无需将其注册为 Windows 服务,即包装在“独立服务控制管理器”中。我正在寻找有关下一步最佳查找内容的一些提示。
还有对services.exe
in的引用\\pipe\ntsvcs
。关于 SCM的维基百科文章指的是\Pipe\Net\NtControlPipeX
正在创建,但据我所知,那是在 Windows 2000(也许是 XP)中,但我看不到在 Windows 8 上发生这种情况。