一
前言
*MmTrackPtes
标志位,让内核调用MiInsertPteTracker
,把Length存储到*MiDeadPteTrackerSListHead
链表,遍历检测这个链表中的Length是不是等于0x2023然后蓝屏。并且同时要置位*MiTrackPtesAborted
为1,不然在置位*MmTrackPtes
后会蓝屏。二
过程
ReadProccesMemory
打断点,并不蓝屏,所以在CreateProcessA
以后拿到了句柄以后,依然不会蓝屏,排除句柄表。ReadProcessMemory
,观察ring3的程序,很明显的地方就是这个0x2023了罗。NtReadVirtualMemory
观察Length的去向。MmCopyVirtualMemory
,在这个函数的内部发现Length被存到了一个临时的MDL结构里面。MemoryDescriptorList
的去向看看是谁获取了结构体中的ByteCount
或者是Size
MmProbeAndLockPages
MmMapLockedPagesSpecifyCache
MmUnlockPages
。我们一个一个来看看有什么奥秘所在。MmProbeAndLockPages
先来看看函数内部。
ByteCount
,接着我们来看看MiProbeAndLockPrepare
函数内部。ByteCount
这个玩意,而是跟别的加加减减再搞一块。所以先放一边。MmMapLockedPagesSpecifyCache
MemoryDescriptorList。
ByteCout
或者Size
的函数直接先放一边,到时候回过头去看。MiInsertPteTracker
我们发现了奥秘所在。typedef struct _PTE_TRACKER {
LIST_ENTRY ListEntry;
PMDL Mdl;
PFN_NUMBER Count;
PVOID SystemVa;
PVOID StartVa;
ULONG Offset;
ULONG Length;
PFN_NUMBER Page;
struct {
ULONG IoMapping: 1;
ULONG Matched: 1;
ULONG CacheAttribute : 2;
ULONG Spare : 28;
};
PVOID CallingAddress;
PVOID CallersCaller;
} PTE_TRACKER, *PPTE_TRACKER;
ByteCount
被直接存储到PTE_TRACKER::Length
里面了。MiDeadPteTrackerSListHead
里面拿到的v8。MmMapLockedPagesSpecifyCache
内部会调用MiInsertPteTracker。
dword_140CFB17C(MmTrackPtes)
为1的情况下会MiInsertPteTracker。
ba w1 fffff8020617318c
(这是标志位地址,在上图)然后拉起驱动。三
完毕
dword_140CFB17C(MmTrackPtes)
标志位置0,长度就不会再往全局数组里面插入了。dword_140CFB17C(MmTrackPtes)
标志位置1,然后遍历*MiDeadPteTrackerSListHead
中的长度是不是等于0x2023。dword_140CFB17C(MmTrackPtes)
以后立马蓝屏了。MiTrackPtesAborted
置1。*MmTrackPtes
标志位,让内核调用MiInsertPteTracker
,把Length存储到*MiDeadPteTrackerSListHead
链表,遍历检测这个链表中的Length是不是等于0x2023然后蓝屏。并且同时要置位*MiTrackPtesAborted
为1,不然在置位*MmTrackPtes
后会蓝屏。0x04
0x05
0x06
附件是去虚拟化以后的
NotepadProtect.sys
的ida分析文件。(附件被吞了 看评论区~)
特别鸣谢
1.https://github1s.com/zhuhuibeishadiao/ntoskrnl (WRK
2.不愿公开姓名的xxx提供的去虚拟化sys。
看雪ID:淡然他徒弟
https://bbs.kanxue.com/user-home-620278.htm
# 往期推荐
3、安卓加固脱壳分享
球分享
球点赞
球在看
原文始发于微信公众号(看雪学苑):2023南极动物厂高校决赛之决赛附加题