父进程欺骗DidierStevens(一)

admin 2024年8月3日15:39:18评论5 views字数 2494阅读8分18秒阅读模式

属性链表初始化

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等函数来创建空的属性链表。创建属性链表需要以下几个步骤

  1. 调用InitializeProcThreadAttributeList设置dwAttributeCount属性计数个数获取接受属性链表所需的缓冲区大小;

  2. 使用HeapAlloc和GetProcessHeap从当前堆空间中分配所需要的空间大小;

  3. 调用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(一)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月3日15:39:18
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   父进程欺骗DidierStevens(一)https://cn-sec.com/archives/3028579.html

发表评论

匿名网友 填写信息