内核知识第六讲,内核编写规范,以及获取GDT表

一丶内核驱动编写规范

 我们都知道,在ring3下,如果我们的程序出错了.那么就崩溃了.但是在ring0下,只要我们的程序崩溃了.那么直接就蓝屏了.

那么有那些规范?

    1.最基本的检查要有. 比如检查指针是否为NULL,基本的校验错误必须有

    2.对内存进行操作的时候,要进行内存判断.下面提供内存判断的API

    

BOOLEAN
MmIsAddressValid(
IN PVOID VirtualAddress
);

给定一个缓冲区,然后检查其内存是否有效

  

VOID
ProbeForWrite(
IN CONST VOID *Address,
IN SIZE_T Length,
IN ULONG Alignment
);

给定一个缓冲区.然后检查是否可以写. 但是注意,检测的是ring3下的内存地址.

     3.尽量不要使用太大变量,因为在内核中.内存地址都是共享的.如果你使用了很大.那么相应的内核空间就会变少.

   比如不能这样写  char szBuf[0x1000];这样是使用栈内存了.但是编译是不通过了.操作系统不让你这样使用.

    但是你可以写成 char szBuf1[0x500], char szBuf2[0x500]; 但是没有任何意义.

    4.ring0下不能直接访问ring3的内存

    这个是有原因的.因为ring0知道一块物理内存.但是不知道是那个进程的.所以不能直接访问.

二丶分页内存与非分页内存管理

我们在内核下申请空间的API:

  

PVOID
ExAllocatePool(
IN POOL_TYPE PoolType,    //指定内存的类型
IN SIZE_T NumberOfBytes    //申请的字节数
);

但是第一个参数是我们制定内存的内容是一个结构体

typedef enum _POOL_TYPE {
NonPagedPool,      //非分页管理
PagedPool,        //分页管理
NonPagedPoolMustSucceed,
DontUseThisType,
NonPagedPoolCacheAligned,
PagedPoolCacheAligned,
NonPagedPoolCacheAlignedMustS
} POOL_TYPE;

然后类型中有个非分页管理以及分页管理,什么意思?

意思就是在内核中申请一块内存,这块内存可否与磁盘交互.

非分页内存:  不可以进行交互.申请了这块内存就不能动了.

分页内存:      可以进行交互.当内存资源紧张的是否,而这块内存很少是否.可以暂时放到磁盘.

操作系统的代码都是放到非分页内存中的.

三丶设置分页内存

了解了分页内存和非分页内存.那么此时就产生了一个新的问题.

我们的代码.有的只调用一次,不该占着这个空间不放.那么我们就要设置为分页内存中.

关键字:

  总共两种方式:

   

.#pragma code_seg("PAGE")  //每个函数都加上,设置到PAGE节中

例如:

  

但是这种方式,很麻烦,且每写一个函数都要设置.那么此时就有第二种方式

.#pragma Alloc_text("PAGE",函数名,.....) //类似于一个数组一样,可以设置多个.

  但是此时就要注意了.我们就需要一个头文件了.把我们的函数声明都放到头文件中.

  然后下方设置.

Page节,和INIT节. 内核中,我们编写的sys驱动程序,其实也是一个PE文件.  类似于我们的ring3下的DLL, ring3的DLL是给应用程序使用的.而sys则是给操作系统使用的. 只不过一个是3环一个是0环

Page节: 这个节则是我们说的分页内存节. 我们给了函数指针.那么就代表这块内存很自由了.操作系统可以在资源紧张的时候使用.

INIT节:  这个节则是初始化的节.例如我们的入口函数,只用一次初始化而已,不用占着内存.所以给INIT节中.那么操作系统会初始化之后释放这块内存.这样可以留给其它驱动使用.

四丶设置内核代码运行的CPU在那个核心上跑.并获取出来每个核心的GDT表.

代码:

  

int shift = ;
char szGDT[];
nCount = KeQueryActiveProcessors();//获取CUP核心个数,按位来算.
while(shift != 0x80000000)
{
if (nCount & shift)
{
KeSetSystemAffinityThread(nCount & shift);//设置在那个线程跑
__asm
{
sgdt szGDT
}
KdPrint(("limit:%p GDT:%p\n", *(short*)szGDT, *(int*)(szGDT + )));
} shift <<= ;
}

