自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Windows内核学习笔记

有花堪折直须这,莫待无花空折枝

  • 博客(34)
  • 问答 (1)
  • 收藏
  • 关注

原创 2021-08-16

APC的本质线程是不能被杀死 挂起和恢复的,线程在执行的时候自己占据着CPU,别人怎么可能控制他呢?举个极端的例子,如果不调用API,屏蔽中断,并保证代码不出现异常,线程将永久占据CPU。所以说线程如果想结束,一定是自己执行代码把自己杀死,不存在别人把线程结束的情况。那如果想改变一个线程的行为该怎么办?可以给他提供一个函数,让他自己去调用,这个函数就是APC,即异步过程调用APC队列我们现在需要讨论是的,如果我给某一个线程提供一个函数,那么这个函数挂在哪里?答案是APC队列,先来看一下当前线程的结构

2021-08-24 02:00:47 678

原创 4、wrk软件的使用

API函数开头的含义

2021-07-27 22:26:17 150

原创 3、HOOK的封装

_KUSER_SHARED_DATAkd> dt _KUSER_SHARED_DATAnt!_KUSER_SHARED_DATA +0x000 TickCountLowDeprecated : Uint4B +0x004 TickCountMultiplier : Uint4B +0x008 InterruptTime : _KSYSTEM_TIME +0x014 SystemTime : _KSYSTEM_TIME +0x020 TimeZoneB

2021-07-26 16:27:04 244

原创 2、逆向分析KiFastCallEntry

sysenter指令做了那些事情在 Ring3 的代码调用了 sysenter 指令之后,CPU 会做出如下的操作:1. 将 SYSENTER_CS_MSR 的值装载到 cs 寄存器 1742. 将 SYSENTER_EIP_MSR 的值装载到 eip 寄存器 1763. 将 SYSENTER_CS_MSR 的值加 8(Ring0 的堆栈段描述符)装载到 ss 寄存器。4. 将 SYSENTER_ESP_MSR 的值装载到 esp 寄存器 1755. 将特权级切换到 Ring06. 如果

2021-07-23 16:02:33 285

原创 11、OpenProcess

neg指令neg指令详细解释规则:neg reg (对寄存器操作)neg mem(对内存操作)作用:将目的操作数的所有数据位取反加1影响的标志:进位标志(CF),零标志(ZF),符合标志(SF),溢出标志(OF),辅助进位标志(AF),奇偶标志(PF)当操作数为0时,置CF位为0当操作数不为0时,置CF位为1sbb指令sbb是带借位减法指令,它利用了CF位上记录的借位值。指令格式:sbb 操作对象1,操作对象2功能:操作对象1=操作对象1-操作对象2-CF比如指令sbb ax,b

2021-07-18 18:58:02 275

原创 7、驱动通信封装

1.R3环境下需要修改的设置,相当于静态编译,把运行库打包到我们的dll或者dll里面,这样别人调用就不用运行库了;否则生成的dll需要运行库

2021-07-16 01:03:18 101

原创 3、工具的使用方法

工具的使用1.剥离进程在代码界面,鼠标右键

2021-07-13 11:49:50 153

原创 6.1、3环程序和0环驱动的通信

驱动设备对象结构体//Defined in ntddk.h // STRUCT PDEVICE_OBJECT typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT { CSHORT Type; USHORT Size; LONG ReferenceCount; //驱动设备对象被引用了多少次 st...

2021-07-10 17:26:30 347

原创 2、DLL注入

一、简单注入Dll#include <Windows.h>void Inject(int, const char*);int main(){ Inject(19172, "D:\\vc++\\DLL\\Dll1\\Debug\\Dll1.dll"); return 0;}void Inject(int pID,const char* Path){ //打开进程 HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS,

2021-07-09 06:59:31 224

转载 1、DLL 动态链接库基础知识

所谓的库,就是程序员把一些常用的函数写在一个文件内,以方便其它程序调用。库分为两种,静态链接库和动态链接库。静态链接库,就是在链接时把库文件链到自己的程序内,也就是整合成一个exe文件。但是这样有一个缺点,就是我们把所有内容都加在这个程序中,使得程序体积增大。如果每个应用程序都用静态链接库的话,那么每个程序的体积都将很大。这是非常浪费硬盘空间的。动态链接库就可以解决这样的问题。他是在程序运行的时候动态地把这个库加载到应用程序的地址空间中,而无需在程序链接时加入程序中,这样程序和dll文件实际上是分离的,

