随笔分类 - Windows内核编程
摘要:7、I/O Request Package,输入输出请求包 1)基本概念 IRP 的全名是I/O Request Package,即输入输出请求包,它是Windows 内核中的一种非常重要的数据结构。上层应用程序与底层驱动程序通信时,应用程序会发出I/O 请求,操作系统将相应的I/O 请求转换成相应的IRP,不同的IRP 会根据类型被分派到不同的派遣例程中进行处理。 IRP有两个基本的属性,即M...
阅读全文
摘要:5、在驱动中获取系统时间1)获取启动毫秒数在ring3 我们可以通过一个GetTickCount 函数来获得自系统启动开始的毫秒数,在ring0也有一个与之对应的KeQueryTickCount 函数。不幸的是,这个函数并不能直接返回毫秒数,它返回的是“滴答”数,而一个时钟“滴答”到底是多久,这在不同的系统中可能是不同的,因此我们还需要另外一个函数的...
阅读全文
摘要:4、注册表操作和文件操作类似,在操作注册表之前需要首先打开注册表,获得一个句柄,这可以通过函数ZwCreateKey 完成。与ZwCreateFile函数类似,它通过一个OBJECT_ATTRIBUTES 获得需要创建或打开的路径信息,但在内核中这个路径与用户模式下不相同,实际上,因为用户模式下的应用程序总是由某个“当前用户”打开的,因此在用户模式下可以直接访问HKEY_CLASSES_ROOT 和HKEY_CURRENT_USER,但工作在内核模式下的驱动程序不属于任何一个用户,因此不能直接访问这两个根键。如果ZwCreateKey 指定的项不存在,则会直接创建该项,同时由函数的Dispos
阅读全文
摘要:1、字符串Unicode 字符串有一个结构体定义如下:typedef struct _UNICODE_STRING {USHORT Length; // 字符串的长度(字节数)USHORT MaximumLength; // 字符串缓冲区的长度(字节数)PWSTR Buffer; // 字符串缓冲区} UNICODE_STRING, *PUNICODE_STRING;需要注意的是,当我们定义了一个...
阅读全文
摘要:3、文件读写在ring3 我们可以使用CreateFile、ReadFile 、WriteFile 等API,在ring0 同样很相似,不过函数变成了ZwCreateFile、ZwReadFile、ZwWriteFile 等内核函数。1)ZwCreateFile与ring3的CreateFile函数有所不同,它不能直接将需要打开或创建的文件路径传递过去,我们必须首先填写一个OBJECT_ATTRI...
阅读全文
摘要:NT式1、Driver.h头文件中包含了开发NT式驱动所需要的NTDDK.h,此外还定义了几个标志来指明函数和变量分配在分页内存还是非分页内存中。Windows驱动程序的入口函数是DriverEntry函数。WDM式的驱动程序要导入的头文件是WDM.h。代码说明:1)采用C++编程,所以需要用extern "C",因为我们导入的是C的函数的符号表。2)在驱动中用到的变量或函数都需要指定分配在分页或...
阅读全文
摘要:了解机器码 X86所有指令的机器码长度不定,且连续排列,因此读取机器码的唯一方法是从头开始逐条解析指令。 nop指令是单字节,可以用作填充替换长指令后的多余区域。 XDE32反汇编引擎。 关于进一步机器码的构成分析,可以看[6]。 CPU权限级与分页机制 Intel的x86通过ring级别进行访问控制,共分四级。R0最高,R3最低。现在的操作系统只分两级R0和R3.R0代表内核态,R3代表用户态。...
阅读全文
摘要:Windows内核(一).sys放在Drivers目录下。运行在R0层。在WDK的相应环境中,进行相应代码目录,build.一个内核程序被看作一个PE格式的DLL,它是被Windows整个内核调用的一个DLL,一旦加裁,就成为内核的组成部分。所有的内核内存空间是共享的。内核程序崩溃,Windows系统也就崩溃了。DriverEntry是一个内核程序的入口,以system进程名出现。编写内核的规则:...
阅读全文
摘要:内核线程在驱动中生成的线程一般是系统线程。系统线程所在的进程名为“System”。NTSTATUSPsCreateSystemThread(OUT PHANDLE ThreadHandle,IN ULONG DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,IN HANDLE ProcessHandle OPTIONAL,OUT PCLIENT_ID ClientId OPTIONAL,IN PKSTART_ROUTINE StartRoutine,IN PVOID StartContext);线程的结束应该在线程中自己
阅读全文
摘要:汇编部分1、call 的本质相当于push+jmp,ret的本质相当于pop+jmp。2、Windows中,不管哪种调用方式都是返回值放在eax中,然后返回。外部从eax中得到值。3、Ebp总是被我们用来保存这个函数执行之前的esp的值。4、把局部变量区域初始化成全0cccccccch,0cch实际是int 3 指令的机器码,这是一个断点中断指令。5、任何一段中间不加任何跳转,连续的mov和加减乘...
阅读全文