撰写本系列文章目的在於提升资讯安全之实务能力,
并透过实作体悟到资讯安全领域的重要性,
本系列所有文章之内容皆有一定技术水平,
不得从事非法行为、恶意攻击等非法活动,
「一切不合法规之行为皆受法律所约束」,
为了避免造成公司、厂商或玩家之间困扰,
所有实作不会拿已上市产品、Online Game 等等来作范例学习,
且部分具有深度、价值之内容,将会提升一定阅读门槛(不对该技术做分析、解说),
请勿透过本系列文章所学,从事任何非法活动,请不要以身试法!!!
首先开始前要先说一下,
小弟我目前还属於菜鸟阶段,正不断努力学习中,
若有发现错误或不妥之处还请不吝赐教。
欢迎大家多多留言,互相交流交流。
那就开始今天的主题罗~
一、什麽是 VadRoot 二元树?
二、这棵树长什麽样子?
!process 0 0 notepad.exe
lkd> !process 0 0 notepad.exe
PROCESS ffffe30717823080
SessionId: 1 Cid: 1534 Peb: a1635df000 ParentCid: 1054
DirBase: 1285ff000 ObjectTable: ffffcf0189d605c0 HandleCount: 260.
Image: notepad.exe
dt _eprocess ffffe30717823080
lkd> dt _eprocess ffffe30717823080
nt!_EPROCESS
+0x000 Pcb : _KPROCESS
+0x2d8 ProcessLock : _EX_PUSH_LOCK
+0x2e0 UniqueProcessId : 0x00000000`00001534 Void
--- --- --- ---
--- --- --- ---
--- --- --- ---
--- --- --- ---
--- --- --- ---
--- --- --- ---
-->+0x628 VadRoot : _RTL_AVL_TREE
+0x630 VadHint : 0xffffe307`16a0a650 Void
+0x638 VadCount : 0x7a
+0x640 VadPhysicalPages : 0
+0x648 VadPhysicalPagesLimit : 0
--- --- --- ---
--- --- --- ---
--- --- --- ---
!vad
好,到这大概已经简单带过什麽是 VAD 了 XD
现在要来写个 Driver 列举这棵树的 DLL 资讯,
当然,我们得先来看看这棵树的整体样貌,以及了解到底要「列举什麽」:
dt _eprocess ffffd88966e915c0
+0x628 VadRoot : _RTL_AVL_TREE
dt _eprocess ffffd88966e915c0 VadRoot
lkd> dt _eprocess ffffd88966e915c0 vadroot
nt!_EPROCESS
+0x628 VadRoot : _RTL_AVL_TREE
dt _RTL_AVL_TREE
lkd> dt _RTL_AVL_TREE
nt!_RTL_AVL_TREE
+0x000 Root : Ptr64 _RTL_BALANCED_NODE
dt ffffd88966e915c0+0x628 _RTL_BALANCED_NODE
lkd> dt ffffd88966e915c0+0x628 _RTL_BALANCED_NODE
nt!_RTL_BALANCED_NODE
+0x000 Children : [2] 0xffffd889`6858fd10 _RTL_BALANCED_NODE
+0x000 Left : 0xffffd889`6858fd10 _RTL_BALANCED_NODE
+0x008 Right : 0xffffd889`6864ec80 _RTL_BALANCED_NODE
+0x010 Red : 0y0
+0x010 Balance : 0y00
+0x010 ParentValue : 0x78
lkd> dt ffffd88966e915c0+0x628 _RTL_BALANCED_NODE Children[0]
nt!_RTL_BALANCED_NODE
+0x000 Children : [0] 0xffffd889`6858fd10 _RTL_BALANCED_NODE
lkd> dt ffffd88966e915c0+0x628 _RTL_BALANCED_NODE Children[1]
nt!_RTL_BALANCED_NODE
+0x000 Children : [1] 0xffffd889`6864ec80 _RTL_BALANCED_NODE
lkd> dt 0xffffd889`6858fd10 _RTL_BALANCED_NODE
nt!_RTL_BALANCED_NODE
+0x000 Children : [2] 0xffffd889`671c59d0 _RTL_BALANCED_NODE
+0x000 Left : 0xffffd889`671c59d0 _RTL_BALANCED_NODE
+0x008 Right : 0xffffd889`687a8a90 _RTL_BALANCED_NODE
+0x010 Red : 0y1
+0x010 Balance : 0y01
+0x010 ParentValue : 1
0xffffd889`687a8a90
这个节点要往前 C 个位置0xffffd889`687a8a90 -c = 0xFFFFD889687A8A84
db FFFFD889687A8A84
lkd> db FFFFD889687A8A84
ffffd889`687a8a84 56 61 64 -- -- 67 Vad zi.. `.\.8.g
ffffd889`687a8a94 89 d8 ff -- -- 68 ......vh......Xh
ffffd889`687a8aa4 89 d8 ff -- -- 00 ................
--- --- --- ---
--- --- --- ---
--- --- --- ---
dt _MMVAD
lkd> dt _MMVAD
nt!_MMVAD
+0x000 Core : _MMVAD_SHORT
+0x040 u2 : <unnamed-tag>
+0x048 Subsection : Ptr64 _SUBSECTION
+0x050 FirstPrototypePte : Ptr64 _MMPTE
+0x058 LastContiguousPte : Ptr64 _MMPTE
+0x060 ViewLinks : _LIST_ENTRY
+0x070 VadsProcess : Ptr64 _EPROCESS
+0x078 u4 : <unnamed-tag>
+0x080 FileObject : Ptr64 _FILE_OBJECT
dt _mmvad 0xffffd889687a8a90
lkd> dt _mmvad 0xffffd889687a8a90
nt!_MMVAD
+0x000 Core : _MMVAD_SHORT
+0x040 u2 : <unnamed-tag>
+0x048 Subsection : 0xffffd889`66c422d0 _SUBSECTION
+0x050 FirstPrototypePte : 0xffff9d02`3a34e2c0 _MMPTE
+0x058 LastContiguousPte : 0xffff9d02`3a34e390 _MMPTE
+0x060 ViewLinks : _LIST_ENTRY [ 0x?? - 0x?? ]
+0x070 VadsProcess : 0xffffd889`66e915c1 _EPROCESS
+0x078 u4 : <unnamed-tag>
+0x080 FileObject : (null)
dt 0xffffd889`66c422d0 _SUBSECTION
Subsection
lkd> dt 0xffffd889`66c422d0 _SUBSECTION
nt!_SUBSECTION
+0x000 ControlArea : 0xffffd889`66c42250 _CONTROL_AREA
+0x008 SubsectionBase : 0x?? _MMPTE
+0x010 NextSubsection : 0x?? _SUBSECTION
+0x018 GlobalPerSessionHead : _RTL_AVL_TREE
+0x018 CreationWaitList : (null)
+0x018 SessionDriverProtos : (null)
+0x020 u : <unnamed-tag>
+0x024 StartingSector : 0
+0x028 NumberOfFullSectors : 2
+0x02c PtesInSubsection : 1
+0x030 u1 : <unnamed-tag>
+0x034 UnusedPtes : 0y00.. ..00 (0)
+0x034 ExtentQueryNeeded : 0y0
+0x034 DirtyPages : 0y0
+0x034 u2 : <unnamed-tag>
dt 0xffffd889`66c42250 _CONTROL_AREA
ControlArea
lkd> dt 0xffffd889`66c42250 _CONTROL_AREA
nt!_CONTROL_AREA
+0x000 Segment : 0xffff9d02`3a2f7690 _SEGMENT
+0x008 ListHead : _LIST_ENTRY [ 0x?? - 0x?? ]
+0x018 NumberOfSectionReferences : 1
+0x020 NumberOfPfnReferences : 0x1b
+0x028 NumberOfMappedViews : 0x3c
+0x030 NumberOfUserReferences : 0x3d
+0x038 u : <unnamed-tag>
+0x03c u1 : <unnamed-tag>
+0x040 FilePointer : _EX_FAST_REF
+0x048 ControlAreaLock : 0n0
+0x04c ModifiedWriteCount : 0
+0x050 WaitList : (null)
+0x058 u2 : <unnamed-tag>
+0x068 FileObjectLock : _EX_PUSH_LOCK
+0x070 LockedPages : 1
+0x078 u3 : <unnamed-tag>
dt 0xffffd889`66c42250 _CONTROL_AREA FilePointer.
lkd> dt 0xffffd889`66c42250 _CONTROL_AREA FilePointer.
nt!_CONTROL_AREA
+0x040 FilePointer :
+0x000 Object : 0xffffd889`66c4423e Void
+0x000 RefCnt : 0y1110
+0x000 Value : 0xffffd889`66c4423e
dt _file_object 0xffffd88966c44230
lkd> dt _file_object 0xffffd88966c44230
nt!_FILE_OBJECT
+0x000 Type : 0n5
+0x002 Size : 0n216
+0x008 DeviceObject : 0x?? _DEVICE_OBJECT
+0x010 Vpb : 0x?? _VPB
+0x018 FsContext : 0x?? Void
+0x020 FsContext2 : 0x?? Void
+0x028 SectionObjectPointer : 0x?? _SECTION_OBJECT_POINTERS
+0x030 PrivateCacheMap : (null)
+0x038 FinalStatus : 0n0
+0x040 RelatedFileObject : 0x?? _FILE_OBJECT
+0x048 LockOperation : 0 ''
+0x049 DeletePending : 0 ''
+0x04a ReadAccess : 0x1 ''
+0x04b WriteAccess : 0 ''
+0x04c DeleteAccess : 0 ''
+0x04d SharedRead : 0x1 ''
+0x04e SharedWrite : 0 ''
+0x04f SharedDelete : 0x1 ''
+0x050 Flags : 0x44042
->>+0x058 FileName : _UNICODE_STRING "\Windows\System32\profapi.dll"
+0x068 CurrentByteOffset : _LARGE_INTEGER 0x0
+0x070 Waiters : 0
+0x074 Busy : 0
+0x078 LastLock : (null)
+0x080 Lock : _KEVENT
+0x098 Event : _KEVENT
+0x0b0 CompletionContext : (null)
+0x0b8 IrpListLock : 0
+0x0c0 IrpList : _LIST_ENTRY [ 0x?? - 0x?? ]
+0x0d0 FileObjectExtension : (null)
所以我们的 Driver 要做什麽事情ㄋ??
第一种方法:
第二种方法:
第三种方法:
效果呈现如下:
隐藏前:
隐藏後:
成功击败 Process Explorer :D
注意:已经有按照名称排序。
最後说一下,当我自己写 Driver 快写好的时候..
我发现 Blackbone 已经把 VAD Unlink 写好了!!!
差点吐血 XDD
所以大家想看原始码就到 Blackbone 看吧~~
附上连结在这...
就不讲解程序码了,因为我没时间了,因为我把时间拿去写 Driver 了.. ...
以上所有实作、测试都是在 16299.15 测试的,其它版本逻辑一样,作法不同。
然後最好是不要想把 ntdll.dll 隐藏,
因为当系统需要它的时候又找不到时,就会...XDDDDDDDDDDDDDDDDD
分享一下写这个驱动时常常看到的画面:
最後简单整理了一下思维:
所以还有没有找出 DLL 的方法??
答:有阿 XD
只要 DLL 存在就一定会占用记忆体空间,
某个 DLL 与某个 DLL 之间的记忆体地址差距
相较其它 DLL 来的大是不是就感觉有点问题?
东西就在 Memory 里面,不管躲得再好都有机会找出来,
以下补充:
在 User mode 有没有什麽其他有趣的 DLL 隐藏法?
答:有,请发挥你/你的想像力,想像力就是你/你的超能力!
这里来讲几个 XD
好啦,这篇/这个 Module 系列就到这结束了!
大家若有发现哪里写得不好或错误的地方,都留个言讨论一下吧 XD
那我们下期见 o( ̄▽ ̄)ブ
终於来到第三十天了,来讲讲完赛感言吧! 其实这次是第二次参加铁人赛了,这次是不小心按到开赛所以根本没...
转换一下, 来谈谈PM的日常, 还有其他工作类型, 例如像是产业研究分析的任务, 尤其是针对想要选...
连线设定其实也没什麽好介绍的,改 env 这种事 sail 已经弄好了。 即便现在,用 compos...
在进入正题之前先让大家看看在 Reactive Programming 中的一种使用案例: val ...
如何撰写测试验证例外 — ExpectedExcetption 与 Assert.Throws(de...