首页
社区
课程
招聘
[求助]ZwWriteVirtualMemory写内存导致蓝屏
发表于: 2013-4-29 17:43 10389

[求助]ZwWriteVirtualMemory写内存导致蓝屏

2013-4-29 17:43
10389
RT
系统 WIN7SP1

我已经获取了目标进程的PID 然后用ObOpenObjectByPointer得到进程句柄
之后调用ZwAllocateVirtualMemory 在进程内申请空间
这一段都是我用DBGPRINT输出看过的,而且OD也看了一下 都是成功的

然后我想用ZwWriteVirtualMemory 向申请的空间内写入数据
结果写入必蓝 我详细的看了一下参数 应该是没有问题
而且我也查看了一下我动态获取的ZwWriteVirtualMemory 也没问题。。

下面附上代码
希望各位兄弟可以给我指出问题所在,不胜感激~

#define SHELL_CODE_LENGTH 15

unsigned char szShellCode[] = "\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03"; 

HANDLE hProcess;
PVOID pFnShellCode = NULL;
ULONG uShellCodeSize = SHELL_CODE_LENGTH;
NTSTATUS ntRet = STATUS_SUCCESS;
ULONG uWirte = 0;

ObOpenObjectByPointer(pEProc, 0, NULL, 0, NULL, KernelMode, &hProcess);
DbgPrint("TarPID:%u--TarHandle:%08x", uTargetPID, hProcess);
ZwAllocateVirtualMemory(hProcess, &pFnShellCode, 0, (PSIZE_T)&uShellCodeSize, MEM_COMMIT, PAGE_READWRITE);
DbgPrint("VirtualAddress:%08x", pFnShellCode);
fnZwWriteVirtualMemory(hProcess, pFnShellCode, szShellCode, uShellCodeSize - 1, &uWirte);//这句一执行就蓝屏 泪奔了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
ZwWriteVirtualMemory这个函数是个未导出的函数,你需要自己搜索
在调用这个函数之前 你先调试输出一下这个函数的地址 看看对不对
2013-4-29 20:06
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
亲 绝对是对的
因为我尝试用我动态获取到的ZwWriteVirtualMemory 去获取Nt函数的序号
并且进行了对照,肯定没错。
2013-4-29 22:23
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
4
即使存在地址,但ZwAllocateVirtualMemory的返回值 不一定是STATUS_SUCCESS。
即使取得了syscall的id,但是获取的地址不一定对,WriteXXX的定义又不一定对,
最后一切都ok的时候,IRQL也不一定能行。
于是你的蓝屏是一种必然。
2013-4-30 11:28
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
刚开始搞 有得地方也弄不清
这样写内存的话 MDL出来会靠谱一点?
2013-4-30 13:17
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
刚才又测试了一下
Allocate函数返回success并且给了我申请到的地址

我测试用NtWriteVirtualMemory 来写内存
并且在获取这个函数的时候输出了,用XT对照了一下地址没错
调用完写内存 ,SATAUS 返回的是 C0000005
我查了一下头文件 是 STATUS_ACCESS_VIOLATION
何解?
2013-4-30 16:38
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
7
直接使用NT型内核函数的话:PreviousMode要修改哦,亲~~~~
2013-4-30 17:53
0
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
UserMode?
2013-4-30 18:16
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
我换个了套路 之前的那种取EPROCESS HANDLE得方法
不能保证在主线程之前开始工作
所以现在用的是ThreadHandle--EThread--EProcess这个路线
只有在把ThreadHandle转换成EThread的时候才有Mode的参数
我看了一下头文件 Kernel User Maxium 三种模式
除了Kernel 其他两种直接会蓝的

而且为了尽量避免错误 我没用Process去操作内存
而是Attach上去的

在这个环境下 有啥方法改Mode?
2013-4-30 19:50
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
你试试就知道了  直接会蓝。。。
2013-4-30 19:51
0
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
mdl锁定
成功了再写
2013-5-28 14:36
0
游客
登录 | 注册 方可回帖
返回
//