Loading... ## 字符串操作 ``` // 内核中一般不再采用 C 语言风格的字符串,原因是可能会出现溢出问题 // 下面的字符串结构体就是内核中所采用的表示字符串的方式,没有使用 // 空字符结尾,而是通过其中的一些字段进行描述。 typedef struct _UNICODE_STRING { USHORT Length; // 字符串长度 USHORT MaximumLength; // 最大长度 PWSTR Buffer; // 字符串缓存区 } UNICODE_STRING, * PUNICODE_STRING; ``` | 函数名 | 功能 | | - | - | | RtlInitUnicodeString | 初始化字符串 | | RtlFreeUnicodeString | 销毁字符串 | | RtlCopyUnicodeString | 拷贝字符串 | | RtlAppendUnicodeStringToString | 追加字符串 | | RtlCmpareUnicodeString | 比较字符串 | | RtlUnicodeStringTpInter | 字符串转数字 | | RtlIntegerToUnicodeString | 数字转字符串 | | Kdprint | 输出调试信息 | | 操作 | C语言 | 内核 | | - | - | - | | 申请内存 | malloc | ExallocatePool | | 拷贝内存 | memcpy | RtlCopyMemory | | 填充内存 | memset | RtlFillMemory | | 释放内存 | free | ExFreePool | ``` PVOID heapA = NULL PVOID heapB = NULL; heapA = ExallocatePool(PagedPool,0xA1); heapB = ExallocatePool(NonPagedPool,0xB1); RtlZeroMemory(pheapA,0xA1); RtlZeroMemory(pheapB,0xA1); //填充空间 将前0x10个字符填充为0xff RtlFillMemory(heapA,0x10,0xff); /拷贝堆空间,将heapB的前0x15个字节拷贝到HeapA RtlCopyMemory(heapA,heapB,0x15) //释放空间 ExFreePool(heapA) ExFreePool(heapB) ``` ## MDL-对内存重新映射 内存描述符表是Windows未公开的结构体,可以通过Windows提供的函数使用此结构将内存重新映射,并指定我们自己的内存属性。 当对内存操作的时候需要对其他内存空间操作,可以使用MDL | 函数 | 功能 | | - | - | | IoCreateMDL | 创建MDL-旧函数 | | IoAllocateMdl | 创建MDL-新函数 | | MmProbeAndLockPages | 锁定分页内存 | | MmBuildMdlForNonPagedPool | 建立MDL描述 | | MmMapLockedPages | 将内存映射到内核空间或者用户空间 | | MmUnmapLokedPages | 取消映射 | | MmUnlockPages | 取消锁定 | | IoFreeMdl | 释放MDL | ``` PMDL pMdl; Pmdl = MmCreateMdl( NULL, //内存描述符列表 pAddr, //内存地址 Len //长度 ) MmbuildMdlForNonPagePool(pMdl);//建立内存页的MDL描述 pMdl->MdlFlahs = pMdl->MdlFlahs|MDL_MAPPED_TO_SYSTEM_VA;//将MDL标记为科协 PVOID pVirtualAddr = (PVOID)MmMapLockedPages(pMdl.KernelModle);//映射MDL空间 MmUnmapLockedPahes(pVirtualAddr,pMdl);//反映射 IoFreeMdl(pMdl); //释放MDL ``` ## 文件操作 在内核层,需要在路径前面加上\\\??\\. | 函数名 | 功能 | | - | - | | ZwCreateFile | 创建或者打开一个文件 | | ZwOpenFile | 打开一个已经存在的文件 | | ZwSetInformationFile | 设置文件属性 | | ZwQueryInformationFile | 查询文件属性 | | ZwWriteFile | 写文件 | | ZwRiteFile | 读文件 | | ZwDeleteFile | 删除文件/文件夹 | | InitializeObjectAttributes | 初始化对象属性结构体 | ## 进程操作 | 函数 | 描述 | | - | - | | PsGetCurrentProcess | 获取当前进程的EPROCESS | | PsSuspendProcess | 暂停进程 | | PsResumePocess | 恢复进程 | | ZwTerminateProcess | 结束进程 | | ZWOpenProcess | 打开进程 | | PsLookupProcessByProcessId | 根据进程ID获取EPROCESS | | KeStackAttachProcess | 依附进程 | | KeUnstackDetachProcess | 接触依附 | | PsGetProcessPeb | 获取进程PEB | ## EPROCESS | 字段 | 含义 | | - | - | | KPROCESSPcb | KPROCESS结构体 | | EX_PUSH_LOCK ProcessLock | 操作EProcess时的锁 | | LARGE_INTEGER CreateTime | 进程的创建时间 | | LARGE_INTEGER ExitTime | 进程退出时间 | | HANDLE UniqueProcessId | 进程ID | | List_ENTRY ActiveProcessLinks | 进程链 | | DebugPort | 调试端口 | | PEB | 进程PEB地址 | | PHANDLE_TABLE ObjectTable | 句柄表 | | EX_FAST_REF Toke | 进程的令牌 | ## KPROCESS 常见的字段 | 字段 | 含义 | | - | - | | DISPATCHER_HEADER Hander | 每一个可被等待的内核对象都有 | | ULONG_PTR DirectoryTableBase | 页目录基址 | | KernelTime | 进程在内核花的时间 | | UserTime | 进程在用户层化的时间 | | Affinity | 规定进程中的线程跑在哪个CPU | | BasePriority | 基础优先级 | ## 线程操作 | 函数 | 描述 | | - | - | | PsLookupThreadByThreadID | 根据线程ID获取EThread | | PsGetCurrentThread | 获取当前ETHREAD结构 | | PsCreateSystemThread | 创建一个内核线程 | | PsTerminateSystemThread | 结束一个内核线程 | | IoThreadToProcess | 得到线程所属的进程EPROCESS | | PsSuspendThread | 暂停线程 | | PsResumeThread | 恢复线程 | | ZwTerminateThread | 结束线程 | ## 模块操作 | 函数 | 用途 | | - | - | | 枚举进程 | 循环调用PsLookupProcessByProcessId | | 暂停进程 | PsSuspendProcess | | 恢复进程 | PsResumeProcess | | 结束进程 | ZwTerminateProcess | | 枚举线程 | 循环调用PsLookupThreadByThreadID | | 暂停线程 | PsSuspendThread | | 恢复线程 | PsResumeThread | | 结束线程 | ZwTerminateThread | | 枚举DLL模块 | 枚举PEB.LDR的双向链表 | | 卸载DLL模块 | MmUnmapViewOfSection | 最后修改:2021 年 04 月 03 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