代码示例了如何使用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 name="LPBYTE lpEnd">模块结束地址</param>
/

本文介绍了一种通过NTAPI来枚举指定进程中由特定模块创建的线程的方法,涉及到线程和模块地址的关系判断,以及在不同环境下的线程起始地址获取。代码示例中,首先调用NtQuerySystemInformation获取系统进程信息,然后遍历找到目标进程及其线程,最后使用KiOpenThread和NtQueryInformationThread等函数判断线程是否在模块范围内。
9310

被折叠的 条评论
为什么被折叠?



