理论基础
无论是在 32 位系统内存分布,还是在 64 位系统内存分布中,我们知道高地址空间分配给系统内核使用,低地址空间分配给用户进程使用。
事实上,用户空间和内核空间其实有一块共享区域(KUSER_SHARED_DATA),大小为 4 KB。它们的内存地址虽然不一样,但是它们都是有同一块物理内存映射出来的,KdDebuggerEnabled 就在存放这一块内存里。
对于 32 位系统和 64 位系统来说,这块共享区域对应的内核地址范围以及对应用户空间的地址范围如下表所示:
| 🤡 | 内核起始地址 | 内核结束地址 | 用户起始地址 | 用户结束地址 |
|---|---|---|---|---|
| x86 | 0xFFDF0000 | 0xFFDF0FFF | 0x7FFE0000 | 0x7FFE0FFF |
| x64 | 0xFFFFF78000000000 | 0xFFFFF78000000FFF | 0x7FFE0000 | 0x7FFE0FFF |
在 windbg 里查看 KUSER_SHARED_DATA:
dt _KUSER_SHARED_DATA
nt!_KUSER_SHARED_DATA
+0x000 TickCountLowDeprecated : Uint4B
+0x004 TickCountMultiplier : Uint4B
+0x008 InterruptTime : _KSYSTEM_TIME
+0x014 SystemTime : _KSYSTEM_TIME
+0x020 TimeZoneBias : _KSYSTEM_TIME
+0x02c ImageNumberLow : Uint2B
+0x02e ImageNumberHigh : Uint2B
+0x030 NtSystemRoot : [260] Wchar
+0x238 MaxStackTraceDepth : Uint4B
+0x23c CryptoExponent : Uint4B
+0x240 TimeZoneId : Uint4B
+0x244 LargePageMinimum : Uint4B
+0x248 AitSamplingValue : Uint4B
+0x24c AppCompatFlag : Uint4B
+0x250 RNGSeedVersion : Uint8B
+0x258 GlobalValidationRunlevel : Uint4B
+0x25c TimeZoneBiasStamp : Int4B
+0x260 NtBuildNumber : Uint4B
+0x264 NtProductType : _NT

本文详细介绍了如何在32位和64位系统中隐藏Windbg调试模式,通过修改共享内存区域KUSER_SHARED_DATA中的KdDebuggerEnabled值,实现对本地和双机调试模式的隐藏。同时探讨了在不影响Windbg使用的前提下,避免调试状态被系统自动恢复的方法。

1692

被折叠的 条评论
为什么被折叠?



