您的位置:首页 > 编程语言

Windows内核安全编程基础知识(一)

2012-06-11 21:18 525 查看
PsGetCurrentProcessId等到当前进程的进程号。
1.、基本数据类型
普通类型-------------------------------------------对应内核类型
unsigned long ------------------------------------ULONG
unsigned char ------------------------------------UCHAR
unsigned int --------------------------------------UINT
voiid ------------------------------------------------VOID
unsigned long * -----------------------------------PULONG
unsigned char * -----------------------------------PUCHAR
unsigned int ----------------------------------------PUINT
void * -----------------------------------------------PVOID

2、返回状态 一般返回类型为NTSTATUS,NT_SUCCESS(NTSTATUS status)这个宏判断是否成功。 常用的返回值:
STATUS_SUCCESS 成功
STATUS_INVALID_PARAMETER 错误的参数等 STATUS_INSUFFICIENT_RESOURCES 资源不足
STATUS_PENDING 请求未决
STATUS_BUFFER_OVERFIOW 缓冲区长度不够
STATUS_BUFFER_TOO_SMALL 缓冲区长度不够

3、字符串 字符串一般用结果来容纳,结构定义:
typedef struct_UNICODE_STRING{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
}UNICODE_STRING *PUNICODE_STRING;

例子:UNICODE_STRING str=RTL_CONSTANT_STRING(L"AAAAAAAAAAA!"); DbgPrint("%wZ", &str); int用%d ,char用%c,UNICODE_STRING指针用%wZ。

4、常用函数类型: Io- Ex- Rtl- Ke- Zw- Nt- Ps- Ndis- Wdf- 系列函数______________________________________________________________
ExAllocatePool分配内存
ExFreePool内存释放 。
ExAcquireFastMutex获取一个快速互斥体,互斥体用于多线程环境下的同步。 ExReleaseFastMutex释放一个快速互斥体 。
ExRaiseStatus抛出一个异常,带有一个错误的status值,这个函数用于代码很深的地方直接报错。 ________________________________________________________________
Zw系列函数 对应Nt系列函数 解释
ZwCreateFile NtCreateFile 打开文件(也可以打开一个设备) ZwWnteFile NtWnteFile 写入文件(也可以发送请求给设备) ZwReadFile NtReadFile 读,同上
ZwQueryDirectoryFile NtQueryDirectoryFIle 目录查询 ZwDeviceloControlFIle NtDeviceloControFile 发送设备控制请求 ZwCreateKey NtCreateKey 打开一个注册表键 ZwQueryValueKey NtQueryValueKey 读取一个注册表中的值 _________________________________________________________________
RtlInitUnicodeString 始化一个字符串
RtlCopyUnicodeString 复制字符串
RtlAppendUnicodeToString 将一个字符串焊接到另一个字符串后
RtlStringCbPrintf 打印字符串
RtlCopyMemory 内存数据拷贝
RtlMoveMemory 内存数据移动
RtlZeroMemory 内存数据清零
RtlCompareMemory 比较内存
RtlGetVersion 获取当前Windows的版本 ___________________________________________________________________
IoCreateFile 打开文件,这个函数比较ZwCreateFile要更加底层 。
IoCreateDevice 生成一个设备对象 。
IoCallDriver 发送请求,实际上这个函数可能是IofCallDriver的一个别名,WindowsIO管理器调用这个函数把不同的IRP发送到不同的设备 。
IoCompleteRequest 完成请求。这实际上是通知IO管理器这个IRP已经完成了。 IoCopyCurrentIrpStackLocationToNext 跳过当前IRP的栈空间所向拷贝到下一个栈空间 。
IoSkipCurrentIrpStackLocationToNext 跳过当前IRP的栈空间 。

5、内核代码主要调用源的运行环境
DriverEntry,DriverUnIoad,单线程,这两个函数有系统进程的单一线程调用。不会出现多线程同时调用的情况。
各种分发函数,多线程,分发函数不会和DriverEntry并发,但可能和DriverUnIoad并发。
完成函数,多线程,完成函数随时可能被未知的线程调用。
各种NDIS回调函数,多线程,和完成函数相同

内核代码主要调用源的运行中断级
DirverEntry,DriverUnload Passive级
各种分发函数 Passive级
完成函数 Dispatch级
各种NDIS回调函数 Dispatch级

6、常用的宏 #define IN #define OUT 这样IN和OUT被定义成空了,用来作为函数的说明。
#pragma alloc_text(INIT , DriverEntry)
#pragma alloc_text(PAGE , NdisProtUnload)
#Pragme alloc_tex(PAGE , NdisProtOpen)
#pragma alloc_text(PAGE , NdisProtClose)
这个宏#pragma alloc_text指定某个函数的可执行代码在编译出来后在sys文件中的位置。内核模块编译出来之后是一个PE格式的sys文件,代码段(text段)中有不同的节(Section),常用的3种节: INIT节在初始化完毕之后就被释放,不在占用内存空间。 PAGE位于可以进行分页交换的内存空间,可以交换到硬盘上。 未指明默认位于PAGELK节,加载后位于不可分页交换的内存空间中。 PAGED_CODE()错误测试。
2012年6月10日
qq:634938543 本文出自 “^_^” 博客,请务必保留此出处http://y5023.blog.51cto.com/750445/895691
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: