- 博客(23)
- 收藏
- 关注
原创 线程的被动切换——KiDispatchInterrupt & KiReadyThread&KiQuantumEnd逆向
时钟中断在IDT中的中断号为0x30,他的IRQL是28如果想获取当前的时钟间隔值,可使用API GstSystemTimeAdjustment当一个线程的时限用完或者发生被抢占的情况下也会会发生线程切换,可以称之为被动切换,时钟中断的服务例程由HAL 提供,它调用了内核模块的KeUpdateSystemTime 函数。当时钟中断到来时,线程调度器获得控制权并不是直接在时钟中断处理函数中,而是在KiDispatchInterrupt 函数中。线程抢占和时限用完都发生在 KiDispatch......
2022-08-05 06:53:16
439
原创 线程的主动切换——KiSwapThread&KiSwapContext逆向
线程的切换分为主动切换和被动切换两种方式主动切换主要是通过KiSwapThread进行的。
2022-08-04 05:47:40
1235
原创 线程的创建过程——PspCreateThread逆向分析
通过之前的分析NtCreateThread函数,可以看到线程的创建实际是在PspCreateThread中。在IDA交叉引用中可以看到仅仅被NtCreateThread和PsCreateSystemThread这两个函数调用,分别用于创建用户线程和系统线程对象。......
2022-08-01 05:58:16
1436
原创 _KPCR&_KPRCB
Windows 内核有个特殊的基本要求,当CPU运行在内核上时,FS会指向一个名为KPCR的结构体。从一个CPU 的KPCR 结构出发,可以直接或间接地找到与该CPU 有关的许多信息
2022-07-31 07:50:57
899
原创 攻防世界——MyDriver2-397
现在整个程序条理清楚了,HOOKNtCreateFile,在调用NtCreateFile7次以后,会把(加)解密的数组写入到打开的File中。所以可以判断sub_113C8中进行的操作就是获取flag。
2022-07-31 03:58:33
423
原创 攻防世界-IgniteMe
可以判断出长度为29,格式为EIS{…},如果任意一项不符合,程序打印Sorry,keeptrying!如果符合进入sub_402B30中。首先把数组中大写字母转为小写字母,小写字母转为大写字母。然后把数组与0x55异或后+72,然后再与数组byte_4420B0异或。执行结果为GONDPHyGjPEKruv{{pj]X@rF。.........
2022-07-30 06:33:16
858
原创 进程的创建过程——PspCreateProcess逆向
创建一个进程是通过NtCreateProcess开始执行的,它通过简单的对参数处理把任务交付给NtCreateProcessEx,然后NtCreateProcessEx检查ProcessHandle句柄是否可写,把真正的创建任务交给PspCreateProcess,所以PspCreateProcess才是真正的创建进程的函数。...
2022-07-30 02:07:55
735
原创 (EPROCESS/KPROCESS/ETHREAD/KTHREAD)进程与线程内核层中的结构
现代操作系统通过中央处理器进行任务执行的操作,通过把时间细分,在适当的时间粒度上轮流执行任务,每个任务都有机会进行执行。通过这种方式用户会认为系统的任务是在同时进行的,这种并行方式被称为伪并行,当然如果存在多个处理器,也可变成真并行。...........................
2022-07-27 05:42:55
1838
原创 KiFastCallEntry逆向&_KiSystemService 逆向
调用NTDLL下的系统服务存根函数时,会指定一个系统服务号,在内核下,会通过_KeServiceDescriptorTable查找到指定的系统服务例程。这个过程就是系统服务分发,系统服务分发主要通过SDT表进行分发,系统可支持多个SDT表,根据传入的系统服务号进行拆分,0-11位是号的索引,12位是表的索引号。..................
2022-07-17 15:38:17
510
原创 模式切换的流程
内核提供的服务都通过NTDLL模块被应用程序使用,使用方法为通过调用一组系统dll中的API,间接的通过ntdll的存根函数来调用内核提供的系统服务系统的服务例程运行在内核模式下,但是应用程序调用是在用户模式,如果想要使用则需要进行模式切换,这个切换工作在系统模块NTDLL中已经实现,依赖于硬件体系结构。...
2022-07-15 21:05:26
759
原创 应用与内核通信
驱动如果想和应用程序进行通讯,需要有设备对象,首先要先创建驱动对象;2.符号链接应用层是无法直接通过设备名字访问设备的,需要通过建立符号链接进行访问注意:符号链接得原理就是记录一个字符串对应到另一个字符串的一种简单结构,所以符号链接的方式并不安全,存在和其他驱动的符号链接发生冲突的情况下方式1:先进行尝试删除这个符号链接,如果存在就被删除了,如果不存在也无所谓,再创建方式2:使用GUID的方式来访问设备处理三环发送给设备对象的请求的函数,比如:OPEN,CLOSE,DEVICE CONTROL等
2022-07-12 23:22:26
193
原创 驱动对象初识
驱动程序:就是一个.sys模块,驱动对象:则是.sys被加载到内核中的实例化出来的对象, 用于表示这个驱动模块.type:驱动对象类型Size:驱动对象大小DeviceObject:设备对象DriverStart:驱动加载的位置DriverSize:模块大小DriverSection:一个结构体,未导出文档 _LDR_DATA_TABLE_ENTRYDriverExtension:驱动扩展对象,一个结构体DriverName:驱动名HardwareDatabase:驱动注册表路径Dri
2022-07-09 16:55:05
279
原创 第一个驱动程序
NT 驱动:最简单的驱动模型,不支持硬件特性;WDM驱动:WDM驱动是在NT驱动基础上引入的一套驱动模型,支持即插即用、电源事件等特性WDF驱动:WDF驱动是WDM驱动的封装和升级,屏蔽了部分细节,简化了大量接口.........
2022-07-08 21:54:54
252
原创 TLB&控制寄存器
处理器将最近使用过的页目录和页表项放在TLB中,在奔腾系列处理器中,数据和指令有各自的TLB,而且在P6系统处理器中,4MB和4GB的页有各自的TLB,CPUID指令可以用来得知TLB的大小。大部分分页操作都是用TLB中的内容进行的,仅当请求页时,进行地址转换所需要的信息不在TLB中。只有特权级为0的程序可以修改TLB是否有效,每当一个页目录或页表项发生变化(包括P位设置0),操作系统立刻修改TLB为无效,这样可以下次再引用这个项时更新它。...
2022-07-07 23:39:32
494
原创 PAE模式
PAE基址以及对36位物理寻址的支持,是在IA32架构的奔腾PRI处理器中采用的,如果想在IA32中实现这个特性通过CPUID指令的特性标志PAE(当CPUID指令源操作数2,EDX位6),CR4中的PAE标志可以开启PAE机制,将物理地址从32位扩展36位,所以需要地址总线增加4个。...
2022-07-07 23:03:04
815
原创 非PAE模式
逻辑地址和线性地址:在保护模式的架构下,处理器分两步进行地址转换获得物理地址:逻辑地址转换为线性地址,线性地址转换为物理地址逻辑地址:一个逻辑地址是由16位的段选择子和32位的偏移量组成线性地址:是处理器线性地址空间内的32位地址,线性地址与物理地址一样,是平坦的(不分段),空间大小2^32字节,地址0000 0000到FFFF FFFFmov eax,[0x12345678]16位:线性地址:(ds为2323)*16+offset32位下:平坦模式(ds.base为0),线性地址等于逻辑地址1
2022-07-07 22:11:37
136
原创 中断门&陷阱门介绍
IDT为每一个异常或中断向量对应的例程或任务分配了一个门描述符。同GDT和LDT一样,IDT也是由一些列描述符组成;和GDT不同的是第一个索引不是NULL描述符,异常或中断向量号乘以8即可得到IDT中的索引。...
2022-07-07 15:51:32
459
原创 段权限检查&代码跨段跳转
处理器的段保护机制可以识别4个特权级,从0-3。权值越大,特权越小环的中心(为具有最高特权级的代码,数据和栈保留)通常为关键性软件所有,如操作系统内核。外环的给不是很关键的软件使用。(使用2个特权级的系统应使用特权0和特权3)处理器使用特权级来防止低权限的进程访问具有高权限级别的段。当处理器检测到一个特权违例就会产生一个通用保护异常(GP)。......
2022-07-07 09:55:25
496
原创 段寄存器&段选择子&段描述符
充分利用了分段机制,提供了对代码,数据结构以及程序的硬件级保护,在这里每个进程(任务)都被分配了自己的段描述符以及自己的段,进程可以完全独自拥有这些分配到的段,也可以与其他进程共享这些段。单独的程序对段和执行环境的访问由硬件控制......
2022-07-05 09:31:33
1790
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人