본문 바로가기

reversing/rootkit

EPROCESS 구조체 [ 프로세스 숨기기_1 ]

SMALL

간단하게 프로세스를 숨기는 드라이버를 만들고자 이것 저것 찾아보고 있다.


환경 : Windows7 32bit


결과

#define Name_Offset 0x16c

#define ActiveProcessLinks 0xb8


위와 같은 offset을 가지고 있다가 결론이다.


EPROCESS란 커널에서 프로세스를 관리하기 위한 오브젝트이다.


그리고 밑에 보이는 구조체의 모습은 Windows7을 EPROCESS 구조체이다.


프로세스를 관리 할 때 이중 연결 리스트로 관리되어진다. 


숨기고자 하는 프로세스 이름이나 PID 값을 찾은 다음 연결 방향만 숨기면 된다.


밑에 굵게 표시한 부분은 프로세스를 숨기기 위해 필요한 요소라고 생각하는 부분을 표시한것이다.



kd> dt _eprocess

nt!_EPROCESS

   +0x000 Pcb              : _KPROCESS

   +0x098 ProcessLock      : _EX_PUSH_LOCK

   +0x0a0 CreateTime       : _LARGE_INTEGER

   +0x0a8 ExitTime         : _LARGE_INTEGER

   +0x0b0 RundownProtect   : _EX_RUNDOWN_REF

   +0x0b4 UniqueProcessId  : Ptr32 Void

   +0x0b8 ActiveProcessLinks : _LIST_ENTRY // 연결리스트의 구조체.

   +0x0c0 ProcessQuotaUsage : [2] Uint4B

   +0x0c8 ProcessQuotaPeak : [2] Uint4B

   +0x0d0 CommitCharge     : Uint4B

   +0x0d4 QuotaBlock       : Ptr32 _EPROCESS_QUOTA_BLOCK

   +0x0d8 CpuQuotaBlock    : Ptr32 _PS_CPU_QUOTA_BLOCK

   +0x0dc PeakVirtualSize  : Uint4B

   +0x0e0 VirtualSize      : Uint4B

   +0x0e4 SessionProcessLinks : _LIST_ENTRY

   +0x0ec DebugPort        : Ptr32 Void

   +0x0f0 ExceptionPortData : Ptr32 Void

   +0x0f0 ExceptionPortValue : Uint4B

   +0x0f0 ExceptionPortState : Pos 0, 3 Bits

   +0x0f4 ObjectTable      : Ptr32 _HANDLE_TABLE

   +0x0f8 Token            : _EX_FAST_REF

   +0x0fc WorkingSetPage   : Uint4B

   +0x100 AddressCreationLock : _EX_PUSH_LOCK

   +0x104 RotateInProgress : Ptr32 _ETHREAD

   +0x108 ForkInProgress   : Ptr32 _ETHREAD

   +0x10c HardwareTrigger  : Uint4B

   +0x110 PhysicalVadRoot  : Ptr32 _MM_AVL_TABLE

   +0x114 CloneRoot        : Ptr32 Void

   +0x118 NumberOfPrivatePages : Uint4B

   +0x11c NumberOfLockedPages : Uint4B

   +0x120 Win32Process     : Ptr32 Void

   +0x124 Job              : Ptr32 _EJOB

   +0x128 SectionObject    : Ptr32 Void

   +0x12c SectionBaseAddress : Ptr32 Void

   +0x130 Cookie           : Uint4B

   +0x134 Spare8           : Uint4B

   +0x138 WorkingSetWatch  : Ptr32 _PAGEFAULT_HISTORY

   +0x13c Win32WindowStation : Ptr32 Void

   +0x140 InheritedFromUniqueProcessId : Ptr32 Void

   +0x144 LdtInformation   : Ptr32 Void

   +0x148 VdmObjects       : Ptr32 Void

   +0x14c ConsoleHostProcess : Uint4B

   +0x150 DeviceMap        : Ptr32 Void

   +0x154 EtwDataSource    : Ptr32 Void

   +0x158 FreeTebHint      : Ptr32 Void

   +0x160 PageDirectoryPte : _HARDWARE_PTE

   +0x160 Filler           : Uint8B

   +0x168 Session          : Ptr32 Void

   +0x16c ImageFileName    : [15] UChar //프로세의 이름이다.

   +0x17b PriorityClass    : UChar

   +0x17c JobLinks         : _LIST_ENTRY

   +0x184 LockedPagesList  : Ptr32 Void

   +0x188 ThreadListHead   : _LIST_ENTRY

   +0x190 SecurityPort     : Ptr32 Void

   +0x194 PaeTop           : Ptr32 Void

   +0x198 ActiveThreads    : Uint4B

   +0x19c ImagePathHash    : Uint4B

   +0x1a0 DefaultHardErrorProcessing : Uint4B

   +0x1a4 LastThreadExitStatus : Int4B

   +0x1a8 Peb              : Ptr32 _PEB

   +0x1ac PrefetchTrace    : _EX_FAST_REF

   +0x1b0 ReadOperationCount : _LARGE_INTEGER

   +0x1b8 WriteOperationCount : _LARGE_INTEGER

   +0x1c0 OtherOperationCount : _LARGE_INTEGER

   +0x1c8 ReadTransferCount : _LARGE_INTEGER

   +0x1d0 WriteTransferCount : _LARGE_INTEGER

   +0x1d8 OtherTransferCount : _LARGE_INTEGER

   +0x1e0 CommitChargeLimit : Uint4B

   +0x1e4 CommitChargePeak : Uint4B

   +0x1e8 AweInfo          : Ptr32 Void

   +0x1ec SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO

   +0x1f0 Vm               : _MMSUPPORT

   +0x25c MmProcessLinks   : _LIST_ENTRY

   +0x264 HighestUserAddress : Ptr32 Void

   +0x268 ModifiedPageCount : Uint4B

   +0x26c Flags2           : Uint4B

   +0x26c JobNotReallyActive : Pos 0, 1 Bit

   +0x26c AccountingFolded : Pos 1, 1 Bit

   +0x26c NewProcessReported : Pos 2, 1 Bit

   +0x26c ExitProcessReported : Pos 3, 1 Bit

   +0x26c ReportCommitChanges : Pos 4, 1 Bit

   +0x26c LastReportMemory : Pos 5, 1 Bit

   +0x26c ReportPhysicalPageChanges : Pos 6, 1 Bit

   +0x26c HandleTableRundown : Pos 7, 1 Bit

   +0x26c NeedsHandleRundown : Pos 8, 1 Bit

   +0x26c RefTraceEnabled  : Pos 9, 1 Bit

   +0x26c NumaAware        : Pos 10, 1 Bit

   +0x26c ProtectedProcess : Pos 11, 1 Bit

   +0x26c DefaultPagePriority : Pos 12, 3 Bits

   +0x26c PrimaryTokenFrozen : Pos 15, 1 Bit

   +0x26c ProcessVerifierTarget : Pos 16, 1 Bit

   +0x26c StackRandomizationDisabled : Pos 17, 1 Bit

   +0x26c AffinityPermanent : Pos 18, 1 Bit

   +0x26c AffinityUpdateEnable : Pos 19, 1 Bit

   +0x26c PropagateNode    : Pos 20, 1 Bit

   +0x26c ExplicitAffinity : Pos 21, 1 Bit

   +0x270 Flags            : Uint4B

   +0x270 CreateReported   : Pos 0, 1 Bit

   +0x270 NoDebugInherit   : Pos 1, 1 Bit

   +0x270 ProcessExiting   : Pos 2, 1 Bit

   +0x270 ProcessDelete    : Pos 3, 1 Bit

   +0x270 Wow64SplitPages  : Pos 4, 1 Bit

   +0x270 VmDeleted        : Pos 5, 1 Bit

   +0x270 OutswapEnabled   : Pos 6, 1 Bit

   +0x270 Outswapped       : Pos 7, 1 Bit

   +0x270 ForkFailed       : Pos 8, 1 Bit

   +0x270 Wow64VaSpace4Gb  : Pos 9, 1 Bit

   +0x270 AddressSpaceInitialized : Pos 10, 2 Bits

   +0x270 SetTimerResolution : Pos 12, 1 Bit

   +0x270 BreakOnTermination : Pos 13, 1 Bit

   +0x270 DeprioritizeViews : Pos 14, 1 Bit

   +0x270 WriteWatch       : Pos 15, 1 Bit

   +0x270 ProcessInSession : Pos 16, 1 Bit

   +0x270 OverrideAddressSpace : Pos 17, 1 Bit

   +0x270 HasAddressSpace  : Pos 18, 1 Bit

   +0x270 LaunchPrefetched : Pos 19, 1 Bit

   +0x270 InjectInpageErrors : Pos 20, 1 Bit

   +0x270 VmTopDown        : Pos 21, 1 Bit

   +0x270 ImageNotifyDone  : Pos 22, 1 Bit

   +0x270 PdeUpdateNeeded  : Pos 23, 1 Bit

   +0x270 VdmAllowed       : Pos 24, 1 Bit

   +0x270 CrossSessionCreate : Pos 25, 1 Bit

   +0x270 ProcessInserted  : Pos 26, 1 Bit

   +0x270 DefaultIoPriority : Pos 27, 3 Bits

   +0x270 ProcessSelfDelete : Pos 30, 1 Bit

   +0x270 SetTimerResolutionLink : Pos 31, 1 Bit

   +0x274 ExitStatus       : Int4B

   +0x278 VadRoot          : _MM_AVL_TABLE

   +0x298 AlpcContext      : _ALPC_PROCESS_CONTEXT

   +0x2a8 TimerResolutionLink : _LIST_ENTRY

   +0x2b0 RequestedTimerResolution : Uint4B

   +0x2b4 ActiveThreadsHighWatermark : Uint4B

   +0x2b8 SmallestTimerResolution : Uint4B

   +0x2bc TimerResolutionStackRecord : Ptr32 _PO_DIAG_STACK_RECOR


해당 부분은 LIST의 구조를 나타낸 것이다.

 

리스트 처음에는 앞의 EPROCESS를 가르키고 있고, LIST+OFFSET4에는 뒤 EPROCESS를 가리키고 있다.


nt!_LIST_ENTRY

   +0x000 Flink            : Ptr32 _LIST_ENTRY

   +0x004 Blink            : Ptr32 _LIST_ENTRY



LIST