属性链表初始化
InitializeProcThreadAttributeList 函数 (processthreadsapi.h)
官方文档:https://learn.microsoft.com/zh-cn/windows/win32/api/processthreadsapi/nf-processthreadsapi-initializeprocthreadattributelist?redirectedfrom=MSDN
InitializeProcThreadAttributeList 初始化用于创建进程和线程的指定属性列表。
BOOL InitializeProcThreadAttributeList(
[out, optional] LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,
[in] DWORD dwAttributeCount,
DWORD dwFlags,
[in, out] PSIZE_T lpSize
);
参数 | 作用 |
---|---|
[out, optional] lpAttributeList | 属性列表。此参数可以为 NULL,以确定支持指定数量的属性所需的缓冲区大小。 |
[in] dwAttributeCount | 要添加到列表的属性计数。 |
dwFlags | 此参数是保留的,必须为零。 |
[in, out] lpSize | 如果 lpAttributeList 不为 NULL,则此参数指定输入时 *pAttributeList 缓冲区的大小(以字节为单位)。输出时,此参数接收初始化的属性列表的大小(以字节为单位)。如果 *pAttributeList 为 NULL,则此参数接收所需的缓冲区大小(以字节为单位)。 |
getProcessHeap 函数 (heapapi.h)
官方文档:https://learn.microsoft.com/zh-cn/windows/win32/api/heapapi/nf-heapapi-getprocessheap
检索调用进程的默认堆的句柄。然后,可以在对堆函数的后续调用中使用此句柄。进程可以使用此句柄从进程堆分配内存,而无需先使用 HeapCreate 函数创建专用堆。
HANDLE GetProcessHeap();
heapAlloc 函数 (heapapi.h)
官方文档:https://learn.microsoft.com/zh-cn/windows/win32/api/heapapi/nf-heapapi-heapalloc
从堆中分配内存块。分配的内存不可移动。
DECLSPEC_ALLOCATOR LPVOID HeapAlloc(
[in] HANDLE hHeap,
[in] DWORD dwFlags,
[in] SIZE_T dwBytes
);
参数 | 作用 |
---|---|
[in] hHeap | 要从中分配内存的堆的句柄。 |
[in] dwFlags | 堆分配选项。指定这些值中的任何一个都将替代使用 HeapCreate 创建堆时指定的相应值。 |
[in] dwBytes | 要分配的字节数。 |
源码分析
PPROC_THREAD_ATTRIBUTE_LIST属性链表的内容是不透明的,无法直接观察到内部数据结构。因此需要InitializeProcThreadAttributeList等函数来创建空的属性链表。创建属性链表需要以下几个步骤
-
调用InitializeProcThreadAttributeList设置dwAttributeCount属性计数个数获取接受属性链表所需的缓冲区大小;
-
使用HeapAlloc和GetProcessHeap从当前堆空间中分配所需要的空间大小;
-
调用InitializeProcThreadAttributeList初始化属性链表的空间。
// 1. 调用InitializeProcThreadAttributeList设置dwAttributeCount属性计数个数获取接受属性链表所需的缓冲区大小
SIZE_T cbAttributeListSize = 0;
InitializeProcThreadAttributeList(NULL, 1, 0, &cbAttributeListSize);
// 2. 使用HeapAlloc和GetProcessHeap从当前堆空间中分配所需要的空间大小
PPROC_THREAD_ATTRIBUTE_LIST pAttributeList = NULL;
/* HeapAlloc(GetProcessHeap(), 0, cbAttributeListSize); 从进程的默认堆中分配内存 */
pAttributeList = (PPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, cbAttributeListSize);
if (NULL == pAttributeList)
{
DisplayErrorMessage((LPTSTR)"HeapAlloc error", GetLastError());
return 0;
}
// 3. 调用InitializeProcThreadAttributeList初始化属性链表的空间
if (!InitializeProcThreadAttributeList(pAttributeList, 1, 0, &cbAttributeListSize))
{
DisplayErrorMessage((LPTSTR)"InitializeProcThreadAttributeList error", GetLastError());
return 0;
}
/* 当属性链表初始化完成后,就可以调用UpdateProcThreadAttribute向其添加键/值对 */
参考
[1]https://blog.didierstevens.com/2009/11/22/quickpost-selectmyparent-or-playing-with-the-windows-process-tree/
原文始发于微信公众号(蟹堡安全团队):父进程欺骗--DidierStevens(一)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论