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。使用 GetThreadPriority和 SetThreadPriority函数来获取和设置线程的优先级值。

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

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

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

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

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

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

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

CreateRemoteThread函数相关推荐

  1. CreateThread创建线程函数详细讲解

    CreateThread CreateThread函数创建一个要在调用进程的地址空间中执行的线程.(MSDN讲解如下) 处理CreateThread ( LPSECURITY_ATTRIBUTES l ...

  2. CreateThread和CreateRemoteThread

    文章目录 CreateThread 函数功能 函数原型 第一个参数: 第二个参数: 第三个参数: 第四个参数: 第五个参数: 第六个参数: 返回值: 补充: 代码实现 注意: CreateRemote ...

  3. C++源代码免杀之函数的动态调用

    最近也在学着修改Gh0st远控的源代码,源代码免杀起来还是方便.简单.有效和简单点.针对于输入输出表盯的比较紧的杀毒软件,最有效的还是进行函数动态调用.也就是说找到函数的原定义,包括值类型和参数等等, ...

  4. CreateThread函数

    创建一个在调用进程的虚拟地址空间内执行的线程. 要创建在另一个进程的虚拟地址空间中运行的线程,请使用 CreateRemoteThread函数. 语法 HANDLE CreateThread(LPSE ...

  5. VC API常用函数简单例子大全(1-89)

    第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCST ...

  6. Windows.h 常用API函数【转】

    转自:https://blog.csdn.net/farmwang/article/details/50603608 http://www.vbgood.com/api.html http://hi. ...

  7. windows常用 API函数

    系统API查询 http://www.vbgood.com/api.html http://hi.baidu.com/3582077/item/9cc3483b581f53c5392ffae3 第一个 ...

  8. php加载shellcode,萌新逆向学习笔记——CreateRemoteThread注入Shellcode

    前言 笔者已经有一段时间没发文了,说实话最近学习逆向没劲儿,不知道是不是因为天气总是变化无常,人感觉有点疲惫. 友情提示:下面一堆笔者废话,所以只想看技术细节可跳过. 之前一直在看韩国人写的<逆 ...

  9. VC API 常用函数简单例子大全

    第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCST ...

最新文章

  1. 特殊用户邮箱附件大小设置
  2. keras和tensorflow使用 keras.callbacks.EarlyStopping 提前结束训练
  3. 第十、十一周项目三-警察和厨师(1)
  4. 李宏毅深度学习——优化方法
  5. TLS回调函数(2)
  6. openshift介绍及centos7安装单节点openshift、Redhat安装openshift集群完全教程
  7. java 什么是耦合_什么是耦合、解耦
  8. datagrid 完整dom结构
  9. Python Tuple:一文彻底粉碎元组
  10. iOS - Card Identification 银行卡号识别
  11. displaytag用法一
  12. YOLOv3 网络搭建Darknet53 训练自己的数据集
  13. 画出计算机网络中两级子网,计算机网络基础练习题
  14. 如何制作优秀的PPT
  15. 【Microsoft Word 2010】页面部分双栏,添加脚注后导致双栏内容换页的解决方法
  16. 考研日语线上笔记(七):十年真题完型精翻篇(2012-2021年)
  17. 归一化互相关(NCC)及其部分应用场景
  18. Lightgbm源论文解析:LightGBM: A Highly Efficient Gradient Boosting Decision Tree
  19. 利用qq IP数据库(QQwry.dat) 查地址的实用类
  20. 安装语言包(LANGUAGE PACKAGE)

热门文章

  1. scrapy 分布式 mysql_Scrapy基于scrapy_redis实现分布式爬虫部署的示例
  2. matlab 泡泡图,使用matlab绘制2维、3维气泡图
  3. python 升级所有库_自动更新Python所有第三方库
  4. 实现Runnable 创建多线程的简单实现
  5. IO流递归拷贝一个文件夹里面的所有文件,到另一个文件夹。如果重复不拷贝,可续拷
  6. log nginx 客户端请求大小_nginx log记录请求响应时间
  7. php 完美防sql注入,PHP 完美的防XSS 防SQL注入的代码
  8. C++的const限定符
  9. Numpy实现酒鬼漫步问题【以及randint()、where()、cumsum()、argmax()的用法详解】
  10. 学姐面了美团阿里京东的面经