(原书)所有内核空间共享,DriverEntery是内核程序入口,在内核程序被加载时,这个函数被调用,加载入的进程为system进程,xp下它的pid是4.内核程序的编写有一定的规则: 不能调用windows运用层API函数 很多C标准函数失去意义,如printf,fopen,fwrite等,它们有专门的内核函数 很多单纯的C标准,如string.h(不涉及I/O及网络等)等还是适用 可以使用标准C语言,但是用浮点数之前要特殊处理 WDK提供大量System Routine以供调用,相当于运用层…
1)Windows运用程序的文件与注册表操作进入R0层之后,都有对应的内核函数实现.在windows内核中,无论打开的是文件.注册表或者设备,都需要使用InitializeObjectAttributes来初始化一个OBJECT_ATTRIBUTES结构体: VOID InitializeObjectAttributes( [out] POBJECT_ATTRIBUTES InitializedAttributes, //OBJECT_ATTRIBUTES的指针 [in] PUNICODE_ST…
1)跳入到基础篇的内核编程第7章,驱动入口函数DriverEnter的返回值决定驱动程序是否加载成功,当打算反汇编阅读驱动内核程序时,可寻找该位置. 2)DRIVER_OBJECT下的派遣函数(分发函数)指针的个数为:IRP_MJ_MAXINUM_FUNCTION,保存在一个数组中,编写驱动程序,实质上就是自己编写处理I/O请求IRP包的派遣函数,可以使用for循环将所有的派遣函数注册到同一个派遣函数.分发函数类似MFC消息机制中的回调函数,它的名字也是程序员自定义的,但是参数确定.卸载函数通过…
---恢复内容开始--- 1) C++的"高级"特性,是它的优点也是它的缺点,微软对于使用C++写内核程序即不推崇也不排斥,使用C++写驱动需注意: a)New等操作符不能直接使用,如果要使用,必须进行重载. b)标准C接口的声明,在包含头文件以及入口例程的前面要声明extern "C" c)类的静态成员函数的使用:在类内部声明一个静态函数作为分发函数Dispatch,这个静态函数当做普通的C函数调用,而C++声明的非静态函数调用该函数进行分配. 这一部分读下来,其…
1) 基础篇是讲理论的,先跳过去,看不到代码运行的效果要去记代码是一个痛苦的事情.这里先跳入探索篇.其实今天的确也很痛苦,这作者对驱动开发的编译与调试环境介绍得太模糊了,我是各种尝试,对这个环境的搭建还是不够理想,这里稍微做下笔记. 2)概念:普通运用程序开发在R3,而内核开发在R0,R0是最高特权等级.内核空间不同于普通的程序代码空间,独享4GB寻址过程,内核空间被所有的运用程序共享,一旦内存程序崩溃,系统将崩溃,导致蓝屏或者重启. 3) 开发与调试方案:基于上述的概念,调试内核程序是一个很要…
1)驱动中使用到的线程是系统线程,在system进程中.创建线程API函数:PsCreateSystemThread:结束线程(线程内自行调用)API函数:PsTerminateSystemThread:关闭线程句柄API函数:ZwClose.以下代码忽略同步问题 线程函数: void MyThreadProc(PVOID context) { PUNICODE_STRING str = (PUNICODE_STRING)context; //打印字符串 KdPrint(("PrintInMyT…
1)使用如下自定义函数获取自系统启动后经历的毫秒数:KeQueryTimeIncrement.KeQueryTickCount void MyGetTickCount(PULONG msec) { LARGE_INTEGER tick_count; ULONG myinc = KeQueryTimeIncrement(); //返回每次时钟中断,系统时间增加的纳秒数 KeQueryTickCount(&tick_count); //返回自系统启动以来经历的定时器中断次数 tick_count.Q…
1)驱动中的字符串使用如下结构: typedef struct _UNICODE_STRING{ USHORT Length; //字符串的长度(字节数) USHORT MaximumLength; //字符串缓冲区长度(字节数) PWSTR Buffer; //字符串缓冲区 }UNICODE_STRING,*PUNICODE_STRING; 这个为UNICODE字符串,一个字符占用双字节.对应的有Ansi字符串: typedef struct _STRING{ USHORT Length; /…
1) Debug版本算法反汇编,现有如下3×3矩阵相乘的程序: #define SIZE 3 int MyFunction(int a[SIZE][SIZE],int b[SIZE][SIZE],int c[SIZE][SIZE]) { int i,j; ; i < ; i++ ) { ; j < ; j++ ) { c[i][j] = a[i][]*b[][j] + a[i][]*b[][j] + a[i][]*b[][j]; } } ; } Debug版本汇编后为: #define SIZ…
1) Debug与Release的区别:前者称调试版,后者称发行版.调试版基本不优化,而发行版会经过编译器的极致优化,往往与优化前的高级语言执行流程会大相径庭,但是实现的功能是等价的. 2) 如下for循环语句: int MyFunction(int a,int b) { int c = a + b; int i; ; i < ; i ++ ) { c = c + i; } return c; } Debug版汇编后代码为: int MyFunction(int a, int b) { //省略…
1. Debug模式下,VC++6.0下断点运行,按CTRL+F11可查看汇编代码:另外可以用cl /c /FAs YourCppFile.cpp命令行在同目录生成YourCppFile.asm汇编文件. 2. Push将32位操作数压入堆栈,esp指向栈顶,故esp减去4(字节=32位,在64位机器上则是8).记住:esp为栈顶指针,堆栈越高,这个值越小.由于Intel处理器采用小端存储模式,故当PUSH一个寄存器(如EBP)的值0012FFB4时,先存低字节再存高字节,即堆栈从栈顶向下应该是…
这篇是计算机中Windows Mobile/Symbian类的优质预售推荐<Windows内核安全与驱动开发>. 编辑推荐 本书适合计算机安全软件从业人员.计算机相关专业院校学生以及有一定C语言和操作系统基础知识的编程爱好者阅读. 内容简单介绍 本书的前身是<天书夜读--从汇编语言到Windows内核编程>和<寒江独钓--Windows内核安全编程>. 与Windowsclient安全软件开发相关的驱动程序开发是本书的主题. 书中的程序使用环境从32位到64位.从Win…
国内有关于windows内核驱动这块的书籍实在是甚少,不过好在<windows内核安全与驱动开发>这本书还算不错(内容方面),但是不得不说这本书在许多地方存在着一些细节上的问题.比如我今天要谈的这个话题. 在这本书的键盘过滤这个章节,作者对ObReferenceObjectByName个函数的用法做了介绍,并指明这是一个非文档化函数(可以用,但是在MSDN的文档中以及SDK的头文件中没有公开出来).这个函数的具体结构如下: NTSTATUS ObReferenceObjectByName( I…
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 7.1&7.2&7.3 串口的过滤 一.设备绑定的内核API 进行过滤的最主要的方法是对一个____进行绑定. 我们可以首先认为:一个真实的设备对应一个_____.通过编程可以生成一个__的____,并绑定到一个___的设备上.一旦绑定,则本来操作系统发送给____的请求,就会发送到____上. 一个简单的API绑定函数是_____,必须是有____的设备,才能使用这…
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 一.内核上机指导 二.内核编程环境及其特殊性 2.1 内核编程的环境 2.2 数据类型 2.3 重要的数据结构 2.4 函数调用 2.5 Windows的驱动开发模型 2.6 WDK编程中的特殊点 三.字符串与链表 3.1 字符串操作 3.2 内存与链表 3.3 自旋锁 四.文件.注册表.线程 4.1 文件操作 4.2 注册表操作 4.3 时间与定时器 4.4 线程与事件 五.应用与内核通信 5.1 内核方面的编程 5.2 应用方面…
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 2.3 重要的数据结构 一.驱动对象  Windows内核采用__的编程方式.Windows内核认为许多东西都是__,比如一个驱动.一个设备.一个文件,甚至其他的一些东西. 与应用程序开发不同,Windows内核模块并不生成一个进程,只是填写一组__函数让Windows来调用,而这组__必须符合Windows内核规定. Windows中很多组件都拥有自己的__,比如:所有的硬件驱动程…
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 3.1 字符串操作 一.字符串的初始化 1. 判断下列代码为什么会蓝屏? UNICODE_STRING str = { }; wcscpy(str.Buffer, L"hello world!"); str.Length = str.MaximumLength = wcslen(L"hello world!") * sizeof(WCHAR);…
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 3.2 内存与链表 1. 尝试生成一个链表头并将其初始化. 2. 尝试向内存中申请两个链表结点,并且初始化该结点,将该结点插入到链表中,其数据结构如下. typedef struct { LIST_ENTRY list_entry; INT id; }StuInfo,*PStuInfo; 3. 遍历“问题2”中生成的链表,并调用 DbgPrint 打印出来. 4. 将问题2中的链表清…
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发>4.1 文件操作 从 C:\a.txt 中读取一部分内容并利用 DbgPrint 输出. #include <ntifs.h> //提供一个卸载函数,让程序能卸载,如果没有这个函数,驱动将不能卸载. VOID UnDriver(PDRIVER_OBJECT driver) { KdPrint(("卸载驱动成功")); } //入口函数,相当于main.…
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发>4.3  时间与定时器 一.获取自系统启动以来的毫秒数 /* 函数作用:求自操作系统启动以来所经历的毫秒数 参数1 mesc: 计算结果(毫秒) */ void MyGetTickCount(PULONG msec) { LARGE_INTEGER tick_count; ULONG myinc = KeQueryTimeIncrement(); // 获取滴答数 KeQueryTic…
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 4.4 线程与事件 一.开辟一个线程,参数为(打印内容+打印次数),利用线程实现打印.(申请堆内存防止栈清空) #include <ntifs.h> typedef struct { int num; UNICODE_STRING str; }MyContext, * PMyContext; static KEVENT event; // 全局变量中定义一个事件 /* 函…
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发>  5.1&5.2 内核与应用方面的编程 一.生成控制设备 如果一个驱动需要和应用程序通信,那么首先要生成一个_____. ____和____构成了整个操作系统的基本框架. ____暴露给了应用层,应用层可以像操作__一样操作它. 一般而言,用于和应用程序的设备往往用来"控制"这个内核驱动,所以往往称之为____. 作为一个控制设备,一般需要____,而普通…
1.返回状态 绝大部分的内核api返回值都是一个返回状态,也就是一个错误代码.这个类型为NTSTATUS.我们自己写的函数也大部分这样做. NTSTATUS MyFunction() { NTSTATUS status; -. return status; } 如果碰到一个函数返回了奇特的NTSTATUS值,正确的方法是在WDK的头文件比如(NTSTATUS.h)中去寻找答案. 2.字符串 驱动里的字符串一般用这个结构来容纳. typedef struct _UNICODE_STRING{ US…
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 一.内核编程注意细节: 在头文件中使用的是 <ntddk.h>,而非普通的 <windows.h>. 在应用层编程时,在内核编程时,要使用自己的WDK文档.https://docs.microsoft.com/zh-cn/windows-hardware/drivers/?redirectedfrom=MSDN 二.获取未公开API的方法: 特征码搜…
系统线程: 在驱动中生成的线程一般是系统线程,系统线程所在的进程名为“System”,用到的内核API函数是: NTSTATUS PsCreateSystemThread( OUT PHANDLE ThreadHandle, IN ULONG DesiredAccess, IN POBJECT_ATTRIBUTES objectAttributes OPTIONAL, IN HANDLE ProcessHandle OPTIONAL, OUT PCLIENT_ID ClientId OPTION…
/* 1.基本的驱动数据结构 //驱动对象结构体 typedef struct _DRIVER_OBJECT { CSHORT Type; //结构类型 CSHORT Size; //结构大小 PDEVICE_OBJECT DeviceObject; //驱动设备对象 PDRIVER_EXTENSION DriverExtension; //驱动扩展指针 UNICODE_STRING DriverName; //驱动程序的名字 PDRIVER_UNLOAD DriverUnload; //驱动的…
一.Mac  OS  X内核编程开发官方文档: I/O Kit Fundamentals: I/O Kit基础 - Mac OS X系统内核编程 https://developer.apple.com/library/mac/#documentation/devicedrivers/conceptual/IOKitFundamentals/index.html Threading Programming Guide:MAC OS X 线程编程指南 - Mac OS X系统内核编程 http://…
windows系统磁盘文件存储: 分区格式:NTFS / FAT32 GetSystemDirectory();//获取系统路径 GetWindowsDirectory();//获取windows路径 GetCurrentDirectory();//获取当前工作文件夹 SetCurrentDirectory();//改动当前工作文件夹 CreateFile/ReadFile/WriteFile/GetFileSize/SetFilePointer //返回文件大小的低32位 DWORD GetF…
//设置字体颜色 SetTextColor(hdc,RGB(255,0,0)); //窗体背景 //wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); //wce.hbrBackground=CreateSolidBrush(RGB(0,0,255)); //设置字体背景 SetBkColor(hdc,RGB(0,0,200)); //设置字体背景模式 SetBkMode(hdc,TRANSPARENT);//字体背景透明 //创建字体,成功返回字体,失败返回…
Windows进程 进程是一个容器,包括程序运行须要的代码.数据.资源等信息, windows进程的特点: 每一个进程都有自己的ID号 每一个进程都有自己的地址空间.进程之间无法訪问对方的地址空间. 每一个进程都有自己的安全属性 每一个进程至少包括一个线程. 获取和释放环境信息 GetEnvironmentStrings FreeEnvironmentStrings 获取或设置 本程序的环境变量 GetEnvironmentVariable SetEnvironmentVariable 演示样例…