内核与驱动_02_API收集

API使用规则

  • 在Windows中API分为用户层API和内核层API,在用户层中,无法直接调用内核层API,实际上,绝大部分的用户层API在最底层都会通过ntdll.dll切换到内核层,间接调用内核层的API。
  • 在内核层编程中,不能调用用户层的API,也就是说,像是创建文件就不能使用CreateFile,创建进程不能使用CreateProcess,在内核层中会提供内核版本的创建文件、创建进程等的API。

内核API命名规则

  • Windows操作系统的内核使用C编写,但是使用了面对对象的思想,在系统内核中,它将不同的API分成了不同的组件,每个API名称前都会带有一个组件的名称前缀,如下所示:
函数前缀所属组件或函数的说明
Cc缓存管理器
Cm配置管理器(注册表)
Dbg/Kd调试支持函数
Ex执行体函数
FsRtl文件系统驱动程序
Fstub文件系统引导接口函数
HalHAL提供的接口函数
IoI/O管理器
ke内核函数
Lpc本地过程调用(LPC)函数
Mm内存管理器
Ntwindows系统服务
Ob对象管理器
Perf日志记录函数
Po电源管理器
Pp即插即用管理器
Ps进程/线程
RawRAW文件系统函数
Rtl内存运行时库函数
Se安全函数
Vf驱动程序检验器哈桑农户
WmiWindows管理器规范
Zw和Nt前缀同名的一套函数,省去了参数验证的步骤,其它逻辑相同,可以认为以Nt前缀为名称的函数针对用户模式的调用者,以zW前缀为名称的函数针对内核模式的调用者

一些字符串操作API

  • 这些API用于操作内核特有的字符串UNICODE_STRING结构
函数名功能
RtlInitUnicodeString初始化字符串,此函数不会分配空间
RtlFreeUnicodeString销毁字符串
RtlCopyUnicodeString拷贝字符串
RtlAppendUnicodeStringToString追加字符串
RtlCmpareUnicodeString比较字符串
RtlUnicodeStringToInteger字符串转数字
RtlIntegerToUnicodeString数字转字符串
Kdprintf输出

部分Ex-系列函数

Ex-系列函数名功能
ExAllocatePoolWithTag内存分配,相当于malloc
ExFreePool内存释放,相当于free
ExAcquireFaseMutex获取一个快速互斥体,互斥体用于多线程同步
ExReleaseFaseMutex释放一个快速互斥体
ExRaiseStatus抛出一个异常,带有一个错误的status值,这个函数用于从代码很深的地方直接报错

部分Zw-及Nt-系列函数

Zw-系列函数名对应的Nt-函数功能
ZwCreateFileNtCreateFile打开文件(实际上也可以用于打开一个设备)
ZwWriteFileNtWriteFile写文件(实际上也可以用于发送请求给设备)
ZwReadFileNtReadFile读文件,同上
ZwQueryDirectoryFileNtQueryDirectoryFile目录查询
ZwDeviceIoControlFileNtDeviceIoControlFile发出设备控制请求
ZwCreateKeyNtCreateKey打开一个注册表键
ZwQueryValueKeyNtQueryValueKey读取一个注册表中的值

部分Rtl-系列函数

Rtl-系列函数名功能
RtlInitUnicodeString初始化一个字符串
RtlCopyUnicodeString拷贝字符串
RtlAppendUnicodeToString将一个字符串追加到另一个字符串后
RtlStringCbPrintf将字符串打印到另一个字符串中,相当于sprintf
RtlCopyMemory内存数据块拷贝
RtlMoveMemory内存数据块移动
RtlZeroMemory内存数据清零
RtlCompareMemory比较内存
RtlGetVersion获得当前windows的版本

部分Io-系列函数

  • 以Io-开头的系列函数非常重要,因为它们涉及到了IO管理器,IO管理器的作用就是将用户调用的API翻译成IRP,或者将等价请求发送到内核各个不同的设备的关键组件,这个类别的函数是我们在处理请求是最常调用的。
Io-系列函数功能
IoCreateFile打开文件,这个函数比ZwCreateFile更加底层
IoCreateDevice生成一个设备对象
IoCallDriver发送请求,实际上这个函数可能是IofCallDriver的以个别名。WindowsIo管理器调用这个函数把不同的IRP发送到不同的设备
IoCompleteRequest完成请求,实际上是通知IO管理器这个IRP已经完成了
IoCopyCurrentIrpStackLocationToNext将当前的IRP栈空间内容拷贝到下一个栈空间
IoSkipCurrentIrpStackLocationToNext跳过当前IRP栈空间
IoGetCurrentIrpStackLocation获得IRP的当前栈空间指针
  • :参考《Windows内核安全与驱动开发》
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值