
win内核
虚构之人
夫学须静也,才须学也,非学无以广才,非志无以成学。
展开
-
驱动ShellCode注入
【代码】驱动ShellCode注入。原创 2023-12-29 14:29:33 · 720 阅读 · 0 评论 -
VS双机调试
使用VS双机调试驱动原创 2023-11-21 15:17:09 · 1386 阅读 · 0 评论 -
Minifilter过滤驱动与R3程序通讯实现文件保护
实现保护文件或目录、R3层通过与过滤驱动通讯通知要保护的文件或目录,可执行创建不可删除或修改原创 2023-09-07 16:09:25 · 593 阅读 · 0 评论 -
Windows操作系统内存管理
Windows操作系统的内存管理机制概述原创 2022-06-21 16:39:56 · 947 阅读 · 0 评论 -
句柄与跨进程读写
跨进程读写内存#### 跨进程的本质跨进程的本质是进程挂靠正常情况下,A的进程的线程只能访问A进程的地址空间,如果A进程的线程想要访问B进程的地址空间,就要修改当前Cr3的值为B进程页目录表基值(KPROCESS.DirectoryTableBase).即:mov cr3,B.DirectoryTableBaseNtReadVirtualMemory API 流程解析:1.切换Cr32.将数据读复制到高2G3.切换Cr34.从高2G复制到目标位置该API功能是读取进程内存,原理是将目标原创 2022-05-19 22:08:07 · 651 阅读 · 0 评论 -
进程挂靠技术
进程与线程一个进程可以包含多个线程一个进程至少要有一个线程进程为线程提供资源,也就是提供Cr3值,Cr3中存储的是页目录表基址,Cr3确定了,线程能访问的内存也就确定了。线程代码:mov eax,dword ptr ds:[0x12345678]CPU解析过程:(1)CPU解析线性地址时要通过页目录表在找对应的物理页,页目录表基址存在 Cr3寄存器中。(2)当前的Cr3的值来源于当前的进程(_KPROCESS.DirectoryTableBase(+0x018))线程与进程的如何关联原创 2022-04-23 12:53:02 · 469 阅读 · 0 评论 -
Windows线程(模拟线程切换、主动切换、时钟中断切换、时间片管理、TSS、FS、线程优先级)
ThreadSwitch源码分析线程结构体(ThreadSwitch源码仿照EHREAD)typedef struct { char *name;//线程名 相当于线程TID int Flags;//线程状态 int SleepMillisecondDot;//休眠时间 void *InitialStack;//线程堆栈起始位置 void *StackLimit;//线程堆栈界限 void *KernelStack;//线程堆栈当前位置,也就是ESP void *lpParameter;/原创 2022-04-17 20:39:08 · 1980 阅读 · 0 评论 -
进程结构体
进程结构体EPROCESS每个windows进程在0环都有对应的结构体:EPROCESS这个结构体包含了进程所有重要的信息。使用windbg查看:dt _EPROCESSEPROCESS与PEB是有区别的:EPROCESS在0环PEB在3环。EPROCESS结构体属性(KPROCESS)+0x0 Pcb 是一个KPROCESS结构体Windbg查看KPROCESS:dt _KPROCESSKPROCESS第一个属性:+0x0 Header DISPATCHER_HEARDER只要是该DI原创 2022-03-17 16:17:10 · 5205 阅读 · 0 评论 -
PWT_PCD、中断与异常
PWT_PCD#### CPU缓存(1)CPU缓存位于是位于CPU与物理内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存快的多。(2)CPU缓存与TLB的区别:TLB:线性地址<------>物理地址CPU缓存:物理地址<---->内容PWT:Page Write ThroughPWT=1时,写Cache的时候也要将数据写入内存中。PCD:Page Cache DisablePCD=1时,禁止某个页写入缓存,直接写入内存。比如,做页表用的页,已原创 2022-03-17 16:15:52 · 634 阅读 · 0 评论 -
10-10-12分页与P/RW页属性
分页物理地址线性地址、有效地址、物理地址如下指令:MOV eax,dword ptr ds:[0x12345678]其中,0x12345678是有效地址ds.Base+0x12345678是线性地址如果Base是0则有效地址和线性地址是一样的。线性地址上述例子中0x12345678+ds.Base是线性地址。线性地址是不存在的真正的数据在物理地址,其中线性地址转换为物理地址是由CPU进行转换的。比如所有EXE里面的系统DLL其实都是存在于物理地址中,然后将对每个EXE都映射了一份线原创 2022-02-19 22:28:56 · 689 阅读 · 0 评论 -
中断门、陷阱门、任务段、任务门
中断门描述符中断门概述1.系统调用Windows没有使用调用门,但是使用了中断门。 Windows很多3环API最终都要使用0环的代码,是使用中断门实现的这种功能。注意:老的CPU是用的中断门而最新的CPU是使用的快速调用。2.调试在像OD这种调试工具中按F12下的断点就是将BYTE内容变为0xCC指令位int3这是中断门效果。中断门和调用门的区别中断门和调用门很相似他们最大的区别是查表的不同,调用门是使用的GDT表而中断门使用的是IDT表。IDT表概述IDT全名中断描述符表,原创 2022-02-13 16:50:38 · 5174 阅读 · 0 评论 -
段、GDT、调用门学习笔记
保护模式什么是保护模式x86 CPU的3个模式:实模式、保护模式、虚拟8086模式。AMD64与Intel64AMD在1999年的时候拓展了这套指令集,成为x86-64后改名叫AMD64,AMD是首先开发了64拓展,但是AMD的64位拓展并不支持32位,后来Intel也开发了64位拓展成为Intel64并首先做到了向下兼容32位。保护的特点段的机制、页的机制,段页机制主要是为了保护操作系统的数据结构,比如保护系统的GDT表和IDT表,关键寄存器比如CR0寄存器段寄存器结构什么是段寄存原创 2022-02-06 19:54:05 · 2306 阅读 · 0 评论 -
加壳与脱壳知识点(持续更新)
加壳与脱壳知识点1.壳的种类有几种壳分为压缩壳/加密壳/虚拟壳(1.1压缩壳)压缩壳调用压缩引引擎主要目的是对文件进行压缩减小文件大小(1.2)加密壳加密壳主要是保护软件防止被各种反跟踪技术来调试程序(1.3)虚拟壳虚拟技术应用到壳的领域,设计了一套虚拟机引擎,将原始的汇编代码转译成虚拟机指令,要理解原始的汇编代码,就必须对其虚拟机引擎进行研究,而这极大地增加了破解和逆向的难度及成本。2.常见的壳(2.1)压缩壳UPX、ASPack、PECompact(2.2)加密壳ASProte原创 2021-01-04 14:59:43 · 1624 阅读 · 0 评论 -
r3级与win内核通信数据例子
//r3代码#include <iostream>#include<Windows.h>using namespace std;#define CW_DEV_SYM L"\\\\.\\slbkcdo_3948d33e"#define CWK_DVC_RECV_STR \(ULONG)CTL_CODE( \FILE_DEVICE_UNKNOWN, \0x912,METHOD_BUFFERED, \FILE_READ_DATA)int main() { HANDLE原创 2020-11-09 16:14:33 · 288 阅读 · 0 评论 -
Windows应用程序控制内核简单例子(通讯)
//应用程序例子#include <iostream>#include<Windows.h>#define CW_DEV_SYM L"\\\\.\\slbkcdo_3948d33e"int main() { HANDLE device = NULL; device = CreateFile(CW_DEV_SYM,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM,0); if (devic原创 2020-11-08 16:56:29 · 329 阅读 · 0 评论 -
Win内核实现设备对象与符号链接(为应用层提供通讯)
#include<ntddk.h>#include<ntstrsafe.h>//提供一个Unload函数只是为了让这个程序能动态卸载VOID DriverUnload(PDRIVER_OBJECT driver) { DbgPrint("first:Our driver is unloading...\r\n"); }#define CWK_CDO_SYB_NAME L"\\??\\slbkcdo_3948d33e"PDEVICE_OBJECT g_co = {0};原创 2020-11-07 15:46:01 · 287 阅读 · 0 评论 -
Win内核使用线程同步事件例子
#include<ntddk.h>#include<ntstrsafe.h>//提供一个Unload函数只是为了让这个程序能动态卸载VOID DriverUnload(PDRIVER_OBJECT driver) { DbgPrint("first:Our driver is unloading...\r\n"); }struct ThreadStruct{ HANDLE ThreadHandle[20];//线程句柄 UNICODE_STRING str; N原创 2020-11-06 13:14:26 · 147 阅读 · 0 评论 -
Win内核系统线程例子
#include<ntddk.h>#include<ntstrsafe.h>//提供一个Unload函数只是为了让这个程序能动态卸载VOID DriverUnload(PDRIVER_OBJECT driver) { DbgPrint("first:Our driver is unloading...\r\n"); }struct ThreadStruct{ HANDLE ThreadHandle; UNICODE_STRING str; NTSTATUS th原创 2020-11-05 16:04:00 · 142 阅读 · 0 评论 -
Windows内核获取时间
#include<ntddk.h>#include<ntstrsafe.h>//提供一个Unload函数只是为了让这个程序能动态卸载VOID DriverUnload(PDRIVER_OBJECT driver) { DbgPrint("first:Our driver is unloading...\r\n");}PWCHAR GetTimeFunction() { LARGE_INTEGER snow, now; TIME_FIELDS now_fields;原创 2020-11-04 19:43:45 · 988 阅读 · 0 评论 -
Win内核模块实现注册表打开与读取
#include<ntddk.h>#include<ntstrsafe.h>//提供一个Unload函数只是为了让这个程序能动态卸载VOID DriverUnload(PDRIVER_OBJECT driver) { DbgPrint("first:Our driver is unloading...\r\n");}struct Regedit_Struct{ HANDLE handleKey; OBJECT_ATTRIBUTES object_attributes原创 2020-11-04 16:02:43 · 299 阅读 · 0 评论 -
Windows内核面试题(持续更新,目前完成度30%约1.8万字)
WINDOWS内核编程问题与答案1.WDK和SDK的区别是什么2.WDK全称叫做3.如何创建WDK程序4.WinDbg如何连接虚拟机5.Windows内核符号表的作用6.如何设置内核符号表与源文件7.如何设置断点与源码调试8.什么时候共享内核空间9.内核模块与驱动程序的区别是什么10.内核模块运行在什么空间11.PsGetCurrentProcessId函数的作用是什么12.System进程的作用是什么13.x64和x86操作系统的用户空间和内核空间的范围分别是多少14.WDK基原创 2020-11-03 17:08:05 · 2762 阅读 · 0 评论