如何判断应用程序运行的代码是在服务还是应用程序中?为什么我想知道这一点 - 我正在编写一些注入目标应用程序的代码,而且代码无法预先知道这些信息,因此必须自行解决。
我不能依赖从服务控制管理器调用的任何代码,启动,停止或命令行参数。
我目前正在查看GetConsoleWindow()
我希望将返回NULL
服务(无控制台)和任何应用程序的窗口句柄(具有控制台)。不确定这个假设是否有效。
任何有关更好解决方案的想法?
答案 0 :(得分:7)
从所有正在运行的服务列表(GetCurrentProcessId
)中搜索当前进程ID(EnumServicesStatusEx
)?
答案 1 :(得分:1)
GetConsoleWindow()的假设无效。
在我看来,您更关心流程的背景。如果您的程序在服务上下文或用户会话中运行,您是否在询问?如果是这样,请使用ProcessIdToSessionId()http://msdn.microsoft.com/en-us/library/aa382990%28v=VS.85%29.aspx来获取会话ID,您将会知道它。
答案 2 :(得分:1)
使用WMI查询“ProcessId = MyProcessid”的Win32_Service个实例。如果没有匹配,那么您的流程不是服务。
使用C ++ here创建WMI应用程序的背景知识。
答案 3 :(得分:0)
使用OpenProcessToken获取当前进程令牌。然后使用CheckTokenMembership查看令牌是否包含WinServiceSid众所周知的SID。