[驱动]第二章学习笔记

InitialiazeObjectAttributes:通过一个对象路径获得该对象的对象属性结构

ExAllocatePool:申请一段内存

ExFreePool:释放申请到的一段内存

内核页保护汇编:

开启页保护:
__asm{
mov eax,cr0         /*将cr0寄存器赋值到eax寄存器*/
or eax,10000h         /*或上一个cr0中的控制着页保护关闭的位*/
mov cr0,eax         /*将修改好的eax寄存器赋值回cr0寄存器*/
sti                 /*开启中断*/
}

关闭页保护:
__asm{
cli                 /*关闭中断 防止线程切换*/
mov eax,cr0         /*将cr0寄存器赋值到eax寄存器*/
and eax,not 10000h /*与上一个cr0中的控制着页保护关闭的位*/
mov cr0,eax         /*将修改好的eax寄存器赋值回cr0寄存器*/

}


磁盘文件操作:

    memset:清空一个结构体变量

    ZwCreateFile:创建或打开一个文件,参数一返回此文件的文件句柄

    ZwClose:关闭一个文件句柄

    ZwQueryInformationFile:查询一个文件属性

    ZwSetInformationFile:写入一个文件属性(属性记住|=)

    ZwReadFile:读出一个文件内容

    ZwWriteFile:写入一个文件内容

    strlen:取出一段字符串长度


注册表操作:

    ZwCreateKey:创建或打开一个注册表项

    ZwOpenKey:打开一个注册表项

    ZwSetValueKey:打开一个注册表键值

    ZwQueryValueKey:查询一个键值

    ZwQueryKey:查询一个表项

    ZwEnumerateKey:遍历表项

    ZwEnumerateValueKey:遍历键值

    ZwDeleteKey:删除一个表项

(部分API的某些参数,结构参数长度不同,这就需要调用2次该API,首次调用目的获取结构真实长度,调用成功后,需要判断,NTSTATUS 是否等于 STATUS_BUFFER_OVERFLOW 或 STATUS_BUFFER_TOO_SMALL ,如果等于则达到我们的目的,获取到了结构的真实长度,再用此长度去第二次调用这个API,即可完成调用。另外,取到的真实长度,需要用到申请内存来操作。)


进程、内存操作:

    ZwOpenProcess:通过一个进程ID或进程设备名(大多为空)来返回一个进程句柄

    ZwAllcateVirtualMemory:在指定进程中申请一段内存

    PsLookProcessByProcessId:通过一个进程ID得到该进程的进程对象


文本操作:

    strstr:在参数一中寻找参数二的文本

    stricmp:比较两个字符串或数组不区分大小写是否相同?(不确定)

编程语句:

    定义函数指针:

定义:typedef 函数返回值类型 (*函数指针名)(参数);

调用:((函数指针名)函数指针)(参数)


SSDT操作:

#pragma pack(1)//设置1字节对齐 节省内存
typedef struct ServiceDescriptorEntry {
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase; //仅适用于checked build版本
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()
_declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;

猜你喜欢

转载自blog.csdn.net/u012088909/article/details/80423815