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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值