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

shopex网站经常出错昆明网站建设时间

shopex网站经常出错,昆明网站建设时间,编写网站方案设计书表格,wps的ppt做网站超链接在开始学习内核内存读写篇之前#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.dnsts.com.cn/news/112798.html

相关文章:

  • 网站利用微信拉取用户做登录页wordpress插件使用
  • 优化网站哪家好嘉兴南湖区优秀营销型网站建设
  • 企业官方网站有哪些WordPress添加2233娘
  • 下列关于网站开发中企业vi品牌设计
  • 网站登陆口提交网站wordpress 设置七牛
  • 银川怎么做网站seo关键词找29火星软件
  • 深圳西乡地铁站做网站 就
  • 旅游网站设计需求分析梅州企业网站建设公司
  • 设计企业网站哪家好智能微营销系统
  • 免费的网站推广 外贸附近的装修公司电话
  • 常用外贸网站wordpress邮件收不到
  • 简单建网站哪家网站建设公司
  • 吉林住房和城乡建设厅网站做网站优化需要做什么
  • 商赢网站建设抖音推广佣金平台
  • 免费网站安全软件大全游戏网站备案需要哪些东西
  • 广州网站建设 app 小程序在百度做网站多少钱
  • 英文网站优化做高铁在哪个网站买
  • 如何做单页网站中国怎么进fiverr网站做任务
  • 鄱阳网站建设网络营销工程师有用吗
  • 商务网站建设实践实训心得seo快速排名软件品牌
  • 重庆市住房和城乡建设网站安徽建新建设工程有限公司网站
  • 常用网站开发软件6wordpress淘宝客主题带条件筛选
  • 梁山县网站建设wordpress创建分类
  • 网站建设公司方维想学服装设计去哪个大学好
  • 网站开发与网站设计区别国家建设环保局网站
  • 锦州网站建设信息网站规划
  • 响水做网站哪家公司好大钢模板相关信息圆柱钢模板优势是什么?企业网站建设模板和定制化有什么区别呢?人工费多少钱一平方
  • thinkphp开发企业网站如何关联网站与网站
  • 河北涿州网站建设wordpress账号破解
  • 手机建设网站赚钱互联网公司裁员