win32线程

一丶什么是线程

在windows中常听到的就是线程.多线程.啊什么的. 这里介绍一下什么是线程.

1.线程是附属在进程中的一个执行实体.简而言之就是执行代码的.

2.每个进程至少有一个线程.可以有多个线程. 一对多的关系.

3.单核CPU可以实现多线程. 几秒钟换一次线程执行不同进程的代码.就实现了多线程.

PS: 在切换的过程中会保存线程的信息. 堆栈寄存器等信息.

二丶线程常见操作API

1.CreateThread 创建线程

HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, SD安全属性
SIZE_T dwStackSize, 创建线程的堆栈大小.为0则默认
LPTHREAD_START_ROUTINE lpStartAddress, 创建线程执行代码的地址.
__drv_aliasesMem LPVOID lpParameter, 创建线程需要的参数
DWORD dwCreationFlags, 创建标志.挂起创建还是普通创建
LPDWORD lpThreadId 返回创建的线程ID
);
返回值: 返回创建的线程句柄.

2. Sleep(毫秒);  延时命令. 可以让当前线程等待指定时间.然后继续执行代码.

3. SuspendThread 挂起线程.如果挂起则线程不能执行

DWORD SuspendThread(
HANDLE hThread 需要线程句柄
);

64位下

DWORD Wow64SuspendThread(    64位调用的API
HANDLE hThread
);

4.ResumeThread 恢复线程执行

DWORD ResumeThread(
HANDLE hThread 传入要恢复线程执行的线程句柄
);

5.获取线程句柄 OpenThread

HANDLE OpenThread(
DWORD dwDesiredAccess, 访问权限
BOOL bInheritHandle, 是否可以继承
DWORD dwThreadId 线程ID
);
返回线程句柄

6.WaitForsingleObjec  等待单个内核对象返回

DWORD WaitForSingleObject(
HANDLE hObject, //指明一个内核对象的句柄 注意可以等待的是内核对象不一定是线程.
DWORD dwMilliseconds //等待时间
);

7.WaitForMultObjects 等待多个内核对象返回

DWORD WaitForSingleObject(
DWORD count; //指明的个数
HANDLE *hObject, //指明一个内核对象的数组指针
DWORD dwflages //等待模式. 如果TURE则数组里面的句柄都等待.false相反.有一个返回就返回
DWORD dwMilliseconds //等待时间
);

8.CONTEXT结构体.

我们知道线程切换的过程中.操作系统会保存线程当前寄存器的值.以及EIP.所以会有一个结构体来保存.这个结构体就是CONTEXT.称作线程上下文.

PS: 这个结构未公开 需要在WinNT.h 中查看.

typedef struct _CONTEXT {

    //
// The flags values within this flag control the contents of
// a CONTEXT record.
//
// If the context record is used as an input parameter, then
// for each portion of the context record controlled by a flag
// whose value is set, it is assumed that that portion of the
// context record contains valid context. If the context record
// is being used to modify a threads context, then only that
// portion of the threads context will be modified.
//
// If the context record is used as an IN OUT parameter to capture
// the context of a thread, then only those portions of the thread's
// context corresponding to set flags will be returned.
//
// The context record is never used as an OUT only parameter.
// DWORD ContextFlags; //
// This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
// set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is NOT
// included in CONTEXT_FULL.
// DWORD Dr0;
DWORD Dr1;
DWORD Dr2;
DWORD Dr3;
DWORD Dr6;
DWORD Dr7; //
// This section is specified/returned if the
// ContextFlags word contians the flag CONTEXT_FLOATING_POINT.
// FLOATING_SAVE_AREA FloatSave; //
// This section is specified/returned if the
// ContextFlags word contians the flag CONTEXT_SEGMENTS.
// DWORD SegGs;
DWORD SegFs;
DWORD SegEs;
DWORD SegDs; //
// This section is specified/returned if the
// ContextFlags word contians the flag CONTEXT_INTEGER.
// DWORD Edi;
DWORD Esi;
DWORD Ebx;
DWORD Edx;
DWORD Ecx;
DWORD Eax; //
// This section is specified/returned if the
// ContextFlags word contians the flag CONTEXT_CONTROL.
// DWORD Ebp;
DWORD Eip;
DWORD SegCs; // MUST BE SANITIZED
DWORD EFlags; // MUST BE SANITIZED
DWORD Esp;
DWORD SegSs; //
// This section is specified/returned if the ContextFlags word
// contains the flag CONTEXT_EXTENDED_REGISTERS.
// The format and contexts are processor specific
// BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; } CONTEXT;

我们要获取这个CONTEXT需要使用API获取和设置. 但是在获取的前提下.我们需要对CONTEXT的一个重要成员赋值.

这个成员是   ContextFlags 成员.我们需要指明我们要获取那个寄存器的值. 比如通用寄存器. 调试寄存器. 等等..

而设置的值在这个结构中的注释也说了. CONTEXT_INTEGER 可以给定这个.也可以自己定义.具体查看注释说明.

9.获取线程设备上下文.

BOOL GetThreadContext(
HANDLE hThread, 线程句柄
LPCONTEXT lpContext 传入Context结构.操作系统写入.给我们传出
);

如果是64位下.则使用API

BOOL Wow64GetThreadContext(
HANDLE hThread,
PWOW64_CONTEXT lpContext
);

10.设置线程设备上下文. SetThreadContext

BOOL SetThreadContext(
HANDLE hThread, 线程句柄
CONST CONTEXT *lpContext CONTEXT结构
);

64位下

BOOL Wow64SetThreadContext(
HANDLE hThread,
CONST WOW64_CONTEXT *lpContext
);

上面的关于线程切换的CONTEXT. 我们可以利用它做一个EIP注入. 详情请看注入分类中的 EIP注入博客.

win32线程的更多相关文章

  1. win32线程池代码(WinApi/C++)

    win32线程池代码(WinApi/C++) 健壮, 高效,易用,易于扩, 可用于任何C++编译器 //说明, 这段代码我用了很久, 我删除了自动调整规模的代码(因为他还不成熟)/********** ...

  2. Win32线程——优先权

    <Win32多线程程序设计>–Jim Beveridge & Robert Wiener Win32 优先权是以数值表现的,并以进程的“优先权类别(priority class)” ...

  3. Win32 线程同步

    Win32 线程同步 ## Win32线程同步 ### 1. 原子锁 ### 2. 临界区 {全局变量} CRITICAL_SECTION CS = {0}; // 定义并初始化临界区结构体变量 {线 ...

  4. win32线程栈溢出问题 (一)

    一.什么是线程栈溢出 我们都知道,每一个win32线程都会开辟一个空间,用来临时存储线程执行时所调用的一系列函数的参数.返回地址和局部变量及其他上下文信息.这个空间就是线程的栈区.栈区的容量是有限的, ...

  5. Win32线程——等待另一个线程结束

    转载: https://blog.csdn.net/yss28/article/details/53646627 <Win32多线程程序设计>–Jim Beveridge & Ro ...

  6. C++ win32线程数上限

    hThread = CreateThread( NULL,  0,  WorkerFunction,  &threadParm,  0, &dwThreadID  ); 这样的创建方法 ...

  7. win32 线程通信初步

    // 线程通信机制.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #define NUM_THREADS 10 #include < ...

  8. Win32线程安全问题.同步函数

    线程安全问题.同步函数 一丶简介什么是线程安全 通过上面几讲.我们知道了线程怎么创建.线程切换的原理(CONTEXT结构) 每个线程在切换的时候都有自己的堆栈. 但是这样会有安全问题. 为什么?  我 ...

  9. win32线程栈溢出问题 (二)

    3.2.函数递归调用引发的栈溢出 写一段最简单的无穷递归代码,如下: #include "stdafx.h" void f(void) { f(); } int _tmain(in ...

随机推荐

  1. flume接收http请求,并将数据写到kafka

    flume接收http请求,并将数据写到kafka,spark消费kafka的数据.是数据采集的经典框架. 直接上flume的配置: source : http channel : file sink ...

  2. 从React组件划分的纠结到总结

    在实际开发项目中,我将所有的React组件划分为容器组件和展示组件,展示组件其实就是一个纯函数组件,没有任何副作用,基本都是PureComponent.但是突然,出现了这么一个问题: 我有一个浮层组件 ...

  3. 关于根据模板生成pdf文档,差入图片和加密

    import com.alibaba.fastjson.JSONObject; import com.aliyun.oss.OSSClient; import com.itextpdf.text.pd ...

  4. JavaWeb三大组件之Servlet

    http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/Servlet.html 一.Servlet继承结构体系图 从结构图中 ...

  5. 学以致用三十三-----django生命周期

    听了讲解django的视频后,受益匪浅,每个知识点老师都会总结整理.学会总结,存为己用. django生命周期弄明白后,对于整个django的框架会有一个清晰的了解.先上图 1.客户端发送请求,在dj ...

  6. mvc 路由伪静态实现

    很多网站都采用伪静态,例如以html.shtml等结尾的url,mvc的路由可以轻松实现. 配置路由 默认路由配置 添加伪静态路由 mvc的路由原理是从上往下匹配的,所以只需要在后面添加自己配置的路由 ...

  7. js基础知识1:标识符 注释

    何为标识符:意思是标记识别的的符号,简称标识符,主要的用途声明变量,函数的名字,属性以及函数中的参数. 标识符的规则1:首先第一个字符必须是字母(abcABC),_(下划线),$(美元符号).不能是( ...

  8. JS 控制输入框输入表情emoji 显示在页面上

    问题描述: 最近做一个评论回复的功能遇到了用户输入框输入表情,存入数据库的时候转变成了问号??? 起初为了避免这个问题,做了一个过滤表情的控制 var inputText = $('#pinglun' ...

  9. 【repost】js window对象属性和方法相关资料整理

    window对象有以下方法: open close alert confirm prompt setTimeout clearTimeout setInterval clearInterval mov ...

  10. python 初级重点

    关于python初学时遇到的重点: 1 python 2 和3 的区别 python2**不识别中文** -*- coding: utf-8 -*-(因为不能识别中文,所以代码有中文时需要在最前面加入 ...