首页
社区
课程
招聘
[求助] 内核 操作用户层内存 申请与释放。
发表于: 2018-6-25 12:15 2770

[求助] 内核 操作用户层内存 申请与释放。

2018-6-25 12:15
2770
申请内存:
返回值 = ZwAllocateVirtualMemory(
进程句柄, //R3的句柄
&地址,
NULL,
&大小,
MEM_RESERVE | MEM_COMMIT,
PAGE_READWRITE);
目前没问题  
PVOID 地址 = 0;
RtlCopyMemory(&地址, (char*)stack->Parameters.DeviceIoControl.Type3InputBuffer + 4, 8);
返回 = R3释放内存((HANDLE)PID, 地址);
返回值 = ZwFreeVirtualMemory(进程句柄,&地址, (SIZE_T*)1024, MEM_RELEASE);  
        返回值 = ZwFreeVirtualMemory(进程句柄,&地址, NULL, MEM_RELEASE);
只要执行了 ZwFreeVirtualMemory 抛异常。。请问大佬。。哪错了。。。windbg调试一点也没看出来问题
再次跪求不黑中文。。。。





[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 81
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
2
易语言能写驱动了?
2018-6-25 12:38
0
雪    币: 149
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
XiaoyDelog 易语言能写驱动了?
易语言可以写X86的。。。但是我这个是VS2015  大哥
2018-6-25 13:26
0
雪    币: 12
活跃值: (423)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
申请的时候只用COMMIT试试

然后CopyMemory的时候 你要Attach进去
ZwAllocateVirtualMemory(NtCurrentProcess(), &desired_address, 0, &desired_size, MEM_COMMIT,PAGE_EXECUTE_READWRITE);

SIZE_T  free_size  =  0;

status  =  ZwFreeVirtualMemory(NtCurrentProcess(),  (PVOID*)& desired_address,  &free_size,MEM_RELEASE);
最后于 2018-6-25 13:32 被MaMy编辑 ,原因:
2018-6-25 13:29
0
雪    币: 2055
活跃值: (486)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
看下面
最后于 2018-6-25 14:11 被不吃麻婆豆腐编辑 ,原因:
2018-6-25 14:08
0
雪    币: 2055
活跃值: (486)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
#include  <Ntifs.h>

VOID  UnLoadDriver(PDRIVER_OBJECT  pDriver)  {

       DbgPrint("程序卸载--------------------------------\r\n");
}

NTSTATUS  DriverEntry(PDRIVER_OBJECT  pDriver  ,PUNICODE_STRING  puns)  {
       DbgPrint("驱动入口\r\n");
       pDriver->DriverUnload  =  UnLoadDriver;
       //R3的地址
       PULONG  readr3;
       readr3  =(PULONG)  0x0000000013fc7c000;
       //r0的地址
       ULONG  readr0  =  0x00;
       //老的CR3  新的CR3
       ULONG64  oldcr3,  newcr3;
       PEPROCESS  eprocess=NULL;
       //R3pid
       HANDLE  PID=  (HANDLE)3048;
       //获取进程信息
       NTSTATUS  SB=PsLookupProcessByProcessId(PID,  &eprocess);
       //判断打开没
       if  (eprocess==NULL)  {
               DbgPrint("获取对象失败:%x\r\n",SB);
               return  STATUS_SUCCESS;
       }
       //获取进程CR3
       newcr3  =  *(PULONG64)((ULONG64)eprocess  +  0x28);
       KdBreakPoint();
       if  (newcr3==0x00)  {
               DbgPrint("获取cr3失败\r\n");
               return  STATUS_SUCCESS;
       }
       DbgPrint("进程CR3:%x\r\n",newcr3);
       _disable();
       //保存老的CR3
       oldcr3  =__readcr3();
       //替换CR3
       __writecr3(newcr3);
       _enable();
       DbgPrint("老的CR3:%x\r\n",  oldcr3);
       //读取进程信息
       DbgPrint("现在读取r0数据\r\n");
       RtlMoveMemory(&readr0,  readr3,4);
       DbgPrint("读取到的信息:%x\r\n",  readr0);
       DbgPrint("现在是还原CR3\r\n");
       //写入
       *readr3  =  0xaa;
       //还原
       _disable();
       //替换CR3
       __writecr3(oldcr3);
       _enable();
       DbgPrint("还原成功\r\n");
       return  STATUS_SUCCESS;
}
2018-6-25 14:09
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
7
有标准的KeStackAttachProcess不用,手动切CR3是想干啥?
2018-6-25 14:11
0
雪    币: 2055
活跃值: (486)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
hzqst 有标准的KeStackAttachProcess不用,手动切CR3是想干啥?
手动实现了解下原理嘛  ovo
2018-6-25 14:13
0
雪    币: 149
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不吃麻婆豆腐 #include VOID UnLoadDriver(PDRIVER_OBJECT pDriver) { DbgPrint("程序卸载-------------------- ...
你这个是驱动读写。。。我是要申请内存和释放内存。。。。
2018-6-25 14:57
0
雪    币: 2055
活跃值: (486)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
获取CR3然后用着函数就行了 ExAllocatePool  ExFreePool
最后于 2018-6-25 15:07 被不吃麻婆豆腐编辑 ,原因:
2018-6-25 15:06
0
雪    币: 149
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不吃麻婆豆腐 获取CR3然后用着函数就行了 ExAllocatePool&nbsp; ExFreePool
不会把。这么坑、???  附加进程就能申请内存和释放了???? 
2018-6-25 15:17
0
雪    币: 149
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不吃麻婆豆腐 获取CR3然后用着函数就行了 ExAllocatePool&nbsp; ExFreePool
测试完毕。坑货。申请的是内核地址。根本不是用户层地址
2018-6-25 15:34
0
雪    币: 149
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
已解决。大小  不能=NULL必须给个指针   
2018-6-25 19:22
1
游客
登录 | 注册 方可回帖
返回
//