枚举服务的一种方法(补)
2008-05-06 18:24
411 查看
上文说到可以通过遍历链表的方法枚举所有的服务,但也会遇到一些限制,如操作系统版本或者若系统服务不在链表中就不可以枚举了。下面的方法可以解决之,就作为对它的补充吧:)
我们通过WindowsNT源代码(见下):
DWORD
ScCreateServiceRecord(
IN LPWSTR ServiceName,
OUT LPSERVICE_RECORD *ServiceRecord
)
{
...
(*ServiceRecord) = (LPSERVICE_RECORD)HeapAlloc(
ServiceRecordHeap,
HEAP_ZERO_MEMORY,
nameSize + sizeof(SERVICE_RECORD)
);
...
}
知道Services.exe为每个SERVCIE_RECORD结构使用了堆分配的空间,且大小为sizeof(SERVICE_RECORD)+服务名称的大小。
了解这个,我们就可以使用Tool32help函数Heap32ListFirst/Next和Heap32First/Next函数来遍历Services.exe的所有分配的堆。根据SERVICE_RECORD.Signature
是否为0x76724573("sErv" in ASCII)来判断是否为一个真正的SERVICE_RECORD结构,此法就可以躲过操作系统的限制,同时也可以防止某些人将一些“特殊”的服务从链表上摘掉。
我们通过WindowsNT源代码(见下):
DWORD
ScCreateServiceRecord(
IN LPWSTR ServiceName,
OUT LPSERVICE_RECORD *ServiceRecord
)
{
...
(*ServiceRecord) = (LPSERVICE_RECORD)HeapAlloc(
ServiceRecordHeap,
HEAP_ZERO_MEMORY,
nameSize + sizeof(SERVICE_RECORD)
);
...
}
知道Services.exe为每个SERVCIE_RECORD结构使用了堆分配的空间,且大小为sizeof(SERVICE_RECORD)+服务名称的大小。
了解这个,我们就可以使用Tool32help函数Heap32ListFirst/Next和Heap32First/Next函数来遍历Services.exe的所有分配的堆。根据SERVICE_RECORD.Signature
是否为0x76724573("sErv" in ASCII)来判断是否为一个真正的SERVICE_RECORD结构,此法就可以躲过操作系统的限制,同时也可以防止某些人将一些“特殊”的服务从链表上摘掉。
相关文章推荐
- 08-01-29>pe_xscan 增加了一种枚举系统服务的方法
- 枚举服务的一种方法
- 一种线上服务日志切分与压缩方法
- 一种根据value解释成枚举的有效方法
- ora-12154 tns 无法处理服务名(执行的程序途径不一致导致,枚举网络数种方法,大家还有其他解决办法?)
- 一种中心服务中同步状态的方法
- 一种面向流媒体云服务平台的自适应负载均衡方法
- http服务区域组网的一种方法
- web服务鉴权的一种实现方法
- 一种为使用Log4j的分布式应用提供云端日志服务的方法
- 一种提高微服务架构的稳定性与数据一致性的方法
- 一种基于tomcat平台将用户后台服务程序加入servlet的方法
- 一种面向服务体系结构中消息层异常处理方法
- 一种枚举指定序列的方法 ————CF A. Pizza Separation
- ics服务启动失败的一种解决方法
- Terminal Services服务无法启动的一种解决方法
- 一种通过AIDL实现DLNA共享服务的方法
- Windows服务程序的一种简捷实现方法
- 一种完全退出应用程序的方法,结束所有的Activity 和服务
- 一种基于手机网络共享服务的网络连接的方法及手机的制作方法