2021-07-08 19:15:52 198

转载 ObReferenceObjectByName函数使用解析

一、由于ObReferenceObjectByName没有文档化,故在使用前先做声明:#ifdef __cplusplus extern "C" { #endif #include <NTDDK.h> NTKERNELAPI NTSTATUS ObReferenceObjectByName( IN PUNICODE_STRING ObjectName, IN ULONG Attributes, IN PACCESS_STAT

2021-07-08 16:48:31 871

转载 LARGE_INTEGER 大整数

一、LARGE_INTEGER(large大 integer整数)这里解释前面碰到的LARGE_INTEGER结构。与可能的误解不同,64位数据并非要在64位操作系统下才能使用。在VC中,64位数据的类型为__int64。定义写法如下:__int64 file_offset; //文件偏移上面之所以定义的变量名为file_offset,是因为文件中的偏移量是一种常见的要使用64位数据的情况。同时,文件的大小也是如此(回忆上一小节中定义的文件大小)。32位数据无符号整型只能表示到4GB。而众所周

2021-07-08 16:16:18 1092

原创 win7-32、驱动模块遍历、驱动模块隐藏

打印日志前缀,过滤掉不是我们的日志,只会显示我们自己的日志

2021-07-08 04:57:23 871

转载 HOOK SSDT 实现内核级的进程保护

SSDT Hook效果图加载驱动并成功Hook NtTerminateProcess函数:当对 指定的进程进行保护后,尝试使用“任务管理器”结束进程的时候,会弹出“拒绝访问”的窗口,说明,我们的目的已经达到:SSDT简介SSDT 的全称是 System Services Descriptor Table,系统服务描述符表。这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来。SSDT 并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息

2021-07-07 14:03:47 576

转载 RMB系统调用4、SSDT

一、回顾前两篇博客,我逆向分析了 KiSystemService 和 KiFastCallEntry 填充_KTRAP_FRAME 结构体的代码,二者大同小异,主要的区别是 sysenter 只改了eip,cs,ss,虽然esp也改了,但是windows不使用,而是从TSS里取esp0;另外sysenter并没有像中断门那样压栈,所以3环的 ss, esp, eflags, cs,eip都要在函数里依次保存到 _KTRAP_FRAME 。这次课后作业是逆向 KiSystemService / KiFas

2021-07-06 19:09:54 258

原创 应用层InLine HOOK

exe程序在xp下运行需要设置的地方// ConsoleApplication6.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <Windows.h>typedef int(__stdcall *MessageBox_type)(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);MessageBox_type old_MessageBoxA; //定

2021-02-28 21:02:28 95

原创 IAT HOOK编程

// ConsoleApplication4.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <Windows.h>VOID __stdcall mySleep(DWORD m); //要跳转到HOOK函数PVOID EnumAPI(); //枚举IAT表中的API函数int _tmain(int argc, _TCHAR* argv[]){ EnumAPI(); Sleep(111); system("pause

2021-02-28 17:23:26 142

原创 驱动程序文件操作

驱动程序文件操作测试.cpp#ifdef _cplusplus{#endifextern "C"#include <ntddk.h>#include<wdm.h>#include "驱动程序文件操作测试.h"#ifdef _cplusplus}#endif// 创建文件函数 1.文件路径字符串NTSTATUS createFile(const PCWSTR fileName){ HANDLE hFile = { NULL }; // 定义一个句柄

2021-02-28 15:56:51 240

原创 读取SSDT原函数地址,读取SSDT当前函数地址,检查是否被HOOK

读取SSDT原函数地址#ifdef _cplusplus{#endifextern "C"#include <ntddk.h>#ifdef _cplusplus}#endifnamespace Name2{ typedef struct _ServiceDescriptorTable { PVOID ServiceTableBase; //System Service Dispatch Table 的基地址 PVOID ServiceCounterTable;/

2021-02-27 16:23:18 219

原创 驱动过游戏保护基础知识点

