Programming/Kernel / Driver2008. 12. 3. 11:37

제가 ActiveProcessLinks의 오프셋을 어떻게하면 구할수 있을까 생각하다가

아주 좋은 방법이 떠올랐습니다 +_+


EPROCESS 구조체의 정보를 보면서 하나하나 알아보죠 ㅇ_ㅇ

다음은 각 Windows별로 EPROCESS 구조체 정보를 생략한 것입니다.

(※이 구조체 정보는 타사이트서 퍼왔습니다)


이 방법은 최소한(?) 다음 Windows에서 성공적으로 동작합니다:

Windows 2000 SP4

Windows XP SP2

Windows Server 2003 No SP

Windows Server 2003 SP1

우선 Windows 2000부터 봅시다.

Windows 2000 SP4

   +0x000 Pcb              : _KPROCESS
   +0x06c ExitStatus       : Int4B
   +0x070 LockEvent        : _KEVENT
   +0x080 LockCount        : Uint4B
   +0x088 CreateTime       : _LARGE_INTEGER
   +0x090 ExitTime         : _LARGE_INTEGER
   +0x098 LockOwner        : Ptr32 _KTHREAD
   +0x09c UniqueProcessId  : Ptr32 Void
   +0x0a0 ActiveProcessLinks : _LIST_ENTRY ---->ActiveProcessLinks
   +0x0a8 QuotaPeakPoolUsage : [2] Uint4B
ActiveProcessLinks의 오프셋은 0x0a0.

UniqueProcessId과 QuotaPeakPoolUsage 사이에 위치해 있군요.


다음은 Windows XP SP2......

Windows XP SP2

   +0x000 Pcb              : _KPROCESS
   +0x06c ProcessLock      : _EX_PUSH_LOCK
   +0x070 CreateTime       : _LARGE_INTEGER
   +0x078 ExitTime         : _LARGE_INTEGER
   +0x080 RundownProtect   : _EX_RUNDOWN_REF
   +0x084 UniqueProcessId  : Ptr32 Void
   +0x088 ActiveProcessLinks : _LIST_ENTRY ---->ActiveProcessLinks
   +0x090 QuotaUsage       : [3] Uint4B
ActiveProcessLinks의 오프셋은 0x088.

UniqueProcessId과 QuotaUsage 사이에 위치해 있군요.


이번에는 Windows Server 2003 No SP

Windows Server 2003 No SP

   +0x000 Pcb              : _KPROCESS
   +0x06c ProcessLock      : _EX_PUSH_LOCK
   +0x070 CreateTime       : _LARGE_INTEGER
   +0x078 ExitTime         : _LARGE_INTEGER
   +0x080 RundownProtect   : _EX_RUNDOWN_REF
   +0x084 UniqueProcessId  : Ptr32 Void
   +0x088 ActiveProcessLinks : _LIST_ENTRY ---->ActiveProcessLinks
   +0x090 QuotaUsage       : [3] Uint4B
ActiveProcessLinks의 오프셋은 0x088.

UniqueProcessId과 QuotaUsage 사이에 위치해 있군요.


마지막으로, Windows Server 2003 SP1을 알아봅시다.

Windows Server 2003 SP1

   +0x000 Pcb              : _KPROCESS
   +0x078 ProcessLock      : _EX_PUSH_LOCK
   +0x080 CreateTime       : _LARGE_INTEGER
   +0x088 ExitTime         : _LARGE_INTEGER
   +0x090 RundownProtect   : _EX_RUNDOWN_REF
   +0x094 UniqueProcessId  : Ptr32 Void
   +0x098 ActiveProcessLinks : _LIST_ENTRY ---->ActiveProcessLinks
   +0x0a0 QuotaUsage       : [3] Uint4B
ActiveProcessLinks의 오프셋은 0x098.

UniqueProcessId과 QuotaUsage 사이에 위치해 있군요.


그런데, 위에서 자세히 보면 ActiveProcessLinks의 오프셋은, UniqueProcessId+4 라는것을 알수가 있군요 +_+

실제로 구해 볼까요?

Windows 2000 SP4 : 0x09c+0x004=0x0a0

Windows XP SP2 : 0x084+0x004=0x088

Windows Server 2003 No SP : 0x084+0x004=0x088(Windows XP SP2와 동일)

Windows Server 2003 SP1 : 0x094+0x004=0x098


결과적으로,


ActiveProcessLinks Offset = UniqueProcessId Offset + 4

ActiveProcessLinks=(PLIST_ENTRY)((char *)EPROCESS 구조체 포인터+UniqueProcessId Offset+4)


음......

과연 다른 운영체제에서는 잘 동작하는지 궁금하네요 +_+

Posted by skensita