当前位置: 首页 > news >正文

天津的网站建设公司哪家好北京顺义做网站

天津的网站建设公司哪家好,北京顺义做网站,网站域名根目录,wordpress工作原理在开始学习内核内存读写篇之前#xff0c;我们先来实现一个简单的内存分配销毁堆的功能#xff0c;在内核空间内用户依然可以动态的申请与销毁一段可控的堆空间#xff0c;一般而言内核中提供了ZwAllocateVirtualMemory这个函数用于专门分配虚拟空间#xff0c;而与之相对应…在开始学习内核内存读写篇之前我们先来实现一个简单的内存分配销毁堆的功能在内核空间内用户依然可以动态的申请与销毁一段可控的堆空间一般而言内核中提供了ZwAllocateVirtualMemory这个函数用于专门分配虚拟空间而与之相对应的则是ZwFreeVirtualMemory此函数则用于销毁堆内存当我们需要分配内核空间时往往需要切换到对端进程栈上再进行操作接下来LyShark将从API开始介绍如何运用这两个函数实现内存分配与使用并以此来作为驱动读写篇的入门知识。 首先以内存分配为例ZwAllocateVirtualMemory()函数该系列函数在ntifs.h头文件内且如果需要使用则最好提前在程序头部进行声明该函数的微软官方定义如下所示 NTSYSAPI NTSTATUS ZwAllocateVirtualMemory([in] HANDLE ProcessHandle, // 进程句柄[in, out] PVOID *BaseAddress, // 指向将接收已分配页面区域基址的变量的指针[in] ULONG_PTR ZeroBits, // 节视图基址中必须为零的高顺序地址位数[in, out] PSIZE_T RegionSize, // 指向将接收已分配页面区域的实际大小[in] ULONG AllocationType, // 包含指定要执行的分配类型的标志的位掩码[in] ULONG Protect // 包含页面保护标志的位掩码 );参数ProcessHandle用于传入一个进程句柄此处我们可以通过NtCurrentProcess()获取到当前自身进程的句柄。 参数BaseAddress则用于接收分配堆地址的首地址此处指向将接收已分配页面区域基址的变量的指针。 参数RegionSize则用于指定需要分配的内存空间大小此参数的初始值指定区域的大小以字节为单位并向上舍入到下一个主机页大小边界。 参数AllocationType用于指定分配内存的属性通常我们会用到的只有两种MEM_COMMIT指定为提交类型MEM_PHYSICAL则用于分配物理内存此标志仅用于地址窗口扩展AWE内存。 如果设置了MEM_PHYSICAL则还必须设置MEM_RESERVE不能设置其他标志并且必须将保护设置为PAGE_READWRITE。 参数Protect用于设置当前分批堆的保护属性通常当我们需要分配一段可执行指令的内存空间时会使用PAGE_EXECUTE_READWRITE如果无执行需求则推荐使用PAGE_READWRITE属性。 在对特定进程分配堆时第一步就是要切入到该进程的进程栈中此时可通过KeStackAttachProcess()切换到进程栈于此对应的是KeUnstackDetachProcess()脱离进程栈这两个函数的具体定义如下 // 附加到进程栈 void KeStackAttachProcess(PRKPROCESS PROCESS, // 传入EProcess结构[out] PRKAPC_STATE ApcState // 指向KAPC_STATE结构的不透明指针 ); // 接触附加 void KeUnstackDetachProcess([in] PRKAPC_STATE ApcState // 指向KAPC_STATE结构的不透明指针 );此处如果需要附加进程栈则必须提供该进程的PRKPROCESS也就是EProcess结构此结构可通过PsLookupProcessByProcessId()获取到该函数接收一个进程PID并将此PID转为EProcess结构函数定义如下 NTSTATUS PsLookupProcessByProcessId([in] HANDLE ProcessId, // 进程PID[out] PEPROCESS *Process // 输出EP结构 );基本的函数介绍完了那么这段代码应该不难理解了如下代码中需要注意一点参数OUT PVOID Buffer用于输出堆地址而不是输入地址。 #include ntifs.h #include windef.h// 定义声明 NTSTATUS ZwAllocateVirtualMemory(__in HANDLE ProcessHandle,__inout PVOID *BaseAddress,__in ULONG_PTR ZeroBits,__inout PSIZE_T RegionSize,__in ULONG AllocationType,__in ULONG Protect );// 分配内存空间 NTSTATUS AllocMemory(IN ULONG ProcessPid, IN SIZE_T Length, OUT PVOID Buffer) {NTSTATUS Status STATUS_SUCCESS;PEPROCESS pEProcess NULL;KAPC_STATE ApcState { 0 };PVOID BaseAddress NULL;// 通过进程PID得到进程EProcessStatus PsLookupProcessByProcessId((HANDLE)ProcessPid, pEProcess);if (!NT_SUCCESS(Status) !MmIsAddressValid(pEProcess)){return STATUS_UNSUCCESSFUL;}// 验证内存可读if (!MmIsAddressValid(pEProcess)){return STATUS_UNSUCCESSFUL;}__try{// 附加到进程栈KeStackAttachProcess(pEProcess, ApcState);// 分配内存Status ZwAllocateVirtualMemory(NtCurrentProcess(), BaseAddress, 0, Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE);RtlZeroMemory(BaseAddress, Length);// 返回内存地址*(PVOID*)Buffer BaseAddress;// 脱离进程栈KeUnstackDetachProcess(ApcState);}__except (EXCEPTION_EXECUTE_HANDLER){KeUnstackDetachProcess(ApcState);Status STATUS_UNSUCCESSFUL;}ObDereferenceObject(pEProcess);return Status; }VOID UnDriver(PDRIVER_OBJECT driver) {DbgPrint((Uninstall Driver Is OK \n)); }NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) {DbgPrint((hello lyshark \n));DWORD process_id 4160;DWORD create_size 1024;DWORD64 ref_address 0;NTSTATUS Status AllocMemory(process_id, create_size, ref_address);DbgPrint(对端进程: %d \n, process_id);DbgPrint(分配长度: %d \n, create_size);DbgPrint(分配的内核堆基址: %p \n, ref_address);Driver-DriverUnload UnDriver;return STATUS_SUCCESS; }运行如上代码片段则会在进程PID4160中开辟一段堆空间输出效果如下 与创建堆相对ZwFreeVirtualMemory()则用于销毁一个堆其微软定义如下所示 NTSYSAPI NTSTATUS ZwFreeVirtualMemory([in] HANDLE ProcessHandle, // 进程句柄[in, out] PVOID *BaseAddress, // 堆基址[in, out] PSIZE_T RegionSize, // 销毁长度[in] ULONG FreeType // 释放类型 );相对于创建来说销毁堆则必须传入堆空间BaseAddress基址以及堆空间的RegionSize长度需要格外注意FreeType参数这是一个位掩码其中包含描述ZwFreeVirtualMemory将为页面指定区域执行的任意操作类型。如果传入MEM_DECOMMIT则将取消提交页面的指定区域页面进入保留状态。而如果设置为MEM_RELEASE则堆地址将被立即释放。 销毁堆空间FreeMemory()的完整代码如下所示销毁是我们使用MEM_RELEASE参数即立即销毁。 #include ntifs.h #include windef.h// 申请堆 NTSTATUS ZwAllocateVirtualMemory(__in HANDLE ProcessHandle,__inout PVOID *BaseAddress,__in ULONG_PTR ZeroBits,__inout PSIZE_T RegionSize,__in ULONG AllocationType,__in ULONG Protect );// 销毁堆 NTSYSAPI NTSTATUS ZwFreeVirtualMemory(__in HANDLE ProcessHandle,__inout PVOID *BaseAddress,__inout PSIZE_T RegionSize,__in ULONG FreeType );// 分配内存空间 NTSTATUS AllocMemory(IN ULONG ProcessPid, IN SIZE_T Length, OUT PVOID Buffer) {NTSTATUS Status STATUS_SUCCESS;PEPROCESS pEProcess NULL;KAPC_STATE ApcState { 0 };PVOID BaseAddress NULL;// 通过进程PID得到进程EProcessStatus PsLookupProcessByProcessId((HANDLE)ProcessPid, pEProcess);if (!NT_SUCCESS(Status) !MmIsAddressValid(pEProcess)){return STATUS_UNSUCCESSFUL;}// 验证内存可读if (!MmIsAddressValid(pEProcess)){return STATUS_UNSUCCESSFUL;}__try{// 附加到进程栈KeStackAttachProcess(pEProcess, ApcState);// 分配内存Status ZwAllocateVirtualMemory(NtCurrentProcess(), BaseAddress, 0, Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE);RtlZeroMemory(BaseAddress, Length);// 返回内存地址*(PVOID*)Buffer BaseAddress;// 脱离进程栈KeUnstackDetachProcess(ApcState);}__except (EXCEPTION_EXECUTE_HANDLER){KeUnstackDetachProcess(ApcState);Status STATUS_UNSUCCESSFUL;}ObDereferenceObject(pEProcess);return Status; }// 注销内存空间 NTSTATUS FreeMemory(IN ULONG ProcessPid, IN SIZE_T Length, IN PVOID BaseAddress) {NTSTATUS Status STATUS_SUCCESS;PEPROCESS pEProcess NULL;KAPC_STATE ApcState { 0 };Status PsLookupProcessByProcessId((HANDLE)ProcessPid, pEProcess);if (!NT_SUCCESS(Status) !MmIsAddressValid(pEProcess)){return STATUS_UNSUCCESSFUL;}if (!MmIsAddressValid(pEProcess)){return STATUS_UNSUCCESSFUL;}__try{// 附加到进程栈KeStackAttachProcess(pEProcess, ApcState);// 释放内存Status ZwFreeVirtualMemory(NtCurrentProcess(), BaseAddress, Length, MEM_RELEASE);// 脱离进程栈KeUnstackDetachProcess(ApcState);}__except (EXCEPTION_EXECUTE_HANDLER){KeUnstackDetachProcess(ApcState);Status STATUS_UNSUCCESSFUL;}ObDereferenceObject(pEProcess);return Status; }VOID UnDriver(PDRIVER_OBJECT driver) {DbgPrint((Uninstall Driver Is OK \n)); }NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) {DbgPrint((hello lyshark \n));DWORD process_id 4160;DWORD create_size 1024;DWORD64 ref_address 0;NTSTATUS Status AllocMemory(process_id, create_size, ref_address);DbgPrint(对端进程: %d \n, process_id);DbgPrint(分配长度: %d \n, create_size);DbgPrint(分配的内核堆基址: %p \n, ref_address);Status FreeMemory(process_id, create_size, ref_address);DbgPrint(销毁堆地址: %p \n, ref_address);Driver-DriverUnload UnDriver;return STATUS_SUCCESS; }编译并运行如上这段代码代码会首先调用AllocMemory()函数实现分配堆然后调用FreeMemory()函数销毁堆并输出销毁地址如下图所示
http://www.hkea.cn/news/14514488/

