在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB.把它们放到一起是因为这三个数据结构及其外延和windows中进程的表示关系密切,我们在做进程隐藏和进程枚举的时候一定会涉及到这3类数据结构,所以这里有必要及时做一下总结,做个学习笔记,理清思路. 1. 相关阅读材料 <windows 内核原理与实现> --- 潘爱民 <深入解析windows操作系统(第4版,中文版)> --- 潘…
句柄表跟内核对象 一丶什么是句柄表什么是内核对象. 1.句柄表的生成 我们知道.我们使用CreateProcess 的时候会返回一个进程句柄.以及线程句柄. 其实在调用CreateProcess的时候.内核中会新建一个EPROCESS结构来存储我们的进程信息. 例如如下图: 但是有一个问题.怎么给三环使用.难道直接返回EPROCESS? 其实不是这样的. 第一EPROCESS在高两G. 三环程序是不可以访问的.所以返回的地址是高两G所以不能使用. 但是为了解决这一问题. windows创建了一个…
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert Love,陈莉君等译. 1.进程 进程是正在执行的程序代码的实时结果,包含打开的文件.挂起的信号等.线程是进程中的活动的对象,内核调度的对象是线程.在Linux内核对线程与进程并不加以区分,线程只不过是一种特殊的进程. 2.进程描述符 内核把进程的信息存放在task list的双向循环链表中,链表中的…
Linux内核学习笔记二——进程   一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器. 内核调度的对象是线程而不是进程.对Linux而言,线程是特殊的进程. 二 进程描述符及任务结构 内核使用双向循环链表的任务队列来存放进程,使用结构体task_struct来描述进程所有信息. 1 进程描述符task_struct struct task_struct {}结构体相当大,大约1.7…
1 进程的创建过程 打开系统 --> 双击要运行的程序 --> EXE开始执行 步骤一: 当系统启动后,创建一个进程:Explorer.exe(也就是桌面进程) 步骤二: 当用户双击某一个EXE时,Explorer 进程使用CreateProcess函数创建被双击的EXE,也就是说,我们在桌面上双 击创建的进程都是Explorer进程的子进程. CreateProcess BOOL CreateProcess( LPCTSTR lpApplicationName, // name of exe…
一.进程与线程 进程是处于执行期的程序,但是并不仅仅局限于一段可执行程序代码.通常,进程还要包含其他资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个或多个执行线程,当然还包括用来存放全局变量的数据段等.在Linux内核中,进程也通常叫做任务. 执行线程,简称线程,是在进程中活动的对象.每个线程都拥有一个独立的程序计数器.进程栈和一组进程寄存器.内核调度的对象是线程,而不是进程.在传统的UNIX系统中,一个进程只包含一个线程,但在现在的系统中,包…
一. 进程创建: Unix 下的进程创建很特别,与许多其他操作系统不同,它分两步操作来创建和执行进程: fork() 和 exec() .首先,fork() 通过拷贝当前进程创建一个子进程:然后,exec() 函数负责读取可执行文件并将其载入地址空间开始运行. 1.fork() :kernel/fork.c 在Linux系统中,通过调用fork()来创建一个进程.调用 fork() 的进程称为父进程,新产生的进程称为子进程.在该调用结束时,在返回点这个相同的位子上,父进程恢复执行,子进程开始执行…
Linux系统中,进程之间有一个明显的继承关系,所有进程都是 PID 为1的 init 进程的后代.内核在系统启动的最后阶段启动 init 进程.该进程读取系统的初始化脚本(initscript)并执行其他的相关程序,最终完成系统启动的整个过程. 系统中每个进程必有一个父进程,相应的,每个进程也可以由零个或者多个子进程.拥有同一个父进程的所有进程被称为兄弟.进程之间的关系存放在进程描述符 task_struct 中.每个 task_struct 都包含一个指向其父进程 task_struct 的…
本篇主要讲述进程的启动过程.线程的调度与切换.进程挂靠 进程的启动过程: BOOL CreateProcess ( LPCTSTR lpApplicationName,                 // LPTSTR lpCommandLine,                      // command line string LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD LPSECURITY_ATTRIBUTES lpThreadA…
有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. 1. 相关阅读材料 <windows 内核原理与分析> --- 潘爱民 <深入解析windows操作系统(第4版,中文版)> http://bbs.pediy.com/showthread.php?p=819417#post819417      看雪上的精华贴 http://und…
在上一篇文章<驱动开发:内核枚举DpcTimer定时器>中我们通过枚举特征码的方式找到了DPC定时器基址并输出了内核中存在的定时器列表,本章将学习如何通过特征码定位的方式寻找Windows 10系统下面的PspCidTable内核句柄表地址. 首先引入一段基础概念: 1.在windows下所有的资源都是用对象的方式进行管理的(文件.进程.设备等都是对象),当要访问一个对象时,如打开一个文件,系统就会创建一个对象句柄,通过这个句柄可以对这个文件进行各种操作. 2.句柄和对象的联系是通过句柄表来进…
本节内容为①进程线程的基础知识:②在Python的实现方法: 学习总结自: 一文看懂Python多进程与多线程编程(工作学习面试必读) - 知乎 multiprocessing 官方文档 1.进程线程基础 什么是进程.线程? ①进程:Process:线程:Thread: ②进程是OS分配资源的最小单元,线程是OS调度的最小单元: ③一个程序至少包括一个进程,一个进程至少包括一个线程:线程的尺度更小 ④进程执行过程中拥有独立内存单元,不同进程间的内存单元互不干涉: 一个进程中的多个线程在执行过程中…
线程有时称为轻权进程(lightweight process) 同一进程内的所有线程共享相同的全局内存.这使得线程之间易于共享信息,然后这样也会带来同步的问题 同一进程内的所有线程处理共享全局变量外还共享: 1.进程指令 2.大多数数据 3.打开的文件(即描述符) 4.信号处理函数和信号处置 5.当前工作目录 6.用户ID和组ID 不过每个线程有各自的: 1.线程ID 2.寄存器集合,包括程序计数器和栈指针 3.栈(用于存放局部变量和返回地址) 4.errno 5.信号掩码 6.优先级 基本线程…
添加一个Command1.一个List1,代码: Private Type PROCESS_HANDLE_TABLE_ENTRY_INFO HandleValue As Long HandleCount As Long PointerCount As Long GrantedAccess As Long ObjectTypeIndex As Long HandleAttributes As Long Reserved As Long End Type Private Type PROCESS_H…
当一个进程被初始化时,系统要为它分配一个句柄表.该句柄表只用于内核对象 ,不用于用户对象或GDI对象. 创建内核对象 当进程初次被初始化时,它的句柄表是空的.然后,当进程中的线程调用创建内核对象的函数时,比如CreateFileMapping,内核就为该对象分配一个内存块,并对它初始化.这时,内核对进程的句柄表进行扫描,找出一个空项.由于表 3 - 1中的句柄表是空的,内核便找到索引1位置上的结构并对它进行初始化.该指针成员将被设置为内核对象的数据结构的内存地址,访问屏蔽设置为全部访问权,同时,…
总结: 1.句柄就是进程句柄表中的索引.2.句柄是对进程范围内一个内核对象地址的引用,一个进程的句柄传给另一个进程是无效的.一个内核对象可用有多个句柄.Windows之所以要设立句柄,根本上源于内存管理机制的问题,即虚拟地址.简而言之数据的地址需要变动,变动以后就需要有人来记录.管理变动,因此系统用句柄来记载数据地址的变更. 当一个进程被初始化时,系统要为它分配一个句柄表.该句柄表只用于内核对象 ,不用于用户对象或 GDI 对象. .第一个句柄索引为4,第二个是8. 创建内核对象 当进程初次被初…
读书笔记--[计算机病毒解密与对抗] 目录: 遍历进程&线程程序 终止进程 获取进程信息 获取进程内模块信息 获取进程命令行参数 代码运行环境:Win7 x64 VS2012 Update3 遍历系统中所有进程 #include <stdio.h> #include <windows.h> #include <TlHelp32.h> int main() { // 为进程的所有线程拍个快照 HANDLE hSnapshort = CreateToolhelp32…
转自:http://www.cnblogs.com/wz19860913/archive/2008/08/04/1259807.html 每个线程都有一个“优先级”,范围是0-31,0为最低优先级,31为最高优先级.当系统决定哪个线程需要调度的时候,首先查看是否存在优先级为31的可调度线程,如果存在,就从中选择一个进行调度.当该线程的时间片到达之后,系统查看是否存在另一个优先级为31的可调度线程,如果存在,就调度它. 只要有一个可调度的优先级为31的线程存在,那么系统绝对不会调度优先级为0-30…
PspCidTable存放着系统中所有的进程和线程对象,其索引也就是进程ID(PID)或线程ID(TID).先通过它来看看windbg里的HANDLE_TABLE结构: 可以看到地址 0x83f41bc4中存放的内容是 0x 8da010a8,这是系统的_HANDLE_TABLE的结构. 好了,现在windbg是得到HANDLE_TABLE结构了,还是要代码实现的.这里只简单用一下加偏移: //system进程的eprocess地址 PEPROCESS EProcess = (PEPROCESS…
linux下进程的最大线程数.进程最大数.进程打开的文件数   ===========最大线程数============== linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_THREADS_MAX这个限制可以在 /usr/include/bits/local_lim.h 中查看对 linuxthreads 这个值一般是 1024,对于 nptl 则没有硬性的限制,仅仅受限于系统的资源这个系统的资源主要就是线程的 stack 所占用的内存,用 ulimit -s 可以查看默认…
原文发表于百度空间,2009-02-28========================================================================== 句柄是Windows对象管理中引入的一个东西,它的实际意义是对象在句柄表中的索引.Windows2000使用的是固定的三层句柄表,而WindowsXP和Windows2003都是使用的动态可扩展的三层句柄表,这是一种很优秀的结构,易扩展,且查找迅速,值得学习.通常情况下每个进程的句柄表都是一级表,当句柄数超过…
ceSetThreadPriority 一直採用SetThreadPriority,结果今天发帖询问线程时间问题,才突然顿悟...发现SetThreadPriority只设置248-255,也就是说就算是设为最高优先级,顶多是248....差好远呢...而ceSetThreadPriority的设置范围是0-255,最高为0!!!我就说我的线程设置的优先级怎么没什么用......NYYD... 初始化代码中的关键 Win32 API 调用是对 CeSetThreadPriority 的调用.此函…
操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进程创建.撤销.阻塞.唤醒.... 0.2 线程模型 为什么引入线程 线程的组成 线程机制的实现 用户级线程.核心级线程.混合方式 1. 进程的基本概念 1.1 多道程序设计 允许多个程序同时进入内存运行,目的是为了提高CPU系统效率 1.2 并发环境与并发程序 并发环境: 一段时间间隔内,单处理器上…
GDT的由来:     在Protected Mode下,一个重要的必不可少的数据结构就是GDT(Global Descriptor Table). 为什么要有GDT?我们首先考虑一下在Real Mode下的编程模型:在Real Mode下,我们对一个内存地址的访问是通过Segment:Offset的方式来进行的,其中Segment是一个段的Base Address,一个Segment的最大长度是64 KB,这是16-bit系统所能表示的最大长度.而Offset则是相对于此Segment Bas…
1.举个栗子 1.1.知乎一形象例子 [摘自知乎]比如说十几年前,马化腾在写QQ,假设他那个时候不懂多进程多线程.然后他就开始写啦,这玩意儿不简单吗,不就是用户输入什么,把信息打包发到另一个用户,再显示出来,卧槽,太简单,2天就能写完一个字符界面的qq! 然后想当然的写出如下伪代码: while(1): wait for user input send user input by UDP/TCP display incoming messages end while 这个代码很简单,就是不断地查…
python自动化开发学习 进程, 线程, 协程   前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这样反复执行下去,表面上看每个任务都是交替执行的,但是由于CPU速度太快,让我们觉得所有任务是在同时执行一样.真正的并行执行多任务只能在多核CPU上,但是由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把多任务轮流调度到每个核心上运行. 多任务的实现有三种方式: 多进程模式 多线程模式 多…
原文发表于百度空间,2009-03-31========================================================================== 理论结合实践,这是我一贯的学习方法~~实验目的:以实验的方式观察PspCidTable的变化,从中了解Windows句柄表的分配过程.实验器材:Windbg,RunIt(一个可控的不断创建线程的程序),DebugView知识回顾: 如图所示,句柄表的结构根据TableLevel来确定:TableLevel为0…
一.socket(单链接) 1.socket:应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面:也有人将socket说成ip+port,ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序,ip地址是配置到网卡上的,而port是应用程序开启的,ip与port的绑定就标识了互联网中独一无二的一个应用程序:而程序的pid是同一台机器上不同进程或者线程的标…
Exercise1 源代码阅读 1.基本头文件:types.h param.h memlayout.h defs.h x86.h asm.h mmu.h elf.h types.h:仅仅是定义uint, ushort, uchar pde_t别名: typedef unsigned int uint; typedef unsigned short ushort; typedef unsigned char uchar; typedef uint pde_t; parame.h 利用宏定义了进程最…
本文基本内容 多道技术 进程 线程 协程 并发 多线程 多进程 线程池 进程池 GIL锁 互斥锁 网络IO 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串行 导致资源浪费 多道技术的目的就是让多个程序并发执行 同时处理多个任务 提高计算机效率 1.1 空间复用 时间复用 空间复用 指的是 同一时间 内存中加载多个不同程序数据, 每个进程间内存区域相互隔离,物理层面的隔离 时间复用 切换+保存 切换条件 1 一个进程执行过程中遇到了IO操作 切换到其他…