首页
社区
课程
招聘
[已解决] MmCopyVirtualMemory引起的PAGE_FAULT_IN_NONPAGED_AREA (50)蓝屏 200.00雪花
发表于: 2023-2-12 17:54 10730

[已解决] MmCopyVirtualMemory引起的PAGE_FAULT_IN_NONPAGED_AREA (50)蓝屏 200.00雪花

2023-2-12 17:54
10730

问题出现好久了一直解决不了,求大佬解决一下
windbg看了一下堆栈,到了nt!memcpy+0x4a这个位置引发的异常,感到很奇怪,传到MmCopyVirtualMemory的参数应该是没问题的,一个脚本项目里面大概3小时后就蓝屏,读的是用户层进程的内存,不知道是不是一直在读的原因

 

源代码很简单,就是这样写的:

dump文件就不上传了,如果有想解决的,可以留个联系方式
蓝屏dump:
PAGE_FAULT_IN_NONPAGED_AREA (50)
Invalid system memory was referenced. This cannot be protected by try-except.
Typically the address is just plain bad or it is pointing at freed memory.
Arguments:
Arg1: ffffffeeffffffef, memory referenced.
Arg2: 0000000000000000, value 0 = read operation, 1 = write operation.
Arg3: fffff80173831c0a, If non-zero, the instruction address which referenced the bad memory
address.
Arg4: 0000000000000002, (reserved)

Debugging Details:

KEY_VALUES_STRING: 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Key  : AV.Type
Value: Read
 
Key  : Analysis.CPU.mSec
Value: 4359
 
Key  : Analysis.DebugAnalysisManager
Value: Create
 
Key  : Analysis.Elapsed.mSec
Value: 56199
 
Key  : Analysis.Init.CPU.mSec
Value: 2578
 
Key  : Analysis.Init.Elapsed.mSec
Value: 84557
 
Key  : Analysis.Memory.CommitPeak.Mb
Value: 94
 
Key  : WER.OS.Branch
Value: co_release
 
Key  : WER.OS.Timestamp
Value: 2021-06-04T16:28:00Z
 
Key  : WER.OS.Version
Value: 10.0.22000.1

FILE_IN_CAB: 011323-18343-01.dmp

 

BUGCHECK_CODE: 50

 

BUGCHECK_P1: ffffffeeffffffef

 

BUGCHECK_P2: 0

 

BUGCHECK_P3: fffff80173831c0a

 

BUGCHECK_P4: 2

 

READ_ADDRESS: fffff80174105450: Unable to get MiVisibleState
Unable to get NonPagedPoolStart
Unable to get NonPagedPoolEnd
Unable to get PagedPoolStart
Unable to get PagedPoolEnd
unable to get nt!MmSpecialPagesInUse
ffffffeeffffffef

 

MM_INTERNAL_CODE: 2

 

BLACKBOXBSD: 1 (!blackboxbsd)

 

BLACKBOXNTFS: 1 (!blackboxntfs)

 

BLACKBOXPNP: 1 (!blackboxpnp)

 

BLACKBOXWINLOGON: 1

 

CUSTOMER_CRASH_COUNT: 1

 

TRAP_FRAME: fffff50c86487050 -- (.trap 0xfffff50c86487050)
NOTE: The trap frame does not contain all registers.
Some register values may be zeroed or incorrect.
rax=fffff50c864873d0 rbx=0000000000000000 rcx=fffff50c864873d0
rdx=00000ae279b78c1f rsi=0000000000000000 rdi=0000000000000000
rip=fffff80173831c0a rsp=fffff50c864871e8 rbp=00000000000038bc
r8=0000000000000001 r9=fffff50c86487300 r10=fffff50c864872f0
r11=ffffffffffffffff r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0 nv up ei pl nz na pe nc
nt!memcpy+0x4a:
fffff80173831c0a 448a1c11 mov r11b,byte ptr [rcx+rdx] ds:ffffffeeffffffef=??
Resetting default scope

 

STACK_TEXT:
fffff50c86486da8 fffff801738a1acd : 0000000000000050 ffffffeeffffffef 0000000000000000 fffff50c86487050 : nt!KeBugCheckEx
fffff50c86486db0 fffff80173665396 : 0000000000000040 0000000000000000 fffff50c86486fb0 0000000000000000 : nt!MiSystemFault+0x1c4a5d
fffff50c86486eb0 fffff8017382c941 : 0000000000000000 0000000000000000 0000000000000001 0000000000000000 : nt!MmAccessFault+0x2a6
fffff50c86487050 fffff80173831c0a : fffff80173a8ebf8 ffffffeeffffffef 0000000000000000 fffff50c864872f0 : nt!KiPageFault+0x341
fffff50c864871e8 fffff80173a8ebf8 : ffffffeeffffffef 0000000000000000 fffff50c864872f0 ffffcf8f00000000 : nt!memcpy+0x4a
fffff50c864871f0 fffff80173a8dadd : ffffcf8f815a00c0 00000000000038bc 0000000000000070 fffff80173821740 : nt!MiCopyVirtualMemory+0x2b8
fffff50c86487620 ffff80008e8c20d7 : cf8f815a00c0b627 0000000000000000 ffffcf8f823b5060 0000000000000020 : nt!MmCopyVirtualMemory+0x2d
fffff50c86487670 cf8f815a00c0b627 : 0000000000000000 ffffcf8f823b5060 0000000000000020 0000000000000001 : 0xffff80008e8c20d7 fffff50c86487678 0000000000000000 : ffffcf8f823b5060 0000000000000020 0000000000000001 fffff80173a8bc00 : 0xcf8f815a00c0b627
SYMBOL_NAME: nt!MiSystemFault+1c4a5d

 

