撰寫本系列文章目的在於提升資訊安全之實務能力,
並透過實作體悟到資訊安全領域的重要性,
本系列所有文章之內容皆有一定技術水平,
不得從事非法行為、惡意攻擊等非法活動,
「一切不合法規之行為皆受法律所約束」,
為了避免造成公司、廠商或玩家之間困擾,
所有實作不會拿已上市產品、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( ̄▽ ̄)ブ