内核知识第六讲,内核编写规范,以及获取GDT表的更多相关文章

  1. 内核知识第八讲,PDE,PTE,页目录表,页表的内存管理

    内核知识第八讲,PDE,PTE,页目录表,页表的内存管理 一丶查看GDT表. 我们通过WinDbg + 虚拟机可以进行双机调试.调试一下看下GDT表 我们知道,GDT表中.存储的是存储段信息. 保存了 ...

  2. 内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

    内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式. 一丶IDT解析. 我们知道.IDT表中存放着各种中断信息.比如当我们调用int 3的时候,则会调用IDT表中的第三项来进行调用. 而函数 ...

  3. Linux基础知识第六讲,远程管理ssh操作

    目录 Linux基础知识第六讲,远程管理ssh操作 一丶什么是SSH 1.什么是SSH 2.了解域名跟端口 二丶SSH命令以及远程连接linux进行维护 1.ssh命令格式 2.scp远程终端拷贝文件 ...

  4. 64位内核开发第六讲,Windbg调试ring3跟Ring0.一起调试

    目录 驱动第六讲_Windbg连续调试Ring3.与Ring0 一丶Windbg连调试 驱动第六讲_Windbg连续调试Ring3.与Ring0 一丶Windbg连调试 有时候我们调试一个程序.可以使 ...

  5. Docker背后的内核知识(一)

    Docker背后的内核知识 当谈论Docker时,常常会聊到Docker的实现方式.很多开发者都知道,Docker容器本质上是宿主机上的进程.Docker通过namespace实现了资源隔离.通过cg ...

  6. Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质

    原文:Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质 Linux内核分析(六) 昨天我们对字符设备进行了初步的了解,并且实现了简单的字符设备驱动,今天我们继续对字符设备的某些方 ...

  7. 64位内核开发第二讲.内核编程注意事项,以及UNICODE_STRING

    目录 一丶驱动是如何运行的 1.服务注册驱动 二丶Ring3跟Ring0通讯的几种方式 1.IOCTRL_CODE 控制代码的几种IO 2.非控制 缓冲区的三种方式. 三丶Ring3跟Ring0开发区 ...

  8. 内核第三讲,进入ring0,以及编写第一个内核驱动程序.

    内核第三讲,进入ring0,以及编写第一个内核驱动程序. PS: 请下配置双机调试,下方有可能用到.如果不配置,则你可以不用调试, 博客连接: http://www.cnblogs.com/iBina ...

  9. LINUX内核分析第六周学习总结——进程的描述和进程的创建

    LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...

随机推荐

  1. android 去掉activity的切换动画

    在styles.xml文件中增加样式代码: <style name="AppTheme" parent="Theme.AppCompat.Light.NoActio ...

  2. RIDE 接口自动化请求体参数中文时报错:“UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 9......”

    在进行robotframework  接口自动化,在请求体参数中输入中文会报以下错误: UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 ...

  3. TaxonKit - A cross-platform and Efficient NCBI Taxonomy Toolkit

    https://github.com/0820LL/taxonkit Usage: https://bioinf.shenwei.me/taxonkit/usage/

  4. windows 性能监视器常用计数器

    转载地址:https://www.jianshu.com/p/f4406c29542a?utm_campaign=maleskine&utm_content=note&utm_medi ...

  5. tomcat的缺少tcnative-1.dll的解决

    tomcat启动出现如下问题: The APR based Apache Tomcat Native library which allows optimal performance in produ ...

  6. 小白的CTF学习之路2——二进制数据基础与运算(上)

    今天的第二更,被我拖到了傍晚,嘿嘿,二进制这方面让本就数学不好的我很头疼,所以研究了一段时间 在学习之前我们先了解几个问题: 32位是几个字节? 01011100对于十进制是多少? 00001111向 ...

  7. spring中的aop演示

    一.步骤(XML配置) 1.导包4+2+2+2 2.准备目标对象 3.准备通知 4.配置进行织入,将通知织入目标对象中 <! -- 3.配置将通知织入目标对象> 5.测试 二.步骤(注解配 ...

  8. Android逆向之smali

    Android逆向之smali 头信息 smail文件前三行 .class <访问权限> [关键修饰字] <类名>; .super <父类名>; .source & ...

  9. C# Autofac集成之Framework WebAPI

    Web API 2集成需要Autofac.WebApi2 NuGet包. Web API集成需要Autofac.WebApi NuGet包. Web API集成为控制器,模型绑定器和操作过滤器提供了依 ...

  10. Microsoft在8月7号发布的帮助文档更新中,HelpLibrary2安装Cab文档包出现签名问题

    在VS 2017 8月2号发布15.7.6版本后,在8月7号推送了helpview程序中的绝大部分更新文档,在本次推送中多数Cab文件出现了无法进行安装的签名问题, 不论是单个下载,还是删除本地所有已 ...