CreateRemoteThread函数

CreateRemoteThread函数

创建在另一个进程的虚拟地址空间中运行的线程。

使用CreateRemoteThreadEx函数创建在另一个进程的虚拟地址空间中运行的线程,并可选择指定扩展属性。

语法

HANDLE CreateRemoteThread(
  HANDLE                 hProcess,
  LPSECURITY_ATTRIBUTES  lpThreadAttributes,
  SIZE_T                 dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID                 lpParameter,
  DWORD                  dwCreationFlags,
  LPDWORD                lpThreadId
);

参数

  • hProcess

要创建线程的进程的句柄。句柄必须具有PROCESS_CREATE_THREAD,PROCESS_QUERY_INFORMATION,PROCESS_VM_OPERATION,PROCESS_VM_WRITE和PROCESS_VM_READ访问权限,并且在某些平台上没有这些权限时可能会失败。有关更多信息,请参阅 进程安全性和访问权限

  • lpThreadAttributes

指向SECURITY_ATTRIBUTES结构的指针,该 结构指定新线程的安全描述符,并确定子进程是否可以继承返回的句柄。如果lpThreadAttributes为NULL,则线程获取默认安全描述符,并且不能继承句柄。线程的默认安全描述符中的访问控制列表(ACL)来自创建者的主令牌。

Windows XP: 线程的默认安全描述符中的ACL来自创建者的主要或模拟令牌。Windows XP SP2和Windows Server 2003更改了此行为。

  • dwStackSize

堆栈的初始大小,以字节为单位。系统将此值四舍五入到最近的页面。如果此参数为0(零),则新线程将使用可执行文件的默认大小。有关更多信息,请参阅 线程堆栈大小

  • lpStartAddress

指向由线程执行的LPTHREAD_START_ROUTINE类型的应用程序定义函数的指针,表示远程进程中线程的起始地址。该功能必须存在于远程进程中。有关更多信息,请参阅 ThreadProc

  • lpParameter

指向要传递给线程函数的变量的指针。

  • dwCreationFlags

控制线程创建的标志。

含义
0该线程在创建后立即运行。
CREATE_SUSPENDED 0x00000004线程是在挂起状态下创建的,并且在调用ResumeThread函数之前不会运行 。
STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000所述dwStackSize参数指定堆栈的初始保留大小。如果未指定此标志,则dwStackSize指定提交大小。

- lpThreadId
指向接收线程标识符的变量的指针。

如果此参数为NULL,则不返回线程标识符。

返回值

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

如果函数失败,则返回值为NULL。要获取扩展错误信息,请调用 GetLastError

请注意,即使lpStartAddress指向数据,代码或无法访问, CreateRemoteThread也可能成功。如果线程运行时起始地址无效,则发生异常,并且线程终止。由于无效的起始地址导致的线程终止被视为线程进程的错误退出。此行为类似于CreateProcess的异步特性, 即使创建进程无效或缺少动态链接库(DLL),也会创建该进程。

备注

远程线程函数会导致一个新的执行线程指定进程的地址空间开始。该线程可以访问进程打开的所有对象。

终端服务按设计隔离每个终端会话。因此,如果目标进程与调用进程位于不同的会话中,则 CreateRemoteThread将失败。

创建新的线程句柄,可以完全访问新线程。如果未提供安全描述符,则句柄可用于需要线程对象句柄的任何函数中。当提供安全描述符时,在授予访问权限之前,对句柄的所有后续使用执行访问检查。如果访问检查拒绝访问,则请求进程无法使用句柄来获取对线程的访问权限。

如果线程是在可运行状态下创建的(即,如果未使用CREATE_SUSPENDED标志),则线程可以在CreateThread返回之前开始运行,特别是在调用者接收到创建的线程的句柄和标识符之前。

创建的线程的线程优先级为THREAD_PRIORITY_NORMAL。使用 GetThreadPrioritySetThreadPriority函数来获取和设置线程的优先级值。

当线程终止时,线程对象获得信号状态,该状态满足等待对象的线程。

