Trao đổi với tôi

http://www.buidao.com

10/11/10

[Rootkit] Finding some non-exported kernel variables in Windows XP

Finding some non-exported kernel variables in Windows XP

by Edgar Barbosa

Tranz by: benina

Phần lớn các kernel modules cần lấy giá trị của vài biến non-exported (biến ko được xuất khẩu) của kernel để sử dụng, để giải quyết vấn đề này chúng ta thường scan (duyệt tuần tự) kernel trong memory để tìm các opcodes đặc trưng hay các signatures đặc trưng. Nhưng tôi đã tìm ra một cách mới để có vài biến hidden (ẩn) này (ẩn do MS ko công bố) trong kernel bằng cách tìm trong một vùng mới ko được công bố rộng rãi trong một cấu trúc cũ được gọi là Processor Control Region.

Chúng ta hảy xem:

KPCR STRUCT

; Start of the architecturally defined section of the PCR. This section

; may be directly addressed by vendor/platform specific HAL code and will

; not change from version to version of NT.

NtTib NT_TIB <>

SelfPcr PVOID ? ; 1Ch

Prcb PVOID ? ; 20h

Irql BYTE ? ; 24h

db 3 dup(?) ; padding

IRR DWORD ? ; 28h

IrrActive DWORD ? ; 2Ch

IDR DWORD ? ; 30h

Reserved2 DWORD ? ; 34h

IDT PVOID ? ; 38h

GDT PVOID ? ; 3Ch

TSS PVOID ? ; 40h PTR KTSS

MajorVersion WORD ? ; 44h

MinorVersion WORD ? ; 46h

SetMember KAFFINITY ? ; 48h

StallScaleFactor DWORD ? ; 4Ch

DebugActive BYTE ? ; 50h

Number BYTE ? ; 51h

db 2 dup(?) ; 052 padding

KPCR ENDS



Khi làm việc với kernel of Windows XP, và tìm ra vùng KPCR area, tôi nhận thấy là tại

0xffdff034 (Reserved2 field) ko bằng 0x0, như thông thường trong Windows 2000.

Và khi dumping pointer mới này trong XP, Tôi đã tìm ra vài biến hidden kernel rất quan trọng như là:

PsActiveProcessHead PsLoadedModuleList MmPfnDatabase PspCidTable

ObpRootDirectoryObject and more...

Và rồi, tôi xem sự thay đổi sau đây trong WinDbg:

lkd> dt _KPCR

+0x000 NtTib : _NT_TIB

+0x01c SelfPcr : Ptr32 _KPCR

+0x020 Prcb : Ptr32 _KPRCB

+0x024 Irql : UChar

+0x028 IRR : Uint4B

+0x02c IrrActive : Uint4B

+0x030 IDR : Uint4B


+0x034 KdVersionBlock : Ptr32 Void

+0x038 IDT : Ptr32 _KIDTENTRY

+0x03c GDT : Ptr32 _KGDTENTRY

+0x040 TSS : Ptr32 _KTSS

+0x044 MajorVersion : Uint2B

+0x046 MinorVersion : Uint2B

+0x048 SetMember : Uint4B

+0x04c StallScaleFactor : Uint4B

+0x050 DebugActive : UChar

+0x051 Number : UChar

+0x052 Spare0 : UChar

+0x053 SecondLevelCacheAssociativity : UChar

+0x054 VdmAlert : Uint4B

+0x058 KernelReserved : [14] Uint4B

+0x090 SecondLevelCacheSize : Uint4B

+0x094 HalReserved : [16] Uint4B

+0x0d4 InterruptMode : Uint4B

+0x0d8 Spare1 : UChar

+0x0dc KernelReserved2 : [17] Uint4B

+0x120 PrcbData : _KPRCB

Vậy KdVersionBlock là gì vậy?

Khi tìm trong Google ở vài trang cho tất cả các biến kernel được liệt kê ở trên, Tôi đã tìm ra include file sau đây:

http://dotnet.di.unipi.it/Content/sscli/docs/doxygen/tools/sos/globals.html

Và cấu trúc mà tôi đã tìm ra xuất hiện ở nơi giống như cấu trúc KDDEBUGGER_DATA32 structure.

Do đó tôi đã cài đặt chương trình getvar (download tại www.rootkit.com) để kiểm tra và nó làm việc hòan hảo trong Windows XP

Bây giờ, ví dụ, để lấy PsActiveProcessHead, thì chỉ cần :

mov eax, 0ffdff034h

mov eax, [eax]

mov eax, [eax+078h]

Vậy bây giờ bạn có được PsActiveProcessHead chỉ với 3 chỉ thị!!! Well, Tôi hy vọng bài viết này hữu dụng cho nhóm coder Rootkit community!

Any errors or questions to: embarbosa AT yahoo DOT com

Regards, Opc0de