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;