제가 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)
음......
과연 다른 운영체제에서는 잘 동작하는지 궁금하네요 +_+