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的场景)
- lpThreadAttributes:指向 SECURITY_ATTRIBUTES 结构的指针,该结构确定返回的句柄是否可以由子进程继承,设置为 NULL;
- dwStackSize:堆栈的初始大小(以字节为单位),参数为零时,新线程使用可执行文件的默认大小,设置为 NULL;
- lpStartAddress:指向由线程执行的应用程序定义函数的指针。此指针表示线程的起始地址。VirtuallAlloc 函数执行返回的内存地址(分配的内存区域起始地址);
- lpParameter:指向要传递给线程的变量的指针,设置为 NULL;
- dwCreationFlags:控制线程创建的标志,设置为 NULL,创建后线程会立即运行;
- lpThreadId:指向接收线程标识符的变量的指针,设置为 NULL,则不返回线程标识符。
返回值(句柄)
- 如果函数成功,返回值是新线程的句柄;
- 如果函数失败,则返回值 NULL。
WaitForSingleObject
DLL:kernel32.dll
标头:<synchapi.h>
功能:等待新创建的子线程结束后再继续向下执行主线程后续的代码 [3]。
原型
DWORD WaitForSingleObject(
[in] HANDLE hHandle,
[in] DWORD dwMilliseconds
);
参数(2)
- hHandle:该参数为要等待的对象的句柄,(设置为 CreateThead 函数返回值);
- 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