枚举服务的一种方法(补)

来源:互联网 发布:网络出租屋怎么申请 编辑:程序博客网 时间:2024/04/25 18:41

上文说到可以通过遍历链表的方法枚举所有的服务,但也会遇到一些限制,如操作系统版本或者若系统服务不在链表中就不可以枚举了。下面的方法可以解决之,就作为对它的补充吧:)

我们通过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结构,此法就可以躲过操作系统的限制,同时也可以防止某些人将一些“特殊”的服务从链表上摘掉。

原创粉丝点击