代码示例了如何使用API枚举指定进程中指定模块创建的线程, 注意该方案存在一定局限性, 就是模块的起始地址和线程起始地址之间的关系无法保证, 可能存在漏掉的.
static HANDLE KiOpenThread(ACCESS_MASK dwDesiredAccess, BOOL bInheritHandle, HANDLE dwThreadId)
{
OBJECT_ATTRIBUTES ObjectAttributes;
InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
if (bInheritHandle)
ObjectAttributes.Attributes = OBJ_INHERIT;
CLIENT_ID ClientId;
ClientId.UniqueProcess = NULL;
ClientId.UniqueThread = dwThreadId;
HANDLE hThread = NULL;
NtOpenThread(&hThread, dwDesiredAccess, &ObjectAttributes, &ClientId);
return hThread;
}
//-------------------------------------------------------------------------
/// <summary>
/// NTAPI枚举指定进程中指定模块创建的线程
/// </summary>
/// <param name="HANDLE dwProcessId"></param>
/// <param name="LPBYTE lpStart">模块开始地址, 可用 GetModuleInformation 等取得</param>
/// <param