Win32学习笔记 | CreateThread, WaitForSingleObject函数

 CreateThread

DLL:kernel32.dll

标头:<processthreadapi.h>

函数说明:创建一个在调用进程的虚拟地址空间内执行的线程

功能:创建一个线程来执行代码(e.g., shellcode)

原型

HANDLE CreateThread(
  [in, optional]  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  [in]            SIZE_T                  dwStackSize,
  [in]            LPTHREAD_START_ROUTINE  lpStartAddress,
  [in, optional]  __drv_aliasesMem LPVOID lpParameter,
  [in]            DWORD                   dwCreationFlags,
  [out, optional] LPDWORD                 lpThreadId
);

参数(6)

(以下参数值的设置用于自定义shellcode的场景)

  1. lpThreadAttributes:指向 SECURITY_ATTRIBUTES 结构的指针,该结构确定返回的句柄是否可以由子进程继承,设置为 NULL;
  2. dwStackSize:堆栈的初始大小(以字节为单位),参数为零时,新线程使用可执行文件的默认大小,设置为 NULL;
  3. lpStartAddress:指向由线程执行的应用程序定义函数的指针。此指针表示线程的起始地址。VirtuallAlloc 函数执行返回的内存地址(分配的内存区域起始地址);
  4. lpParameter:指向要传递给线程的变量的指针,设置为 NULL;
  5. dwCreationFlags:控制线程创建的标志,设置为 NULL,创建后线程会立即运行;
  6. lpThreadId:指向接收线程标识符的变量的指针,设置为 NULL,则不返回线程标识符。

返回值(句柄)

  • 如果函数成功,返回值是新线程的句柄
  • 如果函数失败,则返回值 NULL。

WaitForSingleObject

DLL:kernel32.dll

标头:<synchapi.h>

功能:等待新创建的子线程结束后再继续向下执行主线程后续的代码 [3]。

原型

DWORD WaitForSingleObject(
  [in] HANDLE hHandle,
  [in] DWORD  dwMilliseconds
);

参数(2)

  1. hHandle:该参数为要等待的对象的句柄,(设置为 CreateThead 函数返回值);
  2. dwMilliseconds:该参数指定等待超时间隔(以毫秒为单位),如果设置为0则立即返回。在Keystone引擎的使用中该值设置为 -1(即 INFINITE, 0xffffffff),表示在子线程结束前函数不会返回 [4]。

INFINITE是系统定义的一个宏 [3],定义如下:#define INFINITE 0xFFFFFFFF

引用参考

[1] CreateThread 函数 (processthreadsapi.h) - Win32 apps | Microsoft Learn

[2] WaitForSingleObject 函数 (synchapi.h) - Win32 apps | Microsoft Learn

[3] 《C++黑客编程揭秘与防范》

[4] 《Windows32位汇编语言程序设计》

相关组合函数:VirtuallAlloc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值