相关文章:

  • 网站设计素材坚决把快准严细实要求落实到位
  • 备案 个人网站聊城网站建设报价
  • 提供网站建设备案网站怎么做会让神马搜索到
  • 福永营销型网站多少钱网站如何建立数据库
  • 企业网站建设示范平台有没有免费的网站
  • 网站推广哪个平台好html编辑器的功能介绍
  • 做自媒体查找素材的网站定制营销产生的原因
  • 假冒建设厅网站wordpress 翻页没内容
  • 河南省住房和城乡建设门户网站个旧市建设局网站
  • 网站开发的现状及研究意义asp网站开发pdf
  • 南京企业网站设计制作营销型网站建设模板下载
  • 怎么建立一个网站搜关键词会跳出东莞市研发网站建设企业
  • 微信做明天展现网站要多少钱搭建本地视频网站
  • 网站换服务器要怎么做怎么开电商
  • 网站内容包括哪些系统软件有哪些?
  • 长春微信做网站制作一个自适应网站源码
  • 网站开发及设计网站建设的风格
  • 黄冈商城网站建设哪家好在线做爰视频网站
  • 河南企业做网站网站上的视频直播是怎么做的呢
  • 学做ppt的网站重庆如何快速制作一个网站
  • dw怎么做网站教程房地产项目营销策划方案
  • 自己的公网ip可以做网站清河网站建设公司
  • 网站运营与管理第二版网站的所有权
  • 肇庆微网站网络推广培训哪里好
  • 海安县城乡建设局网站成都网站建设名录
  • 上海网站建设特点哪些网站的网站怎么做的
  • 网站的建设参考文献wordpress页面文章区别
  • 园林景观设计案例网站公网ip 做网站
  • cgi做的网站餐饮公司网站建设的特点
  • 全国建设注册中心网站精准营销的作用