MODULE_NAME: nt

 

IMAGE_VERSION: 10.0.22000.1455

 

STACK_COMMAND: .cxr; .ecxr ; kb

 

IMAGE_NAME: ntkrnlmp.exe

 

BUCKET_ID_FUNC_OFFSET: 1c4a5d

 

FAILURE_BUCKET_ID: AVR(null)_nt!MiSystemFault

 

OS_VERSION: 10.0.22000.1

 

BUILDLAB_STR: co_release

 

OSPLATFORM_TYPE: x64

 

OSNAME: Windows 10

 

FAILURE_ID_HASH: {636dd506-1acb-bac0-a568-0355527c550f}

 

Followup: MachineOwner


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

最后于 2023-3-27 16:25 被wx_刹那轮回编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (10)
雪    币: 3570
活跃值: (4709)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

你这个问题很明显啊
Arg1: ffffffeeffffffef, memory referenced.
这里已经告诉你了,你读这个地址导致的蓝屏
你函数里给的是KernelMode 这里地址是在内核地址空间 相当于直接memcpy了 但是这个地址明显不是有效的
内核地址的异常是没法直接处理的

解决方法三种:
1.要么自己加参数判断你要读的地址是不是小于MmHighestUserAddress(因为你自己说了你读的是R3的内存)
2.用MmCopyMemory(不过WIN7用不了),他会保证即使你读了非法的内核空间地址也没事

不要自己取取Pte判断页有效性,如果被PageFault放到硬盘或者Win10开始的内存压缩机制压缩了就没用了

3.检查你代码。。。为什么会读R3内存传了R0地址空间

最后于 2023-2-13 04:43 被syser编辑 ,原因:
2023-2-13 04:40
0
雪    币: 96
活跃值: (316)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
syser 你这个问题很明显啊Arg1: ffffffeeffffffef, memory referenced.这里已经告诉你了,你读这个地址导致的蓝屏你函 ...

我传的参数应该是没问题的,因为都是用户层的地址,即使我传一个无效的用户地址函数内部也会处理,不知道为啥函数内部里面的memcpy读了这个非法内核地址,也不知道怎么来的,也不是刚读就蓝,大概脚本挂机四五个小时就会蓝

最后于 2023-2-13 05:08 被wx_刹那轮回编辑 ,原因:
2023-2-13 05:07
0
雪    币: 5
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4

缺页错误,刚好访问的用户地址页面交换出去了,或者没有进程挂靠,访问了别的CR3,先MmIsAddressValid看内存地址是否能访问,

还有要判断一下取的Eprocess是否正确

最后于 2023-2-13 09:34 被黑色星期天编辑 ,原因:
2023-2-13 09:29
0
雪    币: 96
活跃值: (316)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
黑色星期天 缺页错误,刚好访问的用户地址页面交换出去了,或者没有进程挂靠,访问了别的CR3,先MmIsAddressValid看内存地址是否能访问,还有要判断一下取的Eprocess是否正确
windbg看了,没被交换出去,而且我用的是MmCopyVirtualMemory,这个api内部就是进程靠挂,建议你看一下我的代码
2023-2-13 11:40
0
雪    币: 2161
活跃值: (750)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6

看你使用了KernelMode
那么这个Mm函数内部会跳过一些地址的可用性检查, 它会默认地址来自内核, 以及一些特殊逻辑
建议是先检查两边进程的memory总是有效, 或者先lock住, 全部成功了再Copy
可以参考WRK的部分实现, 或者手写一份跨进程的CopyMemory

最后于 2023-2-13 12:03 被sidyhe编辑 ,原因:
2023-2-13 12:02
0
雪    币: 96
活跃值: (316)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
sidyhe 看你使用了KernelMode那么这个Mm函数内部会跳过一些地址的可用性检查, 它会默认地址来自内核, 以及一些特殊逻辑建议是先检查两边进程的memory总是有效, ...
好的我试试
2023-2-13 13:17
0
雪    币: 5
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
wx_刹那轮回 windbg看了,没被交换出去,而且我用的是MmCopyVirtualMemory,这个api内部就是进程靠挂,建议你看一下我的代码





rcx+rdx的值,显然是错误的地址,CR3真的正确吗


2023-2-23 11:01
0
雪    币: 180
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
限制一下参数的范围应该就可以了
2023-3-27 16:43
0
雪    币: 167
活跃值: (551)
能力值: ( LV3,RANK:26 )
在线值:
发帖
回帖
粉丝
10
最简单的办法把KernelMode 改成 UserMode
2024-4-6 10:59
0
雪    币: 6
活跃值: (303)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11

SourceProcess和TargetProcess搞反了哥们

NTSTATUS memory::WriteProcessMemory_API(HANDLE ProcessId, PVOID VitualAddress, PVOID Buffer, SIZE_T Size)
{
	NTSTATUS status;
	PEPROCESS Process;
	SIZE_T SizeRead;

	if (VitualAddress > MmHighestUserAddress || Buffer > MmHighestUserAddress
		|| (ULONG64)VitualAddress + Size > (ULONG64)MmHighestUserAddress
		|| (ULONG64)Buffer + Size > (ULONG64)MmHighestUserAddress) {
		return STATUS_INVALID_PARAMETER;
	}
	status = PsLookupProcessByProcessId(ProcessId, &Process);
	if (!NT_SUCCESS(status)) {
		return status;
	}
	ObDereferenceObject(Process);

	status = MmCopyVirtualMemory(PsGetCurrentProcess(), Buffer, Process, VitualAddress, Size, KernelMode, &SizeRead);
	return status;
}


2024-4-16 02:12
0
游客
登录 | 注册 方可回帖
返回
//