自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 使用C++枚举WINDOWS计划任务-使用管理员启动获取全计划任务,否则获取部分计划任务

枚举计划任务

2022-10-14 14:52:08 1740

原创 APC

APC(异步过程调用)使用TerminiateThread函数是往对应线程发送APC消息,线程处理APC消息后自己结束线程ETHREAD结构中有两个APC队列,一个3环APC,一个0环APCAPC是个函数,被插入线程执行APC对列中都存放KAPC结构体QueueAPC这个API可以插入APC函数...

2021-03-14 19:04:50 198

原创 驱动-内核重载

内核重载读取ntkrnlpa.exe的PE文件,并展开加载到内存获取模块基址修复重定位修复新的SSDT表HOOK KiFastCallEntry函数代码// 准备工作// KeServiceDescriptorTable变量,声明就可以直接使用// 函数原型typedef NTSTATUS(NTAPI* FnZwOpenProcess)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PCLIENT_ID);typedef struc

2021-03-13 20:54:53 450

原创 进程、线程同步

用户层的线程同步1.原子操作将一条语句转换成了具有同等功能的单条汇编指令 lock(指令前缀)将代码内存锁定不让其他CPU同时读取这条代码,读取完后自动解锁只能给单个整数类型(4/8)进行保护,不能使一段代码变成原子操作InterlockedIncrement 自增InterlockedExchange 交换两个数2.临界区多行代码的原子操作一次只允许一个线程进入,直至线程离开拥有线程拥有者的概念,同一个线程可以不断的重新进入临界区,但是进入了多少次,就要退出多少。一旦拥有临界区

2021-03-13 17:51:51 113

原创 驱动-句柄表

句柄表当一个进程创建或者打开一个内核对象时,将获得一个句柄,通过这个句柄可以访问内核对象句柄存在的目的是为了避免在应用层直接修改内核对象只有进程才有句柄表,句柄表保存了进程中打开或创建的内核对象关闭句柄后,会在句柄表中删除对应的项值,并将内核对象引用计数+1进程关闭后,会清空句柄表,将内核对象引用计数-1句柄的值都是4的整数倍,所以将句柄的值/4得到索引,再在句柄表中找对应值得到实际内核对象地址因句柄表值是8字节,一个页4KB,句柄在512个以内是在一个页上,如果超过512个,句柄标会更改结

2021-03-13 12:08:20 533

原创 驱动-KPCR

KPCR(CPU控制区)KPCR存储CPU本身要用的一些重要数据:GDT、IDT以及线程相关的信息。当线程进入0环时,FS:[0]指向KPCR(3环时FS:[0] -> TEB)每个CPU都有一个KPCR结构体(一个核一个)windbg指令 dd KiProcessorBlock 查看KPCRKPCR结构体0x01c SelfPcr 指向KPCR自己0x020 Prcb 指向拓展的_KPRCB结构体0x038 IDT IDT表基址0x03c GDT GDT表基址0x040

2021-03-12 17:07:13 200

原创 驱动-线程

线程结构体ETHREADETHREAD第一个是0x22c Cid 进程ID与线程ID0x268 ThreadListEntry 当前进程中所有线程的双向链表nt!_ETHREAD +0x000 Tcb : _KTHREAD +0x200 CreateTime : _LARGE_INTEGER +0x208 ExitTime : _LARGE_INTEGER +0x208 KeyedWaitChain : _LIS

2021-03-12 15:21:19 381

原创 驱动-进程

进程结构体EPROCESS一个进程一个EPROCESS的第一个成员KPROCESS0xa0、0xa8 CREATETIME、EXITTIME 创建时间、退出时间0x0b4 UniqueProcessId 当前进程PID0x0b8 ActiveProcessLinks 所有的活动进程的双向链表0x0ec DebugPort 0x0f0 ExceptionPort 调试信息 DebugPort清0后无法调试0x0f4 ObjectTable 句柄表0x16c ImageFileName

2021-03-12 13:47:33 189

原创 驱动-系统调用

系统调用在用户层与内核层分别定义了一个_KUSER_SHARED_DATA结构体,用于用户层与内核层共享某些数据用户层地址为:0x7ffe0000内核层地址为:0xffdf0000虽然指向同一个物理页,用户层是只读的,内核层是可写的所有应用程序共享的,一改全部都会改如果调用函数,会调用0x7ffe0300是kifastsystemcall函数kifastsystemcall函数EAX放入调用号,edx是栈顶。MSR寄存器174-CS、175-ESP、176-EIP,SS是CS值+8

2021-03-11 18:46:35 402

原创 驱动-TLB

TLB因每次读线性地址最少需要查3次表,所以建立TLB缓存机制将同一页的线性地址与物理地址的对应关系缓存TLB结构,线性地址-物理地址-属性-统计使用频率CR3切换后TLB会被清空,如果PDE和PTE的G位为1不会被清空G位为1可以使用invlpg指令清空某一个TLB记录TLB分为大页与小页,大页小页又分为数据页与代码页检测线程读取的时候会放入数据页TLB中,代码的TLB改为自己的代码可以简单绕过线程检测,但是不稳定,TLB经常刷新可以HOOK系统API,jmp到自己的代码中,不影响功

2021-03-10 15:53:16 104

原创 驱动-TSS(任务段)

TSS是一块内存有104字节TR是一个段寄存器,从GDT表中的段描述符得来在Ring0,可以通过LTR指令去修改TR寄存器在Ring3,可以通过CALL FAR 或者 JMP FAR指令来修改cpu通过TR的base找到TSS TR的limit标识着TSS有多大...

