SuspendAPC's NormalRoutine

kd> !thread
THREAD 8055ac20  Cid 0000.0000  Teb: 00000000 Win32Thread: 00000000 RUNNING on processor 0
Not impersonating
Owning Process            8055ae80       Image:         Idle
Wait Start TickCount      462036         Ticks: 557 (0:00:00:05.578)
Context Switch Count      89087            
UserTime                  00:00:00.0000
KernelTime                01:15:29.0102
Stack Init 80552480 Current 805521cc Base 80552480 Limit 8054f480 Call 0
Priority 16 BasePriority 0 PriorityDecrement 0 DecrementCount 0
ChildEBP RetAddr  Args to Child             
8055214c 804e5324 00000001 00000002 00000030 nt!RtlpBreakWithStatusInstruction (FPO: [1,0,0])
8055214c 806f4742 00000001 00000002 00000030 nt!KeUpdateSystemTime+0x165 (FPO: [0,2] TrapFrame @ 80552160)
WARNING: Frame IP not in any known module. Following frames may be wrong.
805521d0 804ddb37 00000000 0000000e 00000000 0x806f4742
805521d4 00000000 0000000e 00000000 00000000 nt!KiIdleLoop+0x10 (FPO: [0,0,0])

kd> dt -r1 _KTHREAD 8055ac20
   +0x000 Header           : _DISPATCHER_HEADER
      +0x000 Type             : 0x6 ''
      +0x001 Absolute         : 0 ''
      +0x002 Size             : 0x70 'p'
      +0x003 Inserted         : 0 ''
      +0x004 SignalState      : 0
      +0x008 WaitListHead     : _LIST_ENTRY [ 0x8055ac28 - 0x8055ac28 ]
   +0x010 MutantListHead   : _LIST_ENTRY [ 0x8055ac30 - 0x8055ac30 ]
      +0x000 Flink            : 0x8055ac30 _LIST_ENTRY [ 0x8055ac30 - 0x8055ac30 ]
      +0x004 Blink            : 0x8055ac30 _LIST_ENTRY [ 0x8055ac30 - 0x8055ac30 ]
   +0x018 InitialStack     : 0x80552480
....
   +0x168 StackBase        : 0x80552480
   +0x16c SuspendApc       : _KAPC
      +0x000 Type             : 18
      +0x002 Size             : 48
      +0x004 Spare0           : 0
      +0x008 Thread           : 0x8055ac20 _KTHREAD
      +0x00c ApcListEntry     : _LIST_ENTRY [ 0x0 - 0x0 ]
      +0x014 KernelRoutine    : 0x804fc8a1        nt!KiSuspendNop+0
      +0x018 RundownRoutine   : 0x805159ed        nt!PopAttribNop+0
      +0x01c NormalRoutine    : 0x804fc881        nt!KiSuspendThread+0
      +0x020 NormalContext    : (null)
      +0x024 SystemArgument1  : (null)
      +0x028 SystemArgument2  : (null)
      +0x02c ApcStateIndex    : 0 ''
      +0x02d ApcMode          : 0 ''
      +0x02e Inserted         : 0 ''

이 녀석의 본래 모습은 nt!KiSuspendThread()의 함수 주소를 가리킨다. 이 함수는
Suspend될 Thread를 처리해주는 일을 할 것이다. SuspendAPC라는 건 어차피
모든 쓰레드마다 가지고 있는 것이므로 특정 쓰레드에 대해서 SuspendAPC의
NormalRoutine을 실행시키기 원하는 임의의 코드를 가리키게 한 후에, 그냥
Usermode에서 SuspendThread(GetCurrentThread()); 를 해주기만 한다면
APC 레벨에서 원하는 코드를 실행시키는 것이 가능할 것이다.

보통 InitialStack과 StackBase는 같은 값을 가지고 있음을 착안하여, 먼저 대부분의
OS에서 동일한 위치(0x18)에 있는 InitialStack을 찾는다. 그리고 이 값을 참조하여,
그 아래의 같은 값을 찾아내면 그것이 StackBase이고 바로 다음 필드(0x16c)가
SuspendAPC 이다. - idea by skywing

by nerd | 2007/10/18 14:45 | Garage | 트랙백 | 덧글(0)


트랙백 주소 : http://nerd.egloos.com/tb/3442415
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