首页
社区
课程
招聘
未解决 为什么 HOOK NtUserWindowFromPoint 偶尔会蓝屏 50.00雪花
发表于: 2020-5-18 14:08 4608

未解决 为什么 HOOK NtUserWindowFromPoint 偶尔会蓝屏 50.00雪花

2020-5-18 14:08
4608

void SafeMemcpy(PVOID dst, PVOID src, ULONG32 length)
{
KIRQL irql;
irql = WPOFFx64();
memcpy(dst, src, length);<---这句话触发D1蓝屏
WPONx64(irql);
}
检查了很久 并没有出现空指针,到底是什么原因 而且只有

 

HOOK NtUserWindowFromPoint 这个函数的时候会蓝屏

 

其他函数 列如 NtUserGetThreadState 的时候就不会蓝屏

 

而且是 有时候蓝屏 有时候不蓝屏 有没有大神告知一下

 

win7 x64环境

 

* Fatal System Error: 0x000000d1
(0xFFFFF9600015CDF6,0x0000000000000002,0x0000000000000001,0xFFFFF8800636DD4E)


[课程]Android-CTF解题方法汇总!

最后于 2020-5-18 14:09 被Lyxk编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 789
活跃值: (1774)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
应该是读写冲突导致的,应该选择更安全的写内存方法
2020-5-19 09:02
0
雪    币: 210
活跃值: (1627)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
牛逼 不用mdl 这不蓝才有鬼
2020-5-19 10:21
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
用mdl会比较好
2020-5-19 13:27
0
雪    币: 189
活跃值: (267)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

NTSTATUS RtlSuperCopyMemory(IN VOID UNALIGNED* Destination, IN CONST VOID UNALIGNED* Source, IN ULONG Length)

{

//Change memory properties.

PMDL g_pmdl = IoAllocateMdl(Destination, Length, 0, 0, NULL);

if (!g_pmdl)

return STATUS_UNSUCCESSFUL;


MmBuildMdlForNonPagedPool(g_pmdl);


unsigned int* Mapped = (unsigned int*)MmMapLockedPages(g_pmdl, KernelMode);

if (!Mapped)

{

IoFreeMdl(g_pmdl);

return STATUS_UNSUCCESSFUL;

}

KIRQL kirql = KeRaiseIrqlToDpcLevel();


RtlCopyMemory(Mapped, Source, Length);


KeLowerIrql(kirql);

//Restore memory properties.

MmUnmapLockedPages((PVOID)Mapped, g_pmdl);

IoFreeMdl(g_pmdl);

return STATUS_SUCCESS;

}



inline BOOLEAN __forceinline IsAddressSafe(ULONG64 StartAddress, PSYSTEM_ROUTINE_ADDRESS g_pSRA)

{

if (StartAddress <= 0x1000)

return FALSE;

//cannonical check. Bits 48 to 63 must match bit 47

UINT_PTR toppart = (StartAddress >> 47);

if (toppart & 1)

{

//toppart must be 0x1ffff

if (toppart != 0x1ffff)

return FALSE;

}

else

{

//toppart must be 0

if (toppart != 0)

return FALSE;

}


UINT_PTR kernelbase = 0x7fffffffffffffffULL;

if (StartAddress < kernelbase && g_pSRA->pfn_MmIsAddressValid((PVOID)StartAddress))

{

return TRUE;

}

else

{

PHYSICAL_ADDRESS physical;

physical.QuadPart = 0;

physical = g_pSRA->pfn_MmGetPhysicalAddress((PVOID)StartAddress);

return (physical.QuadPart != 0) && g_pSRA->pfn_MmIsAddressValid(StartAddress);

}

}



在内核中请检查 目标地址 以及Buff 地址 是否正常 可使用__try 或者MDL 判断 在或者使用 IsAddressSafe


在内存加载驱动中 通常使用 MDL 映射强写 而非使用 写Cr0 因为你必须判断 内核地址是否可读 




2020-6-24 20:18
0
游客
登录 | 注册 方可回帖
返回
//