2021-03-08 21:19:33 199

原创 驱动-陷阱门

陷进门陷进门与中断门差不多类型为F中断门与陷阱门都不能带参数中断门执行时会将EFLAG的IF置为0陷进门则不会将IF置为0

2021-03-08 16:51:03 107

原创 驱动-中断门

中断门IDT表中只存放中断门、任务门、陷阱门通过int触发 后面数字为IDT表索引type为Ewindbg指令R IDTR查看IDT表通过索引查看IDT表的段描述符通过段描述符的选择子找到GDT表对应下标的段描述符,将CS放入程序在中断门中无法使用RETF返回使用的是IRETD、IRET返回无权限切换PUSH CSPUSH EFLAGPUSH EIP有权限切换PUSH SSPUSH ESPPUSH EFLAGPUSH CSPUSH EIP...

2021-03-07 21:31:11 84

原创 驱动-调用门

调用门信息S位为0type为CDPL为3,必须比>=CPL使用有参数的调用门时,需要pushad与pushfd保存寄存器环境取参数时,需要esp+0x24+8为第一个参数0X24是pushad和pushfd,+8是返回地址与CS无参调用门的使用#include <stdio.h>#include <windows.h>// 门结构体typedef struct _CALLGATE { unsigned int offset1 : 16; unsign

2021-03-07 18:14:32 149

原创 驱动-代码跳转

段寄存器CS:代码段寄存器DS:数据段寄存器SS:堆栈段寄存器ES:附加段寄存器FS:在Ring3中fs:[0]的地址指向的是TEB结构在Ring0中指向一个称为KPCR的数据结构,即FS段的起点与KPCR结构对齐段寄存器读写除CS段外,其他段寄存器都是可以通过MOV、LES、LSS、LDS、LFS指令修改CS是代码段,修改CS地址必须同时修改EIP,必须使用跳转指令长跳转指令:JMP FAR、CALL FAR、RETF、INT、IRETED短跳转指令:JMP、CALL、

2021-03-07 16:31:34 141

原创 驱动-遍历驱动、隐藏驱动

//自定义消息#define Ergodicdrivelist CTL_CODE( FILE_DEVICE_UNKNOWN, 0x801, METHOD_IN_DIRECT, FILE_ANY_ACCESS )#define Hidedriver CTL_CODE( FILE_DEVICE_UNKNOWN, 0x802, METHOD_IN_DIRECT, FILE_ANY_ACCESS )// 遍历驱动void Ergodicdrivelistfun(PIRP Irp){ PIO_STACK_

2021-03-05 17:24:51 587

原创 驱动-与3环程序通讯

3环程序代码#include <stdio.h>#include <windows.h>// 定义自定义消息// 参数:设备类型,IOCTL码(自定义),读写方式,权限#define BufferWay CTL_CODE( FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS )#define DirectWay CTL_CODE( FILE_DEVICE_UNKNOWN, 0x802, METHOD_

2021-03-05 15:56:27 376

原创 驱动-MDL内存映射

MDL将内存中的值映射一份至指定的缓冲区// 1. 包含提供内核结构相关的头文件#include <ntddk.h>PMDL mdl;// 驱动卸载的回调函数,会在卸载的时候被调用VOID DriverUnload(PDRIVER_OBJECT DriverObject){ //释放MDL IoFreeMdl(mdl); UNREFERENCED_PARAMETER(DriverObject);}// 2. 提供驱动程序的入口函数NTSTATUS DriverEnt

2021-03-05 15:20:44 1231

原创 驱动-字符串与内存

字符串的使用// 0. 驱动是和系统相关的,需要设置目标系统// 设置项目属性中的目标系统版本为对应版本// 1. 包含提供内核结构相关的头文件#include <ntddk.h>//字符串结构体// typedef struct _UNICODE_STRING {// USHORT Length; // 字符串长度// USHORT MaximumLength; // 最大长度// PWSTR Buffer; // 字符串缓存区// } UN

2021-03-05 15:06:18 145 3

原创 驱动-分页机制

一、地址的划分逻辑地址: 通过段寄存器+偏移的形式表示的地址虚拟地址: 通过分段机制将逻辑地址转换成位于虚拟空间中的虚拟地址物理地址: 通过分页机制将虚拟地址转换成物理地址二、虚拟地址转物理地址(禁用 PAE 的情况)win7 默认开启 PAE,需要通过下面的指令关闭BCDEdit /set PAE ForceDisableBCDEdit /set NX AlwaysOffx86 环境下每一个进程都拥有自己的 4GB 虚拟地址空间并且每个进程都拥有自己的页目录表,通过 cr3 可以

2021-03-05 14:50:35 226

原创 驱动-分段机制

一、分段机制在 32 位保护模式下,段寄存器就不再直接保存段基址了,而是分为了 可见的 16 位段选择子 部分以及不可见的 80 位 高速缓存部分,对于需要访问的信息(基址、限长以及属性)都被保存在了不可见部分。这一部分的信息无法被人为的查看,由 CPU 自动加载。当段寄存器被修改的时候,CPU 会通过可见部分的段选择子从 GDT 或 LDT(windows没启用)中找到对应的段描述符,在进行权限检查后,将相关内容加载到告诉缓存部分。二、段选择子从下面的结构体可以知道,段选择子由 INDEX、TI 以

2021-03-05 14:36:38 274

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除