线程对象保留在系统中,直到线程终止并且通过调用CloseHandle关闭它的所有 句柄

ExitProcessExitThreadCreateThread, CreateRemoteThread的功能,以及正在启动一个过程(作为结果 的CreateProcess呼叫)的过程中彼此之间串行化。这些事件中只有一个一次发生在地址空间中。这意味着以下限制:

  • 在进程启动和DLL初始化例程期间,可以创建新线程,但是在为进程执行DLL初始化之前它们不会开始执行。
  • 进程中只有一个线程可以一次处于DLL初始化或分离例程中。
  • 所有线程完成DLL初始化或分离例程后,ExitProcess返回。

此函数的一个常见用途是将线程注入正在调试的进程中以发出中断。但是,建议不要使用此方法,因为额外的线程会使调试应用程序的人感到困惑,并且使用此技术会产生一些副作用:

  • 它将单线程应用程序转换为多线程应用程序。
  • 它改变了进程的时序和内存布局。
  • 它导致调用进程中每个DLL的入口点。

此函数的另一个常见用途是将一个线程注入进程以查询堆或其他进程信息。这可能会导致前一段中提到的相同副作用。此外,如果线程尝试获取另一个线程正在使用的锁的所有权,则应用程序可能会死锁。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CreateRemoteThreadEx 是 CreateRemoteThread 的扩展版本,它可以在远程进程中创建线程,并且可以指定线程的安全描述符和堆栈大小等参数。相比之下,CreateRemoteThread 只能创建简单的线程,并且不能指定这些参数。 ### 回答2: CreateRemoteThreadEx与CreateRemoteThread是Windows操作系统提供的两个函数,用于在一个进程中创建远程线程。 区别如下: 1. 功能区别:CreateRemoteThread函数用于在目标进程中创建一个新的线程,并在新线程中执行指定的函数。而CreateRemoteThreadEx函数在创建远程线程的同时,还可以指定线程的起始地址和传递的参数。 2. 参数区别:CreateRemoteThread函数只能传递一个指向线程函数的指针参数,而CreateRemoteThreadEx函数除了线程函数指针外,还可以传递线程起始地址和参数。 3. 执行方式区别:CreateRemoteThread创建的线程在远程进程中使用默认的起始地址和参数来执行,而CreateRemoteThreadEx创建的线程可以指定自定义的起始地址和参数。 4. 使用限制区别:CreateRemoteThreadEx是在Windows Vista及后续版本中引入的函数,相比之下CreateRemoteThread支持的操作系统版本更早,但CreateRemoteThreadEx的功能更加强大,更灵活。 总结:CreateRemoteThreadEx相对于CreateRemoteThread功能更加强大,可以提供更多的选项来创建远程线程。根据具体的需求,可以选择适合的函数来满足程序的要求。 ### 回答3: CreateRemoteThreadEx和CreateRemoteThread都是Windows操作系统提供的函数,用于在远程进程中创建线程。 区别一:参数 CreateRemoteThreadEx函数相比CreateRemoteThread函数增加了一些额外的参数。其中一个重要的参数是lpAttributeList,它允许对远程线程的新创建的线程进行更细粒度的控制,例如设置线程的安全性或优先级。 区别二:线程入口点 CreateRemoteThreadEx函数允许传入一个自定义的线程入口点函数,使得远程线程启动后执行指定的代码。而CreateRemoteThread函数只能使用远程进程中已经存在的函数作为线程入口点。 区别三:线程的权限和环境 CreateRemoteThreadEx函数允许调用者以指定的安全环境或访问权限在远程进程中创建线程。通过传入合适的参数,可以使新创建的线程在远程进程中拥有较高的权限,从而可以完成一些需要特权的操作。而CreateRemoteThread函数则只能以当前进程的访问权限在远程进程中创建线程。 总结: 在功能上,CreateRemoteThreadEx函数提供了更多的灵活性和控制能力,允许更精细地配置远程线程的属性和行为。 而CreateRemoteThread函数则相对简单,适用于一般的远程线程创建操作。选择使用哪一个函数取决于具体的需要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值