A、引用KeServiceDescriptorTable表 B、通过ServiceTableBase+偏移读出当前函数地址 C、用windbg测试读取的值系统服务描述符表 在ntoskrnl.exe导出KeServiceDescriptorTable 这个表typedef struct _ServiceDescriptorTable { PVOID ServiceTableBase; //System Service Dispatch Table 的基地址

2021-02-27 16:20:35 1842 1

原创 驱动下的异常处理

#include <ntddk.h>void assert_test(){ int* p = NULL; ASSERT(p != NULL); //判断条件为假抛出断言,也可以手动强制抛出断言ASSERT(FALSE) return;}void erroe_test(){ int *p = NULL; //空指针只能读不能写 int i = 100; __try { //这里如果出错 发出异常 *p = 1; } __except (1) {

2021-02-27 13:59:47 213

原创 驱动中使用链表sys

#include <ntddk.h>//给节点定义一个结构类型,这里定义为结构体类型typedef struct _strNode{ LIST_ENTRY Entry; //Windows自己提供的 LIST_ENTRY结构双向循环链表 int x; //调用LIST_ENTRY 结构时,一定要把它写在第一位,数据域写在它的下面,不然会导致蓝屏!! int y;}Node, *pNode;//建立链表pNode SetNode(void){

2021-02-27 11:14:08 106

原创 认识链表结构exe

A、链表结构B、链表的初始化C、在链表中插入数据(结点)D、链表的遍历链表:链表有单向链表,也有双向链表,有循环的(环形),在这里我们只讨论 双向循环链表。双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。认识链表结构 typedef struct node{ struct node R; struct node L; i

2021-02-27 10:19:35 67

原创 内核操作相关API

1、RtlCopyMemory 、RtlCopyBytes、RtlMoveMemory;2、RtlZeroMemory、RtlFillMemory;3、RtlEqualMemory;4、ExAllocatePool、ExFreePool;5、New(重载)、Delete操作符一、内存的复制与移动1、RtlCopyMemory作用:把一个缓冲区的内容复制到另一一个缓冲区。VOID RtlCopyMemory( IN VOID UNALIGNED *Destination, IN

2021-02-26 23:47:38 758

原创 驱动中的内存管理

A、 物理内存B、 虚拟内存C、 Ring0地址和Ring3地址D、 驱动程序和进程的关系E、 分页和非分页内存F、 分配内核内存以下概念针对 32位Windows操作系统(32位及以上的CPU)A物理内存:(Physical Memory Address)目前主流的操作系统还是32位的XP,而32位的系统提供的寻址能力是232个字节,用户最多可以使用4GB的真实物理内存。0-0xFFFFFFFF 2G+0.5G+0.1 (2.75-3.25) 2GB虚拟内存:(Virtual Memo

2021-02-26 22:42:50 622

原创 NT式驱动的卸载

NT式驱动的卸载A、卸载驱动流程B、内核函数DeleteServiceC、内核函数ControlServiceD、构建UnLoadSys函数E、测试并查看调试信息一、卸载驱动流程1、用OpenSCManager函数打开 服务控制管理器,取得SCM句柄,如果返回NULL,则结束,否则继续2.//hSCM2、用OpenService打开相应的服务,如果返回NULL,则结束,否则继续3.hSerVice3、用ControlService停止驱动服务,如果返回NULL,只有重新启动才能,再动态加载

2021-02-26 22:29:50 200

原创 NT式驱动的安装-1

一丶加载内核驱动的常用API介绍.加载内核驱动,使用我们的ring3下的API即可完成.API分别是:OpenSCManager 打开设备(服务)管理器CreateService  创建服务(或者设备,根据参数不同而不同)OpenService   打开设备或者服务.StartService 启动服务,启动设备.ControlService 控制设备或者服务的状态.CloseServiceHandle 关闭服务或者设备的句柄DeleteService

2021-02-26 21:30:24 406

原创 2、段寄存器属性探测--Windows内核学习笔记

1、1.1、想要成功的访问一块内存,必须具备2个条件:段机制、页机制1.1、段寄存器是96位,里面的属性决定了段能不能读,能不能写的属性1.2、应用层访问的地址不能超过0x7fffffff,因为这是页的机制,2、Winodws特权保护机制–80386的中断和异常–80386的保护机制–Windows的保护机制80386以后的处理器有3种模式 实模式、保护模式、虚拟8086模式只有再保护模式下,32位的CPU寻址才能达到4GB的地址空间,同时,也能实现多任务、内存分页管理和优先级保护

2021-01-19 15:45:27 183

原创 1、保护模式--Windows内核学习笔记

1、基础1.1、万丈高楼平地起,只有打下坚实的基础,才能长远1.2、多半毁于浮躁1.3、做好眼前的事情,基础扎实了,再向后走1.4、遵守法律法规,拒绝从事非法相关的工作1.5、一定要按照要求走,尤其是课后作业2、2.1、段寄存器有96位,其中16位是可见部分,80位是不可见部分2.2、CS是代码段寄存器,SS是堆栈段寄存器,需要配对使用...

2021-01-18 16:07:12 146 1

原创 7、代码间的跳转(跨段跳转)--Windows内核学习笔记

1、短调用–指令格式:CALL 立即数/寄存器/内存–CALL指令的作用:指令执行之前,先把下一行指令的地址,压入堆栈中,相当于PUSH进去,PUSH完成后会把后边的值写入到EIP中,所以这个指令执行后的效果如下图:–通常一个函数执行完毕后,会用RET指令进行返回 ,RET指令相当于POP EIP,将返回值的地址弹到EIP中,然后ESP加42、长调用(跨段不提权)–指令格式:CALL CS:EIP(EIP是废弃的,只是为了保证语法的兼容)–当一个CALL后面跟了六个字节,那这个CALL就是一个

2021-01-18 15:21:11 521

原创 6、代码间的跳转--Windows内核学习笔记

1、代码间的跳转(段间跳转、非调用门值类的)1、同时修改CS和EIP的指令 JMP FAR/CALL FAR/RETF/INT/IRETED 2、只改变EIP的指令 JMP/CALL/JCC/RET 3、JMP 0x20:0x004183D7 CPU如何执行这行代码? -首先JMP后面跟了6个字节,分别是0020:004183D7 -0x0020是两个字节,0x004183D7是第四个字节 -如果是这样的话 JMP 0x004183D7,CPU直接修改EIP的值,不需要查表 -JM

2021-01-17 01:57:04 218

原创 5、段权限检查--Windows内核学习笔记

1、D\B位置1、D\B位加载到不同的段寄存器中,性质是不一样的 情况一、当段描述符是代码段描述符的时候,对CS段的影响因为cpu是向下兼容的,保护模式是32位,实模式是16位 D = 1 采用32位寻址方式 D = 0 采用16位寻址方式 前缀67改变默认的寻址方式 情况二、当段描述符是数据段描述符的时候,对SS段的影响 D = 1 隐式堆栈访问指令(PUSH POP CALL)使用32位堆栈指针寄存器ESP D = 0 隐式堆栈访问指令(PUSH POP CALL)使用1

2021-01-16 20:12:22 139

原创 4、段描述符属性--windows内核学习笔记

1、段描述符*p = 1 段描述符有效,p = 0 段描述符无效,(高4位也就是第二个字节的最高位>=0x8)2、段描述符与段寄存器的关系struct SegMent{ WORD Selector; // 段选择子 16位 可见 WORD Attributes; // 段属性 16位 不可见 只有少数几个属性位是有效的 DWORD Base // 段起始地址 32位 不可见 仅对于FS和GS有效 DWORD Limit // 段大小 32位 不可见 仅对于FS和GS

2021-01-16 11:18:24 214

原创 3、段描述符与段选择子--windows内核学习笔记

3、段选择子*段选择子就是一个十六位的数*RPL = 请求特权级别,占用两位,有00、01、10、11四种肯能*TI = 0 查询GDT表,TI = 1 查询LDT表*剩下的十三位称之为“索引”,查询在GDT表中的哪一项比如:0x23 拆分后为RPL = 11bTI = 0bIndex = 100b(Index转换为十进制也就是4,所以也就是查询DGT表中的第五项,下标为4的数据)*段选择子就是用来选择段描述符的,找到正确的段描述符,然后段描述符中的数据最终回写入到段寄存器中*当我

2021-01-15 17:05:21 215

空空如也

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

TA关注的人

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